Slide 1

Slide 1 text

Contributeͯ͠ͳ͍Զ͕ DroidKaigiΞϓϦʹ͍ͭͯ
 ΰχϣΰχϣ࿩͢ձ Souzoh Android Talk #2

Slide 2

Slide 2 text

DroidKaigiΞϓϦ • https://github.com/konifar/droidkaigi2018-flutter • https://github.com/DroidKaigi/conference-app-2018 • https://github.com/kikuchy/DroidKaigi2018iOS

Slide 3

Slide 3 text

ࠓ೔࿩͢ͷ͸
 DroidKaigi/conference-app-2018

Slide 4

Slide 4 text

߹ΘͤͯಡΈ͍ͨʂ • DroidKaigi 2018 App Architecture by takahirom • https://speakerdeck.com/takahirom/ droidkaigi-2018-app-architecture • DroidKaigi ΞϓϦͷ಺෦ΛݟΔ by tatsuhama50 • https://www.slideshare.net/kenichitatsuhama/ droidkaigi-88921455

Slide 5

Slide 5 text

CircleCIͷΠϝʔδ͸ެࣜͷͰྑͦ͞͏ • ͖ͬͱެࣜΠϝʔδΛFROMͰࢦఆͯ͠
 RubyΛೖΕͯΔͷ͔ͳʁ jobs: build: docker: - image: punchdrunker/android-27-ruby

Slide 6

Slide 6 text

CircleCIͷΠϝʔδ͸ެࣜͷͰྑͦ͞͏ • ࣮͸ެࣜͷΠϝʔδʹ΋Ruby͸ೖͬͯΔʂ • https://github.com/CircleCI-Public/circleci- dockerfiles/blob/master/android/images/ api-27-alpha/Dockerfile#L125-L134

Slide 7

Slide 7 text

CircleCIͷImage • CircleCI͕ఏڙͯ͠ΔImageͷDockerfile͸Githubʹ·ͱ·ͬͯΔ • https://github.com/CircleCI-Public/circleci-dockerfiles • AndroidͷDockerfile΋΋ͪΖΜ͋ΔΑ • https://github.com/CircleCI-Public/circleci-dockerfiles/tree/master/ android/images • circleci/android:api-27-alphaͷDockerfileͳΒҎԼ • https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ android/images/api-27-alpha/Dockerfile

Slide 8

Slide 8 text

ϖʔδΛอ࣋ͯ͘͠ΕʂཔΉʂ • SearchFragment͸ViewPagerͱTabLayoutͷߏ੒ • SpeakerλϒʹҠಈͯ͠ɺSessionλϒΛ։͘ͱ Page͕࠶ߏஙʹͳΔ • εΫϩʔϧͯͨ͠ҐஔมΘͬͪΌ͏ • Sessionλϒʹ੾Γସ͑Δ࣌ʹएׯ΋ͬ͞Γ͢Δ

Slide 9

Slide 9 text

ϖʔδΛอ࣋ͯ͘͠ΕʂཔΉʂ • ͦ͜ͰViewPagerͷoffscreenPageLimitͰ͢ΑͶʂ • offscreenͷlimitΛมߋ͢Δ • σϑΥϧτͰ͸1 • σϑΥϧτ 1ͳͷͰɺSpeakerλϒʹҠಈ͢Δͱ Sessionλϒ͕ফ͑Δ

Slide 10

Slide 10 text

ϖʔδΛอ࣋ͯ͘͠ΕʂཔΉʂ • SpeakerλϒʹҠಈͯ͠΋Sessionλϒ͕
 ফ͑ͳ͍Α͏ʹ͍ͨ͠ʂ • offscreenPageLimitΛ2ʹ͢Ε͹Αͦ͞͏ʂ • binding.sessionsViewPager.offscreenPageLimit = 2

Slide 11

Slide 11 text

Demo

Slide 12

Slide 12 text

ϖʔδอ࣋Ͱ͖ͨʂ • ΍ͬͨͶʂ • ϖʔδ਺͕ͲΕ͘Β͍͔Θ͔ͬͯΔͳΒ
 ࠷దԽ͢Δ΄͏͕͍͍ • ϖʔδͷอ࣋͢Δ෼ɺϝϞϦΛ࢖͏ͷͰ஫ҙ

Slide 13

Slide 13 text

