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

View File

@ -21,6 +21,9 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
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()
var scrollY = 0

View File

@ -5,6 +5,7 @@ import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.MotionEvent
@ -18,8 +19,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.animation.doOnEnd
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.setPadding
import androidx.core.view.*
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
@ -239,8 +239,56 @@ class LauncherScaffoldView @JvmOverloads constructor(
context.window.statusBarColor = it
}
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) {

View File

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