From c69fd2819a8150ac0c7ec1a3b059edec0add0f3b Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Thu, 20 Feb 2025 21:44:03 +0700 Subject: [PATCH 1/2] Handle opening url intent --- app/src/main/AndroidManifest.xml | 13 +++++++ .../com/paulcoding/hviewer/MainActivity.kt | 14 ++++++-- .../paulcoding/hviewer/ui/page/AppEntry.kt | 35 ++++++++++++++++++- .../hviewer/ui/page/post/PostPage.kt | 19 ++++++---- 4 files changed, 71 insertions(+), 10 deletions(-) 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..219e093 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,11 @@ 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.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NamedNavArgument import androidx.navigation.NavBackStackEntry @@ -38,7 +41,7 @@ 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() @@ -60,6 +63,35 @@ 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) + navToImages(postItem) + } + + 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 +156,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 + ) + } } From bca387ba9f37e8c09afb8248346591813e7b67dc Mon Sep 17 00:00:00 2001 From: paulcoding810 Date: Thu, 20 Feb 2025 23:09:37 +0700 Subject: [PATCH 2/2] Check if url is supported --- .../java/com/paulcoding/hviewer/ui/page/AppEntry.kt | 10 +++++++++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) 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 219e093..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 @@ -13,6 +13,7 @@ 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 @@ -21,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 @@ -48,6 +51,7 @@ fun AppEntry(intent: Intent?) { 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) @@ -68,7 +72,11 @@ fun AppEntry(intent: Intent?) { fun handleIntentUrl(url: String) { val postItem = PostItem(url = url) - navToImages(postItem) + if (postItem.getSiteConfig(siteConfigs.toHostsMap()) != null) { + navToImages(postItem) + } else { + makeToast(context.getString(R.string.invalid_url, url)) + } } LaunchedEffect(updatedIntent) { 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