Fix system bar insets

This commit is contained in:
MM20 2022-03-29 21:00:58 +02:00
parent 4ad482d441
commit bfc370fcf6
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 67 additions and 17 deletions

View File

@ -53,29 +53,29 @@ class LauncherActivity : BaseActivity() {
} }
viewModel.lightStatusBar.observe(this) { viewModel.lightStatusBar.observe(this) {
val windowController = ViewCompat.getWindowInsetsController(binding.rootView) val windowController = WindowCompat.getInsetsController(window, binding.rootView)
windowController?.isAppearanceLightStatusBars = it windowController.isAppearanceLightStatusBars = it
} }
viewModel.lightNavBar.observe(this) { viewModel.lightNavBar.observe(this) {
val windowController = ViewCompat.getWindowInsetsController(binding.rootView) val windowController = WindowCompat.getInsetsController(window, binding.rootView)
windowController?.isAppearanceLightNavigationBars = it windowController.isAppearanceLightNavigationBars = it
} }
viewModel.hideStatusBar.observe(this) { viewModel.hideStatusBar.observe(this) {
val windowController = ViewCompat.getWindowInsetsController(binding.rootView) val windowController = WindowCompat.getInsetsController(window, binding.rootView)
if (it) { if (it) {
windowController?.hide(WindowInsetsCompat.Type.statusBars()) windowController.hide(WindowInsetsCompat.Type.statusBars())
} else { } else {
windowController?.show(WindowInsetsCompat.Type.statusBars()) windowController.show(WindowInsetsCompat.Type.statusBars())
} }
} }
viewModel.hideNavBar.observe(this) { viewModel.hideNavBar.observe(this) {
val windowController = ViewCompat.getWindowInsetsController(binding.rootView) val windowController = WindowCompat.getInsetsController(window, binding.rootView)
if (it) { if (it) {
windowController?.hide(WindowInsetsCompat.Type.navigationBars()) windowController.hide(WindowInsetsCompat.Type.navigationBars())
} else { } else {
windowController?.show(WindowInsetsCompat.Type.navigationBars()) windowController.show(WindowInsetsCompat.Type.navigationBars())
} }
} }
@ -126,8 +126,8 @@ class LauncherActivity : BaseActivity() {
override fun onAttachedToWindow() { override fun onAttachedToWindow() {
super.onAttachedToWindow() super.onAttachedToWindow()
val windowController = ViewCompat.getWindowInsetsController(binding.rootView) val windowController = WindowCompat.getInsetsController(window, binding.rootView)
windowController?.systemBarsBehavior = windowController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
} }

View File

@ -21,6 +21,9 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
val dataStore: LauncherDataStore by inject() val dataStore: LauncherDataStore by inject()
val hideStatusBar = dataStore.data.map { it.systemBars.hideStatusBar }.asLiveData()
val hideNavBar = dataStore.data.map { it.systemBars.hideNavBar }.asLiveData()
val autoFocus = dataStore.data.map { it.searchBar.autoFocus }.asLiveData() val autoFocus = dataStore.data.map { it.searchBar.autoFocus }.asLiveData()
var scrollY = 0 var scrollY = 0

View File

@ -5,6 +5,7 @@ import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
@ -18,8 +19,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.*
import androidx.core.view.setPadding
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
@ -239,8 +239,56 @@ class LauncherScaffoldView @JvmOverloads constructor(
context.window.statusBarColor = it context.window.statusBarColor = it
} }
viewModel.darkStatusBarIcons.observe(context) { viewModel.darkStatusBarIcons.observe(context) {
WindowInsetsControllerCompat(context.window, this).isAppearanceLightStatusBars = it WindowCompat.getInsetsController(context.window, this).isAppearanceLightStatusBars = it
} }
viewModel.hideNavBar.observe(context) {
updateInsetPaddings()
}
viewModel.hideStatusBar.observe(context) {
updateInsetPaddings()
}
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
updateInsetPaddings()
insets
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
updateInsetPaddings()
}
private fun updateInsetPaddings() {
val windowInsets = ViewCompat.getRootWindowInsets(this) ?: return
val hideStatusBar = viewModel.hideStatusBar.value == true
val hideNavBar = viewModel.hideNavBar.value == true
Log.d("MM20", "status: $hideStatusBar, nav: $hideNavBar")
var topPadding = 0
var leftPadding = 0
var rightPadding = 0
var bottomPadding = 0
if (!hideStatusBar) {
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
topPadding += insets.top
leftPadding += insets.left
rightPadding += insets.right
bottomPadding += insets.bottom
}
if (!hideNavBar) {
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars())
topPadding += insets.top
leftPadding += insets.left
rightPadding += insets.right
bottomPadding += insets.bottom
}
setPadding(leftPadding, topPadding, rightPadding, bottomPadding)
} }
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {

View File

@ -14,8 +14,7 @@
<de.mm20.launcher2.ui.launcher.LauncherScaffoldView <de.mm20.launcher2.ui.launcher.LauncherScaffoldView
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
android:fitsSystemWindows="true" />
<View <View
android:id="@+id/activityStartOverlay" android:id="@+id/activityStartOverlay"