From 3e40e4eff6d6bd6e40b0590d1ca622d584de7ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmedalija=20Kari=C5=A1ik?= Date: Tue, 25 Feb 2025 16:35:40 +0100 Subject: [PATCH] Implement share photo/video via Primal app (#342) --- app/src/main/AndroidManifest.xml | 7 + .../android/navigation/PrimalAppNavigation.kt | 135 +++++++++++++----- 2 files changed, 105 insertions(+), 37 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe679eae1..219f0b417 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -138,6 +138,13 @@ + + + + + + + navController.navigateToWelcome() is SplashContract.SideEffect.ActiveAccount -> { - val url = activity?.intent?.data?.toString()?.ifBlank { null } - when (val deepLink = url?.parseDeepLinkOrNull()) { - is DeepLink.Note -> { - navController.popBackStack() - navController.navigateToThread(noteId = deepLink.noteId) - } - - is DeepLink.Profile -> { - navController.popBackStack() - navController.navigateToProfile(profileId = deepLink.pubkey) - } + val intent = activity?.intent - is DeepLink.NostrWalletConnect -> { - navController.popBackStack() - navController.navigateToWalletSettings( - nwcUrl = withContext(Dispatchers.IO) { - URLEncoder.encode(url, Charsets.UTF_8.name()) - }, - ) + when (intent?.action) { + Intent.ACTION_SEND -> { + handleReceiveSingleMedia(intent, navController) } - - is DeepLink.PrimalNWC -> { - navController.popBackStack() - navController.navigateToLinkPrimalWallet( - callback = deepLink.primalWalletNwc.callback, - appName = deepLink.primalWalletNwc.appName, - appIcon = deepLink.primalWalletNwc.appIcon, - ) + Intent.ACTION_SEND_MULTIPLE -> { + handleReceiveMultipleMedia(intent, navController) } - - is DeepLink.Article -> { - navController.popBackStack() - navController.navigateToArticleDetails(deepLink.naddr) - } - - is DeepLink.AdvancedSearch -> { - navController.popBackStack() - navController.navigateToExploreFeed(feedSpec = deepLink.feedSpec) + Intent.ACTION_VIEW -> { + val url = intent.data?.toString()?.ifBlank { null } + handleDeepLink(url, navController) } - - null -> navController.navigateToHome() + else -> navController.navigateToHome() } } } @@ -794,6 +771,90 @@ fun SharedTransitionScope.PrimalAppNavigation() { } } +private fun handleReceiveSingleMedia(intent: Intent, navController: NavHostController) { + val mediaUri: Uri? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(Intent.EXTRA_STREAM) + } + + if (mediaUri != null) { + navController.popBackStack() + navController.navigateToNoteEditor( + NoteEditorArgs( + mediaUris = listOf(mediaUri.toString()), + ), + ) + } else { + navController.navigateToHome() + } +} + +private fun handleReceiveMultipleMedia(intent: Intent, navController: NavController) { + val mediaUris: List? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM) + } + + if (!mediaUris.isNullOrEmpty()) { + navController.popBackStack() + navController.navigateToNoteEditor( + NoteEditorArgs( + mediaUris = mediaUris.map { it.toString() }, + ), + ) + } else { + navController.navigateToHome() + } +} + +private suspend fun handleDeepLink(url: String?, navController: NavHostController) { + when (val deepLink = url?.parseDeepLinkOrNull()) { + is DeepLink.Note -> { + navController.popBackStack() + navController.navigateToThread(noteId = deepLink.noteId) + } + + is DeepLink.Profile -> { + navController.popBackStack() + navController.navigateToProfile(profileId = deepLink.pubkey) + } + + is DeepLink.NostrWalletConnect -> { + navController.popBackStack() + navController.navigateToWalletSettings( + nwcUrl = withContext(Dispatchers.IO) { + URLEncoder.encode(url, Charsets.UTF_8.name()) + }, + ) + } + + is DeepLink.PrimalNWC -> { + navController.popBackStack() + navController.navigateToLinkPrimalWallet( + callback = deepLink.primalWalletNwc.callback, + appName = deepLink.primalWalletNwc.appName, + appIcon = deepLink.primalWalletNwc.appIcon, + ) + } + + is DeepLink.Article -> { + navController.popBackStack() + navController.navigateToArticleDetails(deepLink.naddr) + } + + is DeepLink.AdvancedSearch -> { + navController.popBackStack() + navController.navigateToExploreFeed(feedSpec = deepLink.feedSpec) + } + + null -> navController.navigateToHome() + } +} + private fun NavGraphBuilder.splash(route: String) = composable(route = route) { SplashScreen()