@@ -24,17 +24,34 @@ package net.opatry.adoptacat
2424import android.os.Bundle
2525import androidx.activity.compose.setContent
2626import androidx.appcompat.app.AppCompatActivity
27+ import androidx.compose.foundation.layout.Box
28+ import androidx.compose.foundation.layout.Column
29+ import androidx.compose.foundation.layout.Row
30+ import androidx.compose.foundation.layout.fillMaxHeight
31+ import androidx.compose.foundation.layout.fillMaxWidth
32+ import androidx.compose.foundation.layout.height
33+ import androidx.compose.foundation.layout.width
34+ import androidx.compose.material.Divider
2735import androidx.compose.material.MaterialTheme
2836import androidx.compose.material.Surface
2937import androidx.compose.runtime.Composable
30- import androidx.compose.ui.tooling.preview.Preview
38+ import androidx.compose.runtime.mutableStateOf
39+ import androidx.compose.runtime.getValue
40+ import androidx.compose.runtime.saveable.rememberSaveable
41+ import androidx.compose.runtime.setValue
42+ import androidx.compose.ui.Modifier
43+ import androidx.compose.ui.res.booleanResource
44+ import androidx.compose.ui.res.dimensionResource
45+ import androidx.compose.ui.unit.dp
3146import androidx.lifecycle.viewmodel.compose.viewModel
3247import androidx.navigation.compose.NavHost
3348import androidx.navigation.compose.composable
3449import androidx.navigation.compose.navigate
3550import androidx.navigation.compose.rememberNavController
3651import net.opatry.adoptacat.data.CatRepository
3752import net.opatry.adoptacat.data.FakeCatDataSource
53+ import net.opatry.adoptacat.model.CatModel
54+ import net.opatry.adoptacat.ui.CatDetailsDispatcher
3855import net.opatry.adoptacat.ui.CatDetailsScreen
3956import net.opatry.adoptacat.ui.CatsScreen
4057import net.opatry.adoptacat.ui.CatsViewModel
@@ -64,38 +81,91 @@ sealed class NavRoute(val path: String) {
6481
6582@Composable
6683fun MainLayout (catRepository : CatRepository = (CatRepository ((FakeCatDataSource ())))) {
67- val navController = rememberNavController()
6884 val catsViewModel = viewModel<CatsViewModel >(factory = CatsViewModelFactory (catRepository))
6985 Surface (color = MaterialTheme .colors.background) {
70- NavHost (navController, startDestination = NavRoute .CatsList .path) {
71- composable(NavRoute .CatsList .path) {
72- CatsScreen (catsViewModel,
73- onCatSelected = { cat ->
74- navController.navigate(" ${NavRoute .CatDetails .path} /${cat.uuid} " )
75- }
76- )
86+ if (booleanResource(R .bool.is_tablet)) {
87+ var selectedCatUUID by rememberSaveable { mutableStateOf<UUID ?>(null ) }
88+ val selectedCat = selectedCatUUID?.let { uuid ->
89+ catsViewModel.findCatByUUID(uuid)
7790 }
78- composable(" ${NavRoute .CatDetails .path} /{uuid}" ) { backStackEntry ->
79- val uuid = UUID .fromString(backStackEntry.arguments?.get(" uuid" ) as String )
80- val cat = catsViewModel.findCatByUUID(uuid)
81- CatDetailsScreen (cat) { navController.popBackStack() }
91+ if (booleanResource(R .bool.is_portrait)) {
92+ MainLayoutTabletPortrait (catsViewModel, selectedCat) { cat ->
93+ selectedCatUUID = cat.uuid
94+ }
95+ } else {
96+ MainLayoutTabletLandscape (catsViewModel, selectedCat) { cat ->
97+ selectedCatUUID = cat.uuid
98+ }
8299 }
100+ } else {
101+ MainLayoutTabletPhone (catsViewModel)
83102 }
84103 }
85104}
86105
87- @Preview(" Light Theme" , widthDp = 360 , heightDp = 640 )
88106@Composable
89- fun LightPreview () {
90- AdoptACatTheme {
91- MainLayout ()
107+ fun MainLayoutTabletPortrait (catsViewModel : CatsViewModel , selectedCat : CatModel ? , onCatSelected : (CatModel ) -> Unit ) {
108+ Column {
109+ Box (
110+ Modifier
111+ .fillMaxWidth()
112+ .fillMaxHeight(.5f )
113+ ) {
114+ CatsScreen (catsViewModel, selectedCat) { onCatSelected(it) }
115+ }
116+
117+ Divider (
118+ Modifier
119+ .fillMaxWidth()
120+ .height(1 .dp)
121+ )
122+
123+ Box (
124+ Modifier
125+ .fillMaxWidth()
126+ .fillMaxHeight(.5f )
127+ ) {
128+ CatDetailsDispatcher (selectedCat)
129+ }
92130 }
93131}
94132
95- @Preview(" Dark Theme" , widthDp = 360 , heightDp = 640 )
96133@Composable
97- fun DarkPreview () {
98- AdoptACatTheme (darkTheme = true ) {
99- MainLayout ()
134+ fun MainLayoutTabletLandscape (catsViewModel : CatsViewModel , selectedCat : CatModel ? , onCatSelected : (CatModel ) -> Unit ) {
135+ Row {
136+ Box (
137+ Modifier
138+ .width(dimensionResource(R .dimen.cat_list_width_side_by_side))
139+ .fillMaxHeight()
140+ ) {
141+ CatsScreen (catsViewModel, selectedCat) { onCatSelected(it) }
142+ }
143+
144+ Divider (
145+ Modifier
146+ .width(1 .dp)
147+ .fillMaxHeight()
148+ )
149+
150+ Box (Modifier .fillMaxHeight()) {
151+ CatDetailsDispatcher (selectedCat)
152+ }
153+ }
154+ }
155+
156+ @Composable
157+ fun MainLayoutTabletPhone (catsViewModel : CatsViewModel ) {
158+ val navController = rememberNavController()
159+ NavHost (navController, startDestination = NavRoute .CatsList .path) {
160+ composable(NavRoute .CatsList .path) {
161+ CatsScreen (catsViewModel, null ) { cat ->
162+ navController.navigate(" ${NavRoute .CatDetails .path} /${cat.uuid} " )
163+ }
164+ }
165+ composable(" ${NavRoute .CatDetails .path} /{uuid}" ) { backStackEntry ->
166+ val uuid = UUID .fromString(backStackEntry.arguments?.get(" uuid" ) as String )
167+ val cat = catsViewModel.findCatByUUID(uuid)
168+ CatDetailsScreen (cat) { navController.popBackStack() }
169+ }
100170 }
101171}
0 commit comments