Skip to content

Commit 655aff7

Browse files
authored
Migrate EditSubscriptionActivity to Nav3 (#662)
* Migrate EditSubscriptionActivity to Nav3 * Add BackHandler for dialog Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Fixed going back being called twice Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Cleanup Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Updated comments Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Fix missing comment Signed-off-by: Arnau Mora <arnyminerz@proton.me> --------- Signed-off-by: Arnau Mora <arnyminerz@proton.me>
1 parent 851c5be commit 655aff7

8 files changed

Lines changed: 52 additions & 83 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,6 @@
114114
<data android:mimeType="text/calendar" />
115115
</intent-filter>
116116
</activity>
117-
<activity
118-
android:name=".ui.views.EditSubscriptionActivity"
119-
android:label="@string/activity_edit_calendar"
120-
android:parentActivityName=".MainActivity"
121-
android:windowSoftInputMode="stateAlwaysHidden" />
122117

123118
</application>
124119

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ package at.bitfire.icsdroid.model
66

77
import android.content.Context
88
import android.util.Log
9-
import androidx.compose.runtime.getValue
10-
import androidx.compose.runtime.mutableStateOf
11-
import androidx.compose.runtime.setValue
9+
import android.widget.Toast
10+
import androidx.annotation.StringRes
1211
import androidx.lifecycle.ViewModel
1312
import androidx.lifecycle.viewModelScope
1413
import at.bitfire.icsdroid.Constants
@@ -25,6 +24,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
2524
import dagger.hilt.android.qualifiers.ApplicationContext
2625
import kotlinx.coroutines.Dispatchers
2726
import kotlinx.coroutines.launch
27+
import kotlinx.coroutines.withContext
2828

2929
@HiltViewModel(assistedFactory = EditSubscriptionModel.EditSubscriptionModelFactory::class)
3030
class EditSubscriptionModel @AssistedInject constructor(
@@ -78,9 +78,6 @@ class EditSubscriptionModel @AssistedInject constructor(
7878
credentialsDirty || subscriptionsDirty
7979
}
8080

81-
var successMessage: String? by mutableStateOf(null)
82-
private set
83-
8481
var subscriptionWithCredential: SubscriptionsDao.SubscriptionWithCredential? = null
8582
private set
8683

@@ -107,6 +104,10 @@ class EditSubscriptionModel @AssistedInject constructor(
107104
subscriptionSettingsUseCase.update(subscription, credential)
108105
}
109106

107+
private suspend fun showMessage(@StringRes message: Int) = withContext(Dispatchers.Main) {
108+
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
109+
}
110+
110111
/**
111112
* Updates the loaded subscription from the data provided by the view models.
112113
*/
@@ -131,7 +132,7 @@ class EditSubscriptionModel @AssistedInject constructor(
131132
db.credentialsDao().removeBySubscriptionId(subscriptionId)
132133

133134
// notify UI about success
134-
successMessage = context.getString(R.string.edit_calendar_saved)
135+
showMessage(R.string.edit_calendar_saved)
135136

136137
// sync the subscription to reflect the changes in the calendar provider
137138
SyncWorker.run(context, forceResync = true)
@@ -151,7 +152,7 @@ class EditSubscriptionModel @AssistedInject constructor(
151152
SyncWorker.run(context)
152153

153154
// notify UI about success
154-
successMessage = context.getString(R.string.edit_calendar_deleted)
155+
showMessage(R.string.edit_calendar_deleted)
155156
} ?: Log.w(Constants.TAG, "There's no subscription to remove")
156157
}
157158
}

app/src/main/java/at/bitfire/icsdroid/ui/nav/Destination.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,9 @@ sealed interface Destination : NavKey {
2222
@param:ColorInt val color: Int? = null,
2323
val url: String? = null,
2424
): Destination
25+
26+
@Serializable
27+
data class EditSubscription(
28+
val subscriptionId: Long
29+
): Destination
2530
}

app/src/main/java/at/bitfire/icsdroid/ui/nav/MainApp.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import androidx.compose.runtime.mutableStateOf
1414
import androidx.compose.runtime.remember
1515
import androidx.compose.runtime.setValue
1616
import androidx.core.content.IntentCompat
17+
import androidx.compose.ui.platform.LocalContext
18+
import androidx.core.app.ShareCompat
1719
import androidx.core.os.BundleCompat
1820
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
1921
import androidx.navigation3.runtime.entry
@@ -25,10 +27,12 @@ import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator
2527
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_ERROR_MESSAGE
2628
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_REQUEST_CALENDAR_PERMISSION
2729
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_THROWABLE
30+
import at.bitfire.icsdroid.R
2831
import at.bitfire.icsdroid.service.ComposableStartupService
2932
import at.bitfire.icsdroid.ui.partials.AlertDialog
3033
import at.bitfire.icsdroid.ui.screen.AddSubscriptionScreen
3134
import at.bitfire.icsdroid.ui.screen.InfoScreen
35+
import at.bitfire.icsdroid.ui.screen.EditSubscriptionScreen
3236
import at.bitfire.icsdroid.ui.screen.SubscriptionsScreen
3337
import java.util.ServiceLoader
3438

