Google I/O 2017で驚いたところ(Android多め)

# 概要
個人的なメモとして一通り書いていたのを軽くまとめたものです。
割とAndroidの開発者視点のものが多いと思います。

**太字が特に驚いたところです。**
**言っている場所のYouTubeのURLを貼るので、詳細が気になったらそれを開いてみてください！**
間違えているものがあればご指摘お願いします。(英語勉強します。)


# Keynote
みんな見ている気がするので省略
Google lensでWiFiのパスワード入れられるのめっちゃ便利。AIファースト。

# Developer Keynote
動画: https://www.youtube.com/watch?v=EtQ8Le8-zyo

* Kotlin
    * **KotlinがAndroidアプリの開発言語のfirst class supportになる**そうです。すごい。
    * https://youtu.be/EtQ8Le8-zyo?t=578
* Android Platform Support 
    * **GoogleのmavenリポジトリによってSDKマネージャでダウンロードする必要がなくなった**
    * https://youtu.be/EtQ8Le8-zyo?t=1036
  
```groovy
repositories{  
 maven {  
  // Google Maven Repository  
  url "https://maven.google.com"  
```

* Architecture Component
    * **ライフサイクルやベストプラクティスの共通の処理のためのライブラリ**
    * Googleが推奨する物が出てきたのがすごい。
    * https://youtu.be/EtQ8Le8-zyo?t=1055
* TwitterのPWA(Progressive Web App)アプリが92kbしかなかったのすごすぎる件
    * https://youtu.be/EtQ8Le8-zyo?t=2466
* ChromeでlighthouseでWebページのパフォーマンス測定
    * いい感じに調べられるようになってて汎用性が高そう
    * https://youtu.be/EtQ8Le8-zyo?t=2532
https://github.com/GoogleChrome/lighthouse
* Firebase Performanceがリリース
    * https://youtu.be/EtQ8Le8-zyo?t=2883
    * アプリのスタートタイム
    * ネットワーク  
    が見られるらしい
* Firebaseの大部分をOpen Sourceで公開する  
    https://youtu.be/EtQ8Le8-zyo?t=2935

# What's new in Android

* Android O  
    * Picture in pictureがスマホ対応  
Picture in pictureに入るのに、ManifestファイルにresizableActivity="true"はいらなくなり、supportPictureInPicture="true"とactivity.enterPictureInPicture()を呼び出すだけらしい  
        * https://youtu.be/1N9KveJ-FU8?t=196
    * **findViewByIdに型のキャストがいらなくなりました。**(これはcompileSdkVersionを変えるだけで適応されると思われるのでバージョンにかかわらず利用できるのではと思います。まだソースがダウンロードできないので検証できない)(知っていましたが反響が大きかったので、、)
        * https://youtu.be/1N9KveJ-FU8?t=889
    * 色やショートカット、通知についてはそのセッションについてで、、
* Support Library v26
    * そのセッションについてで

# Architecture Components - Introduction (Google I/O '17)
https://youtu.be/FrteWKKVyzI

* "Big changes to how we recommend that you build application"  
**推奨しているアプリケーションの作り方を変えた！**
https://youtu.be/FrteWKKVyzI?t=14
 
**Architecture Componentsに登場したものは基本的に驚きました。。**

* Lifecycle Made Easy  
https://youtu.be/FrteWKKVyzI?t=647
    * **LifecycleOwner**  
→ Lifecycleを管理しているクラス、getLifecycle()でLifecycleクラスを返す、LifecycleActivityやLifecycleFragment(それぞれLifecycleOwnerを継承している)を継承して通常は利用する  
    * **LifecycleObserver**  
→ Lifecycle.addObserver()で追加するもの。(正確にはLifecycleRegistryで管理されていて)ライフサイクルに変化があった時に`@OnLifecycleEvent(ON_START)`などがついているメソッドが呼び出される。
    * **LiveData**(RxJavaを見たことがあればObservableをイメージすると分かりやすいです。)  
→ ライフサイクルを検知するObservable(変更が検知できる)。 startとstopだけ書けば動く。(中ではLifecycleObserverを利用している)
    * **ViewModel**  
→ LiveDataで保持していた値を画面回転後も持っていたい  
→ ActivityやFragmentでデータを保持しておきたい時に使う

Lifecycleに関する個人的なメモUML:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/18e04bc9-65b0-eb29-f7ab-e53d1d3e38d4.png)

* データの永続化
    * https://youtu.be/FrteWKKVyzI?t=1276
    * Roomというライブラリを作った
        * **RoomはSQLiteのためのマッピングライブラリ**
        * ボイラープレートがいらない
        * SQLite
        * コンパイル時にSQLを検証してくれる
        * **データの変更を検知してLiveDataで返せる**
        * **RxJava2をサポート**  
**Retrofitっぽく書けるのも個人的にとても良いです！**

* アーキテクチャ
    * https://youtu.be/FrteWKKVyzI?t=1677
    * 良いアプリケーションを書く事ができると信じているが、従う必要はない。
    * UIコントローラ(Acctivity, Fragment) , View Model, Repository, Datasourceから構成される
        * それぞれの役割の説明は必見です！  https://youtu.be/FrteWKKVyzI?t=1729
    * DIについて公式からあった
    * **RetrofitやDaggerが公式サンプルで登場**
    * Daggerでなくて、[Service Locator](https://en.wikipedia.org/wiki/Service_locator_pattern)を使う方法もあると説明。

* アプリを書き直すべきか？
→ **あなたが満足しているのであれば書き直す必要はない。**


# Architecture Components - Solving the Lifecycle Problem
https://www.youtube.com/watch?v=bEKNi1JOrNs

* LifecycleOwnerの**LyfecycleActivityやLifecycleFragmentは将来的にはAppCompatActivityやSupport LibraryのFragmentに統合**
    * https://youtu.be/bEKNi1JOrNs?t=352
* Custom LifecycleOwnerを使うとテストが出来る
    * https://youtu.be/bEKNi1JOrNs?t=479
* LiveDataクラスを継承して自分でLiveDataを作れる 作り方はRxJavaのObservableを作る感じ LiveDataはonPause後に勝手に流れなくなったりonDestroyで消したり管理してくれる
    * https://youtu.be/bEKNi1JOrNs?t=884
* LiveDataはRxJavaでは？
    * https://youtu.be/bEKNi1JOrNs?t=1160
    * YES: Reactive programming modelである
    * NO: ライフサイクルawareなのが簡単にかける

* RxJavaから移行するべきか？
    * https://youtu.be/bEKNi1JOrNs?t=1241
    * **すでに正しくライフサイクルを管理できていると思うので、移行しないでいい**
* 新しいプロジェクトではどうするべきか？
    * https://youtu.be/bEKNi1JOrNs?t=1277
    * LiveDataではじめる
    * またはもっとリアクティブプログラミングしたければRxJava
* LiveData.postValueでmainThread以外からも値をpostできる
    * https://youtu.be/bEKNi1JOrNs?t=1359
* LiveDataReactiveStreams
    * https://youtu.be/bEKNi1JOrNs?t=1315
    * compile "android.arch.lifecycle:reactivestreams:1.0.0-alpha1"
    * fromPublisher, toPublisherで使える
    * **RxJavaなどとの連携がスムーズに！**
* LiveDataは基本的にHolderであってStreamではない
    * https://youtu.be/bEKNi1JOrNs?t=1335
    * (個人的にはRxJavaのBehaviorSubjectみたいなものだと思っているのですがどうなんでしょ、、)
* **ViewModelはFragment間でのデータの受け渡しでも使える！**  
    * https://youtu.be/bEKNi1JOrNs?t=1762
    * ViewModelProviders.of(getActivity())// ここでActivityスコープなのでFragment間で受け渡しができる  
   .get(SharedViewModel.class)
* ViewModelは絶対にViewのインスタンス、Activity、resource(draweableなど)を持ってはいけない
https://youtu.be/bEKNi1JOrNs?t=1788

# Architecture Components - Persistence and Offline (Google I/O '17)
https://www.youtube.com/watch?v=MfHsPGQ6bgE
* 簡単にかける！
https://youtu.be/MfHsPGQ6bgE?t=234

```java
@Dao
interface FeedDao {
  @Query("SELECT * FROM feed WHERE title = :query")
  Feed loadFeeds(String query);
}

@Database (entities={Feed.class},version=1) 
abstract class Database {
}
```

* `@Insert`  
https://youtu.be/MfHsPGQ6bgE?t=341  
引数に複数入れられるし、コンフリクトのときのストラテジーも設定できる
* `@Update`や`@Delete`出来る
* 引数にArrayを渡して、SQLiteの`IN(:ids)`などで複数指定したり出来る
    * https://youtu.be/MfHsPGQ6bgE?t=403
* Room Speaks SQL
    * https://youtu.be/MfHsPGQ6bgE?t=422
    * コンパイル時にfieldがないとかテーブルがないとか警告してくれるので安全
* Roomで1カラムを受け取るときはStringとかに返り値をすることも可能 
* roomのTypeAdapter  
    * https://youtu.be/MfHsPGQ6bgE?t=621
TypeComberters(MyConverter.class)  
をDatabaseやDaoクラスにつけて、型の変換することが出来る  
**問い合わせなどではDate型を使って、SQLiteの中ではUnixタイムを使うということが出来る**
* Embeddedをつけると、同じテーブルにフィールドの中の値を入れられる  
→2つあるとエラーになる`@Embedded(prefix=“seen_")`とかつけてあげれば、その中にあるfieldをすべてprefixつけて解決できる  
* Observability  
    * https://youtu.be/MfHsPGQ6bgE?t=1119  
**Listではなく、LiveDataオブジェクトを返してあげるように書くと、アップデートを受け取れる 同様にFlowableにも変えられる**  
* Entityの中にEntityは書けるか？   
    * https://youtu.be/MfHsPGQ6bgE?t=1536   
どこまで取ってくるかが難しい。    
SQLiteで普通にJOINなどして、複数のテーブルから取得してきて、表示用のEntityを用意して、それにいれてあげるのが良い(理由は動画で見てね)  
* Room `@Entity(foreignKeys=...)`とかちゃんとリレーションも設定できる。    
    * https://youtu.be/MfHsPGQ6bgE?t=1821
* `@Entity(indices= {@Index("title","subTitle")})`とかでインデックスも貼れる
* RoomのTest
    * https://youtu.be/MfHsPGQ6bgE?t=1961  
    * Junitで、Room.inMemoryDatabaseBuilderでモックのデータベース作ってテストできる(すごい)    
* MockitoでDaoのMockを作ってもテストできる
* マイグレーションの方法
https://youtu.be/MfHsPGQ6bgE?t=2119

```java
addMigrations(new Migration(1, 2){
            migrate(){
                executeSQL("ALTER TABLE...")
            }
   })
```

* **マイグレーションのテストも出来る**  
MigrationTestHelper.runMigrationsAndValidateメソッドで出来る  


# What's new in the support library
https://www.youtube.com/watch?v=V6-roIeNUY0

* **Support Library minSdkVersion 14に**
    * https://youtu.be/V6-roIeNUY0?t=135
* **Support LibraryがGoogleのMavenに移動したのでSDKManagerから落とす必要なくなった**
    * https://youtu.be/V6-roIeNUY0?t=229
* New issue trackerに移行された
    * https://youtu.be/V6-roIeNUY0?t=306
* **Font in XML res/fontが使えるように。TextViewにandroid:fontFamily="@font/myfont"**   
    * https://youtu.be/V6-roIeNUY0?t=440  
**コードからセットするときはResourceCompat.getFontしてtextView.SetTypeface**  
**800種類のgoogleのfontがGoogle Play Servicesによって使えるように**  
* **Android Studio 3.0でダウンロードfontを設定すると自動でダウンロードのxmlとか書いてくれる！**  
* Emoji Compatibility Library  
    * support-emoji ダウンロード版と、バンドル版がある **バンドル版は7mbあるので注意してね**
    * **support-emoji API Level 19**
* TextView auto sizing  
TextViewにautoSizeTextType=“uniform”でできる
細かいサイズの設定もできる  
* Dynamic Animation  
SpringAnimation
anim.getSpring().setDampingRatio
* VerctorDrawableCompat
Fillできるようになった？もっと細かい指定ができる
* AnimatedVectorDrawableCompat  
    * https://youtu.be/V6-roIeNUY0?t=1518  
**path morphing対応**  
つまりこんなアニメーションが出来るようになりました  
http://qiita.com/takahirom/items/3deee8b73e0a2bc1a50b#path%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%81%AE%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A6%81%E7%B4%A0
* PathInterpolator   
<pathInterpolator android:pathData=“M 0.0…"  
<objectAnimator android:interpolator=“@…"
* new Wear Support Livrary Module  
WearRecyclerView  
BoxInsetLayout
など
* LeanbackにDetailViewが追加 かっこいい
* PreferenceDataStore  
Preferenceの保存先とか保存処理を自分で実装できるらしい

# What's New in Android Development Tools (Google I/O '17)
* この公式ブログがすごく分かりやすくてすぐ見れていい感じです
* https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html


* **Android Studio3.0でNetworkをデバッグで見れるようになって、通信している画像とか見れるようになった！！**
    * HttpUrlConnectionとVolleyとOkHttp3.0のcanaryも対応
* EmulatorにProxy Support追加  
* など
* ![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/cf15128c-84a0-a846-67b8-b27bfdfd402e.png) (https://www.youtube.com/watch?v=Hx_rwS1NTiI より)

# What's New in Android Design Tools - New Features for Rapid UI Development
https://www.youtube.com/watch?v=nYb4FUdlLZE
* ConstraintLayout 1.1.0 beta1はBarriers, Group, Placeholder, Percent dimensionsが追加
    * https://youtu.be/nYb4FUdlLZE?t=677
* Android Studio 3.0でapp/sampledataフォルダに文字列が書いてあるファイルを置くとtools:text="@tools:sample/strings"で参照できたりする(試してみたけどうまく動かない？？)
* **ConstraintSetを使うとレイアウトやViewからConstraintを取得して、他のレイアウトやViewにセットが出来る これでRotation対応ができる**(ちょっとよく分かっていない)
    * https://youtu.be/nYb4FUdlLZE?t=1737
* ConstraintSet + beginDelayedTransitionで楽々アニメーションができそう

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ConstraintSets + Transitions are 🤘 That&#39;s basically how we built this interaction in the I/O app. <a href="https://t.co/KiSpdKLS4e">https://t.co/KiSpdKLS4e</a> <a href="https://t.co/PhlVGXn3Wj">pic.twitter.com/PhlVGXn3Wj</a></p>&mdash; Nick Butcher (@crafty) <a href="https://twitter.com/crafty/status/867376535019368448">2017年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# What's New in Notifications, Launcher Icons, and Shortcuts 
https://www.youtube.com/watch?v=TB-K6OniF68

* **Launcher Icon APIは直径66dpが安全ゾーンで、それ以外は切り取られる可能性がある**ので注意が必要。そこには大切なものを入れないほうが良さそう。
    * https://youtu.be/TB-K6OniF68?t=297
* mipmap-anydpiにic_launcher.xmlにLauncher Icon用のxmlを置いて、O未満用のはmipmap-xxhdpiなどにic_launcher.pngなどで置く
    * https://youtu.be/TB-K6OniF68?t=389
* **insetを入れて再利用してあげることで、古いアイコンを使って新しいアイコンを作れるので、APKサイズに優しく出来る**  
    * https://youtu.be/TB-K6OniF68?t=513
* Android Oのランチャーの設定からアイコンを丸く切り抜くとか選べる
* **Android Oではcom.android.launcher.action.INSTALL_SHORTCUTが無効化された。**かわりにrequestPinShortcutを使う。
    * https://youtu.be/TB-K6OniF68?t=848

Behavior Changesにも書いてありました。
https://developer.android.com/preview/behavior-changes.html

> The com.android.launcher.action.INSTALL_SHORTCUT broadcast no longer has any effect on your app, because it is now a private, implicit broadcast. Instead, you should create an app shortcut by using the requestPinShortcut() method from the ShortcutManager class.

* **AppWidgetManager.requestPinAppWidgetでウォジェットが置けるダイアログが表示させられる** Oが普通になれば、ウィジェット復権ありえますね。
    * https://youtu.be/TB-K6OniF68?t=937
* **通知の順番ソートが変わる**
    * https://youtu.be/TB-K6OniF68?t=1031
    * 以下の順番(ちょっとよく分かっていないのでコードが出て時間があればコードを読みたい)
    * Major Ongoing
        * 重要な現在進行中のタスク
        * Media notification
        * Foreground Service
            * setColorizedで通知に色がつけられる
    * People to People
        * MessagingStyle
        * Default SMS App
    * General
    * BTW
* cannel(コード上) = category(UI上)単位でユーザーが通知を拒否できる
* categoriesは飛行機のアプリであればFlight updatesやExcutive proguramなどにする
* カテゴリに対して振動するかどうかなどの細かい設定ができる(ユーザーも変更できる) 
    * https://youtu.be/TB-K6OniF68?t=1853
* カテゴリはアプリの文脈によって部屋であったり、タイトルであったり、送信者であったりする

# Speeding Up Your Android Gradle Builds (Google I/O '17)
https://www.youtube.com/watch?v=7ll-rkLCtyk

以下のQiitaがよくまとまっています。
http://qiita.com/rkowase/items/808064f16272e131be63
* 追記するのであれば、DexInProcessが有効になっていれば、javaMaxHeapSizeは意味がないので、消したほうが良いという話がありました。


* Android Gradle Pluginの話
    * https://youtu.be/7ll-rkLCtyk?t=1364
    * app -> lib1 -> lib2と言うかたちで依存していた時を思い浮かべてください(compile project(":lib1")みたいな形)
    * ABI(Application Binary Interface)
        * これは主にpublicメソッドなどのことを指す
    * 3.0未満ではlib2などでABIが変わっておらず中身の実装が変わった時も、依存しているモジュールapp,lib1でビルドが走る
    * 3.0からはABIが変わった時以外は再ビルドしない。


    * 3.0でもABIがかわったらapp, lib1で再ビルドがかかる
        * なぜappも再ビルドしなくてはいけないのか？
            * appがlib1もlib2も見える状態になっているから
            * なので、compileの代わりにimplementationが登場！


 → **Android Gradle Plugin 3.0からはdependenciesのcompileはdeprecatedになり、apiとimplementationになる**
 → apiはこれまで通り
 → implementationはappからlib2が見えないような形(つまりtransitive dependencyが発動しない)

# Prototyping to Production Bridging the Gap with a Common Tool
https://www.youtube.com/watch?v=BJCqRpvvTrM

カードの画像を見た時に
デザイナはマテリアルコンポーネントのカードだなと思って
開発者はBoxに影があって、端っこが丸くて、ボタンが有ると思う。
言語の違いがある。

→それをうめるのにFlatterを使う。
開発もデザイナも同じコードベースを見る感じ

Flutter にはマテリアルデザインのコンポーネントがたくさん用意されている
FlutterでRippleさせるにはInkWell。iOSでもRippleする 

ちなみに**文法はKotlinのAnkoっぽかったです。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/3741c2b9-0a81-4abf-3bae-327744ce94b0.png)


# Machine Learning APIs by Example
https://www.youtube.com/watch?v=ETeeSYMGZn0
Video , Vision , Speech , Natural Language, TranslationのAPIの紹介という感じだった ここにそれぞれのサンプルコードがあるみたい　https://github.com/sararob/ml-talk-demos

# Single codebase, Two Apps!
https://www.youtube.com/watch?v=w2TcYP8qiRI

Flutterを始めるには？

```
git clone -b alpha https://github.com/flutter/flutter.git 
// flutterへのパスを通す
flutter doctor
```

reactに似ている

Flatterによるアプリ開発
**370行で画像のアップロードまで出来るチャットアプリが作れる。AndroidでもiOSでもOK**
すごい

# Understanding color
https://www.youtube.com/watch?v=r8NeG0wmFXM
本当に色の話をしていました。
RGBにも色んな種類があり、Android Oからそれを変換したり出来るよという話でした。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AndroidOでColor.valueOfの引数でADOBE_RGBなど、どのRGBを使うか渡せるようになった  <a href="https://twitter.com/hashtag/io17jp?src=hash">#io17jp</a> <a href="https://t.co/3W4Q7gB14K">pic.twitter.com/3W4Q7gB14K</a></p>&mdash; takahirom (@new_runnable) <a href="https://twitter.com/new_runnable/status/865642657967513602">2017年5月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

種類が違うと全然画像の見え方が違いました。
また広い色域を使いたい場合は`<activity android:colorMode="wideColorGamut"`でできるそうです。


# まとめ
初めてのGoogle I/Oでしたが、さまざまなセッションがあり、
たくさんのセッションを集中的に見る機会は少ないため、知見にあふれていてとても良い機会になりました。
英語力の足りなさを実感できたので、強化して、ぜひまた行きたいです！