Add errorMessage implementation for custom tab launch error

pull/1461/head
TM 1 year ago
parent f5673d4b8e
commit 6831c549a7

@ -39,6 +39,7 @@ import com.google.samples.apps.nowinandroid.ui.interests2pane.interestsListDetai
fun NiaNavHost( fun NiaNavHost(
appState: NiaAppState, appState: NiaAppState,
onShowSnackbar: suspend (String, String?) -> Boolean, onShowSnackbar: suspend (String, String?) -> Boolean,
errorHandler: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
startDestination: String = FOR_YOU_ROUTE, startDestination: String = FOR_YOU_ROUTE,
) { ) {
@ -57,6 +58,7 @@ fun NiaNavHost(
onBackClick = navController::popBackStack, onBackClick = navController::popBackStack,
onInterestsClick = { appState.navigateToTopLevelDestination(INTERESTS) }, onInterestsClick = { appState.navigateToTopLevelDestination(INTERESTS) },
onTopicClick = navController::navigateToInterests, onTopicClick = navController::navigateToInterests,
errorHandler = errorHandler,
) )
interestsListDetailScreen() interestsListDetailScreen()
} }

@ -232,6 +232,7 @@ internal fun NiaApp(
duration = Short, duration = Short,
) == ActionPerformed ) == ActionPerformed
}, },
errorHandler = { message -> appState.addErrorMessage(message) }
) )
} }
} }

