diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index f34226c80e..58cbd2aaa6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -7,6 +7,7 @@ import android.util.Log import androidx.compose.runtime.Immutable import com.fasterxml.jackson.module.kotlin.readValue import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.BooleanType import com.vitorpamplona.amethyst.model.ConnectivityType import com.vitorpamplona.amethyst.model.DefaultReactions import com.vitorpamplona.amethyst.model.DefaultZapAmounts @@ -16,6 +17,7 @@ import com.vitorpamplona.amethyst.model.Nip47URI import com.vitorpamplona.amethyst.model.RelaySetupInfo import com.vitorpamplona.amethyst.model.ServersAvailable import com.vitorpamplona.amethyst.model.Settings +import com.vitorpamplona.amethyst.model.parseBooleanType import com.vitorpamplona.amethyst.model.parseConnectivityType import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.quartz.crypto.KeyPair @@ -76,6 +78,7 @@ private object PrefKeys { const val THEME = "theme" const val PREFERRED_LANGUAGE = "preferred_Language" const val AUTOMATICALLY_LOAD_URL_PREVIEW = "automatically_load_url_preview" + const val AUTOMATICALLY_HIDE_NAV_BARS = "automatically_hide_nav_bars" const val LOGIN_WITH_EXTERNAL_SIGNER = "login_with_external_signer" } @@ -272,6 +275,11 @@ object LocalPreferences { } else { putBoolean(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW, account.settings.automaticallyShowUrlPreview.prefCode!!) } + if (account.settings.automaticallyHideNavigationBars.prefCode == null) { + remove(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS) + } else { + putBoolean(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS, account.settings.automaticallyHideNavigationBars.prefCode!!) + } putString(PrefKeys.PREFERRED_LANGUAGE, account.settings.preferredLanguage ?: "") }.apply() } @@ -417,6 +425,11 @@ object LocalPreferences { } else { ConnectivityType.ALWAYS } + settings.automaticallyHideNavigationBars = if (contains(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS)) { + parseBooleanType(getBoolean(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS, false)) + } else { + BooleanType.ALWAYS + } settings.preferredLanguage = getString(PrefKeys.PREFERRED_LANGUAGE, "") } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 42ae9a2c89..a07d08182a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -180,6 +180,14 @@ class Account( saveable.invalidateData() } + fun updateAutomaticallyHideHavBars( + automaticallyHideHavBars: BooleanType + ) { + settings.automaticallyHideNavigationBars = automaticallyHideHavBars + live.invalidateData() + saveable.invalidateData() + } + fun updateAutomaticallyShowImages( automaticallyShowImages: ConnectivityType ) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt index a7cb7ce346..7aa0215f09 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt @@ -8,7 +8,8 @@ class Settings( var preferredLanguage: String? = null, var automaticallyShowImages: ConnectivityType = ConnectivityType.ALWAYS, var automaticallyStartPlayback: ConnectivityType = ConnectivityType.ALWAYS, - var automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS + var automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS, + var automaticallyHideNavigationBars: BooleanType = BooleanType.ALWAYS ) enum class ConnectivityType(val prefCode: Boolean?, val screenCode: Int, val reourceId: Int) { @@ -38,3 +39,28 @@ fun parseConnectivityType(screenCode: Int): ConnectivityType { } } } + +enum class BooleanType(val prefCode: Boolean?, val screenCode: Int, val reourceId: Int) { + ALWAYS(null, 0, R.string.connectivity_type_always), + NEVER(false, 1, R.string.connectivity_type_never) +} + +fun parseBooleanType(code: Boolean?): BooleanType { + return when (code) { + BooleanType.ALWAYS.prefCode -> BooleanType.ALWAYS + BooleanType.NEVER.prefCode -> BooleanType.NEVER + else -> { + BooleanType.ALWAYS + } + } +} + +fun parseBooleanType(screenCode: Int): BooleanType { + return when (screenCode) { + BooleanType.ALWAYS.screenCode -> BooleanType.ALWAYS + BooleanType.NEVER.screenCode -> BooleanType.NEVER + else -> { + BooleanType.ALWAYS + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index b10382a28e..764078896e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.AccountState import com.vitorpamplona.amethyst.model.AddressableNote +import com.vitorpamplona.amethyst.model.BooleanType import com.vitorpamplona.amethyst.model.Channel import com.vitorpamplona.amethyst.model.ConnectivityType import com.vitorpamplona.amethyst.model.LocalCache @@ -97,6 +98,12 @@ class AccountViewModel(val account: Account) : ViewModel(), Dao { account.updateAutomaticallyShowUrlPreview(automaticallyShowUrlPreview) } + fun updateAutomaticallyHideNavBars( + automaticallyHideHavBars: BooleanType + ) { + account.updateAutomaticallyHideHavBars(automaticallyHideHavBars) + } + fun updateAutomaticallyShowImages( automaticallyShowImages: ConnectivityType ) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 1c47e186d9..4b1fa16970 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -42,6 +42,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavBackStackEntry import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import com.vitorpamplona.amethyst.model.BooleanType import com.vitorpamplona.amethyst.ui.buttons.ChannelFabColumn import com.vitorpamplona.amethyst.ui.buttons.NewCommunityNoteButton import com.vitorpamplona.amethyst.ui.buttons.NewImageButton @@ -206,15 +207,18 @@ fun MainScreen( val nestedScrollConnection = remember { object : NestedScrollConnection { override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - val delta = available.y - val newOffset = bottomBarOffsetHeightPx.value + delta + val newOffset = bottomBarOffsetHeightPx.value + available.y - val currentRoute = navState.value?.destination?.route - - bottomBarOffsetHeightPx.value = if (currentRoute !in InvertedLayouts) { - newOffset.coerceIn(-bottomBarHeightPx, 0f) + if (accountViewModel.account.settings.automaticallyHideNavigationBars == BooleanType.ALWAYS) { + bottomBarOffsetHeightPx.value = if (navState.value?.destination?.route !in InvertedLayouts) { + newOffset.coerceIn(-bottomBarHeightPx, 0f) + } else { + newOffset.coerceIn(0f, bottomBarHeightPx) + } } else { - newOffset.coerceIn(0f, bottomBarHeightPx) + if (abs(bottomBarOffsetHeightPx.value) > 0.1) { + bottomBarOffsetHeightPx.value = 0f + } } return Offset.Zero diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SettingsScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SettingsScreen.kt index b832846bf7..7ad689e75a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SettingsScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SettingsScreen.kt @@ -40,6 +40,7 @@ import androidx.core.os.LocaleListCompat import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.ConnectivityType +import com.vitorpamplona.amethyst.model.parseBooleanType import com.vitorpamplona.amethyst.model.parseConnectivityType import com.vitorpamplona.amethyst.ui.screen.ThemeViewModel import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer @@ -122,10 +123,16 @@ fun SettingsScreen( TitleExplainer(stringResource(R.string.dark)) ) + val booleanItems = persistentListOf( + TitleExplainer(stringResource(ConnectivityType.ALWAYS.reourceId)), + TitleExplainer(stringResource(ConnectivityType.NEVER.reourceId)) + ) + val settings = accountViewModel.account.settings val showImagesIndex = settings.automaticallyShowImages.screenCode val videoIndex = settings.automaticallyStartPlayback.screenCode val linkIndex = settings.automaticallyShowUrlPreview.screenCode + val hideNavBarsIndex = settings.automaticallyHideNavigationBars.screenCode val themeIndex = themeViewModel.theme.value ?: 0 @@ -220,6 +227,22 @@ fun SettingsScreen( LocalPreferences.saveToEncryptedStorage(accountViewModel.account) } } + + Spacer(modifier = HalfVertSpacer) + + SettingsRow( + R.string.automatically_hide_nav_bars, + R.string.automatically_hide_nav_bars_description, + booleanItems, + hideNavBarsIndex + ) { + val automaticallyHideNavBars = parseBooleanType(it) + + scope.launch(Dispatchers.IO) { + accountViewModel.updateAutomaticallyHideNavBars(automaticallyHideNavBars) + LocalPreferences.saveToEncryptedStorage(accountViewModel.account) + } + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3772e1a4a..3e318a9205 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -499,6 +499,8 @@ Image Preview Video Playback URL Preview + Immersive Scrolling + Hide Nav Bars when Scrolling Load Image Spammers