Skip to content

Commit 079fafc

Browse files
Add sharing functionality to receive links from other apps (#62)
* Initial plan * Implement sharing functionality for receiving links from other apps Co-authored-by: yogeshpaliyal <[email protected]> * Improve shared text handling to prevent dialog conflicts Co-authored-by: yogeshpaliyal <[email protected]> * feat: minor changes * feat: minor change --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: yogeshpaliyal <[email protected]> Co-authored-by: Yogesh Choudhary Paliyal <[email protected]>
1 parent 970c9f8 commit 079fafc

File tree

4 files changed

+85
-22
lines changed

4 files changed

+85
-22
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@
3636

3737
<category android:name="android.intent.category.LAUNCHER" />
3838
</intent-filter>
39+
40+
<!-- Intent filter for receiving shared text/links from other apps -->
41+
<intent-filter>
42+
<action android:name="android.intent.action.SEND" />
43+
<category android:name="android.intent.category.DEFAULT" />
44+
<data android:mimeType="text/plain" />
45+
</intent-filter>
3946
</activity>
4047
<activity
4148
android:name="com.journeyapps.barcodescanner.CaptureActivity"

app/src/main/java/com/yogeshpaliyal/deepr/MainActivity.kt

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.yogeshpaliyal.deepr
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import androidx.activity.ComponentActivity
56
import androidx.activity.compose.setContent
@@ -8,6 +9,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
89
import androidx.compose.material3.Surface
910
import androidx.compose.material3.Text
1011
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.collectAsState
1113
import androidx.compose.runtime.mutableStateListOf
1214
import androidx.compose.runtime.remember
1315
import androidx.compose.ui.Modifier
@@ -23,25 +25,59 @@ import com.yogeshpaliyal.deepr.ui.screens.SettingsScreen
2325
import com.yogeshpaliyal.deepr.ui.screens.home.Home
2426
import com.yogeshpaliyal.deepr.ui.screens.home.HomeScreen
2527
import com.yogeshpaliyal.deepr.ui.theme.DeeprTheme
28+
import kotlinx.coroutines.flow.MutableStateFlow
2629

2730
class MainActivity : ComponentActivity() {
31+
val sharingLink = MutableStateFlow<String?>(null)
32+
2833
@OptIn(ExperimentalMaterial3Api::class)
2934
override fun onCreate(savedInstanceState: Bundle?) {
3035
super.onCreate(savedInstanceState)
3136
enableEdgeToEdge()
37+
38+
getLinkFromIntent(intent)
39+
3240
setContent {
3341
DeeprTheme {
3442
Surface {
35-
Dashboard()
43+
val sharedText = sharingLink.collectAsState().value
44+
Dashboard(sharedText = sharedText) {
45+
sharingLink.value = null
46+
}
3647
}
3748
}
3849
}
3950
}
51+
52+
fun getLinkFromIntent(intent: Intent) {
53+
// Check if this activity was started via a share intent
54+
val sharedText =
55+
when {
56+
intent?.action == Intent.ACTION_SEND -> {
57+
if (intent.type == "text/plain") {
58+
intent.getStringExtra(Intent.EXTRA_TEXT)
59+
} else {
60+
null
61+
}
62+
}
63+
else -> null
64+
}
65+
sharingLink.value = sharedText
66+
}
67+
68+
override fun onNewIntent(intent: Intent) {
69+
super.onNewIntent(intent)
70+
getLinkFromIntent(intent)
71+
}
4072
}
4173

4274
@Composable
43-
fun Dashboard(modifier: Modifier = Modifier) {
44-
val backStack = remember { mutableStateListOf<Any>(Home) }
75+
fun Dashboard(
76+
modifier: Modifier = Modifier,
77+
sharedText: String? = null,
78+
resetSharedText: () -> Unit,
79+
) {
80+
val backStack = remember(sharedText) { mutableStateListOf<Any>(Home) }
4581

4682
NavDisplay(
4783
backStack = backStack,
@@ -59,7 +95,7 @@ fun Dashboard(modifier: Modifier = Modifier) {
5995
when (key) {
6096
is Home ->
6197
NavEntry(key) {
62-
HomeScreen(backStack)
98+
HomeScreen(backStack, sharedText = sharedText, resetSharedText = resetSharedText)
6399
}
64100

65101
is Settings ->

app/src/main/java/com/yogeshpaliyal/deepr/ui/screens/home/Home.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import androidx.compose.material3.Text
2929
import androidx.compose.material3.TopAppBar
3030
import androidx.compose.material3.TopAppBarDefaults
3131
import androidx.compose.runtime.Composable
32+
import androidx.compose.runtime.LaunchedEffect
3233
import androidx.compose.runtime.collectAsState
3334
import androidx.compose.runtime.getValue
3435
import androidx.compose.runtime.mutableStateOf
@@ -73,6 +74,8 @@ fun HomeScreen(
7374
backStack: SnapshotStateList<Any>,
7475
modifier: Modifier = Modifier,
7576
viewModel: AccountViewModel = koinViewModel(),
77+
sharedText: String? = null,
78+
resetSharedText: () -> Unit,
7679
) {
7780
var isSearchActive by remember { mutableStateOf(false) }
7881
var searchQuery by remember { mutableStateOf("") }
@@ -94,6 +97,17 @@ fun HomeScreen(
9497
}
9598
}
9699

100+
// Handle shared text from other apps
101+
LaunchedEffect(sharedText) {
102+
if (!sharedText.isNullOrBlank() && saveDialogInfo == null) {
103+
if (isValidDeeplink(sharedText)) {
104+
saveDialogInfo = SaveDialogInfo(sharedText, false)
105+
} else {
106+
Toast.makeText(context, "Invalid deeplink from shared content", Toast.LENGTH_SHORT).show()
107+
}
108+
}
109+
}
110+
97111
Scaffold(
98112
modifier = modifier.fillMaxSize(),
99113
topBar = {
@@ -163,6 +177,9 @@ fun HomeScreen(
163177
bottomBar = {
164178
HomeBottomContent(hazeState, saveDialogInfo = saveDialogInfo) {
165179
saveDialogInfo = it
180+
if (it == null) {
181+
resetSharedText()
182+
}
166183
}
167184
},
168185
) { contentPadding ->

app/src/main/java/com/yogeshpaliyal/deepr/ui/screens/home/SaveCompleteDialog.kt

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.yogeshpaliyal.deepr.ui.screens.home
22

3+
import androidx.compose.foundation.layout.Column
34
import androidx.compose.foundation.layout.fillMaxWidth
45
import androidx.compose.foundation.layout.padding
56
import androidx.compose.material3.AlertDialog
@@ -46,24 +47,26 @@ fun SaveCompleteDialog(
4647
Text(stringResource(R.string.save_deeplink))
4748
},
4849
text = {
49-
Text(stringResource(R.string.save_deeplink_message, localSaveDialogInfo.link))
50-
TextField(
51-
value = linkName.value,
52-
onValueChange = {
53-
linkName.value = it
54-
isError = false
55-
},
56-
modifier =
57-
Modifier
58-
.fillMaxWidth()
59-
.padding(bottom = 8.dp),
60-
placeholder = { Text(stringResource(R.string.enter_link_name)) },
61-
supportingText = {
62-
if (isError) {
63-
Text(text = stringResource(R.string.enter_link_name_error))
64-
}
65-
},
66-
)
50+
Column {
51+
Text(localSaveDialogInfo.link)
52+
TextField(
53+
value = linkName.value,
54+
onValueChange = {
55+
linkName.value = it
56+
isError = false
57+
},
58+
modifier =
59+
Modifier
60+
.fillMaxWidth()
61+
.padding(bottom = 8.dp),
62+
placeholder = { Text(stringResource(R.string.enter_link_name)) },
63+
supportingText = {
64+
if (isError) {
65+
Text(text = stringResource(R.string.enter_link_name_error))
66+
}
67+
},
68+
)
69+
}
6770
},
6871
confirmButton = {
6972
Button(onClick = {

0 commit comments

Comments
 (0)