@ -16,6 +16,7 @@
package com.google.samples.apps.nowinandroid.core.ui package com.google.samples.apps.nowinandroid.core.ui
import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
@ -52,6 +53,7 @@ fun LazyStaggeredGridScope.newsFeed(
onNewsResourceViewed: (String) -> Unit, onNewsResourceViewed: (String) -> Unit,
onTopicClick: (String) -> Unit, onTopicClick: (String) -> Unit,
onExpandedCardClick: () -> Unit = {}, onExpandedCardClick: () -> Unit = {},
onLaunchFailed: () -> Unit = {},
) { ) {
when (feedState) { when (feedState) {
NewsFeedUiState.Loading -> Unit NewsFeedUiState.Loading -> Unit
@ -73,7 +75,7 @@ fun LazyStaggeredGridScope.newsFeed(
analyticsHelper.logNewsResourceOpened( analyticsHelper.logNewsResourceOpened(
newsResourceId = userNewsResource.id, newsResourceId = userNewsResource.id,
) )
launchCustomChromeTab(context, Uri.parse(userNewsResource.url), backgroundColor) launchCustomChromeTab(context, Uri.parse(userNewsResource.url), backgroundColor, onLaunchFailed)
onNewsResourceViewed(userNewsResource.id) onNewsResourceViewed(userNewsResource.id)
}, },
@ -94,14 +96,18 @@ fun LazyStaggeredGridScope.newsFeed(
} }
} }
fun launchCustomChromeTab(context: Context, uri: Uri, @ColorInt toolbarColor: Int) { fun launchCustomChromeTab(context: Context, uri: Uri, @ColorInt toolbarColor: Int, onLaunchFailed: () -> Unit) {
val customTabBarColor = CustomTabColorSchemeParams.Builder() val customTabBarColor = CustomTabColorSchemeParams.Builder()
.setToolbarColor(toolbarColor).build() .setToolbarColor(toolbarColor).build()
val customTabsIntent = CustomTabsIntent.Builder() val customTabsIntent = CustomTabsIntent.Builder()
.setDefaultColorSchemeParams(customTabBarColor) .setDefaultColorSchemeParams(customTabBarColor)
.build() .build()
customTabsIntent.launchUrl(context, uri) try {
customTabsIntent.launchUrl(context, uri)
} catch (e: ActivityNotFoundException) {
onLaunchFailed()
}
} }
/** /**

@ -38,6 +38,7 @@ fun LazyListScope.userNewsResourceCardItems(
onToggleBookmark: (item: UserNewsResource) -> Unit, onToggleBookmark: (item: UserNewsResource) -> Unit,
onNewsResourceViewed: (String) -> Unit, onNewsResourceViewed: (String) -> Unit,
onTopicClick: (String) -> Unit, onTopicClick: (String) -> Unit,
onLaunchFailed: () -> Unit = {},
itemModifier: Modifier = Modifier, itemModifier: Modifier = Modifier,
) = items( ) = items(
items = items, items = items,
@ -57,7 +58,7 @@ fun LazyListScope.userNewsResourceCardItems(
analyticsHelper.logNewsResourceOpened( analyticsHelper.logNewsResourceOpened(
newsResourceId = userNewsResource.id, newsResourceId = userNewsResource.id,
) )
launchCustomChromeTab(context, resourceUrl, backgroundColor) launchCustomChromeTab(context, resourceUrl, backgroundColor, onLaunchFailed)
onNewsResourceViewed(userNewsResource.id) onNewsResourceViewed(userNewsResource.id)
}, },
onTopicClick = onTopicClick, onTopicClick = onTopicClick,

@ -101,10 +101,14 @@ internal fun SearchRoute(
onTopicClick: (String) -> Unit, onTopicClick: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
searchViewModel: SearchViewModel = hiltViewModel(), searchViewModel: SearchViewModel = hiltViewModel(),
errorHandler: (String) -> Unit,
) { ) {
val recentSearchQueriesUiState by searchViewModel.recentSearchQueriesUiState.collectAsStateWithLifecycle() val recentSearchQueriesUiState by searchViewModel.recentSearchQueriesUiState.collectAsStateWithLifecycle()
val searchResultUiState by searchViewModel.searchResultUiState.collectAsStateWithLifecycle() val searchResultUiState by searchViewModel.searchResultUiState.collectAsStateWithLifecycle()
val searchQuery by searchViewModel.searchQuery.collectAsStateWithLifecycle() val searchQuery by searchViewModel.searchQuery.collectAsStateWithLifecycle()
val launchFailedString = stringResource(id = searchR.string.feature_search_custom_tab_activity_not_found)
SearchScreen( SearchScreen(
modifier = modifier, modifier = modifier,
searchQuery = searchQuery, searchQuery = searchQuery,
@ -119,6 +123,7 @@ internal fun SearchRoute(
onBackClick = onBackClick, onBackClick = onBackClick,
onInterestsClick = onInterestsClick, onInterestsClick = onInterestsClick,
onTopicClick = onTopicClick, onTopicClick = onTopicClick,
onLaunchFailed = { errorHandler(launchFailedString) },
) )
} }
@ -137,6 +142,7 @@ internal fun SearchScreen(
onBackClick: () -> Unit = {}, onBackClick: () -> Unit = {},
onInterestsClick: () -> Unit = {}, onInterestsClick: () -> Unit = {},
onTopicClick: (String) -> Unit = {}, onTopicClick: (String) -> Unit = {},
onLaunchFailed: () -> Unit = {},
) { ) {
TrackScreenViewEvent(screenName = "Search") TrackScreenViewEvent(screenName = "Search")
Column(modifier = modifier) { Column(modifier = modifier) {
@ -193,6 +199,7 @@ internal fun SearchScreen(
onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged, onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged,
onNewsResourceViewed = onNewsResourceViewed, onNewsResourceViewed = onNewsResourceViewed,
onFollowButtonClick = onFollowButtonClick, onFollowButtonClick = onFollowButtonClick,
onLaunchFailed = onLaunchFailed,
) )
} }
} }
@ -287,6 +294,7 @@ private fun SearchResultBody(
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit, onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
onNewsResourceViewed: (String) -> Unit, onNewsResourceViewed: (String) -> Unit,
onFollowButtonClick: (String, Boolean) -> Unit, onFollowButtonClick: (String, Boolean) -> Unit,
onLaunchFailed: () -> Unit,
) { ) {
val state = rememberLazyStaggeredGridState() val state = rememberLazyStaggeredGridState()
Box( Box(
@ -361,6 +369,9 @@ private fun SearchResultBody(
onExpandedCardClick = { onExpandedCardClick = {
onSearchTriggered(searchQuery) onSearchTriggered(searchQuery)
}, },
onLaunchFailed = {
onLaunchFailed()
}
) )
} }
} }

@ -30,6 +30,7 @@ fun NavGraphBuilder.searchScreen(
onBackClick: () -> Unit, onBackClick: () -> Unit,
onInterestsClick: () -> Unit, onInterestsClick: () -> Unit,
onTopicClick: (String) -> Unit, onTopicClick: (String) -> Unit,
errorHandler: (String) -> Unit,
) { ) {
// TODO: Handle back stack for each top-level destination. At the moment each top-level // TODO: Handle back stack for each top-level destination. At the moment each top-level
// destination may have own search screen's back stack. // destination may have own search screen's back stack.
@ -38,6 +39,7 @@ fun NavGraphBuilder.searchScreen(
onBackClick = onBackClick, onBackClick = onBackClick,
onInterestsClick = onInterestsClick, onInterestsClick = onInterestsClick,
onTopicClick = onTopicClick, onTopicClick = onTopicClick,
errorHandler = errorHandler
) )
} }
} }

Loading…
Cancel
Save