Kotlin 1.3 で CoroutineScope

Kotlin 1.3 RC is Here: Migrate Your Coroutines! | Kotlin Blog

新しくこんなの出てます。


public interface CoroutineScope {

  /**
   * Returns `true` when this coroutine is still active (has not completed and was not cancelled yet).
   *
   * Check this property in long-running computation loops to support cancellation:
   * ```
   * while (isActive) {
   *   // do some computation
   * }
   * ```
   *
   * This property is a shortcut for `coroutineContext.isActive` in the scope when
   * [CoroutineScope] is available.
   * See [coroutineContext][kotlin.coroutines.experimental.coroutineContext],
   * [isActive][kotlinx.coroutines.experimental.isActive] and [Job.isActive].
   *
   * @suppress **Deprecated**: Deprecated in favor of top-level extension property
   */
  @Deprecated(level = DeprecationLevel.HIDDEN, message = "Deprecated in favor of top-level extension property")
  public val isActive: Boolean
    get() = coroutineContext[Job]?.isActive ?: true

  /**
   * Returns the context of this scope.
   */
  public val coroutineContext: CoroutineContext

}

新しいコルーチンのスコープです。

すべてのコルーチンビルダーは CoroutineScope の拡張となり、これを継承したコルーチンコンテキストは自動的にすべての要素にキャンセルを伝えることができます。

これを使って、アクティビティのライフサイクル周りを実装します。


class MyActivity : AppCompatActivity(), CoroutineScope {

  lateinit var job: Job

  override val coroutineContext: CoroutineContext
      get() = Dispatchers.Main + job


  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    job = Job()
  }


  override fun onDestroy() {
    super.onDestroy()

    // すべての子ジョブが destroy されたあと
    // 自動的にキャンセル
    job.cancel() 
  }


  // Activity が destroy されるか、このメソッド内で、例外が
  // 発生すると、すべてのネストしたコルーチンはキャンセルされる

  fun loadDataFromUI() = launch { // メインスレッドで起動

    val ioData = async(Dispatchers.IO) { // IOコンテキストで起動
      // ブロッキング I/O 処理
    }

    //  I/O の結果を wait
    val data = ioData.await()

    // メインスレッドで描画
    draw(data) 
  }
}

簡単な記述で、ネストしたコルーチンすべてを自動的にキャンセルしてくれるのです。

Kotlin 1.3 RC is Here: Migrate Your Coroutines! | Kotlin Blog

Using Kotlin Coroutines in your Android App


11月1日に迫った「targetSdkVersion は 26以上」に向けての対応の目処

メール来てますよね。

Hello Google Play Developer,

This is a reminder that starting November 1, 2018, updates to apps and games on Google Play will be required to target Android Oreo (API level 26) or higher. After this date, the Play Console will prevent you from submitting new APKs with a targetSdkVersion less than 26.

Configuring your app to target a recent API level ensures that users benefit from significant security and performance improvements, while still allowing your app to run on older Android versions (down to the minSdkVersion).

Action required

Please ensure that your apps are configured to target at least Android 8.0 (API level 26) by November 1, 2018. For technical advice on how to change your app's target API level to meet these requirements, refer to the migration guide.

Affected apps

The apps included below have one or more APKs—in production or testing tracks—that aren't currently targeting API level 26 or higher. Apps are listed with the maximum version code and corresponding targetSdkVersion. If you have more than 20 apps that could be affected in your account, please check the Play Console for a full list.

動くとはいうものの、GoogleサービスAPIの仕様や各サービス/プラットフォームのポリシーの変更が頻繁なことを考えると、放置しているアプリは一掃されていくと思われます。

メールには、以下が「マイグレーションガイド」として案内されています。

Meet Google Play's target API level requirement  |  Android Developers

おおまかに、影響しそうなキーワードを拾っておきます。

API 23 (6.0) 未満

「Runtime Permission」
実行時のパーミッション リクエスト  |  Android Developers

API 24 (7.0) 未満

「Doze」
Doze と App Standby 用に最適化する  |  Android Developers

「Firebase Cloud Messaging (FCM)」
Firebase Cloud Messaging  |  Firebase

「file://」
Setting up file sharing  |  Android Developers

API 26 (8.0) 未満

「startService()」
「startForeground()」
「startForegroundService()」
「Firebase Cloud Messaging (FCM)」
「Google Play services SDK」
「JobScheduler」

バックグラウンド実行制限  |  Android Developers

「Notification」
Create and Manage Notification Channels  |  Android Developers

「ANDROID_ID」
Settings.Secure  |  Android Developers