@@ -110,8 +114,9 @@ fun MainApp(
110114
entry(Destination.SubscriptionList) {
111115
SubscriptionsScreen(
112116
requestPermissions,
117+
onAddRequested = { backStack.add(Destination.AddSubscription()) },
118+
onItemSelected = { backStack.add(Destination.EditSubscription(it.id)) },
113119
onAboutRequested = { backStack.add(Destination.Info) },
114-
onAddRequested = { backStack.add(Destination.AddSubscription()) }
115120
)
116121
}
117122
entry(Destination.Info) {
@@ -128,6 +133,21 @@ fun MainApp(
128133
onBackRequested = { goBack() }
129134
)
130135
}
136+
entry<Destination.EditSubscription> { destination ->
137+
val context = LocalContext.current
138+
EditSubscriptionScreen(
139+
subscriptionId = destination.subscriptionId,
140+
onShare = { subscription ->
141+
ShareCompat.IntentBuilder(context)
142+
.setSubject(subscription.displayName)
143+
.setText(subscription.url.toString())
144+
.setType("text/plain")
145+
.setChooserTitle(R.string.edit_calendar_send_url)
146+
.startChooser()
147+
},
148+
onExit = ::goBack
149+
)
150+
}
131151
}
132152
)
133153
}

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

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
package at.bitfire.icsdroid.ui.screen
66

