44
55package at.bitfire.icsdroid.ui.screen
66
7- import android.content.Intent
87import android.net.Uri
9- import android.provider.OpenableColumns
108import android.util.Log
11- import android.widget.Toast
129import androidx.activity.compose.rememberLauncherForActivityResult
1310import androidx.activity.result.contract.ActivityResultContracts
1411import androidx.compose.animation.AnimatedVisibility
1512import androidx.compose.animation.expandVertically
1613import androidx.compose.foundation.ExperimentalFoundationApi
1714import androidx.compose.foundation.layout.Arrangement
18- import androidx.compose.foundation.layout.Box
1915import androidx.compose.foundation.layout.Row
2016import androidx.compose.foundation.layout.fillMaxSize
2117import androidx.compose.foundation.layout.fillMaxWidth
@@ -42,7 +38,6 @@ import androidx.compose.runtime.rememberCoroutineScope
4238import androidx.compose.ui.Alignment
4339import androidx.compose.ui.Modifier
4440import androidx.compose.ui.graphics.toArgb
45- import androidx.compose.ui.platform.LocalContext
4641import androidx.compose.ui.res.stringResource
4742import androidx.compose.ui.unit.dp
4843import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
@@ -63,69 +58,16 @@ fun AddSubscriptionScreen(
6358 model : AddSubscriptionModel = hiltViewModel(),
6459 onBackRequested : () -> Unit
6560) {
66- val context = LocalContext .current
67- val uiState = model.uiState
68-
69- LaunchedEffect (uiState) {
70- if (uiState.success) {
71- // on success, show notification and close activity
72- Toast .makeText(context, context.getString(R .string.add_calendar_created), Toast .LENGTH_LONG ).show()
73- onBackRequested()
74- }
75- uiState.errorMessage?.let {
76- // on error, show error message
77- Toast .makeText(context, it, Toast .LENGTH_LONG ).show()
78- }
79- }
80-
81- LaunchedEffect (title, color, url) {
82- if (model.subscriptionSettingsUseCase.uiState.isInitialized())
83- return @LaunchedEffect
84- model.subscriptionSettingsUseCase.setInitialValues(title, color, url)
85-
86- if (url != null ) {
87- model.checkUrlIntroductionPage()
88- }
89- }
61+ val scope = rememberCoroutineScope()
62+ val pagerState = rememberPagerState { 2 }
9063
9164 val pickFile = rememberLauncherForActivityResult(
9265 ActivityResultContracts .OpenDocument ()
93- ) { uri: Uri ? ->
94- if (uri != null ) {
95- // keep the picked file accessible after the first sync and reboots
96- context.contentResolver.takePersistableUriPermission(
97- uri,
98- Intent .FLAG_GRANT_READ_URI_PERMISSION
99- )
100- model.subscriptionSettingsUseCase.setUrl(uri.toString())
66+ ) { uri: Uri ? -> model.onFilePicked(uri) }
10167
102- // Get file name
103- val displayName = context.contentResolver.query(uri, null , null , null , null )?.use { cursor ->
104- if (! cursor.moveToFirst()) return @use null
105- val name = cursor.getColumnIndex(OpenableColumns .DISPLAY_NAME )
106- cursor.getString(name)
107- }
108- model.subscriptionSettingsUseCase.setFileName(displayName)
109- }
110- }
111-
112- Box (modifier = Modifier .imePadding()) {
113- AddSubscriptionScreen (
114- model = model,
115- onPickFileRequested = { pickFile.launch(arrayOf(" text/calendar" )) },
116- finish = onBackRequested
117- )
68+ LaunchedEffect (title, color, url) {
69+ model.initialize(title, color, url)
11870 }
119- }
120-
121- @Composable
122- fun AddSubscriptionScreen (
123- model : AddSubscriptionModel ,
124- onPickFileRequested : () -> Unit ,
125- finish : () -> Unit
126- ) {
127- val scope = rememberCoroutineScope()
128- val pagerState = rememberPagerState { 2 }
12971
13072 // Receive updates for the URL introduction page
13173 with (model.subscriptionSettingsUseCase.uiState) {
@@ -202,7 +144,7 @@ fun AddSubscriptionScreen(
202144 isCreating = model.uiState.isCreating,
203145 validationResult = validationResult,
204146 onResetResult = model::resetValidationResult,
205- onPickFileRequested = onPickFileRequested ,
147+ onPickFileRequested = { pickFile.launch(arrayOf( " text/calendar " )) } ,
206148 onNextRequested = { page: Int ->
207149 when (page) {
208150 // First page (Enter Url)
@@ -225,13 +167,13 @@ fun AddSubscriptionScreen(
225167 }
226168 // Second page (details and confirm)
227169 1 -> {
228- model.createSubscription()
170+ model.createSubscription().invokeOnCompletion { onBackRequested() }
229171 }
230172 }
231173 },
232174 onNavigationClicked = {
233175 // If first page, close activity
234- if (pagerState.currentPage <= 0 ) finish ()
176+ if (pagerState.currentPage <= 0 ) onBackRequested ()
235177 // otherwise, go back a page
236178 else scope.launch {
237179 // Needed for non-first-time validations to trigger following validation result updates
@@ -296,6 +238,7 @@ fun AddSubscriptionScreen(
296238 modifier = Modifier
297239 .fillMaxSize()
298240 .padding(paddingValues)
241+ .imePadding()
299242 ) { page ->
300243 when (page) {
301244 0 -> EnterUrlComposable (
0 commit comments