Skip to content

Commit 15b4808

Browse files
ArnyminerZCopilot
andauthored
Fix URL sharing (#668)
* Fix URL sharing from DAVx⁵ Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Clean log message Signed-off-by: Arnau Mora <arnyminerz@proton.me> * Update app/src/main/java/at/bitfire/icsdroid/ui/nav/MainApp.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Copilot removed this Signed-off-by: Arnau Mora <arnyminerz@proton.me> --------- Signed-off-by: Arnau Mora <arnyminerz@proton.me> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 3a0d028 commit 15b4808

3 files changed

Lines changed: 29 additions & 25 deletions

File tree

app/src/main/java/at/bitfire/icsdroid/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class MainActivity : AppCompatActivity() {
2121
super.onCreate(savedInstanceState)
2222

2323
setContentThemed {
24-
MainApp(savedInstanceState, intent.extras, ::finish)
24+
MainApp(savedInstanceState, intent, ::finish)
2525
}
2626
}
2727

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ sealed interface Destination : NavKey {
1717
data class AddSubscription(
1818
val title: String? = null,
1919
@param:ColorInt val color: Int? = null,
20+
val url: String? = null,
2021
): Destination
2122
}

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

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import android.content.Intent
99
import android.net.Uri
1010
import android.os.Bundle
1111
import androidx.compose.runtime.Composable
12-
import androidx.compose.runtime.LaunchedEffect
1312
import androidx.compose.runtime.getValue
1413
import androidx.compose.runtime.mutableStateOf
1514
import androidx.compose.runtime.remember
1615
import androidx.compose.runtime.setValue
16+
import androidx.core.content.IntentCompat
1717
import androidx.core.os.BundleCompat
1818
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
1919
import androidx.navigation3.runtime.entry
@@ -32,15 +32,30 @@ import at.bitfire.icsdroid.ui.screen.SubscriptionsScreen
3232
import java.util.ServiceLoader
3333

3434
/**
35-
* Computes the correct initial destination from some intent extras:
35+
* Computes the correct initial destination from some intent:
3636
* - If [AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE] is present -> [Destination.AddSubscription]
3737
* - Otherwise: [Destination.SubscriptionList]
3838
*/
39-
private fun calculateInitialDestination(intentExtras: Bundle?): Destination {
40-
return if (intentExtras?.containsKey(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE) == true) {
39+
private fun calculateInitialDestination(intent: Intent): Destination {
40+
val extras = intent.extras ?: Bundle.EMPTY
41+
val text = extras.getString(Intent.EXTRA_TEXT)
42+
?.trim()
43+
?.takeUnless { it.isEmpty() }
44+
val stream = BundleCompat.getParcelable(extras, Intent.EXTRA_STREAM, Uri::class.java)
45+
?.toString()
46+
val data = intent.dataString
47+
48+
return if (extras.containsKey(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE)) {
4149
// If KEY_ACCOUNT_AUTHENTICATOR_RESPONSE was given, intent was launched from authenticator,
4250
// open the add subscription screen
4351
Destination.AddSubscription()
52+
} else if (text != null || stream != null || data != null) {
53+
// If a URL was given, open the add subscription screen
54+
Destination.AddSubscription(
55+
title = extras.getString("title"),
56+
color = extras.takeIf { it.containsKey("color") }?.getInt("color", -1),
57+
url = text ?: stream ?: data
58+
)
4459
} else {
4560
// If no condition matches, show the subscriptions list
4661
Destination.SubscriptionList
@@ -50,20 +65,20 @@ private fun calculateInitialDestination(intentExtras: Bundle?): Destination {
5065
@Composable
5166
fun MainApp(
5267
savedInstanceState: Bundle?,
53-
intentExtras: Bundle?,
68+
intent: Intent,
5469
onFinish: () -> Unit,
5570
) {
5671
// If EXTRA_PERMISSION is true, request the calendar permissions
57-
val requestPermissions = intentExtras?.getBoolean(EXTRA_REQUEST_CALENDAR_PERMISSION, false) == true
72+
val requestPermissions = intent.getBooleanExtra(EXTRA_REQUEST_CALENDAR_PERMISSION, false)
5873

5974
// show error message from calling intent, if available
6075
var showingErrorMessage by remember {
61-
mutableStateOf(savedInstanceState == null && intentExtras?.containsKey(EXTRA_ERROR_MESSAGE) == true)
76+
mutableStateOf(savedInstanceState == null && intent.hasExtra(EXTRA_ERROR_MESSAGE))
6277
}
63-
if (showingErrorMessage && intentExtras != null) {
78+
if (showingErrorMessage) {
6479
AlertDialog(
65-
intentExtras.getString(EXTRA_ERROR_MESSAGE)!!,
66-
BundleCompat.getSerializable(intentExtras, EXTRA_THROWABLE, Throwable::class.java)
80+
intent.getStringExtra(EXTRA_ERROR_MESSAGE)!!,
81+
IntentCompat.getSerializableExtra(intent, EXTRA_THROWABLE, Throwable::class.java)
6782
) { showingErrorMessage = false }
6883
}
6984

@@ -75,7 +90,7 @@ fun MainApp(
7590
if (show) service.Content()
7691
}
7792

78-
val backStack = rememberNavBackStack(calculateInitialDestination(intentExtras))
93+
val backStack = rememberNavBackStack(calculateInitialDestination(intent))
7994

8095
fun goBack(depth: Int = 1) {
8196
if (backStack.size <= 1) onFinish()
@@ -98,22 +113,10 @@ fun MainApp(
98113
)
99114
}
100115
entry<Destination.AddSubscription> { destination ->
101-
var url: String? = null
102-
LaunchedEffect(intentExtras) {
103-
if (intentExtras != null) {
104-
intentExtras.getString(Intent.EXTRA_TEXT)
105-
?.trim()
106-
?.let { url = it }
107-
BundleCompat.getParcelable(intentExtras, Intent.EXTRA_STREAM, Uri::class.java)
108-
?.toString()
109-
?.let { url = it }
110-
}
111-
}
112-
113116
AddSubscriptionScreen(
114117
title = destination.title,
115118
color = destination.color,
116-
url = url,
119+
url = destination.url,
117120
onBackRequested = { goBack() }
118121
)
119122
}

0 commit comments

Comments
 (0)