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