Skip to content

Commit 6ebf7e9

Browse files
committed
Use VM factory
Signed-off-by: Arnau Mora <arnyminerz@proton.me>
1 parent 85fbcb2 commit 6ebf7e9

3 files changed

Lines changed: 35 additions & 41 deletions

File tree

app/src/main/java/at/bitfire/icsdroid/model/AddSubscriptionModel.kt

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import at.bitfire.icsdroid.db.AppDatabase
1818
import at.bitfire.icsdroid.db.entity.Credential
1919
import at.bitfire.icsdroid.db.entity.Subscription
2020
import at.bitfire.icsdroid.ui.ResourceInfo
21+
import dagger.assisted.Assisted
22+
import dagger.assisted.AssistedFactory
23+
import dagger.assisted.AssistedInject
2124
import dagger.hilt.android.lifecycle.HiltViewModel
2225
import dagger.hilt.android.qualifiers.ApplicationContext
2326
import kotlinx.coroutines.Dispatchers
@@ -26,16 +29,34 @@ import kotlinx.coroutines.withContext
2629
import okhttp3.HttpUrl.Companion.toHttpUrl
2730
import java.net.URI
2831
import java.net.URISyntaxException
29-
import javax.inject.Inject
3032

31-
@HiltViewModel
32-
class AddSubscriptionModel @Inject constructor(
33+
@HiltViewModel(assistedFactory = AddSubscriptionModel.Factory::class)
34+
class AddSubscriptionModel @AssistedInject constructor(
35+
@Assisted("title") initialTitle: String?,
36+
@Assisted("color") initialColor: Int?,
37+
@Assisted("url") initialUrl: String?,
3338
@param:ApplicationContext private val context: Context,
3439
private val db: AppDatabase,
35-
val validator: Validator,
36-
val subscriptionSettingsUseCase: SubscriptionSettingsUseCase
40+
val validator: Validator
3741
) : ViewModel() {
3842

43+
@AssistedFactory
44+
interface Factory {
45+
fun create(
46+
@Assisted("title") title: String? = null,
47+
@Assisted("color") color: Int? = null,
48+
@Assisted("url") url: String? = null
49+
): AddSubscriptionModel
50+
}
51+
52+
val subscriptionSettingsUseCase: SubscriptionSettingsUseCase = SubscriptionSettingsUseCase(
53+
SubscriptionSettingsUseCase.UiState(
54+
title = initialTitle,
55+
color = initialColor,
56+
url = initialUrl
57+
)
58+
)
59+
3960
data class UiState(
4061
val errorMessage: String? = null,
4162
val isCreating: Boolean = false,
@@ -225,15 +246,6 @@ class AddSubscriptionModel @Inject constructor(
225246
return uri
226247
}
227248

228-
fun initialize(title: String?, color: Int?, url: String?,) {
229-
if (subscriptionSettingsUseCase.uiState.isInitialized()) return
230-
subscriptionSettingsUseCase.setInitialValues(title, color, url)
231-
232-
if (url != null) {
233-
checkUrlIntroductionPage()
234-
}
235-
}
236-
237249
fun onFilePicked(uri: Uri?) {
238250
if (uri == null) return
239251

app/src/main/java/at/bitfire/icsdroid/model/SubscriptionSettingsUseCase.kt

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import at.bitfire.icsdroid.db.entity.Credential
99
import at.bitfire.icsdroid.db.entity.Subscription
1010
import javax.inject.Inject
1111

12-
class SubscriptionSettingsUseCase @Inject constructor() {
12+
class SubscriptionSettingsUseCase(initialUiState: UiState = UiState()) {
13+
14+
@Deprecated("Do not inject constructor. Manually initialize with initial state.")
15+
@Inject constructor(): this(UiState())
16+
1317
data class UiState(
1418
val url: String? = null,
1519
val fileName: String? = null,
@@ -33,11 +37,9 @@ class SubscriptionSettingsUseCase @Inject constructor() {
3337
val validUrlInput: Boolean = url?.let { url ->
3438
HttpUtils.acceptedProtocol(url.toUri())
3539
} ?: false
36-
37-
fun isInitialized() = url != null || title != null || color != null
3840
}
3941

40-
var uiState by mutableStateOf(UiState())
42+
var uiState by mutableStateOf(initialUiState)
4143
private set
4244

4345
fun setUrl(value: String?) {
@@ -98,24 +100,6 @@ class SubscriptionSettingsUseCase @Inject constructor() {
98100
)
99101
}
100102

101-
/**
102-
* Set initial values when creating a new subscription.
103-
*
104-
* Note that all values will be overwritten, so call this method before changing any individual
105-
* value, or when you want to reset the form to an initial state.
106-
*/
107-
fun setInitialValues(
108-
title: String?,
109-
color: Int?,
110-
url: String?,
111-
) {
112-
uiState = UiState(
113-
title = title,
114-
color = color,
115-
url = url,
116-
)
117-
}
118-
119103
fun equalsSubscription(subscription: Subscription) =
120104
uiState.url == subscription.url.toString()
121105
&& uiState.title == subscription.displayName

app/src/main/java/at/bitfire/icsdroid/ui/screen/AddSubscriptionScreen.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ fun AddSubscriptionScreen(
5454
title: String?,
5555
color: Int?,
5656
url: String?,
57-
model: AddSubscriptionModel = hiltViewModel(),
57+
model: AddSubscriptionModel = hiltViewModel<AddSubscriptionModel, AddSubscriptionModel.Factory> {
58+
it.create(title, color, url)
59+
},
5860
onBackRequested: () -> Unit
5961
) {
6062
val scope = rememberCoroutineScope()
@@ -64,10 +66,6 @@ fun AddSubscriptionScreen(
6466
ActivityResultContracts.OpenDocument()
6567
) { uri: Uri? -> model.onFilePicked(uri) }
6668

67-
LaunchedEffect(title, color, url) {
68-
model.initialize(title, color, url)
69-
}
70-
7169
// Receive updates for the URL introduction page
7270
with(model.subscriptionSettingsUseCase.uiState) {
7371
LaunchedEffect(url, requiresAuth, username, password) {

0 commit comments

Comments
 (0)