ViewPager#offscreenPageLimit • ViewPager#offscreenPageLimit API Document • https://developer.android.com/reference/ android/support/v4/view/ ViewPager.html#setOffscreenPageLimit(int)

Slide 14

Slide 14 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ

Slide 15

Slide 15 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ

Slide 16

Slide 16 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ

Slide 17

Slide 17 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ

Slide 18

Slide 18 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ

Slide 19

Slide 19 text

ͭ·Γ

Slide 20

Slide 20 text

OkHttpͷLog͸ϦϦʔε൛͸
 ग़͞ͳ͍ํ͕͍͍ʂ • ϦϦʔε൛ͷΞϓϦͰ͸HttpLoggingInterceptorΛ Interceptorʹઃఆ͠ͳ͍ํ͕͍͍ • ·ͨ͸NONEʹઃఆ͢Δ • OkHttpͷݶΒͣɺLogcatʹྲྀ͢಺༰͸ϚδͰؾΛͭ ͚͍ͯͩ͘͞ʂ

Slide 21

Slide 21 text

λϒ λοϓͨ࣌͠ʹ
 Listͷઌ಄ʹ໭Δͷ͍͍ΑͶʂ • ·ͨ·ͨSearchFragment͞ΜͰ͢ • TabLayout.OnTabSelectedListenerΛ࢖ͬͯɺλοϓΠϕϯτΛ औͬͯΔ • λϒ͕λοϓ͞ΕΔͱɺViewPagerʹΞλον͞ΕͯΔ FragmentʹλονΠϕϯτ͕఻ΘΔ • FragmentͷRecyclerViewʹsmoothScrollToPosition(0)ͯ͠
 ઌ಄·ͰεΫϩʔϧͤ͞Δ

Slide 22

Slide 22 text

Demo

Slide 23

Slide 23 text

λϒ λοϓͨ࣌͠ʹ
 Listͷઌ಄ʹ໭Δͷ͍͍ΑͶʂ • ࣮૷؆୯͚ͩͲɺΊͬͪΌศརʹͳΔͷͰ
 ؾʹೖͬͨΒΈΜͳ࣮૷ͯ͠ΈͯͶʂ • ϝϧΧϦ Χ΢ϧͰ΋ࣅͨΑ͏ͳ࣮૷ͯ͠ΔΑʂ

Slide 24

Slide 24 text

@CheckResult Annotation • APIͱ͔DBͱ͔Repositoryͷ໭Γ஋ͱ͔ʹ
 ͪΐ͍ͪΐ͍͚ͭΒΕͯͨ • DroidKaigiΞϓϦͰ࢖ΘΕͯΔͱ͜Ζ • https://github.com/DroidKaigi/conference- app-2018/search? q=CheckResult&type=Code&utf8=%E2%9C%93

Slide 25

Slide 25 text

@CheckResult Annotation “ϝιουͷ݁Ռ·ͨ͸໭Γ஋͕࣮ࡍʹ࢖༻͞Ε͍ͯ Δ͔Ͳ͏͔Λݕূ͢Δʹ͸ @CheckResult Ξϊςʔ γϣϯΛ࢖༻͠·͢ɻ
 
 ͢΂ͯͷඇ void ϝιουʹ @CheckResult Ξϊςʔ γϣϯΛ෇͚ΔͷͰ͸ͳ͘ɺෳࡶͳϝιουͷ݁Ռ Λ໌֬ʹ͢ΔͨΊʹΞϊςʔγϣϯΛ௥Ճ͠·͢ɻ”

Slide 26

Slide 26 text

@CheckResult Annotation “ͨͱ͑͹ɺܦݧͷઙ͍ Java σϕϩούʔ͸ɺ .trim() ͕ݩͷจࣈྻ͔ΒۭനΛ࡟আ͢ Δ΋ͷͩͱצҧ͍͢Δ͜ͱ͕͋Γ·͢ɻϝιο υʹ @CheckResult ΞϊςʔγϣϯΛ෇͚Δ ͱɺݺͼग़͠ݩͰ .trim() ͷ໭Γ஋Λ Ұ੾࢖༻͍ͯ͠ͳ͍৔߹ʹܯࠂ͕ग़·͢ɻ”

Slide 27

Slide 27 text

࢖͍ํͱઆ໌͕
 ׬ᘳ͗ͯ͢਒͑ͨ͆

Slide 28

Slide 28 text

@CheckResult Annotation • https://developer.android.com/studio/write/ annotations.html#check-result • https://developer.android.com/reference/ android/support/annotation/ CheckResult.html

