From 9935386ad8b3aed00b031f27056fa49f17e29d4e Mon Sep 17 00:00:00 2001 From: Hendika N Date: Sat, 22 Feb 2025 07:35:28 +0700 Subject: [PATCH 1/3] Add option to hide navigation bar on home screen --- .../LauncherPreferences$Config.java | 1 + .../jrpie/android/launcher/ui/HomeActivity.kt | 33 +++++++++++++++++++ app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 4 +++ 5 files changed, 40 insertions(+) diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java index c216911..aacff13 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java @@ -61,6 +61,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences; @Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"), @Preference(name = "full_screen", type = boolean.class, defaultValue = "true"), @Preference(name = "rotate_screen", type = boolean.class, defaultValue = "true"), + @Preference(name = "hide_navigation_bar", type = boolean.class, defaultValue = "false"), }), @PreferenceGroup(name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = { @Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"), diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 973e0ca..1d807fd 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -9,6 +9,7 @@ import android.util.DisplayMetrics import android.view.KeyEvent import android.view.MotionEvent import android.view.View +import android.view.Window import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible @@ -99,6 +100,38 @@ class HomeActivity : UIObject, AppCompatActivity() { } + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + + if (hasFocus && LauncherPreferences.display().hideNavigationBar()) { + hideNavigationBar() + } + } + + @Suppress("DEPRECATION") + private fun hideNavigationBar() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val windowInsetsController = window.insetsController ?: return + windowInsetsController.hide(android.view.WindowInsets.Type.navigationBars()) + windowInsetsController.systemBarsBehavior = + android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } else { + val decorView = window.decorView + val uiOptions = + (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) + + // Try to hide the navigation bar but do not hide the status bar + decorView.systemUiVisibility = uiOptions + + // Add listener to hide the navigation bar + decorView.setOnSystemUiVisibilityChangeListener { visibility -> + if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { + decorView.systemUiVisibility = uiOptions + } + } + } + } + private fun updateSettingsFallbackButtonVisibility() { // If µLauncher settings can not be reached from any action bound to an enabled gesture, // show the fallback button. diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 6ebdf63..ec87cf8 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -137,6 +137,7 @@ display.disable_timeout display.use_full_screen display.rotate_screen + display.hide_navigation enabled_gestures.double_actions enabled_gestures.edge_actions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 687aed1..870e202 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,7 @@ Keep screen on Use full screen Rotate screen + Hide navigation bar Functionality diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 406f81a..180a261 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -180,6 +180,10 @@ android:key="@string/settings_display_screen_timeout_disabled_key" android:defaultValue="false" android:title="@string/settings_display_screen_timeout_disabled"/> + From 941b06b258056d7e33c37a2ce59b38ccd86c4d05 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Sat, 22 Feb 2025 03:03:52 +0100 Subject: [PATCH 2/3] minor reformatting --- .../jrpie/android/launcher/ui/HomeActivity.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 1d807fd..1100e0c 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -10,6 +10,8 @@ import android.view.KeyEvent import android.view.MotionEvent import android.view.View import android.view.Window +import android.view.WindowInsets +import android.view.WindowInsetsController import android.window.OnBackInvokedDispatcher import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible @@ -111,14 +113,18 @@ class HomeActivity : UIObject, AppCompatActivity() { @Suppress("DEPRECATION") private fun hideNavigationBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val windowInsetsController = window.insetsController ?: return - windowInsetsController.hide(android.view.WindowInsets.Type.navigationBars()) - windowInsetsController.systemBarsBehavior = - android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + window.insetsController?.apply { + hide(WindowInsets.Type.navigationBars()) + systemBarsBehavior = + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } } else { val decorView = window.decorView - val uiOptions = - (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) + val uiOptions = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_IMMERSIVE + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) // Try to hide the navigation bar but do not hide the status bar decorView.systemUiVisibility = uiOptions @@ -219,6 +225,7 @@ class HomeActivity : UIObject, AppCompatActivity() { // Only used pre Android 13, cf. onBackInvokedDispatcher handleBack() } + KeyEvent.KEYCODE_VOLUME_UP -> { if (Action.forGesture(Gesture.VOLUME_UP) == LauncherAction.VOLUME_UP) { // Let the OS handle the key event. This works better with some custom ROMs From d7dd1aa71a413bbd8735b4330ded32f1339ebdce Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Thu, 13 Mar 2025 16:28:01 +0100 Subject: [PATCH 3/3] refactor hide navigation bar * move code to UIObject * remove listener * rename 'full screen' to 'hide status bar' --- .../LauncherPreferences$Config.java | 4 +- .../jrpie/android/launcher/ui/HomeActivity.kt | 27 ------------ .../de/jrpie/android/launcher/ui/UIObject.kt | 42 +++++++++++++++---- .../android/launcher/ui/list/ListActivity.kt | 2 +- app/src/main/res/values/donottranslate.xml | 2 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/preferences.xml | 8 ++-- 7 files changed, 45 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java index aacff13..78c5611 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java @@ -59,9 +59,9 @@ import eu.jonahbauer.android.preference.annotations.Preferences; }), @PreferenceGroup(name = "display", prefix = "settings_display_", suffix = "_key", value = { @Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"), - @Preference(name = "full_screen", type = boolean.class, defaultValue = "true"), - @Preference(name = "rotate_screen", type = boolean.class, defaultValue = "true"), + @Preference(name = "hide_status_bar", type = boolean.class, defaultValue = "true"), @Preference(name = "hide_navigation_bar", type = boolean.class, defaultValue = "false"), + @Preference(name = "rotate_screen", type = boolean.class, defaultValue = "true"), }), @PreferenceGroup(name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = { @Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"), diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index 1100e0c..61a4250 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -110,33 +110,6 @@ class HomeActivity : UIObject, AppCompatActivity() { } } - @Suppress("DEPRECATION") - private fun hideNavigationBar() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - window.insetsController?.apply { - hide(WindowInsets.Type.navigationBars()) - systemBarsBehavior = - WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - } - } else { - val decorView = window.decorView - val uiOptions = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - or View.SYSTEM_UI_FLAG_IMMERSIVE - or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) - - // Try to hide the navigation bar but do not hide the status bar - decorView.systemUiVisibility = uiOptions - - // Add listener to hide the navigation bar - decorView.setOnSystemUiVisibilityChangeListener { visibility -> - if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { - decorView.systemUiVisibility = uiOptions - } - } - } - } private fun updateSettingsFallbackButtonVisibility() { // If µLauncher settings can not be reached from any action bound to an enabled gesture, diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt b/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt index 3702bb2..d97388f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/UIObject.kt @@ -3,7 +3,11 @@ package de.jrpie.android.launcher.ui import android.app.Activity import android.content.pm.ActivityInfo import android.content.res.Resources +import android.os.Build +import android.view.View import android.view.Window +import android.view.WindowInsets +import android.view.WindowInsetsController import android.view.WindowManager import de.jrpie.android.launcher.preferences.LauncherPreferences @@ -14,7 +18,7 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences fun setWindowFlags(window: Window, homeScreen: Boolean) { window.setFlags(0, 0) // clear flags // Display notification bar - if (LauncherPreferences.display().fullScreen()) + if (LauncherPreferences.display().hideStatusBar()) window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN @@ -36,17 +40,19 @@ fun setWindowFlags(window: Window, homeScreen: Boolean) { } + interface UIObject { fun onCreate() { - if (this is Activity) { - setWindowFlags(window, isHomeScreen()) - - if (!LauncherPreferences.display().rotateScreen()) { - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR - } + if (this !is Activity) { + return + } + setWindowFlags(window, isHomeScreen()) + if (!LauncherPreferences.display().rotateScreen()) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR } } + fun onStart() { setOnClicks() adjustLayout() @@ -70,4 +76,26 @@ interface UIObject { fun isHomeScreen(): Boolean { return false } + + + @Suppress("DEPRECATION") + fun hideNavigationBar() { + if (this !is Activity) { + return + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + window.insetsController?.apply { + hide(WindowInsets.Type.navigationBars()) + systemBarsBehavior = + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } + } else { + // Try to hide the navigation bar but do not hide the status bar + window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_IMMERSIVE + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) + } + } } \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt index c4ecded..334bd62 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/list/ListActivity.kt @@ -155,7 +155,7 @@ class ListActivity : AppCompatActivity(), UIObject { binding.listContainer.context.resources.displayMetrics.heightPixels val diff = height - r.bottom if (diff != 0 && - LauncherPreferences.display().fullScreen() + LauncherPreferences.display().hideStatusBar() ) { if (binding.listContainer.paddingBottom != diff) { binding.listContainer.setPadding(0, 0, 0, diff) diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index ec87cf8..7d89272 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -135,8 +135,8 @@ - --> display.disable_timeout - display.use_full_screen display.rotate_screen + display.use_full_screen display.hide_navigation enabled_gestures.double_actions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 870e202..51bf623 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -153,9 +153,9 @@ Display Keep screen on - Use full screen - Rotate screen + Hide status bar Hide navigation bar + Rotate screen Functionality diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 180a261..62552d2 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -168,10 +168,6 @@ - +