7-
import android.widget.Toast
7+
import androidx.activity.compose.BackHandler
88
import androidx.compose.animation.AnimatedVisibility
99
import androidx.compose.foundation.layout.Column
1010
import androidx.compose.foundation.layout.Spacer
@@ -28,7 +28,6 @@ import androidx.compose.runtime.mutableStateOf
2828
import androidx.compose.runtime.remember
2929
import androidx.compose.runtime.setValue
3030
import androidx.compose.ui.Modifier
31-
import androidx.compose.ui.platform.LocalContext
3231
import androidx.compose.ui.res.stringResource
3332
import androidx.compose.ui.tooling.preview.Preview
3433
import androidx.compose.ui.unit.dp
@@ -58,9 +57,10 @@ fun EditSubscriptionScreen(
5857
EditSubscriptionScreen(
5958
inputValid = model.inputValid,
6059
modelsDirty = model.modelsDirty,
61-
successMessage = model.successMessage,
6260
onDelete = model::removeSubscription,
63-
onSave = model::updateSubscription,
61+
onSave = {
62+
model.updateSubscription().invokeOnCompletion { onExit() }
63+
},
6464
onShare = {
6565
model.subscriptionWithCredential?.let { (subscription) ->
6666
onShare(subscription)
@@ -100,7 +100,6 @@ fun EditSubscriptionScreen(
100100
fun EditSubscriptionScreen(
101101
inputValid: Boolean,
102102
modelsDirty: Boolean,
103-
successMessage: String?,
104103
onDelete: () -> Unit,
105104
onSave: () -> Unit,
106105
onShare: () -> Unit,
@@ -131,12 +130,6 @@ fun EditSubscriptionScreen(
131130
onUsernameChange: (String) -> Unit,
132131
onPasswordChange: (String) -> Unit
133132
) {
134-
// show success message
135-
successMessage?.let {
136-
Toast.makeText(LocalContext.current, successMessage, Toast.LENGTH_LONG).show()
137-
onExit()
138-
}
139-
140133
Scaffold(
141134
topBar = {
142135
AppBarComposable(
@@ -236,6 +229,11 @@ private fun AppBarComposable(
236229
dismissButton = stringResource(R.string.edit_calendar_dismiss) to onExit
237230
) { openSaveDismissDialog = false }
238231
}
232+
233+
BackHandler(enabled = modelsDirty) {
234+
openSaveDismissDialog = true
235+
}
236+
239237
ExtendedTopAppBar(
240238
navigationIcon = {
241239
IconButton(
@@ -276,7 +274,6 @@ fun EditSubscriptionScreen_Preview() {
276274
EditSubscriptionScreen(
277275
inputValid = true,
278276
modelsDirty = false,
279-
successMessage = "yay!",
280277
onDelete = {},
281278
onSave = {},
282279
onShare = {},

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ import at.bitfire.icsdroid.ui.partials.CalendarListItem
6262
import at.bitfire.icsdroid.ui.partials.ExtendedTopAppBar
6363
import at.bitfire.icsdroid.ui.partials.GenericAlertDialog
6464
import at.bitfire.icsdroid.ui.partials.SyncIntervalDialog
65-
import at.bitfire.icsdroid.ui.views.EditSubscriptionActivity
6665

6766
@Composable
6867
fun SubscriptionsScreen(
6968
requestPermissions: Boolean,
7069
onAboutRequested: () -> Unit,
7170
onAddRequested: () -> Unit,
71+
onItemSelected: (Subscription) -> Unit,
7272
model: SubscriptionsModel = hiltViewModel()
7373
) {
7474
val activity = LocalActivity.current
@@ -100,12 +100,7 @@ fun SubscriptionsScreen(
100100
onAddRequested = onAddRequested,
101101
onRequestCalendarPermissions = requestCalendarPermissions,
102102
onRequestNotificationPermission = requestNotificationPermission,
103-
onItemSelected = { subscription ->
104-
activity?.startActivity(
105-
Intent(context, EditSubscriptionActivity::class.java)
106-
.putExtra(EditSubscriptionActivity.EXTRA_SUBSCRIPTION_ID, subscription.id)
107-
)
108-
}
103+
onItemSelected = onItemSelected
109104
)
110105
}
111106

app/src/main/java/at/bitfire/icsdroid/ui/views/EditSubscriptionActivity.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<string name="install_browser">Please install a Web browser</string>
1818
<string name="required_annotation">Required</string>
1919

20-
<!-- CalendarListActivity -->
20+
<!-- SubscriptionScreen -->
2121
<string name="title_activity_calendar_list">My subscriptions</string>
2222
<string name="calendar_list_empty_info">To subscribe to a Webcal feed, use the + button or open a Webcal URL.</string>
2323
<string name="calendar_list_info">About ICSx⁵</string>
@@ -33,7 +33,7 @@
3333
<string name="calendar_list_autorevoke_permissions_title">Auto-Revoke Permissions</string>
3434
<string name="calendar_list_autorevoke_permissions_text">Android revokes permissions of rarely opened apps. Please disable for %s.</string>
3535
<string name="calendar_list_autorevoke_permissions_instruction">Click Permissions > uncheck \"Remove permissions if app isn\'t used\"</string>
36-
<!-- settings, currently in CalendarListActivity -->
36+
<!-- settings, currently in SubscriptionsScreen -->
3737
<string name="calendar_list_privacy_policy">Privacy policy</string>
3838
<string name="set_sync_interval_title">Set sync. interval:</string>
3939
<string-array name="set_sync_interval_seconds" translatable="false">
@@ -56,7 +56,7 @@
5656
</string-array>
5757
<string name="settings_force_dark_theme">Force dark theme</string>
5858

59-
<!-- AddCalendarActivity -->
59+
<!-- AddSubscriptionScreen -->
6060
<string name="activity_add_calendar">Subscribe to calendar</string>
6161
<string name="activity_add_calendar_subscribe">Subscribe</string>
6262
<string name="add_calendar_subscribe_url">Subscribe to URL</string>
@@ -92,10 +92,10 @@
9292
<string name="add_calendar_custom_user_agent_label">Custom user agent string</string>
9393
<string name="add_calendar_custom_user_agent_description">Replace the default user agent with a custom one.</string>
9494

95-
<!-- AlertFragment -->
95+
<!-- AlertDialog -->
9696
<string name="alert_share_details">Share details</string>
9797

98-
<!-- EditCalendarActivity -->
98+
<!-- EditSubscriptionScreen -->
9999
<string name="activity_edit_calendar">Edit subscription</string>
100100
<string name="edit_calendar_cancel">Cancel</string>
101101
<string name="edit_calendar_delete">Unsubscribe</string>
@@ -117,7 +117,7 @@
117117
<string name="sync_permission_required_sync_calendar">Needing permission to sync your calendar</string>
118118
<string name="could_not_open_storage_file">Couldn\'t open file from storage</string>
119119

120-
<!-- InfoActivity -->
120+
<!-- InfoScreen -->
121121
<string name="activity_app_info">App info</string>
122122
<string name="app_info_version">Version %1$s-%2$s</string>
123123
<string name="app_info_copyright">© Ricki Hirner, Bernhard Stockmann (bitfire web engineering GmbH) and contributors</string>

0 commit comments

Comments
 (0)