├── .idea ├── .gitignore ├── compiler.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml └── misc.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── arvind │ │ └── bottomnavwithsidebar │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── arvind │ │ │ └── bottomnavwithsidebar │ │ │ ├── MainActivity.kt │ │ │ ├── app │ │ │ └── BottomNavWithSideBarApp.kt │ │ │ ├── components │ │ │ ├── Drawer.kt │ │ │ ├── UIComponents.kt │ │ │ └── dialog │ │ │ │ └── LogoutDialog.kt │ │ │ ├── navigation │ │ │ └── Screens.kt │ │ │ ├── ui │ │ │ └── theme │ │ │ │ ├── Color.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ ├── utils │ │ │ └── BackPressHandler.kt │ │ │ ├── view │ │ │ ├── bottom │ │ │ │ ├── FavoriteScreen.kt │ │ │ │ ├── NearbyScreen.kt │ │ │ │ ├── ReservedScreen.kt │ │ │ │ └── SavedScreen.kt │ │ │ └── sidebar │ │ │ │ ├── AboutUsScreen.kt │ │ │ │ ├── AppSettingsScreen.kt │ │ │ │ ├── HelpScreen.kt │ │ │ │ ├── HomeScreen.kt │ │ │ │ ├── MyProfileScreen.kt │ │ │ │ ├── MyReviewsScreen.kt │ │ │ │ ├── NotificationsScreen.kt │ │ │ │ ├── QRCodeScreen.kt │ │ │ │ └── VisitHistoryScreen.kt │ │ │ └── viewmodel │ │ │ └── MainViewModel.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── avtar.jpg │ │ ├── ic_baseline_android_24.xml │ │ ├── ic_baseline_help_24.xml │ │ ├── ic_baseline_home_24.xml │ │ ├── ic_baseline_info_24.xml │ │ ├── ic_baseline_location_on_24.xml │ │ ├── ic_baseline_logout_24.xml │ │ ├── ic_baseline_notifications_24.xml │ │ ├── ic_baseline_person_24.xml │ │ ├── ic_baseline_person_pin_24.xml │ │ ├── ic_baseline_qr_code_24.xml │ │ ├── ic_baseline_rate_review_24.xml │ │ ├── ic_baseline_settings_24.xml │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── arvind │ └── bottomnavwithsidebar │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BottomNavWithSideDrawer 2 | New style for app design simple bottom navigtaion with side navigation drawer UI made in Jetpack Compose.😉😎 3 | 4 | (Navigation Components, 5 | Dagger-Hilt, 6 | Material Components) 7 | 8 | # Screenshot 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'kotlin-android' 4 | id 'kotlin-kapt' 5 | id 'dagger.hilt.android.plugin' 6 | } 7 | 8 | android { 9 | compileSdk 31 10 | 11 | defaultConfig { 12 | applicationId "com.arvind.bottomnavwithsidebar" 13 | minSdk 21 14 | targetSdk 31 15 | versionCode 1 16 | versionName "1.0" 17 | 18 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 19 | vectorDrawables { 20 | useSupportLibrary true 21 | } 22 | } 23 | 24 | buildTypes { 25 | release { 26 | minifyEnabled false 27 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 28 | } 29 | } 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_1_8 32 | targetCompatibility JavaVersion.VERSION_1_8 33 | } 34 | kotlinOptions { 35 | jvmTarget = '1.8' 36 | useIR = true 37 | } 38 | buildFeatures { 39 | compose true 40 | } 41 | composeOptions { 42 | kotlinCompilerExtensionVersion compose_version 43 | kotlinCompilerVersion '1.5.31' 44 | } 45 | packagingOptions { 46 | resources { 47 | excludes += '/META-INF/{AL2.0,LGPL2.1}' 48 | } 49 | } 50 | } 51 | 52 | dependencies { 53 | 54 | implementation 'androidx.core:core-ktx:1.7.0' 55 | implementation 'androidx.appcompat:appcompat:1.3.1' 56 | implementation 'com.google.android.material:material:1.4.0' 57 | implementation "androidx.compose.ui:ui-util:$compose_version" 58 | implementation "androidx.compose.ui:ui:$compose_version" 59 | implementation "androidx.compose.material:material:$compose_version" 60 | implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" 61 | implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' 62 | implementation 'androidx.activity:activity-compose:1.4.0' 63 | testImplementation 'junit:junit:4.+' 64 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 65 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 66 | androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" 67 | debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" 68 | 69 | //Material Icon 70 | implementation "androidx.compose.material:material-icons-extended:$compose_version" 71 | 72 | //Coil Image 73 | implementation("io.coil-kt:coil-compose:1.3.2") 74 | implementation "com.github.skydoves:landscapist-coil:1.3.5" 75 | implementation 'com.google.accompanist:accompanist-coil:0.12.0' 76 | 77 | //Lifecycle 78 | implementation "androidx.compose.runtime:runtime-livedata:$compose_version" 79 | 80 | // Coroutine Lifecycle Scopes 81 | implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" 82 | implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" 83 | 84 | // Compose dependencies 85 | implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0" 86 | implementation "androidx.navigation:navigation-compose:2.4.0-beta02" 87 | implementation "com.google.accompanist:accompanist-flowlayout:0.17.0" 88 | implementation "com.google.accompanist:accompanist-navigation-animation:0.17.0" 89 | implementation "com.google.accompanist:accompanist-pager:0.17.0" 90 | implementation "com.google.accompanist:accompanist-pager-indicators:0.17.0" 91 | implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-rc02" 92 | 93 | //Dagger - Hilt 94 | implementation "com.google.dagger:hilt-android:2.38.1" 95 | kapt "com.google.dagger:hilt-android-compiler:2.38.1" 96 | implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03" 97 | kapt "androidx.hilt:hilt-compiler:1.0.0" 98 | implementation 'androidx.hilt:hilt-navigation-compose:1.0.0-alpha03' 99 | 100 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/arvind/bottomnavwithsidebar/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.arvind.bottomnavwithsidebar", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.compose.material.* 7 | import androidx.compose.material.icons.Icons 8 | import androidx.compose.material.icons.filled.ArrowBack 9 | import androidx.compose.material.icons.filled.Menu 10 | import androidx.compose.runtime.Composable 11 | import androidx.compose.runtime.CompositionLocalProvider 12 | import androidx.compose.runtime.getValue 13 | import androidx.compose.runtime.livedata.observeAsState 14 | import androidx.compose.runtime.rememberCoroutineScope 15 | import androidx.compose.ui.tooling.preview.Preview 16 | import androidx.lifecycle.viewmodel.compose.viewModel 17 | import androidx.navigation.NavController 18 | import androidx.navigation.NavHostController 19 | import androidx.navigation.compose.NavHost 20 | import androidx.navigation.compose.composable 21 | import androidx.navigation.compose.rememberNavController 22 | import com.arvind.bottomnavwithsidebar.components.BottomBar 23 | import com.arvind.bottomnavwithsidebar.components.Drawer 24 | import com.arvind.bottomnavwithsidebar.components.TopBar 25 | import com.arvind.bottomnavwithsidebar.components.dialog.LogoutDialog 26 | import com.arvind.bottomnavwithsidebar.navigation.* 27 | import com.arvind.bottomnavwithsidebar.ui.theme.BottomNavWithSideBarTheme 28 | import com.arvind.bottomnavwithsidebar.utils.BackPressHandler 29 | import com.arvind.bottomnavwithsidebar.utils.LocalBackPressedDispatcher 30 | import com.arvind.bottomnavwithsidebar.view.bottom.FavoriteScreen 31 | import com.arvind.bottomnavwithsidebar.view.bottom.NearbyScreen 32 | import com.arvind.bottomnavwithsidebar.view.bottom.ReservedScreen 33 | import com.arvind.bottomnavwithsidebar.view.bottom.SavedScreen 34 | import com.arvind.bottomnavwithsidebar.view.sidebar.* 35 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 36 | import dagger.hilt.android.AndroidEntryPoint 37 | import kotlinx.coroutines.launch 38 | 39 | @AndroidEntryPoint 40 | class MainActivity : ComponentActivity() { 41 | override fun onCreate(savedInstanceState: Bundle?) { 42 | super.onCreate(savedInstanceState) 43 | setContent { 44 | BottomNavWithSideBarTheme { 45 | // A surface container using the 'background' color from the theme 46 | CompositionLocalProvider(LocalBackPressedDispatcher provides this.onBackPressedDispatcher) { 47 | AppScaffold() 48 | } 49 | } 50 | } 51 | } 52 | 53 | @Composable 54 | fun AppScaffold() { 55 | val viewModel: MainViewModel = viewModel() 56 | val navController = rememberNavController() 57 | val scaffoldState = rememberScaffoldState() 58 | val scope = rememberCoroutineScope() 59 | val currentScreen by viewModel.currentScreen.observeAsState() 60 | 61 | if (scaffoldState.drawerState.isOpen) { 62 | BackPressHandler { 63 | scope.launch { 64 | scaffoldState.drawerState.close() 65 | } 66 | } 67 | } 68 | 69 | var topBar: @Composable () -> Unit = { 70 | TopBar( 71 | title = currentScreen!!.title, 72 | buttonIcon = Icons.Filled.Menu, 73 | onButtonClicked = { 74 | scope.launch { 75 | scaffoldState.drawerState.open() 76 | } 77 | } 78 | ) 79 | } 80 | if (currentScreen == Screens.DrawerScreens.QRCode) { 81 | topBar = { 82 | TopBar( 83 | title = Screens.DrawerScreens.MyProfile.title, 84 | buttonIcon = Icons.Filled.ArrowBack, 85 | onButtonClicked = { 86 | navController.popBackStack() 87 | } 88 | ) 89 | } 90 | } 91 | 92 | val bottomBar: @Composable () -> Unit = { 93 | if (currentScreen == Screens.DrawerScreens.Home || currentScreen is Screens.HomeScreens) { 94 | BottomBar( 95 | navController = navController, 96 | screens = screensInHomeFromBottomNav 97 | ) 98 | } 99 | } 100 | 101 | Scaffold( 102 | topBar = { 103 | topBar() 104 | }, 105 | bottomBar = { 106 | bottomBar() 107 | }, 108 | scaffoldState = scaffoldState, 109 | drawerContent = { 110 | Drawer { route -> 111 | scope.launch { 112 | scaffoldState.drawerState.close() 113 | } 114 | navController.navigate(route) { 115 | popUpTo = navController.graph.startDestinationId 116 | launchSingleTop = true 117 | } 118 | } 119 | }, 120 | drawerGesturesEnabled = scaffoldState.drawerState.isOpen, 121 | ) { innerPadding -> 122 | NavigationHost(navController = navController, viewModel = viewModel) 123 | } 124 | } 125 | 126 | @Composable 127 | fun NavigationHost(navController: NavController, viewModel: MainViewModel) { 128 | NavHost( 129 | navController = navController as NavHostController, 130 | startDestination = Screens.DrawerScreens.Home.route 131 | ) { 132 | composable(Screens.DrawerScreens.Home.route) { HomeScreen(viewModel = viewModel) } 133 | composable(Screens.HomeScreens.Favorite.route) { FavoriteScreen(viewModel = viewModel) } 134 | composable(Screens.HomeScreens.NearBy.route) { NearbyScreen(viewModel = viewModel) } 135 | composable(Screens.HomeScreens.Reserved.route) { ReservedScreen(viewModel = viewModel) } 136 | composable(Screens.HomeScreens.Saved.route) { SavedScreen(viewModel = viewModel) } 137 | composable(Screens.DrawerScreens.MyProfile.route) { MyProfileScreen(viewModel = viewModel) } 138 | composable(Screens.DrawerScreens.MyReviews.route) { MyReviewsScreen(viewModel = viewModel) } 139 | composable(Screens.DrawerScreens.VisitsHistory.route) { VisitHistoryScreen(viewModel = viewModel) } 140 | composable(Screens.DrawerScreens.Notifications.route) { NotificationsScreen(viewModel = viewModel) } 141 | composable(Screens.DrawerScreens.AppSettings.route) { AppSettingsScreen(viewModel = viewModel) } 142 | composable(Screens.DrawerScreens.QRCode.route) { QRCodeScreen(viewModel = viewModel) } 143 | composable(Screens.DrawerScreens.Help.route) { HelpScreen(viewModel = viewModel) } 144 | composable(Screens.DrawerScreens.AboutUs.route) { AboutUsScreen(viewModel = viewModel) } 145 | composable(Screens.DrawerScreens.Logout.route) { LogoutDialog() } 146 | 147 | } 148 | } 149 | 150 | @Preview(showBackground = true) 151 | @Composable 152 | fun DefaultPreview() { 153 | BottomNavWithSideBarTheme { 154 | AppScaffold() 155 | } 156 | } 157 | } 158 | 159 | -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/app/BottomNavWithSideBarApp.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.app 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class BottomNavWithSideBarApp : Application() { 8 | 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/components/Drawer.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.components 2 | 3 | import androidx.compose.foundation.* 4 | import androidx.compose.foundation.layout.* 5 | import androidx.compose.foundation.shape.CircleShape 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import androidx.compose.ui.draw.clip 12 | import androidx.compose.ui.graphics.Brush 13 | import androidx.compose.ui.graphics.Color 14 | import androidx.compose.ui.layout.ContentScale 15 | import androidx.compose.ui.res.colorResource 16 | import androidx.compose.ui.res.painterResource 17 | import androidx.compose.ui.tooling.preview.Preview 18 | import androidx.compose.ui.unit.dp 19 | import androidx.compose.ui.unit.sp 20 | import com.arvind.bottomnavwithsidebar.R 21 | import com.arvind.bottomnavwithsidebar.navigation.screensFromDrawer 22 | import com.arvind.bottomnavwithsidebar.ui.theme.BottomNavWithSideBarTheme 23 | import com.arvind.bottomnavwithsidebar.ui.theme.ColorPurplePrimary 24 | import com.arvind.bottomnavwithsidebar.ui.theme.Purple500 25 | import com.arvind.bottomnavwithsidebar.ui.theme.Purple700 26 | 27 | @Composable 28 | fun Drawer( 29 | modifier: Modifier = Modifier, 30 | onDestinationClicked: (route: String) -> Unit 31 | ) { 32 | Box( 33 | modifier = modifier 34 | .verticalScroll(rememberScrollState()) 35 | ) { 36 | Column( 37 | modifier 38 | .fillMaxSize() 39 | ) { 40 | 41 | Row( 42 | modifier = modifier 43 | .fillMaxWidth() 44 | .height(200.dp) 45 | .background( 46 | brush = Brush.horizontalGradient( 47 | listOf( 48 | Color(0xFF966DE7), 49 | Color(0xFF755CD4), 50 | Color(0xFF4C48C1) 51 | ) 52 | ) 53 | ), 54 | verticalAlignment = Alignment.CenterVertically, 55 | ) { 56 | Column(modifier = modifier.padding(15.dp)) { 57 | Text( 58 | text = "Arvind Meshram", 59 | style = MaterialTheme.typography.h5, 60 | color = Purple500 61 | ) 62 | Spacer(Modifier.height(4.dp)) 63 | Text( 64 | text = "meshramaravind@gmail.com", 65 | style = MaterialTheme.typography.body2, 66 | color = Purple500 67 | ) 68 | } 69 | 70 | Image( 71 | painter = painterResource(R.drawable.ic_baseline_person_pin_24), 72 | contentDescription = "avatar", 73 | contentScale = ContentScale.Crop, 74 | modifier = Modifier 75 | .size(64.dp) 76 | .clip(CircleShape) 77 | ) 78 | 79 | } 80 | 81 | screensFromDrawer.forEach { screen -> 82 | Spacer(Modifier.height(14.dp)) 83 | Row( 84 | verticalAlignment = Alignment.CenterVertically, 85 | modifier = Modifier 86 | .fillMaxWidth() 87 | .clickable(onClick = { onDestinationClicked(screen.route) }) 88 | .height(40.dp) 89 | .background(color = Color.Transparent) 90 | 91 | ) { 92 | Image( 93 | painter = painterResource(id = screen.icon), 94 | contentDescription = screen.title, 95 | contentScale = ContentScale.Fit, 96 | modifier = Modifier 97 | .height(35.dp) 98 | .width(35.dp) 99 | .padding(start = 10.dp) 100 | ) 101 | Spacer(modifier = Modifier.width(7.dp)) 102 | Text( 103 | text = screen.title, 104 | fontSize = 16.sp, 105 | color = Purple700, 106 | modifier = Modifier.padding(start = 10.dp) 107 | ) 108 | } 109 | } 110 | } 111 | } 112 | 113 | } 114 | 115 | @Preview 116 | @Composable 117 | fun DrawerPreview() { 118 | BottomNavWithSideBarTheme { 119 | Drawer {} 120 | } 121 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/components/UIComponents.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.components 2 | 3 | import android.graphics.Color 4 | import android.graphics.ColorFilter 5 | import androidx.compose.foundation.Image 6 | import androidx.compose.foundation.layout.Spacer 7 | import androidx.compose.foundation.layout.height 8 | import androidx.compose.foundation.layout.width 9 | import androidx.compose.material.* 10 | import androidx.compose.runtime.Composable 11 | import androidx.compose.runtime.getValue 12 | import androidx.compose.ui.Modifier 13 | import androidx.compose.ui.graphics.Color.Companion.Gray 14 | import androidx.compose.ui.graphics.Color.Companion.White 15 | import androidx.compose.ui.graphics.ColorFilter.Companion.tint 16 | import androidx.compose.ui.graphics.vector.ImageVector 17 | import androidx.compose.ui.layout.ContentScale 18 | import androidx.compose.ui.res.painterResource 19 | import androidx.compose.ui.tooling.preview.Preview 20 | import androidx.compose.ui.unit.dp 21 | import androidx.navigation.NavController 22 | import androidx.navigation.compose.currentBackStackEntryAsState 23 | import com.arvind.bottomnavwithsidebar.navigation.Screens 24 | import com.arvind.bottomnavwithsidebar.ui.theme.BottomNavWithSideBarTheme 25 | import com.arvind.bottomnavwithsidebar.ui.theme.ColorPurplePrimary 26 | import com.arvind.bottomnavwithsidebar.ui.theme.Purple500 27 | import com.arvind.bottomnavwithsidebar.ui.theme.Purple700 28 | 29 | @Composable 30 | fun TopBar(title: String = "", buttonIcon: ImageVector, onButtonClicked: () -> Unit) { 31 | TopAppBar( 32 | title = { 33 | Text( 34 | text = title 35 | ) 36 | }, 37 | navigationIcon = { 38 | IconButton(onClick = { onButtonClicked() }) { 39 | Icon(buttonIcon, contentDescription = "") 40 | } 41 | }, 42 | backgroundColor = MaterialTheme.colors.primaryVariant 43 | ) 44 | } 45 | 46 | @Composable 47 | fun BottomBar( 48 | modifier: Modifier = Modifier, 49 | screens: List, 50 | navController: NavController 51 | ) { 52 | BottomNavigation( 53 | modifier = modifier, 54 | backgroundColor = Purple700 55 | ) { 56 | val navBackStackEntry by navController.currentBackStackEntryAsState() 57 | val currentRoute = navBackStackEntry?.destination?.route 58 | screens.forEach { screen -> 59 | BottomNavigationItem( 60 | icon = { Icon(imageVector = screen.icon, contentDescription = "") }, 61 | label = { Text(screen.title) }, 62 | selected = currentRoute == screen.route, 63 | onClick = { 64 | navController.navigate(screen.route) { 65 | popUpTo = navController.graph.startDestinationId 66 | launchSingleTop = true 67 | } 68 | } 69 | ) 70 | } 71 | } 72 | } 73 | 74 | -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/components/dialog/LogoutDialog.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.components.dialog 2 | 3 | import androidx.compose.material.AlertDialog 4 | import androidx.compose.material.Text 5 | import androidx.compose.material.TextButton 6 | import androidx.compose.runtime.Composable 7 | import androidx.compose.runtime.mutableStateOf 8 | import androidx.compose.runtime.remember 9 | import androidx.compose.ui.platform.LocalContext 10 | import androidx.compose.ui.res.stringResource 11 | import com.arvind.bottomnavwithsidebar.R 12 | import com.arvind.bottomnavwithsidebar.ui.theme.* 13 | import com.arvind.bottomnavwithsidebar.ui.theme.dark_gray 14 | 15 | 16 | @Composable 17 | fun LogoutDialog() { 18 | val context = LocalContext.current 19 | val openDialog = remember { mutableStateOf(true) } 20 | 21 | if (openDialog.value) { 22 | AlertDialog( 23 | onDismissRequest = { openDialog.value = false }, 24 | 25 | title = { Text(text = stringResource(id = R.string.logout), color = dark_gray) }, 26 | text = { Text(stringResource(id = R.string.wouldyouliketologout), color = dark_gray) }, 27 | confirmButton = { 28 | TextButton( 29 | onClick = { 30 | openDialog.value = false 31 | } 32 | ) { 33 | 34 | Text(stringResource(id = R.string.logoutok), color = Purple500) 35 | } 36 | }, 37 | dismissButton = { 38 | TextButton( 39 | onClick = { 40 | openDialog.value = false 41 | 42 | } 43 | ) { 44 | Text(stringResource(id = R.string.cancel), color = ColorGray) 45 | } 46 | }, 47 | backgroundColor = ColorWhite, 48 | contentColor = dark_gray 49 | ) 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/navigation/Screens.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.navigation 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.Button 7 | import androidx.compose.material.MaterialTheme 8 | import androidx.compose.material.Text 9 | import androidx.compose.material.icons.Icons 10 | import androidx.compose.material.icons.filled.Favorite 11 | import androidx.compose.material.icons.filled.Notifications 12 | import androidx.compose.material.icons.filled.Person 13 | import androidx.compose.runtime.Composable 14 | import androidx.compose.runtime.getValue 15 | import androidx.compose.runtime.livedata.observeAsState 16 | import androidx.compose.ui.Alignment 17 | import androidx.compose.ui.Modifier 18 | import androidx.compose.ui.graphics.vector.ImageVector 19 | import com.arvind.bottomnavwithsidebar.R 20 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 21 | 22 | sealed class Screens(val route: String, val title: String) { 23 | 24 | sealed class HomeScreens( 25 | route: String, 26 | title: String, 27 | val icon: ImageVector 28 | ) : Screens( 29 | route, 30 | title 31 | ) { 32 | object Favorite : HomeScreens("favorite", "Favorite", Icons.Filled.Favorite) 33 | object NearBy : HomeScreens("nearby", "Nearby", Icons.Filled.Notifications) 34 | object Reserved : HomeScreens("reserved", "Reserved", Icons.Filled.Person) 35 | object Saved : HomeScreens("saved", "Saved", Icons.Filled.Person) 36 | 37 | } 38 | 39 | sealed class DrawerScreens( 40 | route: String, 41 | val icon: Int, 42 | title: String 43 | ) : Screens(route, title) { 44 | object Home : DrawerScreens("home", R.drawable.ic_baseline_home_24, "Home") 45 | object MyProfile : 46 | DrawerScreens("my_profile", R.drawable.ic_baseline_person_24, "My Profile") 47 | 48 | object MyReviews : 49 | DrawerScreens("my_reviews", R.drawable.ic_baseline_rate_review_24, "My Reviews") 50 | 51 | object VisitsHistory : 52 | DrawerScreens("visit_history", R.drawable.ic_baseline_location_on_24, "Visits History") 53 | 54 | object Notifications : 55 | DrawerScreens("notifications", R.drawable.ic_baseline_notifications_24, "Notifications") 56 | 57 | object AppSettings : 58 | DrawerScreens("settings", R.drawable.ic_baseline_settings_24, "Settings") 59 | 60 | object QRCode : DrawerScreens("qr-code", R.drawable.ic_baseline_qr_code_24, "QR Code") 61 | 62 | object Help : DrawerScreens("help", R.drawable.ic_baseline_help_24, "Help") 63 | 64 | object AboutUs : DrawerScreens("about_us", R.drawable.ic_baseline_info_24, "About Us") 65 | 66 | object Logout : DrawerScreens("logout", R.drawable.ic_baseline_logout_24, "Logout") 67 | 68 | } 69 | } 70 | 71 | val screensInHomeFromBottomNav = listOf( 72 | Screens.HomeScreens.Favorite, 73 | Screens.HomeScreens.NearBy, 74 | Screens.HomeScreens.Reserved, 75 | Screens.HomeScreens.Saved 76 | ) 77 | 78 | val screensFromDrawer = listOf( 79 | Screens.DrawerScreens.Home, 80 | Screens.DrawerScreens.MyProfile, 81 | Screens.DrawerScreens.MyReviews, 82 | Screens.DrawerScreens.VisitsHistory, 83 | Screens.DrawerScreens.Notifications, 84 | Screens.DrawerScreens.AppSettings, 85 | Screens.DrawerScreens.QRCode, 86 | Screens.DrawerScreens.Help, 87 | Screens.DrawerScreens.AboutUs, 88 | Screens.DrawerScreens.Logout 89 | ) 90 | 91 | 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) 9 | 10 | val ColorPurplePrimary = Color(0xFFDCC8F8) 11 | val ColorWhite = Color(0xFFFFFFFF) 12 | val ColorGray = Color(0xFF4B4F5A) 13 | val dark_gray = Color(0xFF38414A) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.ui.theme 2 | 3 | import androidx.compose.foundation.isSystemInDarkTheme 4 | import androidx.compose.material.MaterialTheme 5 | import androidx.compose.material.darkColors 6 | import androidx.compose.material.lightColors 7 | import androidx.compose.runtime.Composable 8 | 9 | private val DarkColorPalette = darkColors( 10 | primary = Purple200, 11 | primaryVariant = Purple700, 12 | secondary = Teal200 13 | ) 14 | 15 | private val LightColorPalette = lightColors( 16 | primary = Purple500, 17 | primaryVariant = Purple700, 18 | secondary = Teal200 19 | 20 | /* Other default colors to override 21 | background = Color.White, 22 | surface = Color.White, 23 | onPrimary = Color.White, 24 | onSecondary = Color.Black, 25 | onBackground = Color.Black, 26 | onSurface = Color.Black, 27 | */ 28 | ) 29 | 30 | @Composable 31 | fun BottomNavWithSideBarTheme( 32 | darkTheme: Boolean = isSystemInDarkTheme(), 33 | content: @Composable() () -> Unit 34 | ) { 35 | val colors = if (darkTheme) { 36 | DarkColorPalette 37 | } else { 38 | LightColorPalette 39 | } 40 | 41 | MaterialTheme( 42 | colors = colors, 43 | typography = Typography, 44 | shapes = Shapes, 45 | content = content 46 | ) 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.ui.theme 2 | 3 | import androidx.compose.material.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | body1 = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp 15 | ) 16 | /* Other default text styles to override 17 | button = TextStyle( 18 | fontFamily = FontFamily.Default, 19 | fontWeight = FontWeight.W500, 20 | fontSize = 14.sp 21 | ), 22 | caption = TextStyle( 23 | fontFamily = FontFamily.Default, 24 | fontWeight = FontWeight.Normal, 25 | fontSize = 12.sp 26 | ) 27 | */ 28 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/utils/BackPressHandler.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.utils 2 | 3 | import androidx.activity.OnBackPressedCallback 4 | import androidx.activity.OnBackPressedDispatcher 5 | import androidx.compose.runtime.* 6 | 7 | @Composable 8 | fun BackPressHandler(onBackPressed: () -> Unit) { 9 | // Safely update the current `onBack` lambda when a new one is provided 10 | val currentOnBackPressed by rememberUpdatedState(onBackPressed) 11 | 12 | // Remember in Composition a back callback that calls the `onBackPressed` lambda 13 | val backCallback = remember { 14 | object : OnBackPressedCallback(true) { 15 | override fun handleOnBackPressed() { 16 | currentOnBackPressed() 17 | } 18 | } 19 | } 20 | 21 | val backDispatcher = LocalBackPressedDispatcher.current 22 | 23 | // Whenever there's a new dispatcher set up the callback 24 | DisposableEffect(backDispatcher) { 25 | backDispatcher.addCallback(backCallback) 26 | // When the effect leaves the Composition, or there's a new dispatcher, remove the callback 27 | onDispose { 28 | backCallback.remove() 29 | } 30 | } 31 | } 32 | 33 | /** 34 | * This [CompositionLocal] is used to provide an [OnBackPressedDispatcher]: 35 | * 36 | * ``` 37 | * CompositionLocalProvider( 38 | * LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher 39 | * ) { } 40 | * ``` 41 | * 42 | * and setting up the callbacks with [BackPressHandler]. 43 | */ 44 | val LocalBackPressedDispatcher = 45 | staticCompositionLocalOf { error("No Back Dispatcher provided") } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/bottom/FavoriteScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.bottom 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun FavoriteScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.HomeScreens.Favorite) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Favorite.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/bottom/NearbyScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.bottom 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun NearbyScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.HomeScreens.NearBy) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Near by.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/bottom/ReservedScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.bottom 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun ReservedScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.HomeScreens.Reserved) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Reserved .", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/bottom/SavedScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.bottom 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun SavedScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.HomeScreens.Saved) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Saved .", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/AboutUsScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun AboutUsScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.AboutUs) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "About us.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/AppSettingsScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun AppSettingsScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.AppSettings) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "App Settings.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/HelpScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun HelpScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.Help) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Help.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/HomeScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun HomeScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.Home) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Home.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/MyProfileScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun MyProfileScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.MyProfile) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "My Profile.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/MyReviewsScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun MyReviewsScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.MyReviews) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "My Reviews.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/NotificationsScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun NotificationsScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.Notifications) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Notifications .", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/QRCodeScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun QRCodeScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.QRCode) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "QR Code.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/view/sidebar/VisitHistoryScreen.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.view.sidebar 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import com.arvind.bottomnavwithsidebar.navigation.Screens 12 | import com.arvind.bottomnavwithsidebar.viewmodel.MainViewModel 13 | 14 | @Composable 15 | fun VisitHistoryScreen( 16 | modifier: Modifier = Modifier, 17 | viewModel: MainViewModel 18 | ) { 19 | viewModel.setCurrentScreen(Screens.DrawerScreens.VisitsHistory) 20 | Column( 21 | modifier = modifier.fillMaxSize(), 22 | verticalArrangement = Arrangement.Center, 23 | horizontalAlignment = Alignment.CenterHorizontally 24 | ) { 25 | Text(text = "Visit History.", style = MaterialTheme.typography.h4) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/arvind/bottomnavwithsidebar/viewmodel/MainViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.arvind.bottomnavwithsidebar.viewmodel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.arvind.bottomnavwithsidebar.navigation.Screens 7 | import dagger.hilt.android.lifecycle.HiltViewModel 8 | import javax.inject.Inject 9 | 10 | @HiltViewModel 11 | class MainViewModel @Inject constructor() : 12 | ViewModel() { 13 | private val _currentScreen = MutableLiveData(Screens.DrawerScreens.Home) 14 | val currentScreen: LiveData = _currentScreen 15 | 16 | fun setCurrentScreen(screen: Screens) { 17 | _currentScreen.value = screen 18 | } 19 | 20 | private val _clickCount = MutableLiveData(0) 21 | val clickCount: LiveData = _clickCount 22 | 23 | fun updateClick(value: Int) { 24 | _clickCount.value = value 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/avtar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/drawable/avtar.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_android_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_help_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_home_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_info_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_location_on_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_logout_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_notifications_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_person_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_person_pin_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 16 | 19 | 22 | 25 | 28 | 31 | 34 | 37 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_rate_review_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_settings_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meshramaravind/BottomNavWithSideDrawer/5cababf95bf4df8e365abdeaa77605361f99406e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | BottomNavWithSideBar 3 | 4 | Logout 5 | Would you like to logout? 6 | LOGOUT 7 | CANCEL 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |