diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/Database.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/Database.kt index 366390c..9834b95 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/Database.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/Database.kt @@ -15,7 +15,6 @@ import com.wismna.geoffroy.donext.data.local.dao.TaskListDao import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.time.ZonedDateTime @Database( entities = [TaskEntity::class, TaskListEntity::class], diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/MainActivity.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/MainActivity.kt index 73c0091..fd79293 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/MainActivity.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/MainActivity.kt @@ -5,17 +5,21 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass import com.wismna.geoffroy.donext.presentation.screen.MainScreen import com.wismna.geoffroy.donext.presentation.ui.theme.DoNextTheme import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MainActivity : ComponentActivity() { + @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { - DoNextTheme(darkTheme = isSystemInDarkTheme(), dynamicColor = false) { MainScreen() } + val windowSizeClass = calculateWindowSizeClass(this) + DoNextTheme(darkTheme = isSystemInDarkTheme(), dynamicColor = false) { MainScreen(windowSizeClass) } } } } \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt index 2f4c528..669ffbe 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt @@ -2,6 +2,7 @@ package com.wismna.geoffroy.donext.presentation.screen +import android.content.res.Configuration import androidx.compose.animation.core.tween import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally @@ -24,6 +25,7 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.PermanentNavigationDrawer import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHost @@ -34,6 +36,8 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberDrawerState +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect @@ -44,6 +48,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavHostController @@ -62,10 +67,10 @@ import kotlinx.coroutines.launch @Composable fun MainScreen( + windowSizeClass: WindowSizeClass, viewModel: MainViewModel = hiltViewModel() ) { val navController = rememberNavController() - val drawerState = rememberDrawerState(DrawerValue.Closed) if (viewModel.isLoading) { Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { @@ -84,13 +89,36 @@ fun MainScreen( val navBackStackEntry by navController.currentBackStackEntryAsState() viewModel.setCurrentDestination(navBackStackEntry) - ModalNavigationDrawer( - drawerContent = { - MenuScreen (currentDestination = viewModel.currentDestination) - }, - drawerState = drawerState - ) { - AppContent(viewModel = viewModel, navController = navController, drawerState = drawerState) + val isExpandedScreen = windowSizeClass.widthSizeClass >= WindowWidthSizeClass.Medium + val orientation = LocalConfiguration.current.orientation + val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE + val showPermanentDrawer = isExpandedScreen || isLandscape + + if (showPermanentDrawer) { + PermanentNavigationDrawer( + drawerContent = { + MenuScreen(currentDestination = viewModel.currentDestination) + } + ) { + AppContent( + viewModel = viewModel, + navController = navController + ) + } + } else { + val drawerState = rememberDrawerState(DrawerValue.Closed) + ModalNavigationDrawer( + drawerContent = { + MenuScreen(currentDestination = viewModel.currentDestination) + }, + drawerState = drawerState + ) { + AppContent( + viewModel = viewModel, + navController = navController, + drawerState = drawerState + ) + } } } @@ -99,7 +127,7 @@ fun AppContent( modifier : Modifier = Modifier, viewModel: MainViewModel, navController: NavHostController, - drawerState: DrawerState + drawerState: DrawerState? = null ) { val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } @@ -108,7 +136,7 @@ fun AppContent( viewModel.uiEventBus.events.collectLatest { event -> when (event) { is UiEvent.Navigate -> { - drawerState.close() + drawerState?.close() navController.navigate(event.route) } is UiEvent.NavigateBack -> navController.popBackStack() @@ -140,17 +168,22 @@ fun AppContent( actionIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer ), navigationIcon = { - CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onPrimaryContainer) { - if (viewModel.currentDestination.showBackButton) { - IconButton(onClick = { viewModel.navigateBack() }) { - Icon(Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back") - } - } else { - IconButton(onClick = { scope.launch { drawerState.open() } }) { - Icon( - Icons.Default.Menu, - contentDescription = "Open navigation drawer" - ) + if (drawerState != null) { + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onPrimaryContainer) { + if (viewModel.currentDestination.showBackButton) { + IconButton(onClick = { viewModel.navigateBack() }) { + Icon( + Icons.AutoMirrored.Default.ArrowBack, + contentDescription = "Back" + ) + } + } else { + IconButton(onClick = { scope.launch { drawerState.open() } }) { + Icon( + Icons.Default.Menu, + contentDescription = "Open navigation drawer" + ) + } } } } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt index 909d009..2301fba 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt @@ -44,7 +44,7 @@ fun MenuScreen( ) { Column { Text( - text = "Task Lists", + text = "DoNext v2", style = MaterialTheme.typography.titleMedium, modifier = Modifier.padding(16.dp) )