diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml
index c9818640..645bde68 100644
--- a/core/base/src/main/res/values/strings.xml
+++ b/core/base/src/main/res/values/strings.xml
@@ -322,6 +322,9 @@ Maybe this can be labeled better? Let me know. It should be something that can d
View source code
Add time zone
+ Unitto is now NumberHub!
+ Unitto has been discontinued. You\'re one of the first users to try NumberHub! Please spread the word and share the app with your friends. Thank you for your support!
+
Read the article
diff --git a/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt b/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt
index 5c2e5648..084f5428 100644
--- a/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt
+++ b/data/model/src/main/java/app/myzel394/numberhub/data/model/repository/UserPreferencesRepository.kt
@@ -99,4 +99,6 @@ interface UserPreferencesRepository {
suspend fun updateAdditionalButtons(enabled: Boolean)
suspend fun updateInverseMode(enabled: Boolean)
+
+ suspend fun updateHasSeenNewAppAnnouncement(value: Boolean)
}
diff --git a/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt b/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt
index f5ec03e3..eedcb342 100644
--- a/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt
+++ b/data/model/src/main/java/app/myzel394/numberhub/data/model/userprefs/GeneralPreferences.kt
@@ -21,4 +21,5 @@ package app.myzel394.numberhub.data.model.userprefs
interface GeneralPreferences {
val lastReadChangelog: String
val enableVibrations: Boolean
+ val hasSeenNewAppAnnouncement: Boolean
}
diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt
index 08907c59..8fc3e046 100644
--- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt
+++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceExt.kt
@@ -77,6 +77,10 @@ internal fun Preferences.getRadianMode(): Boolean {
return this[PrefsKeys.RADIAN_MODE] ?: true
}
+internal fun Preferences.getHasSeenNewAppAnnouncement(): Boolean {
+ return this[PrefsKeys.HAS_SEEN_NEW_APP_ANNOUNCEMENT] ?: false
+}
+
internal fun Preferences.getFormatterSymbols(): FormatterSymbols {
val grouping = this[PrefsKeys.FORMATTER_GROUPING]
val fractional = this[PrefsKeys.FORMATTER_FRACTIONAL]
diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt
index 3f64ed0f..0fafec83 100644
--- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt
+++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PreferenceModels.kt
@@ -50,6 +50,7 @@ data class AppPreferencesImpl(
data class GeneralPreferencesImpl(
override val lastReadChangelog: String,
override val enableVibrations: Boolean,
+ override val hasSeenNewAppAnnouncement: Boolean,
) : GeneralPreferences
data class CalculatorPreferencesImpl(
diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt
index cb0f7f77..a97ef803 100644
--- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt
+++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/PrefsKeys.kt
@@ -37,6 +37,7 @@ object PrefsKeys {
val ENABLE_VIBRATIONS = booleanPreferencesKey("ENABLE_VIBRATIONS_PREF_KEY")
val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY")
val AC_BUTTON = booleanPreferencesKey("AC_BUTTON_PREF_KEY")
+ val HAS_SEEN_NEW_APP_ANNOUNCEMENT = booleanPreferencesKey("HAS_SEEN_NEW_APP_ANNOUNCEMENT_PREF_KEY")
// val RPN_MODE = booleanPreferencesKey("RPN_MODE_PREF_KEY")
// FORMATTER
diff --git a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt
index 6a23659d..c047af42 100644
--- a/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt
+++ b/data/userprefs/src/main/java/app/myzel394/numberhub/data/userprefs/UserPreferencesRepositoryImpl.kt
@@ -70,6 +70,7 @@ class UserPreferencesRepositoryImpl @Inject constructor(
GeneralPreferencesImpl(
lastReadChangelog = preferences.getLastReadChangelog(),
enableVibrations = preferences.getEnableVibrations(),
+ hasSeenNewAppAnnouncement = preferences.getHasSeenNewAppAnnouncement(),
)
}
@@ -325,4 +326,10 @@ class UserPreferencesRepositoryImpl @Inject constructor(
preferences[PrefsKeys.INVERSE_MODE] = enabled
}
}
+
+ override suspend fun updateHasSeenNewAppAnnouncement(value: Boolean) {
+ dataStore.edit { preferences ->
+ preferences[PrefsKeys.HAS_SEEN_NEW_APP_ANNOUNCEMENT] = value
+ }
+ }
}
diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt
index b13d328e..bdab1c79 100644
--- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt
+++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsScreen.kt
@@ -50,6 +50,7 @@ import androidx.compose.material.icons.filled.RateReview
import androidx.compose.material.icons.filled.SwapHoriz
import androidx.compose.material.icons.filled.Vibration
import androidx.compose.material.icons.filled._123
+import androidx.compose.material.icons.outlined.CheckCircle
import androidx.compose.material.icons.outlined.NewReleases
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DropdownMenu
@@ -119,6 +120,7 @@ internal fun SettingsRoute(
uiState = uiState,
openDrawer = openDrawer,
navControllerAction = navControllerAction,
+ onHasSeenNewAppAnnouncement = viewModel::updateHasSeenNewAppAnnouncement,
updateLastReadChangelog = viewModel::updateLastReadChangelog,
updateVibrations = viewModel::updateVibrations,
clearCache = viewModel::clearCache,
@@ -135,6 +137,7 @@ private fun SettingsScreen(
navControllerAction: (String) -> Unit,
updateLastReadChangelog: (String) -> Unit,
updateVibrations: (Boolean) -> Unit,
+ onHasSeenNewAppAnnouncement: (Boolean) -> Unit,
clearCache: () -> Unit,
backup: (Context, Uri) -> Unit,
restore: (Context, Uri) -> Unit,
@@ -197,6 +200,25 @@ private fun SettingsScreen(
.verticalScroll(rememberScrollState())
.padding(padding),
) {
+ AnimatedVisibility(
+ visible = !uiState.hasSeenNewAppAnnouncement,
+ enter = expandVertically() + fadeIn(),
+ exit = shrinkVertically() + fadeOut(),
+ ) {
+ val title = stringResource(R.string.settings_numberhub_newApp)
+ AnnoyingBox(
+ modifier = Modifier
+ .padding(16.dp, 8.dp)
+ .fillMaxWidth(),
+ imageVector = Icons.Outlined.CheckCircle,
+ imageVectorContentDescription = title,
+ title = title,
+ support = stringResource(R.string.settings_numberhub_newApp_message),
+ ) {
+ //onHasSeenNewAppAnnouncement(true)
+ }
+ }
+
AnimatedVisibility(
visible = uiState.showUpdateChangelog,
enter = expandVertically() + fadeIn(),
@@ -339,6 +361,7 @@ private fun PreviewSettingsScreen() {
cacheSize = 2,
backupInProgress = false,
showUpdateChangelog = true,
+ hasSeenNewAppAnnouncement = false,
),
)
}
@@ -347,6 +370,9 @@ private fun PreviewSettingsScreen() {
uiState = uiState,
openDrawer = {},
navControllerAction = {},
+ onHasSeenNewAppAnnouncement = {
+ uiState = uiState.copy(hasSeenNewAppAnnouncement = true)
+ },
updateLastReadChangelog = {
uiState = uiState.copy(showUpdateChangelog = false)
},
diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt
index 06157187..1c0b2ccf 100644
--- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt
+++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsUIState.kt
@@ -26,5 +26,6 @@ internal sealed class SettingsUIState {
val cacheSize: Int,
val backupInProgress: Boolean,
val showUpdateChangelog: Boolean,
+ val hasSeenNewAppAnnouncement: Boolean,
) : SettingsUIState()
}
diff --git a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt
index 6ee7718e..3a30540a 100644
--- a/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt
+++ b/feature/settings/src/main/java/app/myzel394/numberhub/feature/settings/SettingsViewModel.kt
@@ -62,6 +62,7 @@ internal class SettingsViewModel @Inject constructor(
cacheSize = cacheSize,
backupInProgress = backupInProgress,
showUpdateChangelog = prefs.lastReadChangelog != BuildConfig.VERSION_CODE,
+ hasSeenNewAppAnnouncement = prefs.hasSeenNewAppAnnouncement,
)
}
.stateIn(viewModelScope, SettingsUIState.Loading)
@@ -100,6 +101,10 @@ internal class SettingsViewModel @Inject constructor(
}
}
+ fun updateHasSeenNewAppAnnouncement(value: Boolean) = viewModelScope.launch {
+ userPrefsRepository.updateHasSeenNewAppAnnouncement(value)
+ }
+
/**
* @see UserPreferencesRepository.updateLastReadChangelog
*/