11package com.neki.android.app
22
3+ import android.content.Intent
34import android.graphics.Color
45import android.os.Bundle
56import android.widget.Toast
@@ -8,7 +9,10 @@ import androidx.activity.SystemBarStyle
89import androidx.activity.compose.setContent
910import androidx.activity.enableEdgeToEdge
1011import androidx.compose.runtime.CompositionLocalProvider
12+ import androidx.compose.runtime.getValue
13+ import androidx.compose.runtime.mutableStateOf
1114import androidx.compose.runtime.remember
15+ import androidx.compose.runtime.setValue
1216import androidx.lifecycle.lifecycleScope
1317import androidx.navigation3.runtime.entryProvider
1418import com.neki.android.app.main.MainRoute
@@ -29,10 +33,30 @@ import com.neki.android.feature.auth.api.AuthNavKey
2933import com.neki.android.feature.auth.impl.navigation.authEntryProvider
3034import com.neki.android.feature.photo_upload.api.navigateToQRScan
3135import com.neki.android.feature.photo_upload.api.navigateToUploadAlbum
36+ import android.net.Uri
37+ import androidx.core.content.IntentCompat
3238import dagger.hilt.android.AndroidEntryPoint
39+ import kotlinx.collections.immutable.ImmutableList
40+ import kotlinx.collections.immutable.persistentListOf
41+ import kotlinx.collections.immutable.toImmutableList
3342import kotlinx.coroutines.launch
3443import javax.inject.Inject
3544
45+ private fun Intent.extractShareUriStrings (): ImmutableList <String > {
46+ val uris: List <Uri > = when (action) {
47+ Intent .ACTION_SEND -> {
48+ IntentCompat .getParcelableExtra(this , Intent .EXTRA_STREAM , Uri ::class .java)
49+ ?.let { listOf (it) } ? : emptyList()
50+ }
51+ Intent .ACTION_SEND_MULTIPLE -> {
52+ IntentCompat .getParcelableArrayListExtra(this , Intent .EXTRA_STREAM , Uri ::class .java)
53+ ? : emptyList()
54+ }
55+ else -> emptyList()
56+ }
57+ return uris.map { it.toString() }.toImmutableList()
58+ }
59+
3660@AndroidEntryPoint
3761class MainActivity : ComponentActivity () {
3862
@@ -54,9 +78,13 @@ class MainActivity : ComponentActivity() {
5478 @Inject
5579 lateinit var authEventManager: AuthEventManager
5680
81+ private var pendingShareUriStrings by mutableStateOf<ImmutableList <String >>(persistentListOf())
82+
5783 override fun onCreate (savedInstanceState : Bundle ? ) {
5884 super .onCreate(savedInstanceState)
5985
86+ pendingShareUriStrings = intent.extractShareUriStrings()
87+
6088 enableEdgeToEdge(
6189 navigationBarStyle = SystemBarStyle .auto(
6290 lightScrim = Color .TRANSPARENT ,
@@ -97,6 +125,8 @@ class MainActivity : ComponentActivity() {
97125 navigateToQRScan = mainNavigator::navigateToQRScan,
98126 navigateToUploadAlbumWithGallery = mainNavigator::navigateToUploadAlbum,
99127 navigateToUploadAlbumWithQRScan = mainNavigator::navigateToUploadAlbum,
128+ pendingShareUriStrings = pendingShareUriStrings,
129+ onShareUrisConsumed = { pendingShareUriStrings = persistentListOf() },
100130 )
101131 }
102132 }
@@ -107,6 +137,14 @@ class MainActivity : ComponentActivity() {
107137 observeAuthEvents()
108138 }
109139
140+ override fun onNewIntent (intent : Intent ) {
141+ super .onNewIntent(intent)
142+ val uriStrings = intent.extractShareUriStrings()
143+ if (uriStrings.isNotEmpty()) {
144+ pendingShareUriStrings = uriStrings
145+ }
146+ }
147+
110148 private fun observeAuthEvents () {
111149 lifecycleScope.launch {
112150 authEventManager.authEvent.collect { event ->
0 commit comments