Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Multiple screen size #137

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from
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
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ dependencies {

implementation Firebase.dynamicLink
implementation(project(":features:article:dynamic-links-handler"))
implementation "androidx.compose.material3:material3-window-size-class:1.0.0-alpha12"
}

if (file("google-services.json").exists()) {
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/java/kasem/sm/slime/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.RequiresApi
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import coil.ImageLoader
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
Expand All @@ -27,6 +29,7 @@ class MainActivity : ComponentActivity() {
@Inject
lateinit var imageLoader: ImageLoader

@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@RequiresApi(S)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -37,7 +40,8 @@ class MainActivity : ComponentActivity() {
SlimeNavigation(
navController = navController,
imageLoader = imageLoader,
bottomSheetNavigator = bottomSheetNavigator
bottomSheetNavigator = bottomSheetNavigator,
windowSizeClass = calculateWindowSizeClass(this)
)

handleDynamicLink(
Expand Down
89 changes: 59 additions & 30 deletions app/src/main/java/kasem/sm/slime/ui/navigation/SlimeNavigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,23 @@ package kasem.sm.slime.ui.navigation

import android.os.Build.VERSION_CODES.S
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.rememberScaffoldState
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import coil.ImageLoader
import com.google.accompanist.navigation.material.BottomSheetNavigator
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import kasem.sm.common_ui.scaffold.SlimeBottomBar
import kasem.sm.common_ui.scaffold.SlimeNavigationRail
import kasem.sm.common_ui.scaffold.SlimeScaffold
import kasem.sm.common_ui.scaffold.isCompactWindow
import kasem.sm.common_ui.theme.SlimeTheme
import kasem.sm.common_ui.util.BottomNavigationItems

Expand All @@ -27,38 +33,61 @@ fun SlimeNavigation(
imageLoader: ImageLoader,
navController: NavHostController,
bottomSheetNavigator: BottomSheetNavigator,
) = SlimeTheme {
val scaffoldState = rememberScaffoldState()
windowSizeClass: WindowSizeClass,
) {
SlimeTheme {
val scaffoldState = rememberScaffoldState()

SlimeScaffold(
state = scaffoldState,
bottomBarVisibility = navController.isNotAuthRoute(),
fabVisibility = navController.isProfileScreenRoute(),
bottomBar = {
SlimeBottomBar(
currentRoute = navController.currentRouteAsState(),
items = BottomNavigationItems.toList,
navigateTo = { route ->
if (navController.currentDestination?.route != route) {
navController.navigate(route) {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
}
SlimeScaffold(
state = scaffoldState,
bottomBarVisibility = navController.isNotAuthRoute(),
fabVisibility = navController.isProfileScreenRoute(),
windowSizeClass = windowSizeClass,
bottomBar = {
SlimeBottomBar(
currentRoute = navController.currentRouteAsState(),
items = BottomNavigationItems.toList,
navigateTo = navController::navigateTo
)
},
) { padding ->
/**
* If the device is rotated (horizontally), we need to display
* the rail first in the row then the content
*/
Row(
Modifier
.fillMaxSize()
) {
if (!windowSizeClass.isCompactWindow) {
SlimeNavigationRail(
currentRoute = navController.currentRouteAsState(),
items = BottomNavigationItems.toList,
navigateTo = navController::navigateTo
)
}
)

NavHost(
navController = navController,
bottomSheetNavigator = bottomSheetNavigator,
imageLoader = imageLoader,
snackbarHostState = scaffoldState.snackbarHostState,
modifier = Modifier
.padding(padding)
)
}
}
}
}

fun NavController.navigateTo(route: String) {
if (currentDestination?.route != route) {
navigate(route) {
popUpTo(graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
) { padding ->
NavHost(
navController = navController,
bottomSheetNavigator = bottomSheetNavigator,
imageLoader = imageLoader,
snackbarHostState = scaffoldState.snackbarHostState,
modifier = Modifier
.padding(padding)
)
}
}
2 changes: 2 additions & 0 deletions common-ui/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ dependencies {
implementation(Accompanist.flowLayout)
implementation Accompanist.sysUiController
implementation "org.jetbrains.kotlin:kotlin-reflect:1.6.21"

implementation "androidx.compose.material3:material3-window-size-class:1.0.0-alpha12"
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationRail
import androidx.compose.material3.NavigationRailItem
import androidx.compose.material3.Text
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
Expand Down Expand Up @@ -48,3 +52,37 @@ fun SlimeBottomBar(
}
}
}

@Composable
fun SlimeNavigationRail(
currentRoute: String?,
navigateTo: (String) -> Unit,
items: List<BottomNavigationItems>,
) {
NavigationRail {
items.forEach { item ->
NavigationRailItem(
icon = {
Icon(
painter = painterResource(id = item.icon),
modifier = Modifier.size(22.dp),
contentDescription = item.title,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
},
label = {
Text(
text = item.title,
fontFamily = LocalSlimeFont.current.secondaryMedium
)
},
selected = currentRoute == item.route,
onClick = {
navigateTo(item.route)
}
)
}
}
}

val WindowSizeClass.isCompactWindow get() = widthSizeClass == WindowWidthSizeClass.Compact
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier

Expand All @@ -19,6 +20,7 @@ fun SlimeScaffold(
state: ScaffoldState,
bottomBarVisibility: Boolean,
fabVisibility: Boolean,
windowSizeClass: WindowSizeClass,
bottomBar: @Composable () -> Unit,
content: @Composable (PaddingValues) -> Unit,
) {
Expand All @@ -28,20 +30,24 @@ fun SlimeScaffold(
content = content,
bottomBar = {
if (bottomBarVisibility) {
bottomBar()
if (windowSizeClass.isCompactWindow) {
bottomBar()
}
}
},
floatingActionButton = {
if (fabVisibility) {
FloatingActionButton(onClick = {
//
}) {
FloatingActionButton(
onClick = {
//
}
) {
Icon(
imageVector = Icons.Default.Add,
contentDescription = Icons.Default.Add.name
)
}
}
}
},
)
}
4 changes: 2 additions & 2 deletions version.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#Tue May 24 20:35:34 IST 2022
#Tue May 24 22:03:57 IST 2022
MAJOR=0
MINOR=0
VERSION_CODE=31
PATCH=4188
PATCH=4198