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