diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6e4d6b6..eacb4b2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,6 +29,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/paulcoding/hviewer/MainActivity.kt b/app/src/main/java/com/paulcoding/hviewer/MainActivity.kt
index 6c274fd..3fe1aa2 100644
--- a/app/src/main/java/com/paulcoding/hviewer/MainActivity.kt
+++ b/app/src/main/java/com/paulcoding/hviewer/MainActivity.kt
@@ -1,5 +1,6 @@
package com.paulcoding.hviewer
+import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
@@ -39,13 +40,20 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
- Content()
+ Content(intent)
+ }
+ }
+
+ override fun onNewIntent(intent: Intent) {
+ super.onNewIntent(intent)
+ setContent {
+ Content(intent)
}
}
}
@Composable
-fun Content() {
+fun Content(intent: Intent?) {
val githubState by Github.stateFlow.collectAsState()
val repoUrl = githubState.remoteUrl
@@ -65,7 +73,7 @@ fun Content() {
HViewerTheme {
if (githubState.isLoading)
UpdateDialog()
- AppEntry()
+ AppEntry(intent)
}
}
diff --git a/app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt b/app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt
index 5c3f980..cc4371c 100644
--- a/app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt
+++ b/app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt
@@ -1,5 +1,6 @@
package com.paulcoding.hviewer.ui.page
+import android.content.Intent
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
@@ -7,9 +8,12 @@ import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
@@ -18,6 +22,8 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
+import com.paulcoding.hviewer.R
+import com.paulcoding.hviewer.helper.makeToast
import com.paulcoding.hviewer.model.PostItem
import com.paulcoding.hviewer.model.SiteConfigs
import com.paulcoding.hviewer.model.Tag
@@ -38,13 +44,14 @@ import com.paulcoding.hviewer.ui.page.tabs.TabsPage
import com.paulcoding.hviewer.ui.page.web.WebPage
@Composable
-fun AppEntry() {
+fun AppEntry(intent: Intent?) {
val navController = rememberNavController()
val githubState by Github.stateFlow.collectAsState()
val siteConfigs = githubState.siteConfigs ?: SiteConfigs()
val appViewModel: AppViewModel = viewModel()
val appState by appViewModel.stateFlow.collectAsState()
+ val context = LocalContext.current
fun navToImages(post: PostItem) {
appViewModel.setCurrentPost(post)
@@ -60,6 +67,39 @@ fun AppEntry() {
val startDestination =
remember { if (Preferences.pin.isNotEmpty()) Route.LOCK else Route.SITES }
+ // handle intent
+ val updatedIntent by rememberUpdatedState(intent)
+
+ fun handleIntentUrl(url: String) {
+ val postItem = PostItem(url = url)
+ if (postItem.getSiteConfig(siteConfigs.toHostsMap()) != null) {
+ navToImages(postItem)
+ } else {
+ makeToast(context.getString(R.string.invalid_url, url))
+ }
+ }
+
+ LaunchedEffect(updatedIntent) {
+ updatedIntent?.apply {
+ when (action) {
+ Intent.ACTION_SEND -> {
+ if ("text/plain" == type) {
+ getStringExtra(Intent.EXTRA_TEXT)?.let {
+ handleIntentUrl(it)
+ }
+ }
+ }
+
+ Intent.ACTION_VIEW -> {
+ handleIntentUrl(data.toString())
+ }
+
+ else -> {
+ }
+ }
+ }
+ }
+
NavHost(navController, startDestination = startDestination) {
animatedComposable(Route.SITES) {
SitesPage(
@@ -124,6 +164,7 @@ fun AppEntry() {
appViewModel.setWebViewUrl(it)
navController.navigate(Route.WEBVIEW)
},
+ hostMap = siteConfigs.toHostsMap(),
goBack = {
navController.popBackStack()
})
diff --git a/app/src/main/java/com/paulcoding/hviewer/ui/page/post/PostPage.kt b/app/src/main/java/com/paulcoding/hviewer/ui/page/post/PostPage.kt
index 461dc19..7538d0a 100644
--- a/app/src/main/java/com/paulcoding/hviewer/ui/page/post/PostPage.kt
+++ b/app/src/main/java/com/paulcoding/hviewer/ui/page/post/PostPage.kt
@@ -3,16 +3,23 @@ package com.paulcoding.hviewer.ui.page.post
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
+import com.paulcoding.hviewer.model.SiteConfig
import com.paulcoding.hviewer.ui.page.AppViewModel
@Composable
-fun PostPage(appViewModel: AppViewModel, navToWebView: (String) -> Unit, goBack: () -> Unit) {
+fun PostPage(
+ appViewModel: AppViewModel,
+ hostMap: Map,
+ navToWebView: (String) -> Unit,
+ goBack: () -> Unit
+) {
val appState by appViewModel.stateFlow.collectAsState()
val post = appState.post
- val siteConfig = appState.site.second
- ImageList(
- postUrl = post.url, siteConfig = siteConfig,
- goBack = goBack
- )
+ post.getSiteConfig(hostMap)?.let {
+ ImageList(
+ postUrl = post.url, siteConfig = it,
+ goBack = goBack
+ )
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 738ebc4..3b300d5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -31,4 +31,5 @@
Edit local scripts
Added to tabs
Tabs
+ Invalid URL %1$s
\ No newline at end of file