Skip to content

Commit

Permalink
feat(ui): large screen support
Browse files Browse the repository at this point in the history
  • Loading branch information
abcghy committed Feb 25, 2024
1 parent 713b47d commit 50b4054
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 15 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ dependencies {

// https://developer.android.com/jetpack/androidx/releases/compose-material3
implementation "androidx.compose.material3:material3:$material3"
implementation "androidx.compose.material3:material3-window-size-class:$material3"

// https://github.com/google/accompanist/releases
implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.core.util.Consumer
Expand Down Expand Up @@ -40,6 +42,7 @@ class MainActivity : AppCompatActivity() {
@Inject
lateinit var accountDao: AccountDao

@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
Expand All @@ -65,6 +68,7 @@ class MainActivity : AppCompatActivity() {
}

setContent {
val widthSizeClass = calculateWindowSizeClass(this).widthSizeClass
CompositionLocalProvider(
LocalImageLoader provides imageLoader,
) {
Expand All @@ -82,7 +86,7 @@ class MainActivity : AppCompatActivity() {
removeOnNewIntentListener(listener)
}
}
HomeEntry(subscribeViewModel = subscribeViewModel)
HomeEntry(subscribeViewModel = subscribeViewModel, widthSizeClass = widthSizeClass)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import me.ash.reader.ui.theme.palette.onDark
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RYScaffold(
modifier: Modifier = Modifier,
containerColor: Color = MaterialTheme.colorScheme.surface,
topBarTonalElevation: Dp = 0.dp,
containerTonalElevation: Dp = 0.dp,
Expand All @@ -27,7 +28,7 @@ fun RYScaffold(
content: @Composable () -> Unit = {},
) {
Scaffold(
modifier = Modifier
modifier = modifier
.background(
MaterialTheme.colorScheme.surfaceColorAtElevation(
topBarTonalElevation,
Expand Down
12 changes: 9 additions & 3 deletions app/src/main/java/me/ash/reader/ui/page/common/HomeEntry.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.util.Log
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.background
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
Expand All @@ -23,6 +24,7 @@ import me.ash.reader.ui.page.home.HomeViewModel
import me.ash.reader.ui.page.home.feeds.FeedsPage
import me.ash.reader.ui.page.home.feeds.subscribe.SubscribeViewModel
import me.ash.reader.ui.page.home.flow.FlowPage
import me.ash.reader.ui.page.home.flow.FlowRoute
import me.ash.reader.ui.page.home.reading.ReadingPage
import me.ash.reader.ui.page.settings.SettingsPage
import me.ash.reader.ui.page.settings.accounts.AccountDetailsPage
Expand All @@ -44,6 +46,7 @@ import me.ash.reader.ui.theme.AppTheme
fun HomeEntry(
homeViewModel: HomeViewModel = hiltViewModel(),
subscribeViewModel: SubscribeViewModel = hiltViewModel(),
widthSizeClass: WindowWidthSizeClass,
) {
val context = LocalContext.current
var isReadingPage by rememberSaveable { mutableStateOf(false) }
Expand All @@ -58,6 +61,8 @@ fun HomeEntry(
intent?.replaceExtras(null)
}

val isExpandedScreen = widthSizeClass == WindowWidthSizeClass.Expanded

LaunchedEffect(Unit) {
when (context.initialPage) {
1 -> {
Expand Down Expand Up @@ -152,13 +157,14 @@ fun HomeEntry(
)
}
forwardAndBackwardComposable(route = RouteName.FLOW) {
FlowPage(
FlowRoute(
navController = navController,
homeViewModel = homeViewModel,
isExpandedScreen = isExpandedScreen,
homeViewModel = homeViewModel
)
}
forwardAndBackwardComposable(route = "${RouteName.READING}/{articleId}") {
ReadingPage(navController = navController, homeViewModel = homeViewModel)
ReadingPage(navController = navController, homeViewModel = homeViewModel, isExpandedScreen = isExpandedScreen)
}

// Settings
Expand Down
38 changes: 36 additions & 2 deletions app/src/main/java/me/ash/reader/ui/page/home/flow/FlowPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import me.ash.reader.ui.component.base.*
import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.page.common.RouteName
import me.ash.reader.ui.page.home.HomeViewModel
import me.ash.reader.ui.page.home.reading.ReadingPage

@OptIn(
com.google.accompanist.pager.ExperimentalPagerApi::class,
Expand All @@ -41,6 +42,8 @@ import me.ash.reader.ui.page.home.HomeViewModel
fun FlowPage(
navController: NavHostController,
flowViewModel: FlowViewModel = hiltViewModel(),
isExpandedScreen: Boolean,
onArticleClick: ((ArticleWithFeed) -> Unit)? = null,
homeViewModel: HomeViewModel,
) {
val keyboardController = LocalSoftwareKeyboardController.current
Expand Down Expand Up @@ -145,7 +148,9 @@ fun FlowPage(
onSearch = false
}

val width = if (isExpandedScreen) Modifier.width(334.dp) else Modifier
RYScaffold(
modifier = width,
topBarTonalElevation = topBarTonalElevation.value.dp,
containerTonalElevation = articleListTonalElevation.value.dp,
navigationIcon = {
Expand Down Expand Up @@ -290,8 +295,12 @@ fun FlowPage(
isScrollInProgress = { listState.isScrollInProgress },
onClick = {
onSearch = false
navController.navigate("${RouteName.READING}/${it.article.id}") {
launchSingleTop = true
if (onArticleClick == null) {
navController.navigate("${RouteName.READING}/${it.article.id}") {
launchSingleTop = true
}
} else {
onArticleClick(it)
}
},
onSwipeStartToEnd = onSwipeStartToEnd,
Expand Down Expand Up @@ -327,3 +336,28 @@ fun FlowPage(
}
)
}

@Composable
fun FlowWithArticleDetailsScreen(
navController: NavHostController,
isExpandedScreen: Boolean,
homeViewModel: HomeViewModel,
flowViewModel: FlowViewModel,
) {
var articleId : String? by remember {
mutableStateOf(null)
}

Row {
FlowPage(
navController = navController,
isExpandedScreen = isExpandedScreen,
onArticleClick = {
articleId = it.article.id
},
homeViewModel = homeViewModel,
flowViewModel = flowViewModel,
)
ReadingPage(navController = navController, homeViewModel = homeViewModel, isExpandedScreen = isExpandedScreen, articleId = articleId)
}
}
49 changes: 49 additions & 0 deletions app/src/main/java/me/ash/reader/ui/page/home/flow/FlowRoute.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package me.ash.reader.ui.page.home.flow

import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import me.ash.reader.ui.page.home.HomeViewModel

enum class FlowScreenType {
FlowWithArticleDetails,
Flow,
}

fun getFlowScreenType(isExpanded: Boolean): FlowScreenType = when (isExpanded) {
true -> {
FlowScreenType.FlowWithArticleDetails
}
false -> {
FlowScreenType.Flow
}
}

@Composable
fun FlowRoute(
navController: NavHostController,
isExpandedScreen: Boolean,
homeViewModel: HomeViewModel,
flowViewModel: FlowViewModel = hiltViewModel(),
) {
val flowScreenType = getFlowScreenType(isExpandedScreen)

when (flowScreenType) {
FlowScreenType.FlowWithArticleDetails -> {
FlowWithArticleDetailsScreen(
navController = navController,
isExpandedScreen = isExpandedScreen,
homeViewModel = homeViewModel,
flowViewModel = flowViewModel,
)
}
FlowScreenType.Flow -> {
FlowPage(
navController = navController,
isExpandedScreen = isExpandedScreen,
homeViewModel = homeViewModel,
flowViewModel = flowViewModel,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import me.ash.reader.domain.model.general.MarkAsReadConditions
import me.ash.reader.domain.service.RssService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ private const val DOWNWARD = -1
fun ReadingPage(
navController: NavHostController,
homeViewModel: HomeViewModel,
isExpandedScreen: Boolean,
articleId: String? = null,
readingViewModel: ReadingViewModel = hiltViewModel(),
) {
val tonalElevation = LocalReadingPageTonalElevation.current
Expand All @@ -66,9 +68,10 @@ fun ReadingPage(

val pagingItems = homeUiState.pagingData.collectAsLazyPagingItems().itemSnapshotList

LaunchedEffect(Unit) {
LaunchedEffect(articleId) {
navController.currentBackStackEntryFlow.collect {
it.arguments?.getString("articleId")?.let { articleId ->
val getArticleId : String? = articleId ?: it.arguments?.getString("articleId")
getArticleId?.let { articleId ->
if (readerState.articleId != articleId) {
readingViewModel.initData(articleId)
}
Expand Down Expand Up @@ -101,6 +104,7 @@ fun ReadingPage(
windowInsets = WindowInsets(top = paddings.calculateTopPadding()),
title = readerState.title,
link = readerState.link,
isExpandedScreen = isExpandedScreen,
onClose = {
navController.popBackStack()
},
Expand Down
15 changes: 9 additions & 6 deletions app/src/main/java/me/ash/reader/ui/page/home/reading/TopBar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ fun TopBar(
windowInsets: WindowInsets = WindowInsets(0.dp),
title: String? = "",
link: String? = "",
isExpandedScreen: Boolean,
onClose: () -> Unit = {},
) {
val context = LocalContext.current
Expand All @@ -52,12 +53,14 @@ fun TopBar(
modifier = Modifier,
windowInsets = windowInsets,
navigationIcon = {
FeedbackIconButton(
imageVector = Icons.Rounded.Close,
contentDescription = stringResource(R.string.close),
tint = MaterialTheme.colorScheme.onSurface
) {
onClose()
if (!isExpandedScreen) {
FeedbackIconButton(
imageVector = Icons.Rounded.Close,
contentDescription = stringResource(R.string.close),
tint = MaterialTheme.colorScheme.onSurface
) {
onClose()
}
}
},
actions = {
Expand Down

0 comments on commit 50b4054

Please sign in to comment.