「multiple window/display」
マルチ ウィンドウのサポート  |  Android Developers
Android 8.0 の機能と API  |  Android Developers

「Camera API」
android.hardware.camera2  |  Android Developers

まとめ

Gradle周りやライブラリ同士の依存関係などもあって簡単には終われないですよね。

保守的に古いSDKにスティックしていた開発陣はモヤモヤ一掃のチャンスと思うべし。

あと、オプトインしといたほうがいいよ、と以下リンクがありました。

http://g.co/play/monthlynews


史上初のスマホ老人時代に向けての老眼対策 4つの文字拡大設定

たいそうなタイトルですが、

実際、人類初ですよね、スマホの登場からして。

「すでに、ワシは5インチのスマホでは老眼で文字が読めないがのぅ。」

そんなわれらスマホジジイのための拡大系設定が4つあるようです。

拡大操作 - Android Accessibility ヘルプ

実際にAndroid Pie で確認してみます。

4つの拡大方法のうち、どれが使いやすいでしょうか。

1. フォントサイズの変更

フォントサイズを変更します。

1. 端末の設定アプリを開きます。
2. [ユーザー補助]、[フォントサイズ] をタップします。
3. スライダーを使って、希望するフォントサイズを選択します。

フォントサイズの設定は、Google Chrome アプリには適用されません。Chrome アプリでは独自に文字のサイズを管理しています。

小・デフォルト・大・最大の4段階。
アプリによっては、レイアウトが壊れたりします。

2. 表示サイズの変更

画面上に表示されているアイテムのサイズを変更します。

1. 端末の設定アプリを開きます。
2. [ユーザー補助]、[表示サイズ] をタップします。
3. スライダーを使って、希望する表示サイズを選択します。

小・デフォルト・大・特大・最大 の5段階。
フォントとコンテンツレイアウトが同時に拡大・縮小されますのでレイアウト崩れが少ない雰囲気です。

3. トリプルタップで拡大

1. 端末の設定アプリ 設定 を起動します。
2. [ユーザー補助]、[拡大] を開きます。
3. [トリプルタップで拡大] を選択します。

A. ズームインですべてを拡大する
1. 画面(キーボードとナビゲーション バー以外の場所)をトリプルタップします。
2. パン操作を行ったり、ズームレベルを調整したりできるようになります。
- パン操作を行うには、2 本以上の指で画面上をドラッグします。
- ズームレベルを調整するには、2 本以上の指をつまむように近づけたり(ピンチイン)、離して広げたり(ズームアウト)します。
3. 画面をトリプルタップすると、ズームアウトします。

B. 画面を一時的に拡大する
1. 画面(キーボードとナビゲーション バー以外の場所)をトリプルタップして押し続けます。
2. 拡大した領域を移動するには、指で画面上をドラッグします。
3. 拡大を停止するには、指を離します。

トリプルタップが意外に面倒。誤操作も発生したり。

4. ボタンで拡大

1. 端末の設定アプリ 設定 を起動します。
2. [ユーザー補助]、[拡大] を開きます。
3. [ボタンで拡大] を選択します。

A. ズームインですべてを拡大する
1. ユーザー補助機能アイコン をタップします。
2. 画面(キーボードとナビゲーション バー以外の場所)をタップします。
3. パン操作を行ったり、ズームレベルを調整したりできるようになります。
- パン操作を行うには、2 本以上の指で画面上をドラッグします。
- ズームレベルを調整するには、2 本以上の指をつまむように近づけたり(ピンチイン)、離して広げたり(ズームアウト)します。
4. ユーザー補助機能アイコン をタップすると、ズームアウトします。

B. 画面を一時的に拡大する
1. ユーザー補助機能アイコン をタップします。
2. 画面(キーボードとナビゲーション バー以外の場所)をタップして押し続けます。
3. 拡大した領域を移動するには、指で画面上をドラッグします。
4. 拡大を停止するには、指を離します。

直感的に操作ができる気がする。指を離すと拡大が終了する一時的な、のがフツーに使いやすそう。

まとめ

現在のAndroidで文字を拡大する設定は、すべて、

「設定」-「ユーザー補助」

から。


   設定
    ┣ ユーザー補助
        ┣ フォントサイズ (1)
        ┣ 表示サイズ (2)
        ┣ 拡大
            ┣ トリプルタップで拡大 (3)
            ┗ ボタンで拡大 (4)

4つ設定を組み合わせて使うことができるようですが、逆にややこしいか。

私は、まずは「ボタンで拡大」を使っていこうと思います。

とはいえ、アマゾンランキングで人気の老眼鏡でも買ったほうが良くね?