Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,17 @@ android {
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "1.8"
jvmTarget = "17"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
kotlinCompilerExtensionVersion = "1.5.8"
}
packaging {
resources {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,32 @@ package com.codewithfk.expensetracker.android
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.codewithfk.expensetracker.android.ui.theme.ExpenseTrackerAndroidTheme
import com.codewithfk.expensetracker.android.ui.theme.ThemeViewModel
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private val themeViewModel: ThemeViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ExpenseTrackerAndroidTheme {
val isDarkMode by themeViewModel.isDarkMode.collectAsState()

ExpenseTrackerAndroidTheme(darkTheme = isDarkMode) {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
NavHostScreen()
NavHostScreen(themeViewModel = themeViewModel)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,75 +2,116 @@ package com.codewithfk.expensetracker.android

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationBarItemDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.*
import androidx.compose.ui.res.painterResource
import kotlinx.coroutines.launch
import com.codewithfk.expensetracker.android.ui.components.DrawerContent
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.codewithfk.expensetracker.android.feature.add_expense.AddExpense
import com.codewithfk.expensetracker.android.feature.dashboard.DashboardScreen
import com.codewithfk.expensetracker.android.feature.home.HomeScreen
import com.codewithfk.expensetracker.android.feature.stats.StatsScreen
import com.codewithfk.expensetracker.android.ui.theme.Zinc
import com.codewithfk.expensetracker.android.feature.settings.SettingsScreen
import com.codewithfk.expensetracker.android.ui.theme.LightPrimary
import androidx.compose.runtime.rememberCoroutineScope
import com.codewithfk.expensetracker.android.ui.theme.ThemeViewModel

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NavHostScreen() {
fun NavHostScreen(themeViewModel: ThemeViewModel)
{
val navController = rememberNavController()
var bottomBarVisibility by remember {
mutableStateOf(true)
var bottomBarVisibility by remember { mutableStateOf(true) }
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route ?: "/home"
val showMenuButton = currentRoute == "/home"

}
Scaffold(bottomBar = {
AnimatedVisibility(visible = bottomBarVisibility) {
NavigationBottomBar(
navController = navController,
items = listOf(
NavItem(route = "/home", icon = R.drawable.ic_home),
NavItem(route = "/stats", icon = R.drawable.ic_stats)
)
)
}
}) {
NavHost(
navController = navController,
startDestination = "/home",
modifier = Modifier.padding(it)
) {
composable(route = "/home") {
bottomBarVisibility = true
HomeScreen(navController)
ModalNavigationDrawer(
drawerState = drawerState, drawerContent = {
ModalDrawerSheet {
DrawerContent(
navController = navController, themeViewModel = themeViewModel, onCloseDrawer = {
scope.launch { drawerState.close() }
})
}

composable(route = "/add_income") {
bottomBarVisibility = false
AddExpense(navController, isIncome = true)
}) {
Scaffold(topBar = {
if (showMenuButton)
{
CenterAlignedTopAppBar(title = { }, actions = {
IconButton(
onClick = {
scope.launch { drawerState.open() }
}) {
Icon(
painter = painterResource(id = R.drawable.ic_menu),
contentDescription = "Menu"
)
}
})
}
composable(route = "/add_exp") {
bottomBarVisibility = false
AddExpense(navController, isIncome = false)
}, bottomBar = {
AnimatedVisibility(visible = bottomBarVisibility) {
NavigationBottomBar(
navController = navController, items = listOf(
NavItem(route = "/home", icon = R.drawable.ic_home),
NavItem(route = "/dashboard", icon = R.drawable.ic_dashboard),
NavItem(route = "/stats", icon = R.drawable.ic_stats)
)
)
}
}) {
NavHost(
navController = navController, startDestination = "/home", modifier = Modifier.padding(it)
) {
composable(route = "/home") {
bottomBarVisibility = true
HomeScreen(navController)
}

composable(route = "/add_income") {
bottomBarVisibility = false
AddExpense(navController, isIncome = true)
}
composable(route = "/add_exp") {
bottomBarVisibility = false
AddExpense(navController, isIncome = false)
}

composable(route = "/dashboard") {
bottomBarVisibility = true
DashboardScreen(navController)
}

composable(route = "/stats") {
bottomBarVisibility = true
StatsScreen(navController)
}

composable(route = "/stats") {
bottomBarVisibility = true
StatsScreen(navController)
composable(route = "/settings") {
bottomBarVisibility = false
SettingsScreen(navController, themeViewModel)
}
}
}
}
}


}

data class NavItem(
val route: String,
val icon: Int
Expand All @@ -81,9 +122,8 @@ fun NavigationBottomBar(
navController: NavController,
items: List<NavItem>
) {
// Bottom Navigation Bar
val navBackStackEntry = navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry.value?.destination?.route
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route

BottomAppBar {
items.forEach { item ->
Expand All @@ -99,12 +139,15 @@ fun NavigationBottomBar(
}
},
icon = {
Icon(painter = painterResource(id = item.icon), contentDescription = null)
Icon(
painter = painterResource(id = item.icon),
contentDescription = null
)
},
alwaysShowLabel = false,
colors = NavigationBarItemDefaults.colors(
selectedTextColor = Zinc,
selectedIconColor = Zinc,
selectedTextColor = LightPrimary,
selectedIconColor = LightPrimary,
unselectedTextColor = Color.Gray,
unselectedIconColor = Color.Gray
)
Expand Down
Loading