Slide 29

Slide 29 text

ࠃࡍԽΛҙࣝͨ͠Notification Channel • Notification Channelͱ͸ʁ • ௨஌ΛChannelͱ͍͏୯ҐʹΧςΰϥΠζ͠Α͏ʂ • ৄ͘͠͸υΩϡϝϯτಡΜͰʂ • https://developer.android.com/guide/topics/ui/ notifiers/notifications.html#ManageChannels

Slide 30

Slide 30 text

ͳͥࠃࡍԽΛҙࣝ͠ͳ͍ͱ͍͚ͳ͍ͷ͔ • NotificationChannelΛnew͢Δ࣌ͷname͸Ϣʔβʹ
 ݟ͑Δνϟϯωϧͷ֓ཁతͳ΍ͭ • ͜ΕઃఆΞϓϦͱ͔͕resource͔Βग़͢Θ͚Ͱ͸ͳ͍ • ChannelΛੜ੒ͨ࣌͠ͷݴޠͷϦιʔεʹґଘ͢Δͬͯ͜ͱ • ೔ຊޠઃఆͰChannelΛ࡞੒ͯ͠ɺӳޠઃఆʹ͢Δͱ Channelͷઆ໌͕೔ຊޠʹͳΔͱ͍͏໰୊͕ى͖Δ

Slide 31

Slide 31 text

ࠃࡍԽΛҙࣝͨ͠Notification Channel • ݴޠઃఆ͕มΘͬͨλΠϛϯάͰChannelΛ࡞Γ௚͢ • android.intent.action.LOCALE_CHANGEDΛ
 BroadcastReceiverͰϑοΫ͢Δ • ͦͷλΠϛϯάͰνϟϯωϧΛ࡞Γ௚͢ • NotificationManager.createNotificationChannel͸
 ಉ͡Channel IDʹରͯ͠࠶౓ੜ੒Λݺͼग़͢ͱname΍ descriptionΛߋ৽Ͱ͖Δ

Slide 32

Slide 32 text

ࠃࡍԽΛҙࣝͨ͠Notification Channel • ͜ͷ͜ͱͪΌΜͱυΩϡϝϯτʹ΋ॻ͍ͯ͋Δ • https://developer.android.com/reference/ android/app/ NotificationChannel.html#NotificationChannel (java.lang.String, java.lang.CharSequence, int)

Slide 33

Slide 33 text

ࠃࡍԽΛҙࣝͨ͠Notification Channel “You can rename this channel when the system locale changes by listening for the ACTION_CHANGED broadcast.”

Slide 34

Slide 34 text

ࠃࡍԽΛҙࣝͨ͠Notification Channel • Incomplete Implementation of Notification Channel • https://github.com/DroidKaigi/conference- app-2018/pull/406 • ʲAndroid Oʳ௨஌νϟϯωϧΛࠃࡍԽ͢Δ • https://qiita.com/Shiozawa/items/ 095e77d38fc00681e898

Slide 35

Slide 35 text

DrawerLayout • Α͘Ͱ͖ͯΔʂ • ͔͠΋Ͳͷը໘Ͱ΋Drawerग़ͤΔΑ͏ʹͳͬͯΔʂ • Google͕ਪ঑??ͯ͠Δಈ͘ͳͷͰΑ͍

Slide 36

Slide 36 text

resValue • Gradle͔ΒResouce΋ੜ੒Ͱ͖Δʂ • ศརʂ

Slide 37

Slide 37 text

resValue • app/build/generated/res/resValues/debug/ values഑Լʹੜ੒͞ΕΔ 1.0.0-debug DroidKaigi 2018 Dev

Slide 38

Slide 38 text

BindingAdapter • TextBinding.ktʹͳΔ΄Ͳʔ͍ͬͯ͏ͷ͋ͬͨʂ • android:textͰDate౉ͤΔΑ͏ʹ͢Δ࣮૷ʂ @BindingAdapter(value = ["android:text"]) fun TextView.setDateText(date: Date?) { date ?: return text = date.toReadableDateTimeString() }

Slide 39

Slide 39 text

͋ͱͳΜ͔ΞϓϦΫϥογϡͨ͆͠ Shutting down VM FATAL EXCEPTION: main Process: io.github.droidkaigi.confsched2018, PID: 11577 b.a at io.github.droidkaigi.confsched2018.presentation.feed.a.a$a.onPreDraw(FeedItem.kt:58) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:977) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2349) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) at android.view.Choreographer.doCallbacks(Choreographer.java:723) at android.view.Choreographer.doFrame(Choreographer.java:658) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Slide 40

Slide 40 text

͞ΒʹಡΉͱ໘നͦ͏ͳͱ͜Ζ • Mapper͍͍ͬ͢Ͷ • Room • binding.prevSession = prevSessionͱ binding.nextSession = nextSession • RTLରԠ

Slide 41

Slide 41 text

͞ΒʹಡΉͱ໘നͦ͏ͳͱ͜Ζ • FirebaseFirestore • Firestore offline͸ແޮԽͯ͠Δ • in memory cache͸͋Δʁ • https://firebase.google.com/docs/firestore/manage-data/enable- offline?hl=ja • ͍͍ͶʂΦϑϥΠϯͷঢ়ଶͰ։͘ͱΞϓϦͷProcess kill͢Δ·Ͱऔಘ Ͱ͖ͳ͍ʁʁ • ΦϯϥΠϯʹͯ͠ProcessϨϕϧͰΞϓϦ্ཱͪ͛௚͢ͱऔಘͰ͖Δ

Slide 42

Slide 42 text

࿩͔͚ͨͬͨ͠Ͳ࣌ؒͷ౎߹্ ࿩ͤͳ͔ͬͨ͜ͱ • EmojiCompat • Support LibraryͷDownloadable Fonts΍EmojiCompatʹରԠ
 ͨ͠ΞϓϦΛ࡞Ζ͏ by takahirom • https://speakerdeck.com/takahirom/support- libraryfalsedownloadable-fontsyaemojicompatnidui-ying- sitaapuriwozuo-rou • Resultύλʔϯ • FeedItemͳΜ͔bugͬͯΔ

Slide 43

Slide 43 text

࿩͔͚ͨͬͨ͠Ͳ࣌ؒͷ౎߹্ ࿩ͤͳ͔ͬͨ͜ͱ • NotificationHelper.kt • NotificationChannelTypeΑ͞ • Gradle Versions Plugin • ೖͬͯΔ͚ͲCIͱ͔Ͱ͸࢖ΘΕͯͳ͍ͷͰ๨Ε͕͚ͪͩͲΊͬͪΌศར • https://github.com/ben-manes/gradle-versions-plugin • AlarmManager.setAndAllowWhileIdle + Doze • https://qiita.com/FumihikoSHIROYAMA/items/ b1d6dbda120462d0e209

Slide 44

Slide 44 text

࿩͔͚ͨͬͨ͠Ͳ࣌ؒͷ౎߹্ ࿩ͤͳ͔ͬͨ͜ͱ • Open Source Notices • https://developers.google.com/android/guides/opensource • https://qiita.com/sho5nn/items/f63ebd7ccc0c86d98e4b • Kotlin DSL • https://github.com/gradle/kotlin-dsl • Kotlin + buildSrc for Better Gradle Dependency Management • https://handstandsam.com/2018/02/11/kotlin-buildsrc-for-better-gradle- dependency-management/ • Ϛϧν Ϟδϡʔϧ͔ͩΒόʔδϣϯͷ؅ཧ͸͜͏ͨ͠ํָ͕

Slide 45

Slide 45 text

࿩͔͚ͨͬͨ͠Ͳ࣌ؒͷ౎߹্ ࿩ͤͳ͔ͬͨ͜ͱ • MessageProcessorΛฦ͢ͷ͔ • ͳΔ΄Ͳʔ • ॲཧΛMessageProcessor͝ͱʹॻ͚ΔͷͰྑͦ͞͏ • ࣅͨΑ͏ͳ͜ͱΛϝϧΧϦ Χ΢ϧͰ΋Custom URLͰ ΍ͬͯΔ

Slide 46

Slide 46 text

͞Βʹ͜ͷ࣮૷΋͋Ε͹ྑ͔ͬͨʔ • Runtime Permission • ͍Βͳ͍ͳΒແཧʹ΍Δඞཁͳ͍ΑͶ

Slide 47

Slide 47 text

DroidKaigi 2018 Flutter App • https://github.com/konifar/droidkaigi2018-flutter • git clone͔ͯ͠ΒAndroidϏϧυͰ͖Ͷʔw

Slide 48

Slide 48 text

Thanks