From fe73d7dfbb7e60948194a280fcaa22eac6a41638 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:36:10 +0200 Subject: [PATCH] feat: Add new app announcement --- core/base/src/main/res/values/strings.xml | 3 +++ .../repository/UserPreferencesRepository.kt | 2 ++ .../model/userprefs/GeneralPreferences.kt | 1 + .../numberhub/data/userprefs/PreferenceExt.kt | 4 +++ .../data/userprefs/PreferenceModels.kt | 1 + .../numberhub/data/userprefs/PrefsKeys.kt | 1 + .../UserPreferencesRepositoryImpl.kt | 7 +++++ .../feature/settings/SettingsScreen.kt | 26 +++++++++++++++++++ .../feature/settings/SettingsUIState.kt | 1 + .../feature/settings/SettingsViewModel.kt | 5 ++++ 10 files changed, 51 insertions(+) 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 */