Set up navigation controller.

This commit is contained in:
AlbYoda 2025-03-06 15:58:21 +01:00
parent 1f6e4de032
commit 5f9996b2a7
No known key found for this signature in database
GPG key ID: 1124F0801AFEF527
17 changed files with 382 additions and 9 deletions

3
.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
.idea/.name generated Normal file
View file

@ -0,0 +1 @@
DeNa Drive

6
.idea/AndroidProjectSystem.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

6
.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

10
.idea/deploymentTargetSelector.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

18
.idea/gradle.xml generated Normal file
View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

View file

@ -0,0 +1,61 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
</profile>
</component>

6
.idea/kotlinc.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="2.0.21" />
</component>
</project>

10
.idea/migrations.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

10
.idea/misc.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

17
.idea/runConfigurations.xml generated Normal file
View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View file

@ -56,4 +56,6 @@ dependencies {
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
implementation(libs.androidx.navigation.compose)
}

View file

@ -11,22 +11,28 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.rememberNavController
import com.bbc.denadrive.ui.theme.DeNaDriveTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
DeNaDriveTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
}
}
val navController = rememberNavController()
NavigationGraph(navController)
}
// enableEdgeToEdge()
// setContent {
// DeNaDriveTheme {
// Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
// Greeting(
// name = "Android",
// modifier = Modifier.padding(innerPadding)
// )
// }
// }
// }
}
}

View file

@ -0,0 +1,25 @@
package com.bbc.denadrive
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.bbc.denadrive.home.DetailsScreen
import com.bbc.denadrive.home.HomeScreen
@Composable
fun NavigationGraph(navController: NavHostController) {
// Create a NavHost that defines the navigation graph
NavHost(navController = navController, startDestination = "home") {
// Define the home screen destination
composable("home") { HomeScreen(navController) }
// Define the details screen destination with an argument
composable("details/{itemId}") { backStackEntry ->
// Retrieve the argument from the back stack entry
val itemId = backStackEntry.arguments?.getString("itemId")
// Pass the argument to the DetailsScreen
DetailsScreen(itemId, navController)
}
}
}

View file

@ -0,0 +1,184 @@
package com.bbc.denadrive.home
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
//import androidx.compose.foundation.background
//import androidx.compose.foundation.clickable
//import androidx.compose.foundation.layout.*
//import androidx.compose.material3.*
//import androidx.compose.runtime.*
//import androidx.compose.ui.Alignment
//import androidx.compose.ui.Modifier
//import androidx.compose.ui.graphics.Color
//import androidx.compose.ui.unit.dp
//import androidx.compose.ui.unit.sp
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
//import androidx.compose.material3.icons.Icons
//import androidx.compose.material3.icons.filled.Menu
//import androidx.compose.material3.icons.filled.MoreVert
@Composable
fun HomeScreen(navController: NavHostController) {
Button(onClick = { navController.navigate("details/1") }) {
Text("Go to Details")
}
}
@Composable
fun DetailsScreen(itemId: String?, navController: NavHostController) {
Text(text = "Details for item: $itemId")
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ScaffoldWithSidebar() {
// State to control the drawer
var isDrawerOpen by remember { mutableStateOf(false) }
// ModalNavigationDrawer
ModalNavigationDrawer(
drawerState = rememberDrawerState(initialValue = DrawerValue.Closed),
drawerContent = {
// Drawer content
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Text("Item 1", modifier = Modifier.clickable { /* Handle click */ })
Spacer(modifier = Modifier.height(8.dp))
Text("Item 2", modifier = Modifier.clickable { /* Handle click */ })
Spacer(modifier = Modifier.height(8.dp))
Text("Item 3", modifier = Modifier.clickable { /* Handle click */ })
}
},
content = {
// Main content of the screen
Scaffold(
topBar = {
TopAppBar(
title = { Text("My App") },
navigationIcon = {
IconButton(onClick = { isDrawerOpen = true }) {
// Icon for the menu (three horizontal lines)
Icon(Icons.Filled.Menu, contentDescription = "Menu")
}
},
actions = {
IconButton(onClick = { /* Handle settings click */ }) {
// Icon for the settings (three vertical dots)
Icon(Icons.Filled.MoreVert, contentDescription = "Settings")
}
}
)
},
content = { innerPadding ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
.padding(16.dp),
contentAlignment = Alignment.Center
) {
Text("Main Content", fontSize = 24.sp)
}
}
)
}
)
}
@Composable
fun MyApp() {
ScaffoldWithSidebar()
}
@Composable
fun MainActivityContent() {
MyApp()
}
//@OptIn(ExperimentalMaterial3Api::class)
//@Composable
//fun ScaffoldWithSidebar() {
// // State to control the drawer
// var isDrawerOpen by remember { mutableStateOf(false) }
//
// // Main Scaffold
// Scaffold(
// topBar = {
// TopAppBar(
// title = { Text("My App") },
// navigationIcon = {
// IconButton(onClick = { isDrawerOpen = true }) {
// // Icon for the menu (three horizontal lines)
// Icon(Icons.Filled.Menu, contentDescription = "Menu")
// }
// },
// actions = {
// IconButton(onClick = { /* Handle settings click */ }) {
// // Icon for the settings (three vertical dots)
// Icon(Icons.Filled.MoreVert, contentDescription = "Settings")
// }
// }
// )
// },
// drawerContent = {
// // Drawer content
// Column(
// modifier = Modifier
// .fillMaxSize()
// .padding(16.dp)
// ) {
// Text("Item 1", modifier = Modifier.clickable { /* Handle click */ })
// Spacer(modifier = Modifier.height(8.dp))
// Text("Item 2", modifier = Modifier.clickable { /* Handle click */ })
// Spacer(modifier = Modifier.height(8.dp))
// Text("Item 3", modifier = Modifier.clickable { /* Handle click */ })
// }
// },
// drawerGesturesEnabled = true,
// drawerShape = MaterialTheme.shapes.large,
// drawerContentColor = MaterialTheme.colorScheme.background,
// drawerContainerColor = MaterialTheme.colorScheme.surface,
// content = { padding ->
// // Main content of the screen
// Box(
// modifier = Modifier
// .fillMaxSize()
// .padding(padding)
// .background(Color.White),
// contentAlignment = Alignment.Center
// ) {
// Text("Main Content", fontSize = 24.sp)
// }
// }
// )
//
// // Handle drawer state
// if (isDrawerOpen) {
// // Close the drawer when clicking outside
// Box(
// modifier = Modifier
// .fillMaxSize()
// .background(Color.Black.copy(alpha = 0.5f))
// .clickable { isDrawerOpen = false }
// )
// }
//}

View file

@ -8,9 +8,11 @@ espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.1"
composeBom = "2024.09.00"
navigationCompose = "2.8.8"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }