feat(settings): reset settings when subscription expires
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user