diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivity.kt index 91212348..dc7ff3ab 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivity.kt @@ -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 } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt index a6889aab..97a3f373 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt @@ -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 diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt index 143985b3..0afff54a 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt @@ -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) { diff --git a/ui/src/main/res/layout/activity_launcher.xml b/ui/src/main/res/layout/activity_launcher.xml index c3b324aa..0a39faca 100644 --- a/ui/src/main/res/layout/activity_launcher.xml +++ b/ui/src/main/res/layout/activity_launcher.xml @@ -14,8 +14,7 @@ + android:layout_height="match_parent" />