設定「画面の自動回転」は OFF で良い。

急いでいるときに、

スマホを操作するとき、

画面が回転してイラッとする。

以前に考え方について書いてはみましたが。

👉 【Android Pie】Auto-rotate (自動回転) OFF のときの挙動 

今現在のAndroid最新は「Anroid10」=「Android Q」ですが、画面回転の設定に関しては同様なことが言えます。

自動画面回転はOFFにしておくべき

考え方としては、

画面固定(自動回転OFF)にしておいて、画面回転するかしないかはサジェスチョンボタンで操作する

がオススメです。

これは、「Android OS 9 Pie」でも「Android OS 10 Q」でも同様です。


今どきの「ネット接続してるかどうか」のコード。

ググると公式リファレンスが見つかる。


val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true

しかし、このコードはAPI29で非推奨。

Note: getActiveNetworkInfo() was deprecated in Android 10. Use NetworkCallbacks instead for apps that target Android 10 (API level 29) and higher.

👉 Monitor connectivity status and connection metering 

Android 10 で通信状態の変更を監視するには、 ConnectivityManager.registerNetworkCallback() を使いましょう。

👉 Android 10 時代の Connectivity Monitoring - takasfz blog 

- コールバックの登録/解除のタイミングはライフサイクルに依存する。
- コールバック onAvailable()/onLost() は、非メインスレッド上で受信。

よって、MVVM上で使うとなると、LiveData化するのが良さげ。


class ConnectivityLiveData @VisibleForTesting internal constructor(private val connectivityManager: ConnectivityManager)
    : LiveData<Boolean>() {

    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
    constructor(application: Application) : this(application.getSystemService(Context.CONNECTIVITY_SERVICE)
        as ConnectivityManager)

    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network?) {
            postValue(true)
        }

        override fun onLost(network: Network?) {
            postValue(false)
        }
    }

    override fun onActive() {
        super.onActive()

        val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
        postValue(activeNetwork?.isConnectedOrConnecting == true)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            connectivityManager.registerDefaultNetworkCallback(networkCallback)
        } else {
            val builder = NetworkRequest.Builder()
            connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
        }
    }

    override fun onInactive() {
        super.onInactive()
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }
}

👉 ConnectivityLiveData - AndroidPub 

まとめ

ただ「ネットが使える/使えない」を判定させるだけの実装がここまでややこしいSDKてのは問題じゃねえか?!

みんな混乱してるようにみえるけども。

もっといい感じがあれば教えてね!


今どきの Retrofit と LiveData で Coroutine

ありがとうございます。


👉 Retrofit 

ご存知の通り Retrofit2 では、サスペンドな関数も利用できるようになっております。

👉 SpaceX REST API で試す Retrofit の coroutine 対応 


// NewModel.kt
@GET("/feed/here/")
suspend fun getData(@Query("token") token : String) : Status


// NewRepository.kt
class Repository {
  var client = RetrofitService.createService(JsonApi::class.java)
  suspend fun getData(token : String) = client.getData(token)
}

ので、以下のようなこれまでのコードは、


// OldViewModel.kt
val data = MutableLiveData<Status>()

private fun loadData(token: String){
  viewModelScope.launch {
    val retrievedData = withContext(Dispatchers.IO) {
      repository.getData(token)
    }
    data.value = retrievedData
  }
}

シンプルに以下のように書けます。


// NewViewModel.kt
val data : LiveData<Status> = liveData(Dispatchers.IO) {
      val retrievedData = repository.getData(token)
      emit(retrievedData)
    }

ありがとうございます。

👉 Exploring new Coroutines and Lifecycle Architectural Components integration on Android 
👉 Using Retrofit 2 with Kotlin coroutines - ProAndroidDev 


Android A/B パーテーション と Lineage OS インストール

大まかでもイメージしておくと得をすると思います。

👉 Here's a list of Android devices that support Seamless Updates 


👉 Download TWRP for sailfish 
👉 サポートが切れた Pixel に Android 10 相当の Lineage OS 17 を 

分かりやすく簡単に言いますが。

昔のパーテーション。

- recovery
- boot
- cache
- system
- vendor
- data

これが、Pixel時代以降の、A/B スタイルでは以下のようになります。

- boot_a
- boot_b
- system_a
- system_b
- vendor_a
- vendor_b
- data

キャッシュディレクトリは data/cache、リカバリパーテーションは boot_a と boot_b 以下に統合されました。

TWRP の flash 時には考慮が必須となります。

そして、TWRPのバージョンは、OpenGapps の 「Signature Verification」にも関係してきます。

👉 Help understanding A/B partitions | Google Pixel XL 
👉 TWRP lead explains why it'll take time for the custom recovery to support Android 10 

さらに、Android10では「ダイナミックパーテーション」などになるようです。

👉 Implementing Dynamic Partitions  |  Android Open Source Project 

よって、

Android10で初回のTWRP適用は、いきなり fastboot で flash するのはむずい。

なので、まず fastboot boot /path/to/twrp.img でメモリブートする。

そして、TWRPの端末への適用はインストーラ入りのzipで行う。

のが良いようです。

Pixelで以下の順でハマり続けた結果です。

Android10

非公式LineageOS17(Android10相当)

公式LineageOS16(Android9相当)


サポートが切れた Pixel に Android 10 相当の Lineage OS 17 を

サポート切れです、Pixel。

👉 Pixel スマートフォンと Nexus デバイスで Android アップデートが提供されるタイミング - Pixel Phone ヘルプ 

アンオフィシャルだが、入れてみました、どうせ入れる。

👉 [LineageOS 17] Download LineageOS 17 for Supported Devices 

手順は、おおまかに以下の流れ。

1. BootLoader アンロック
2. TWRP をリカバリ領域にインストール
3. すべてのパーティションをワイプ
4. LineageOS をインストール
5. リカバリモードでリブート
6. GApps をインストール
7. リブート

👉 [LineageOS 17] Download LineageOS 17 for Pixel (Android 10) 

で、インストールできて問題なく稼働しているように見えるが、いろいろあるだろうよアンオフィシャル。

オフィシャル版公開時に向けて忘備録。

ブラウザ、ギャラリー、カメラ、ファイル、時計などのアプリはオリジナル版が同梱されているので、Android OS標準のGoogle産をインストールすると重複する。いくつか無効化した。

twrp-pixel-installer-sailfish-3.3.1-0.zip がアップされたら それを適用してみるべし。

👉 Download TWRP for sailfish 

Long story short, TWRP support for Android 10 is going to take a while.
(要するに、Android 10のTWRPサポートにはしばらく時間がかかります。)
とのこと。

👉 TWRP and Android 10 

リカバリ領域に上書きできなくて、一時的に boot して zip からインストールする。

$ fastboot boot path/to/twrp.img

fastboot flash recovery で上書き出来たようにみえても暗号化パスワードが通らず、ファイル群は暗号化されたまま。再度上書きできない → Factoryイメージに戻さないとかも。

👉 TWRP for Google Pixel
👉 vendor partition does not exists : LineageOS 

OEMアンロックは、開発者オプションのスイッチボタン押した後、

$ fastboot flashing unlock

ロックは逆。

👉 Flashing Devices  |  Android Open Source Project 

いろいろあるけど、TWRPの進捗を中心に気にしておこうかな。


👉 LineageOS – LineageOS Android Distribution 

動画に収めたかったけど、すんなりいかなかった。

👉 Android標準リカバリ「Android Recovery」を使う方法 
👉 Android Q で 画面録画機能は利用できるのか。Can we use Screen Recording on Android Q stable release? 


Related Categories :  AndroidLineageOSReputationTools