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