diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt index f27b90cbe..e23b57333 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt @@ -16,6 +16,7 @@ package com.google.samples.apps.nowinandroid.ui +import android.content.Context import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets @@ -30,6 +31,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarDuration.Indefinite import androidx.compose.material3.SnackbarDuration.Short import androidx.compose.material3.SnackbarHost @@ -52,6 +54,7 @@ import androidx.compose.ui.composed import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics @@ -69,6 +72,10 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopAp import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColors import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors +import com.google.samples.apps.nowinandroid.core.model.data.MessageData +import com.google.samples.apps.nowinandroid.core.model.data.MessageType.MESSAGE +import com.google.samples.apps.nowinandroid.core.model.data.MessageType.OFFLINE +import com.google.samples.apps.nowinandroid.core.model.data.MessageType.UNKNOWN import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog import com.google.samples.apps.nowinandroid.navigation.NiaNavHost import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination @@ -81,6 +88,8 @@ fun NiaApp( modifier: Modifier = Modifier, windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), ) { + val context = LocalContext.current + val shouldShowGradientBackground = appState.currentTopLevelDestination == TopLevelDestination.FOR_YOU var showSettingsDialog by rememberSaveable { mutableStateOf(false) } @@ -95,16 +104,30 @@ fun NiaApp( ) { val snackbarHostState = remember { SnackbarHostState() } - val isOffline by appState.isOffline.collectAsStateWithLifecycle() + val stateMessage by appState.stateMessage.collectAsStateWithLifecycle() - // If user is not connected to the internet show a snack bar to inform them. - val notConnectedMessage = stringResource(R.string.not_connected) - LaunchedEffect(isOffline) { - if (isOffline) { - snackbarHostState.showSnackbar( - message = notConnectedMessage, - duration = Indefinite, - ) + LaunchedEffect(stateMessage) { + stateMessage?.let { message -> + + //Text and Duration values dictated by the UI + val (text, duration) = getSnackbarValues(context, message) + + // Determine whether user clicked action button + val snackBarResult = snackbarHostState.showSnackbar( + message = text, + actionLabel = message.label, + duration = duration, + ) == ActionPerformed + + // Handle result action + if (snackBarResult) { + message.onConfirm?.invoke() + } else { + message.onDelay?.invoke() + } + + // Remove Message from List + appState.errorMonitor.clearMessage(message) } } @@ -271,3 +294,11 @@ private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = this?.hierarchy?.any { it.hasRoute(route) } ?: false + +private fun getSnackbarValues(context: Context, message: MessageData): Pair { + return when (message.type) { + OFFLINE -> context.getString(R.string.not_connected) to SnackbarDuration.Indefinite + is MESSAGE -> (message.type as MESSAGE).value to SnackbarDuration.Long + UNKNOWN -> context.getString(R.string.unknown_error) to SnackbarDuration.Short + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd92f3977..2f8cbe60e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,4 +17,5 @@ Now in Android ⚠️ You aren’t connected to the internet + Unknown Error