Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Kyash Androidのイースターエッグ実装 / Kyash Android Easter Eggs
konifar
April 18, 2019
Programming
2
910
Kyash Androidのイースターエッグ実装 / Kyash Android Easter Eggs
konifar
April 18, 2019
Tweet
Share
More Decks by konifar
See All by konifar
VPoEとして1年 もっとこうすればよかった3選 / VPoE Retrospective
konifar
12
5.3k
Introduction to API Testing Automation by Postman
konifar
1
2.9k
Kyash iOSアプリのQAの歴史
konifar
0
5.1k
エンジニアから見たKyashのPdMのおしごと / An engineer's perspective for PdM roles in Kyash
konifar
3
1.4k
Master of Android Theme
konifar
23
12k
Material Themingとは何か / material theming overview
konifar
2
250
KyashのGoogle Pay対応の概要 / kyash-google-pay
konifar
2
780
LottieAnimation with DataBinding
konifar
5
430
私の年収グラフと幸せグラフ / The graph of my income and happiness
konifar
14
16k
Other Decks in Programming
See All in Programming
ペパカレで入社した私が感じた2つのギャップと向き合い方
kosuke_ito
0
160
爆速の日経電子版開発の今
shinyaigeek
1
520
PHPアプリケーションにおけるアーキテクチャメトリクスについて / Architecture Metrics in PHP Applications
isanasan
1
210
子育てとEMと転職と
_atsushisakai
1
330
ITエンジニア特化型Q&Aサイトteratailを 言語、DB、クラウドなど フルリプレイスした話
leveragestech
0
390
Rによる大規模データの処理
s_uryu
2
620
Micro Frontends with Module Federation @MicroFrontend Summit 2023
manfredsteyer
PRO
0
450
AWS App Runnerがそろそろ本番環境でも使い物になりそう
n1215
PRO
0
890
Amazon QuickSightのアップデート -re:Invent 2022の復習&2022年ハイライト-
shogo452
0
210
Makuakeの認証基盤とRe-Architectureチーム
bmf_san
0
310
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
130
なぜRubyコミュニティにコミットするのか?
luccafort
0
300
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
120
29k
Faster Mobile Websites
deanohume
295
29k
GraphQLの誤解/rethinking-graphql
sonatard
39
7.8k
Designing for Performance
lara
600
65k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
Imperfection Machines: The Place of Print at Facebook
scottboms
254
12k
No one is an island. Learnings from fostering a developers community.
thoeni
12
1.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
6
4.5k
Ruby is Unlike a Banana
tanoku
93
9.5k
How To Stay Up To Date on Web Technology
chriscoyier
779
250k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
217
21k
Unsuck your backbone
ammeep
659
56k
Transcript
Kyash Android ͷ ΠʔελʔΤοά࣮ 2019/04/18 () Kyash Meetup #6 Kyash
Inc. @konifar
@konifar (Yusuke Konishi) • ೖࣾͯ͠14ϲ݄͘Β͍ http://konifar.hatenablog.com/entry/2019/03/22/222554 • AndroidΞϓϦ։ൃ͕ϝΠϯ • ೖ͙ࣾͯ͢͠ʹ39ΞχϝʔγϣϯΛ࣮
None
ΠʔελʔΤοά = ָ͓͠Έػೳ
ࡩΞχϝʔγϣϯ • ࡩͬΆ͍จࣈΛτϦΨʔ ʹͯ͠ɺࡩ͕͍ࢄΔʂ
http://konifar.hatenablog.com/entry/2018/06/14/173716 ࡩΞχϝʔγϣϯͷ͖͔͚ͬ
ࢭ·Βͳ͍ཉ
ࠓͨͿΜ 7छྨ͘Β͍͋Δ
ΠʔελʔΤοάͷ ίʔυ෦ͷΛ͠·͢
ੲͱࠓͷίʔυͷ
39Ξχϝʔγϣϯ͚ͩͷࠒ • ཤྺৄࡉը໘ͷViewModelͷҰ෦ʹͼ͜Δ is39() ϝιου • ࣌͜Μͳʹָ͠ΜͰΒ֦͑ͯு͍ͯ͘͠ͱࢥͬͯͳ͔ͬͨ
நԽ͢Δ
ΠʔελʔΤοάͷղ 1. ରͷॴʹ 2. ݅ʹԠͯ͡ 3. Կ͔Λදࣔ͢Δ
39Ξχϝʔγϣϯͷ߹ 1. ରͷॴʹʢૹۚྃը໘શମʹʣ 2. ݅ʹԠͯ͡ʢ39ԁͩͬͨ߹ʹʣ 3. Կ͔Λදࣔ͢ΔʢgifΛදࣔ͢Δʣ
ࡩΞχϝʔγϣϯͷ߹ 1. ରͷॴʹʢཤྺৄࡉը໘શମʹʣ 2. ݅ʹԠͯ͡ʢ࠷ޙͷϝοηʔδʹࡩͬΆ͍จࣈ͕ೖ͍ͬͯͨ߹ʹʣ 3. Կ͔Λදࣔ͢ΔʢՖͼΒͷը૾Λ߱ΒͤΔʣ
ࠓͷΞϯυϩΠυͷ࣮ 7JFX.PEFM 5JNFMJOF)FBEFS &BTUFS&HH'BDUPSZ &BTUFS&HH,FZXPSE .BUDIFS 5JNFMJOF)FBEFS &BTUFS&HH 5JNFMJOF)FBEFS &BTUFS&HH
5JNFMJOF)FBEFS &BTUFS&HH EasterEggΛදࣔ͢ΔViewModel͔Β Factoryܦ༝ͰEasterEggΦϒδΣΫτΛऔ Γग़͢ EasterEggΠϯλʔϑΣʔεΛ࣮ͯ͠ ʰදࣔ݅ʱͱʰදࣔ͢ΔϦιʔεʱΛࢦ ఆ͢Δ දࣔ݅ɺଞͷը໘ͷEasterEggΫϥε ͱڞ௨ͳͷͰɺMatcherΫϥεͱͯ͠Γ ग़͍ͯ͠Δ
|--keywords | |--EasterEggKeywordsMatcher.kt | |-—SakuraEasterEggKeywordsMatcher.kt | |…… |--timeline | |--NoTimelineHeaderEasterEgg.kt
| |--ThankYouReceiveTimelineHeaderEasterEgg.kt | |--TimelineHeaderEasterEgg.kt | |-—TimelineHeaderEasterEggFactory.kt | |…… |--transaction | |--NoTransactionEasterEgg.kt | |--ThankYouSendTransactionEasterEgg.kt | |--TransactionEasterEgg.kt | |--TransactionEasterEggFactory.kt | |…… • UIͷσΟϨΫτϦͷதʹeastereggsσΟϨΫτϦΛஔ͍͍ͯΔ
|--keywords | |--EasterEggKeywordsMatcher.kt | |-—SakuraEasterEggKeywordsMatcher.kt | |…… |--timeline | |--NoTimelineHeaderEasterEgg.kt
| |--ThankYouReceiveTimelineHeaderEasterEgg.kt | |--TimelineHeaderEasterEgg.kt | |-—TimelineHeaderEasterEggFactory.kt | |…… |--transaction | |--NoTransactionEasterEgg.kt | |--ThankYouSendTransactionEasterEgg.kt | |--TransactionEasterEgg.kt | |--TransactionEasterEggFactory.kt | |…… • ʮରͷॴʯ͝ͱʹEasterEggΫϥεͱFactoryΫϥεΛ࡞͍ͬͯΔ • timeline = ཤྺৄࡉը໘্෦ • transaction = ૹۚɾٻྃը໘શମ
interface TimelineHeaderEasterEgg { @DrawableRes fun getAnimationDrawableResId(): Int? fun shouldShow(): Boolean
} • λΠϜϥΠϯৄࡉͷ39ΞχϝʔγϣϯͷΠϯλʔϑΣʔε • Կදࣔ͠ͳ͍έʔεͷͨΊʹɺNullObjectύλʔϯͷΑ͏ͳܗͰ NoTransactionEasterEggΫϥε࡞͍ͬͯΔ class NoTransactionEasterEgg : TransactionEasterEgg { override fun getAnimationDrawableResId(): Int? = null override fun shouldShow() = false }
/** * डऔ࣌ͷ39Ξχϝʔγϣϯ */ class ThankYouReceiveTimelineHeaderEasterEgg( val amount: Long )
: TimelineHeaderEasterEgg { override fun getAnimationDrawableResId() = R.drawable.img_receive_39 override fun shouldShow() = amount == 39L } • 39ԁΛड͚औͬͨ߹ͷ࣮ • දࣔ݅ͱͳΔ shouldShow() ͷςετΛ͔ͬ͠Γॻ͍͍ͯΔ
class SakuraEasterEggKeywordsMatcher : EasterEggKeywordsMatcher { override fun getKeywords() = arrayListOf(
"͘͞Β", "αΫϥ", "ࡩ", "Ֆݟ", "ͳΈ", "ϋφϛ", "ԅ", String(byteArrayOf(-16, -97, -116, -72)) // ࡩͷemoji ) } • ͘͞ΒΞχϝʔγϣϯͷΩʔϫʔυΛఆٛ • JUnitͰParameterized TestΛॻ͘
@RunWith(Parameterized::class) class SakuraEasterEggKeywordsMatcherUnitTest( private val message: String, private val result:
Boolean ) { companion object { @JvmStatic @Parameterized.Parameters fun data(): List<Array<out Any?>> { return listOf( arrayOf("αΫϥ͕͘͞", true), arrayOf("", true), arrayOf("α Ϋϥ", false), …… ) } } @Test fun containsKeyword() { val subject = SakuraEasterEggKeywordsMatcher() assertEquals(result, subject.containsKeyword(message)) } }
class TimelineHeaderEasterEggFactory( val amount: Long, val message: String? ) {
// ద༻͞ΕΔॱʹϦετʹηοτ͍ͯ͠·͢ private val easterEggs = arrayListOf( … // ωλόϨʹͳΔͷͰφΠγϣ ThankYouReceiveTimelineHeaderEasterEgg(amount) ) fun createEasterEgg(): TimelineHeaderEasterEgg { easterEggs.forEach { if (it.shouldShow()) return it } return NoTimelineHeaderEasterEgg() } } • FactoryɺEasterEggͷϦετΛ࣋ͬͯɺ݅ʹԠͯ͡࠷ॳʹද ࣔ݅ʹ߹கͨ͠EasterEggΛฦ͢
val easterEgg = TimelineHeaderEasterEggFactory( amount, message ).createEasterEgg() …
@get:Bindable val headerEasterEggVisible: Boolean get() = easterEgg.shouldShow() @get:Bindable val headerEasterEggDrawable: Int? get() = easterEgg.getAnimationDrawableResId() • ViewModelͰEasterEggΛݩʹDataBindingͷΛܾΊͯBind • AnimationDrawableResIdgifͳͷͰɺGifDrawableΛbindͰ͖ ΔBindingAdapterΛ࡞͍ͬͯΔ https://github.com/koral--/android-gif-drawable
ࠓޙͷίʔυͷ
ʮͦͦαʔόʔαΠ υʹϩδοΫ͋Δ͖ ͡Όͳ͍ʁʯ
ʮͦ͏ͩͶʂʂʯ
ࠓޙͷ • Android/iOSʹϩδοΫ͕ࢄΒΒͳ͍Α͏ʹαʔ όʔαΠυʹϩδοΫΛدͤΔ = APIԽ • ΞχϝʔγϣϯϑΝΠϧΛΫϥΠΞϯτଆͰ࣋ͨͳ ͍Α͏ʹμϯϩʔυͷΈΛ༻ҙ͢Δ =
Ξϓ ϦαΠζͷݮ • ΫϥΠΞϯτͰͷநԽͰ༷͕ݻ·͖ͬͯͨࠓͳ Β͍͚ͬͯͦ͏
None
͍Ζ͍Ζࢼͯ͠܅͚ͩͷ ΠʔελʔΤοάΛ୳ͦ͏ʂ ※ ͪͳΈʹࣗͷkyash_id konifar ͩΑ
࠙ձͰฉ͍ͯΒ͑Ε Ͱ͖Δ͚ͩԿͰ͠·͢ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