Skip to content

Commit

Permalink
Implement share photo/video via Primal app (#342)
Browse files Browse the repository at this point in the history
  • Loading branch information
mehmedalijaK authored Feb 25, 2025
1 parent 0a9fa78 commit 3e40e4e
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 37 deletions.
7 changes: 7 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,13 @@
<data android:host="connect"/>
</intent-filter>

<intent-filter android:label="Share in a Note">
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>

<provider
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package net.primal.android.navigation

import android.content.Intent
import android.net.Uri
import android.os.Build
import androidx.activity.compose.LocalActivity
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExperimentalSharedTransitionApi
Expand All @@ -17,6 +20,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.NavOptions
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
Expand Down Expand Up @@ -426,47 +430,20 @@ fun SharedTransitionScope.PrimalAppNavigation() {
when (it) {
SplashContract.SideEffect.NoActiveAccount -> 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()
}
}
}
Expand Down Expand Up @@ -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<Uri>? = 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()
Expand Down

0 comments on commit 3e40e4e

Please sign in to comment.