Commit c39a2157 by Aleksandr

fix back navigation on preview screen in different cases

parent 70de6755
...@@ -29,6 +29,7 @@ import com.isidroid.c23.ui.navigation.routeHome ...@@ -29,6 +29,7 @@ import com.isidroid.c23.ui.navigation.routeHome
import com.isidroid.c23.ui.theme.AppTheme import com.isidroid.c23.ui.theme.AppTheme
import com.isidroid.core.ext.navigateSingleTopTo import com.isidroid.core.ext.navigateSingleTopTo
import com.isidroid.core.ext.printCurrentDestination import com.isidroid.core.ext.printCurrentDestination
import com.isidroid.core.ext.printNavigationStack
import com.isidroid.utils.extractUris import com.isidroid.utils.extractUris
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
...@@ -64,7 +65,7 @@ fun ComposeApp() { ...@@ -64,7 +65,7 @@ fun ComposeApp() {
navController.navigateSingleTopTo(routeHome(uris = uris.joinToString())) navController.navigateSingleTopTo(routeHome(uris = uris.joinToString()))
} }
LaunchedEffect(Unit) { navController.printCurrentDestination() } LaunchedEffect(Unit) { navController.printNavigationStack() }
val surfaceModifier = with(Modifier) { val surfaceModifier = with(Modifier) {
if (!isEdgeToEdge) if (!isEdgeToEdge)
......
package com.isidroid.c23.ui._component
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavController
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@Composable
internal fun BackCloseComponent(navController: NavController) {
var showExitApp by remember { mutableStateOf(false) }
val activity = LocalContext.current as? ComponentActivity
val scope = rememberCoroutineScope()
LaunchedEffect(showExitApp) {
if (showExitApp)
scope.launch(Dispatchers.Default) {
delay(2000)
showExitApp = false
}
}
BackHandler {
when {
navController.previousBackStackEntry != null -> navController.popBackStack()
showExitApp -> activity?.finish()
else -> {
showExitApp = true
Toast.makeText(activity, "Tap back again to close the app", Toast.LENGTH_LONG).show()
}
}
}
}
\ No newline at end of file
...@@ -3,18 +3,20 @@ package com.isidroid.c23.ui.navigation.destinations ...@@ -3,18 +3,20 @@ package com.isidroid.c23.ui.navigation.destinations
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.isidroid.c23.ui._component.BackCloseComponent
import com.isidroid.c23.ui.navigation.routeMap import com.isidroid.c23.ui.navigation.routeMap
import com.isidroid.c23.ui.navigation.routePrintJobs import com.isidroid.c23.ui.navigation.routePrintJobs
import com.isidroid.c23.ui.navigation.routeRenderPreview import com.isidroid.c23.ui.navigation.routeRenderPreview
import com.isidroid.c23.ui.screen.content.ContentContract import com.isidroid.c23.ui.screen.content.ContentContract
import com.isidroid.c23.ui.screen.content.ContentScreen import com.isidroid.c23.ui.screen.content.ContentScreen
import com.isidroid.c23.ui.screen.content.ContentViewModel import com.isidroid.c23.ui.screen.content.ContentViewModel
import com.isidroid.core.ext.navigateSingleTopTo
@Composable @Composable
fun ContentScreenDestination(navController: NavHostController) { fun ContentScreenDestination(navController: NavHostController) {
val viewModel: ContentViewModel = hiltViewModel() val viewModel: ContentViewModel = hiltViewModel()
BackCloseComponent(navController)
ContentScreen( ContentScreen(
state = viewModel.viewState, state = viewModel.viewState,
effectFlow = viewModel.effect, effectFlow = viewModel.effect,
...@@ -22,7 +24,7 @@ fun ContentScreenDestination(navController: NavHostController) { ...@@ -22,7 +24,7 @@ fun ContentScreenDestination(navController: NavHostController) {
onNavigationRequested = { effect -> onNavigationRequested = { effect ->
when (effect) { when (effect) {
is ContentContract.Effect.Navigation.ToRenderPreview -> navController.navigate(routeRenderPreview(uris = effect.uris)) is ContentContract.Effect.Navigation.ToRenderPreview -> navController.navigate(routeRenderPreview(uris = effect.uris))
is ContentContract.Effect.Navigation.ToMap -> navController.navigateSingleTopTo(routeMap(effect.lat?.toString(), effect.lng?.toString(), effect.spotId)) is ContentContract.Effect.Navigation.ToMap -> navController.navigate(routeMap(effect.lat?.toString(), effect.lng?.toString(), effect.spotId))
ContentContract.Effect.Navigation.ToBack -> navController.popBackStack() ContentContract.Effect.Navigation.ToBack -> navController.popBackStack()
ContentContract.Effect.Navigation.ToPrintJobList -> navController.navigate(routePrintJobs()) ContentContract.Effect.Navigation.ToPrintJobList -> navController.navigate(routePrintJobs())
} }
......
...@@ -3,12 +3,14 @@ package com.isidroid.c23.ui.navigation.destinations ...@@ -3,12 +3,14 @@ package com.isidroid.c23.ui.navigation.destinations
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.isidroid.c23.ui._component.BackCloseComponent
import com.isidroid.c23.ui.navigation.routeMap import com.isidroid.c23.ui.navigation.routeMap
import com.isidroid.c23.ui.navigation.routeSelectContent import com.isidroid.c23.ui.navigation.routeSelectContent
import com.isidroid.c23.ui.screen.render_preview.RenderContract import com.isidroid.c23.ui.screen.render_preview.RenderContract
import com.isidroid.c23.ui.screen.render_preview.RenderPreviewScreen import com.isidroid.c23.ui.screen.render_preview.RenderPreviewScreen
import com.isidroid.c23.ui.screen.render_preview.RenderViewModel import com.isidroid.c23.ui.screen.render_preview.RenderViewModel
import com.isidroid.core.ext.navigateSingleTopTo import com.isidroid.core.ext.navigateSingleTopTo
import timber.log.Timber
@Composable @Composable
fun RenderScreenDestination(navController: NavController) { fun RenderScreenDestination(navController: NavController) {
...@@ -21,7 +23,13 @@ fun RenderScreenDestination(navController: NavController) { ...@@ -21,7 +23,13 @@ fun RenderScreenDestination(navController: NavController) {
onEventSent = { event -> viewModel.setEvent(event) }, onEventSent = { event -> viewModel.setEvent(event) },
onNavigationRequested = { effect -> onNavigationRequested = { effect ->
when (effect) { when (effect) {
RenderContract.Effect.Navigation.ToBack -> navController.popBackStack() RenderContract.Effect.Navigation.ToBack -> {
if (navController.previousBackStackEntry != null)
navController.popBackStack()
else
navController.navigateSingleTopTo(routeSelectContent())
}
RenderContract.Effect.Navigation.ToMap -> navController.navigate(routeMap()) RenderContract.Effect.Navigation.ToMap -> navController.navigate(routeMap())
RenderContract.Effect.Navigation.ToSelectContent -> navController.navigateSingleTopTo(routeSelectContent()) RenderContract.Effect.Navigation.ToSelectContent -> navController.navigateSingleTopTo(routeSelectContent())
} }
......
...@@ -71,10 +71,6 @@ fun ContentScreen( ...@@ -71,10 +71,6 @@ fun ContentScreen(
onEventSent(ContentContract.Event.CopyRenderedFilesToPublicFolder(it)) onEventSent(ContentContract.Event.CopyRenderedFilesToPublicFolder(it))
} }
BackHandler {
onEventSent(ContentContract.Event.GoBack)
}
LaunchedEffect(state.value.galleryHash) { if (state.value.galleryHash != null) launcher.launch("image/*") } LaunchedEffect(state.value.galleryHash) { if (state.value.galleryHash != null) launcher.launch("image/*") }
LaunchedEffect(state.value.documentHash) { if (state.value.documentHash != null) launcher.launch("application/pdf") } LaunchedEffect(state.value.documentHash) { if (state.value.documentHash != null) launcher.launch("application/pdf") }
LaunchedEffect(state.value.wordHash) { if (state.value.wordHash != null) launcher.launch("application/msword") } LaunchedEffect(state.value.wordHash) { if (state.value.wordHash != null) launcher.launch("application/msword") }
......
package com.isidroid.core.ext package com.isidroid.core.ext
import android.annotation.SuppressLint
import androidx.core.net.toUri
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
...@@ -71,4 +73,10 @@ suspend fun NavHostController?.printCurrentDestination( ...@@ -71,4 +73,10 @@ suspend fun NavHostController?.printCurrentDestination(
}.collect() }.collect()
} }
@SuppressLint("RestrictedApi")
suspend fun NavHostController.printNavigationStack(tag: String = "navigation_graph") {
currentBackStack.collect { list ->
val backstack = list.mapNotNull { navBackStackEntry -> navBackStackEntry.destination.route?.toUri()?.path }.joinToString()
Timber.tag(tag).i(backstack)
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment