@@ -23,7 +23,6 @@ import dagger.assisted.AssistedInject
2323import dagger.hilt.android.lifecycle.HiltViewModel
2424import dagger.hilt.android.qualifiers.ApplicationContext
2525import kotlinx.coroutines.Dispatchers
26- import kotlinx.coroutines.flow.firstOrNull
2726import kotlinx.coroutines.launch
2827import kotlinx.coroutines.withContext
2928
@@ -42,7 +41,7 @@ class EditSubscriptionModel @AssistedInject constructor(
4241
4342 private var initialSubscription: Subscription ? = null
4443 private var initialCredential: Credential ? = null
45- private var initialRequiresAuthValue : Boolean? = null
44+ private val initialRequiresAuth : Boolean get() = initialCredential ! = null
4645
4746 /* *
4847 * Whether user input is error free
@@ -69,7 +68,7 @@ class EditSubscriptionModel @AssistedInject constructor(
6968 get() = with (subscriptionSettingsUseCase) {
7069 val requiresAuth = uiState.requiresAuth
7170
72- val credentialsDirty = initialRequiresAuthValue != requiresAuth || initialCredential?.let {
71+ val credentialsDirty = initialRequiresAuth != requiresAuth || initialCredential?.let {
7372 ! equalsCredential(it)
7473 } ? : false
7574 val subscriptionsDirty = initialSubscription?.let {
@@ -79,49 +78,34 @@ class EditSubscriptionModel @AssistedInject constructor(
7978 credentialsDirty || subscriptionsDirty
8079 }
8180
82- val subscription = db.subscriptionsDao().getByIdFlow(subscriptionId)
83- val subscriptionWithCredential = db.subscriptionsDao().getWithCredentialsByIdFlow(subscriptionId)
81+ var successMessage: String? by mutableStateOf(null )
82+ private set
83+
84+ var subscriptionWithCredential: SubscriptionsDao .SubscriptionWithCredential ? = null
85+ private set
8486
8587 init {
86- // Initialise view models and save their initial state
8788 viewModelScope.launch {
88- subscriptionWithCredential.collect { data ->
89- if (data != null )
90- onSubscriptionLoaded(data)
89+ db.subscriptionsDao().getWithCredentialsById(subscriptionId)?.let {
90+ onSubscriptionLoaded(it)
9191 }
9292 }
9393 }
9494
9595 /* *
9696 * Initialise view models and remember their initial state
9797 */
98- private fun onSubscriptionLoaded (subscriptionWithCredential : SubscriptionsDao .SubscriptionWithCredential ) =
99- with (subscriptionSettingsUseCase) {
100- val subscription = subscriptionWithCredential.subscription
101-
102- setUrl(subscription.url.toString())
103- setTitle(subscription.displayName)
104- setColor(subscription.color)
105- setCustomUserAgent(subscription.customUserAgent)
106- setIgnoreAlerts(subscription.ignoreEmbeddedAlerts)
107- setDefaultAlarmMinutes(subscription.defaultAlarmMinutes?.toString())
108- setDefaultAllDayAlarmMinutes(subscription.defaultAllDayAlarmMinutes?.toString())
109- setIgnoreDescription(subscription.ignoreDescription)
110-
111- val credential = subscriptionWithCredential.credential
112- val requiresAuth = credential != null
113- setRequiresAuth(requiresAuth)
114-
115- if (credential != null ) {
116- setUsername(credential.username)
117- setPassword(credential.password)
118- }
98+ private fun onSubscriptionLoaded (subscriptionWithCredential : SubscriptionsDao .SubscriptionWithCredential ) {
99+ val subscription = subscriptionWithCredential.subscription
100+ val credential = subscriptionWithCredential.credential
119101
120- // Save state, before user makes changes
121- initialSubscription = subscription
122- initialCredential = credential
123- initialRequiresAuthValue = uiState.requiresAuth
124- }
102+ // Save the initial state, before updating the UI, so the state is persisted
103+ initialSubscription = subscription
104+ initialCredential = credential
105+ this .subscriptionWithCredential = subscriptionWithCredential
106+
107+ subscriptionSettingsUseCase.update(subscription, credential)
108+ }
125109
126110 private suspend fun showMessage (@StringRes message : Int ) = withContext(Dispatchers .Main ) {
127111 Toast .makeText(context, message, Toast .LENGTH_LONG ).show()
@@ -132,7 +116,7 @@ class EditSubscriptionModel @AssistedInject constructor(
132116 */
133117 fun updateSubscription () = with (subscriptionSettingsUseCase.uiState) {
134118 viewModelScope.launch(Dispatchers .IO ) {
135- subscription.firstOrNull() ?.let { subscription ->
119+ subscriptionWithCredential ?.let { ( subscription) ->
136120 val newSubscription = subscription.copy(
137121 displayName = title ? : subscription.displayName,
138122 color = color,
@@ -164,7 +148,7 @@ class EditSubscriptionModel @AssistedInject constructor(
164148 */
165149 fun removeSubscription () {
166150 viewModelScope.launch(Dispatchers .IO ) {
167- subscription.firstOrNull() ?.let { subscription ->
151+ subscriptionWithCredential ?.let { ( subscription) ->
168152 db.subscriptionsDao().delete(subscription)
169153
170154 // sync the subscription to reflect the changes in the calendar provider
0 commit comments