feat(settings): reset settings when subscription expires

This commit is contained in:
Nishant Mishra
2025-10-28 11:01:29 +05:30
parent 509bcdab6d
commit de6550d6ab
5 changed files with 55 additions and 17 deletions

View File

@@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.asStateFlow
*/ */
class FossBillingManager : BillingManager { class FossBillingManager : BillingManager {
override val isPlus = MutableStateFlow(true).asStateFlow() override val isPlus = MutableStateFlow(true).asStateFlow()
override val isLoaded = MutableStateFlow(true).asStateFlow()
} }
object BillingManagerProvider { object BillingManagerProvider {

View File

@@ -61,6 +61,18 @@ class MainActivity : ComponentActivity() {
val seed = preferencesState.colorScheme.toColor() val seed = preferencesState.colorScheme.toColor()
val isPlus by settingsViewModel.isPlus.collectAsStateWithLifecycle() val isPlus by settingsViewModel.isPlus.collectAsStateWithLifecycle()
val isPurchaseStateLoaded by settingsViewModel.isPurchaseStateLoaded.collectAsStateWithLifecycle()
val isSettingsLoaded by settingsViewModel.isSettingsLoaded.collectAsStateWithLifecycle()
LaunchedEffect(isPurchaseStateLoaded, isPlus, isSettingsLoaded) {
if (isPurchaseStateLoaded && isSettingsLoaded) {
if (!isPlus) {
settingsViewModel.resetPaywalledSettings()
} else {
settingsViewModel.reloadSettings()
}
}
}
TomatoTheme( TomatoTheme(
darkTheme = darkTheme, darkTheme = darkTheme,

View File

@@ -21,4 +21,5 @@ import kotlinx.coroutines.flow.StateFlow
interface BillingManager { interface BillingManager {
val isPlus: StateFlow<Boolean> val isPlus: StateFlow<Boolean>
val isLoaded: StateFlow<Boolean>
} }

View File

@@ -54,6 +54,10 @@ class SettingsViewModel(
val backStack = mutableStateListOf<Screen.Settings>(Screen.Settings.Main) val backStack = mutableStateListOf<Screen.Settings>(Screen.Settings.Main)
val isPlus = billingManager.isPlus val isPlus = billingManager.isPlus
val isPurchaseStateLoaded = billingManager.isLoaded
private val _isSettingsLoaded = MutableStateFlow(false)
val isSettingsLoaded = _isSettingsLoaded.asStateFlow()
private val _preferencesState = MutableStateFlow(PreferencesState()) private val _preferencesState = MutableStateFlow(PreferencesState())
val preferencesState = _preferencesState.asStateFlow() val preferencesState = _preferencesState.asStateFlow()
@@ -94,23 +98,8 @@ class SettingsViewModel(
init { init {
viewModelScope.launch { viewModelScope.launch {
val theme = preferenceRepository.getStringPreference("theme") reloadSettings()
?: preferenceRepository.saveStringPreference("theme", "auto") _isSettingsLoaded.value = true
val colorScheme = preferenceRepository.getStringPreference("color_scheme")
?: preferenceRepository.saveStringPreference("color_scheme", Color.White.toString())
val blackTheme = preferenceRepository.getBooleanPreference("black_theme")
?: preferenceRepository.saveBooleanPreference("black_theme", false)
val aodEnabled = preferenceRepository.getBooleanPreference("aod_enabled")
?: preferenceRepository.saveBooleanPreference("aod_enabled", false)
_preferencesState.update { currentState ->
currentState.copy(
theme = theme,
colorScheme = colorScheme,
blackTheme = blackTheme,
aodEnabled = aodEnabled
)
}
} }
} }
@@ -235,6 +224,36 @@ class SettingsViewModel(
} }
} }
fun resetPaywalledSettings() {
_preferencesState.update { currentState ->
currentState.copy(
aodEnabled = false,
blackTheme = false,
colorScheme = Color.White.toString()
)
}
}
suspend fun reloadSettings() {
val theme = preferenceRepository.getStringPreference("theme")
?: preferenceRepository.saveStringPreference("theme", "auto")
val colorScheme = preferenceRepository.getStringPreference("color_scheme")
?: preferenceRepository.saveStringPreference("color_scheme", Color.White.toString())
val blackTheme = preferenceRepository.getBooleanPreference("black_theme")
?: preferenceRepository.saveBooleanPreference("black_theme", false)
val aodEnabled = preferenceRepository.getBooleanPreference("aod_enabled")
?: preferenceRepository.saveBooleanPreference("aod_enabled", false)
_preferencesState.update { currentState ->
currentState.copy(
theme = theme,
colorScheme = colorScheme,
blackTheme = blackTheme,
aodEnabled = aodEnabled
)
}
}
companion object { companion object {
val Factory: ViewModelProvider.Factory = viewModelFactory { val Factory: ViewModelProvider.Factory = viewModelFactory {
initializer { initializer {

View File

@@ -33,6 +33,9 @@ class PlayBillingManager : BillingManager {
private val _isPlus = MutableStateFlow(false) private val _isPlus = MutableStateFlow(false)
override val isPlus = _isPlus.asStateFlow() override val isPlus = _isPlus.asStateFlow()
private val _isLoaded = MutableStateFlow(false)
override val isLoaded = _isLoaded.asStateFlow()
private val purchases by lazy { Purchases.sharedInstance } private val purchases by lazy { Purchases.sharedInstance }
init { init {
@@ -45,9 +48,11 @@ class PlayBillingManager : BillingManager {
purchases.getCustomerInfoWith( purchases.getCustomerInfoWith(
onSuccess = { customerInfo -> onSuccess = { customerInfo ->
_isPlus.value = customerInfo.entitlements[ENTITLEMENT_ID]?.isActive == true _isPlus.value = customerInfo.entitlements[ENTITLEMENT_ID]?.isActive == true
_isLoaded.value = true
}, },
onError = { error -> onError = { error ->
Log.e("GooglePlayPaywallManager", "Error fetching customer info: $error") Log.e("GooglePlayPaywallManager", "Error fetching customer info: $error")
_isLoaded.value = true
} }
) )
} }