1717package com.google.samples.apps.nowinandroid.ui.interests2pane
1818
1919import androidx.activity.compose.BackHandler
20- import androidx.annotation.Keep
2120import androidx.compose.animation.AnimatedContent
2221import androidx.compose.foundation.interaction.MutableInteractionSource
2322import androidx.compose.foundation.layout.Box
@@ -27,55 +26,44 @@ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
2726import androidx.compose.material3.adaptive.WindowAdaptiveInfo
2827import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
2928import androidx.compose.material3.adaptive.layout.AnimatedPane
30- import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold
3129import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole
3230import androidx.compose.material3.adaptive.layout.PaneAdaptedValue
3331import androidx.compose.material3.adaptive.layout.PaneExpansionAnchor
3432import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldDestinationItem
3533import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective
34+ import androidx.compose.material3.adaptive.layout.defaultDragHandleSemantics
3635import androidx.compose.material3.adaptive.layout.rememberPaneExpansionState
36+ import androidx.compose.material3.adaptive.navigation.BackNavigationBehavior
37+ import androidx.compose.material3.adaptive.navigation.NavigableListDetailPaneScaffold
3738import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator
39+ import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldPredictiveBackHandler
3840import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
3941import androidx.compose.runtime.Composable
4042import androidx.compose.runtime.getValue
41- import androidx.compose.runtime.key
4243import androidx.compose.runtime.mutableStateOf
4344import androidx.compose.runtime.remember
4445import androidx.compose.runtime.rememberCoroutineScope
45- import androidx.compose.runtime.saveable.Saver
46- import androidx.compose.runtime.saveable.rememberSaveable
4746import androidx.compose.runtime.setValue
4847import androidx.compose.ui.Modifier
4948import androidx.compose.ui.draw.clipToBounds
5049import androidx.compose.ui.layout.layout
5150import androidx.compose.ui.unit.dp
5251import androidx.hilt.navigation.compose.hiltViewModel
5352import androidx.lifecycle.compose.collectAsStateWithLifecycle
54- import androidx.lifecycle.viewmodel.viewModelFactory
5553import androidx.navigation.NavGraphBuilder
56- import androidx.navigation.compose.NavHost
5754import androidx.navigation.compose.composable
58- import androidx.navigation.compose.rememberNavController
5955import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute
6056import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute
6157import com.google.samples.apps.nowinandroid.feature.topic.TopicDetailPlaceholder
6258import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen
6359import com.google.samples.apps.nowinandroid.feature.topic.TopicViewModel
64- import com.google.samples.apps.nowinandroid.feature.topic.TopicViewModel_Factory
6560import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicRoute
66- import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic
67- import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen
6861import kotlinx.coroutines.launch
6962import kotlinx.serialization.Serializable
70- import java.util.UUID
7163import kotlin.math.max
7264
7365@Serializable internal object TopicPlaceholderRoute
7466
75- // TODO: Remove @Keep when https://issuetracker.google.com/353898971 is fixed
76- @Keep
77- @Serializable internal object DetailPaneNavHostRoute
78-
7967fun NavGraphBuilder.interestsListDetailScreen () {
8068 composable<InterestsRoute > {
8169 InterestsListDetailScreen ()
@@ -121,9 +109,17 @@ internal fun InterestsListDetailScreen(
121109 ),
122110 )
123111
124- BackHandler (listDetailNavigator.canNavigateBack()) {
112+ ThreePaneScaffoldPredictiveBackHandler (
113+ listDetailNavigator,
114+ BackNavigationBehavior .PopUntilScaffoldValueChange ,
115+ )
116+ BackHandler (
117+ paneExpansionState.currentAnchor == PaneExpansionAnchor .Proportion (0f ) &&
118+ listDetailNavigator.isListPaneVisible() &&
119+ listDetailNavigator.isDetailPaneVisible(),
120+ ) {
125121 coroutineScope.launch {
126- listDetailNavigator.navigateBack( )
122+ paneExpansionState.animateTo( PaneExpansionAnchor . Proportion ( 1f ) )
127123 }
128124 }
129125
@@ -138,14 +134,18 @@ internal fun InterestsListDetailScreen(
138134 coroutineScope.launch {
139135 listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole .Detail )
140136 }
137+ if (paneExpansionState.currentAnchor == PaneExpansionAnchor .Proportion (1f )) {
138+ coroutineScope.launch {
139+ paneExpansionState.animateTo(PaneExpansionAnchor .Proportion (0f ))
140+ }
141+ }
141142 }
142143
143144 val mutableInteractionSource = remember { MutableInteractionSource () }
144145 val minPaneWidth = 300 .dp
145146
146- ListDetailPaneScaffold (
147- value = listDetailNavigator.scaffoldValue,
148- directive = listDetailNavigator.scaffoldDirective,
147+ NavigableListDetailPaneScaffold (
148+ navigator = listDetailNavigator,
149149 listPane = {
150150 AnimatedPane {
151151 Box (
@@ -209,7 +209,7 @@ internal fun InterestsListDetailScreen(
209209 key = route.id,
210210 ) { factory ->
211211 factory.create(route.id)
212- }
212+ },
213213 )
214214 }
215215 is TopicPlaceholderRoute -> {
@@ -227,6 +227,7 @@ internal fun InterestsListDetailScreen(
227227 state = paneExpansionState,
228228 minTouchTargetSize = LocalMinimumInteractiveComponentSize .current,
229229 interactionSource = mutableInteractionSource,
230+ semanticsProperties = paneExpansionState.defaultDragHandleSemantics(),
230231 ),
231232 interactionSource = mutableInteractionSource,
232233 )
0 commit comments