API31以上で没入モード全画面表示


以前からAndroidアプリのイマーシブモードとは格闘しているものの、古いプロジェクトを更新しているとAndroid Studioを使うようになった辺りから、システムのユーザーインターフェース(上部ステータスバーと下部ナビゲーションバー)の表示非表示で使うwindow.decorView.systemUiVisibilityが廃止になりますよと言う警告を目にしていたので、未だ最新OS事案はないもののやってくる前に(公式の文書が古いこともあり)対応しました。具体的にはAndroid 12以上に対応する際の onWindowFocusChanged で呼び出す際に Android Studio 2021.3.1でエラーを吐かない hideSystemUI 関数の書き方になります。

private fun hideSystemUI() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
  }
  
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    window.setDecorFitsSystemWindows(false)
    window.insetsController?.apply {
      hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
      systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
  } else {
    @Suppress("DEPRECATION")
    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
      or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
      or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
      or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
      or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
      or View.SYSTEM_UI_FLAG_FULLSCREEN)
  }
}

参考: java – Immersive fullscreen on Android 11 – Stack Overflow

コード全体はこちら: Enabling Immersive Mode from JavaScript Event on WebView