From 902d77fff07e0d8306f0416d8699932abf93fa46 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Fri, 18 Feb 2022 14:52:55 +0100
Subject: [PATCH] Add options to hide system bars
---
i18n/src/main/res/values-de/strings.xml | 2 ++
i18n/src/main/res/values/strings.xml | 2 ++
.../mm20/launcher2/preferences/DataStore.kt | 5 ++--
.../de/mm20/launcher2/preferences/Defaults.kt | 2 ++
.../preferences/migrations/Migration_1_2.kt | 14 ++++++++++
.../migrations/VersionedMigration.kt | 25 +++++++++++++++++
preferences/src/main/proto/settings.proto | 2 ++
.../launcher2/ui/launcher/LauncherActivity.kt | 28 +++++++++++++++++--
.../ui/launcher/LauncherActivityVM.kt | 3 ++
.../appearance/AppearanceSettingsScreen.kt | 16 +++++++++++
.../appearance/AppearanceSettingsScreenVM.kt | 28 +++++++++++++++++++
11 files changed, 123 insertions(+), 4 deletions(-)
create mode 100644 preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_1_2.kt
create mode 100644 preferences/src/main/java/de/mm20/launcher2/preferences/migrations/VersionedMigration.kt
diff --git a/i18n/src/main/res/values-de/strings.xml b/i18n/src/main/res/values-de/strings.xml
index a4078e34..d17f3d68 100644
--- a/i18n/src/main/res/values-de/strings.xml
+++ b/i18n/src/main/res/values-de/strings.xml
@@ -116,6 +116,8 @@
Systemleisten
Dunkle Statusleisten-Symbole
Dunkle Navigationsleisten-Symbole
+ Statusleiste ausblenden
+ Navigationsleiste ausblenden
Musik
In Kontakte-App anzeigen
An Favoriten anheften
diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml
index 6027d8ec..4ce89e8a 100644
--- a/i18n/src/main/res/values/strings.xml
+++ b/i18n/src/main/res/values/strings.xml
@@ -155,6 +155,8 @@
System bars
Dark status bar icons
Dark navigation bar icons
+ Hide status bar
+ Hide navigation bar
Music
Open in contacts app
Pin to favorites
diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt
index 69ca3ebf..0c04ed43 100644
--- a/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt
+++ b/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt
@@ -7,6 +7,7 @@ import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
import androidx.datastore.dataStore
import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.preferences.migrations.FactorySettingsMigration
+import de.mm20.launcher2.preferences.migrations.Migration_1_2
typealias LauncherDataStore = DataStore
@@ -14,7 +15,7 @@ internal val Context.dataStore: LauncherDataStore by dataStore(
fileName = "settings.pb",
serializer = SettingsSerializer,
produceMigrations = {
- listOf(FactorySettingsMigration(it))
+ listOf(FactorySettingsMigration(it), Migration_1_2())
},
corruptionHandler = ReplaceFileCorruptionHandler {
CrashReporter.logException(it)
@@ -23,4 +24,4 @@ internal val Context.dataStore: LauncherDataStore by dataStore(
}
)
-internal const val SchemaVersion = 1
\ No newline at end of file
+internal const val SchemaVersion = 2
\ No newline at end of file
diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt
index ad1fd256..b5dbe5c7 100644
--- a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt
+++ b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt
@@ -118,6 +118,8 @@ fun createFactorySettings(context: Context): Settings {
Settings.SystemBarsSettings.newBuilder()
.setLightNavBar(false)
.setLightStatusBar(false)
+ .setHideStatusBar(false)
+ .setHideNavBar(false)
)
.setCards(
Settings.CardSettings.newBuilder()
diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_1_2.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_1_2.kt
new file mode 100644
index 00000000..31deca72
--- /dev/null
+++ b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_1_2.kt
@@ -0,0 +1,14 @@
+package de.mm20.launcher2.preferences.migrations
+
+import de.mm20.launcher2.preferences.Settings
+
+class Migration_1_2: VersionedMigration(1, 2) {
+
+ override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder {
+ return builder.setSystemBars(
+ builder.systemBars.toBuilder()
+ .setHideNavBar(false)
+ .setHideStatusBar(false)
+ )
+ }
+}
\ No newline at end of file
diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/VersionedMigration.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/VersionedMigration.kt
new file mode 100644
index 00000000..b1128880
--- /dev/null
+++ b/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/VersionedMigration.kt
@@ -0,0 +1,25 @@
+package de.mm20.launcher2.preferences.migrations
+
+import androidx.datastore.core.DataMigration
+import de.mm20.launcher2.preferences.SchemaVersion
+import de.mm20.launcher2.preferences.Settings
+
+abstract class VersionedMigration(
+ private val fromVersion: Int,
+ private val toVersion: Int
+) : DataMigration {
+ abstract suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder
+
+ final override suspend fun migrate(currentData: Settings): Settings {
+ val builder = currentData.toBuilder()
+ applyMigrations(builder)
+ builder.version = toVersion
+ return builder.build()
+ }
+
+ override suspend fun cleanUp() {}
+
+ override suspend fun shouldMigrate(currentData: Settings): Boolean {
+ return currentData.version <= fromVersion && SchemaVersion >= toVersion
+ }
+}
\ No newline at end of file
diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto
index c339f6e7..7867d430 100644
--- a/preferences/src/main/proto/settings.proto
+++ b/preferences/src/main/proto/settings.proto
@@ -162,6 +162,8 @@ message Settings {
message SystemBarsSettings {
bool lightStatusBar = 1;
bool lightNavBar = 2;
+ bool hideStatusBar = 3;
+ bool hideNavBar = 4;
}
SystemBarsSettings system_bars = 23;
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 786c1d52..4b4f0913 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
@@ -4,9 +4,13 @@ import android.app.WallpaperManager
import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
-import android.view.*
+import android.view.LayoutInflater
+import android.view.View
import androidx.activity.viewModels
import androidx.core.view.*
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
@@ -14,12 +18,14 @@ import com.afollestad.materialdialogs.callbacks.onDismiss
import com.afollestad.materialdialogs.customview.customView
import de.mm20.launcher2.icons.DynamicIconController
import de.mm20.launcher2.icons.IconRepository
-import de.mm20.launcher2.ui.legacy.helper.ActivityStarter
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.BaseActivity
import de.mm20.launcher2.ui.databinding.ActivityLauncherBinding
import de.mm20.launcher2.ui.launcher.modals.EditFavoritesView
import de.mm20.launcher2.ui.launcher.modals.HiddenItemsView
+import de.mm20.launcher2.ui.legacy.helper.ActivityStarter
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
@@ -53,13 +59,31 @@ class LauncherActivity : BaseActivity() {
}
val windowController = WindowInsetsControllerCompat(window, binding.rootView)
+ windowController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+
viewModel.lightStatusBar.observe(this) {
windowController.isAppearanceLightStatusBars = it
}
+
viewModel.lightNavBar.observe(this) {
windowController.isAppearanceLightNavigationBars = it
}
+ viewModel.hideStatusBar.observe(this) {
+ if (it) {
+ windowController.hide(WindowInsetsCompat.Type.statusBars())
+ } else {
+ windowController.show(WindowInsetsCompat.Type.statusBars())
+ }
+ }
+ viewModel.hideNavBar.observe(this) {
+ if (it) {
+ windowController.hide(WindowInsetsCompat.Type.navigationBars())
+ } else {
+ windowController.show(WindowInsetsCompat.Type.navigationBars())
+ }
+ }
+
var editFavoritesDialog: MaterialDialog? = null
viewModel.isEditFavoritesShown.observe(this) {
if (it) {
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivityVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivityVM.kt
index 4b92ed52..e6a31673 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivityVM.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherActivityVM.kt
@@ -40,6 +40,9 @@ class LauncherActivityVM : ViewModel(), KoinComponent {
!dim && light
}.asLiveData()
+ val hideNavBar = dataStore.data.map { it.systemBars.hideNavBar }.asLiveData()
+ val hideStatusBar = dataStore.data.map { it.systemBars.hideStatusBar }.asLiveData()
+
fun setDarkMode(darkMode: Boolean) {
isDarkInMode.value = darkMode
}
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt
index ace70dfc..fd5f8916 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt
@@ -194,6 +194,22 @@ fun AppearanceSettingsScreen() {
viewModel.setLightNavBar(it)
}
)
+ val hideStatusBar by viewModel.hideStatusBar.observeAsState()
+ SwitchPreference(
+ title = stringResource(R.string.preference_hide_status_bar),
+ value = hideStatusBar == true,
+ onValueChanged = {
+ viewModel.setHideStatusBar(it)
+ }
+ )
+ val hideNavBar by viewModel.hideNavBar.observeAsState()
+ SwitchPreference(
+ title = stringResource(R.string.preference_hide_nav_bar),
+ value = hideNavBar == true,
+ onValueChanged = {
+ viewModel.setHideNavBar(it)
+ }
+ )
}
}
}
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt
index 17cd6da6..f27e214d 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt
@@ -178,4 +178,32 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent {
}
}
}
+
+ val hideStatusBar = dataStore.data.map { it.systemBars.hideStatusBar }.asLiveData()
+ fun setHideStatusBar(hideStatusBar: Boolean) {
+ viewModelScope.launch {
+ dataStore.updateData {
+ it.toBuilder()
+ .setSystemBars(
+ it.systemBars.toBuilder()
+ .setHideStatusBar(hideStatusBar)
+ )
+ .build()
+ }
+ }
+ }
+
+ val hideNavBar = dataStore.data.map { it.systemBars.hideNavBar }.asLiveData()
+ fun setHideNavBar(hideNavBar: Boolean) {
+ viewModelScope.launch {
+ dataStore.updateData {
+ it.toBuilder()
+ .setSystemBars(
+ it.systemBars.toBuilder()
+ .setHideNavBar(hideNavBar)
+ )
+ .build()
+ }
+ }
+ }
}
\ No newline at end of file