Skip to content

Commit 94b04b7

Browse files
committed
feat: Move image screens into home screen navigation, add animations
1 parent 8dca163 commit 94b04b7

File tree

5 files changed

+319
-242
lines changed

5 files changed

+319
-242
lines changed

app/src/main/java/org/nsh07/wikireader/ui/AppNavigationDrawer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ fun AppNavigationDrawer(
6666
windowSizeClass: WindowSizeClass,
6767
backStackEntry: NavBackStackEntry?,
6868
historyEnabled: Boolean,
69+
isImageView: Boolean,
6970
onAboutClick: () -> Unit,
7071
onHistoryClick: () -> Unit,
7172
onHomeClick: () -> Unit,
@@ -131,7 +132,7 @@ fun AppNavigationDrawer(
131132

132133
Row(modifier = modifier) {
133134
AnimatedVisibility(
134-
backStackEntry?.destination?.hasRoute(FullScreenImage::class) != true,
135+
visible = !isImageView,
135136
enter = expandHorizontally(animationSpec = motionScheme.defaultSpatialSpec()),
136137
exit = shrinkHorizontally(animationSpec = motionScheme.defaultSpatialSpec())
137138
) {

app/src/main/java/org/nsh07/wikireader/ui/AppScreen.kt

Lines changed: 56 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package org.nsh07.wikireader.ui
22

33
import android.os.Build.VERSION.SDK_INT
4+
import androidx.compose.animation.AnimatedVisibility
45
import androidx.compose.animation.core.tween
6+
import androidx.compose.animation.expandVertically
57
import androidx.compose.animation.fadeIn
68
import androidx.compose.animation.fadeOut
79
import androidx.compose.animation.scaleIn
810
import androidx.compose.animation.slideInHorizontally
11+
import androidx.compose.animation.slideInVertically
912
import androidx.compose.animation.slideOutHorizontally
1013
import androidx.compose.foundation.Canvas
1114
import androidx.compose.foundation.background
@@ -60,7 +63,6 @@ import androidx.compose.ui.platform.LocalContext
6063
import androidx.compose.ui.platform.LocalDensity
6164
import androidx.compose.ui.res.stringResource
6265
import androidx.compose.ui.unit.dp
63-
import androidx.core.text.parseAsHtml
6466
import androidx.lifecycle.compose.collectAsStateWithLifecycle
6567
import androidx.navigation.NavDestination.Companion.hasRoute
6668
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -69,7 +71,6 @@ import androidx.navigation.compose.composable
6971
import androidx.navigation.compose.currentBackStackEntryAsState
7072
import androidx.navigation.compose.rememberNavController
7173
import androidx.navigation.navDeepLink
72-
import androidx.navigation.toRoute
7374
import androidx.window.core.layout.WindowSizeClass
7475
import coil3.ImageLoader
7576
import coil3.gif.AnimatedImageDecoder
@@ -81,15 +82,13 @@ import kotlinx.serialization.Serializable
8182
import org.nsh07.wikireader.R.string
8283
import org.nsh07.wikireader.data.SearchHistoryItem
8384
import org.nsh07.wikireader.data.UserLanguage
84-
import org.nsh07.wikireader.data.WikiPhoto
8585
import org.nsh07.wikireader.ui.aboutScreen.AboutScreen
8686
import org.nsh07.wikireader.ui.historyScreen.HistoryScreenRoot
8787
import org.nsh07.wikireader.ui.homeScreen.AppHomeScreen
8888
import org.nsh07.wikireader.ui.homeScreen.AppSearchBar
8989
import org.nsh07.wikireader.ui.homeScreen.viewModel.HomeAction
9090
import org.nsh07.wikireader.ui.homeScreen.viewModel.HomeScreenViewModel
9191
import org.nsh07.wikireader.ui.homeScreen.viewModel.HomeSubscreen
92-
import org.nsh07.wikireader.ui.image.FullScreenImage
9392
import org.nsh07.wikireader.ui.savedArticlesScreen.SavedArticlesScreenRoot
9493
import org.nsh07.wikireader.ui.settingsScreen.SettingsScreenRoot
9594
import org.nsh07.wikireader.ui.settingsScreen.viewModel.SettingsViewModel
@@ -177,6 +176,7 @@ fun AppScreen(
177176
windowSizeClass = windowSizeClass,
178177
backStackEntry = navBackStackEntry,
179178
historyEnabled = preferencesState.browsingHistory,
179+
isImageView = backStack.last() is HomeSubscreen.Image,
180180
onAboutClick = {
181181
navController.navigate(AboutScreen) {
182182
popUpTo(navController.graph.findStartDestination().id) {
@@ -304,43 +304,52 @@ fun AppScreen(
304304

305305
Scaffold(
306306
topBar = {
307-
AppSearchBar(
308-
appSearchBarState = appSearchBarState,
309-
searchBarState = searchBarState,
310-
preferencesState = preferencesState,
311-
textFieldState = textFieldState,
312-
userLangs = userLangs,
313-
recentLangs = recentLangs,
314-
searchHistory = searchHistory,
315-
scrollBehavior = searchBarScrollBehavior,
316-
searchBarEnabled = !showArticleLanguageSheet,
317-
imageLoader = imageLoader,
318-
searchListState = searchListState,
319-
windowSizeClass = windowSizeClass,
320-
languageSearchStr = languageSearchStr,
321-
languageSearchQuery = languageSearchQuery,
322-
onAction = viewModel::onAction,
323-
onSettingsAction = settingsViewModel::onAction,
324-
onSearchBarExpandedChange = {
325-
scope.launch {
326-
if (it) searchBarState.animateToExpanded()
327-
else searchBarState.animateToCollapsed()
307+
AnimatedVisibility(
308+
backStack.last() !is HomeSubscreen.Image,
309+
enter = slideInVertically(
310+
motionScheme.defaultSpatialSpec(),
311+
initialOffsetY = { -it }
312+
) + expandVertically(motionScheme.defaultSpatialSpec()),
313+
exit = fadeOut(motionScheme.fastEffectsSpec())
314+
) {
315+
AppSearchBar(
316+
appSearchBarState = appSearchBarState,
317+
searchBarState = searchBarState,
318+
preferencesState = preferencesState,
319+
textFieldState = textFieldState,
320+
userLangs = userLangs,
321+
recentLangs = recentLangs,
322+
searchHistory = searchHistory,
323+
scrollBehavior = searchBarScrollBehavior,
324+
searchBarEnabled = !showArticleLanguageSheet,
325+
imageLoader = imageLoader,
326+
searchListState = searchListState,
327+
windowSizeClass = windowSizeClass,
328+
languageSearchStr = languageSearchStr,
329+
languageSearchQuery = languageSearchQuery,
330+
onAction = viewModel::onAction,
331+
onSettingsAction = settingsViewModel::onAction,
332+
onSearchBarExpandedChange = {
333+
scope.launch {
334+
if (it) searchBarState.animateToExpanded()
335+
else searchBarState.animateToCollapsed()
336+
}
337+
},
338+
clearHistory = {
339+
historyItem = null
340+
setShowDeleteDialog(true)
341+
},
342+
removeHistoryItem = {
343+
historyItem = it
344+
setShowDeleteDialog(true)
345+
},
346+
onMenuIconClicked = {
347+
scope.launch {
348+
railState.expand()
349+
}
328350
}
329-
},
330-
clearHistory = {
331-
historyItem = null
332-
setShowDeleteDialog(true)
333-
},
334-
removeHistoryItem = {
335-
historyItem = it
336-
setShowDeleteDialog(true)
337-
},
338-
onMenuIconClicked = {
339-
scope.launch {
340-
railState.expand()
341-
}
342-
}
343-
)
351+
)
352+
}
344353
},
345354
snackbarHost = { SnackbarHost(snackBarHostState) },
346355
contentWindowInsets =
@@ -369,10 +378,6 @@ fun AppScreen(
369378
languageSearchQuery = languageSearchQuery,
370379
showLanguageSheet = showArticleLanguageSheet,
371380
deepLinkHandled = deepLinkHandled,
372-
onImageClick = { navController.navigate(FullScreenImage()) },
373-
onGalleryImageClick = { uri, desc ->
374-
navController.navigate(FullScreenImage(uri, desc))
375-
},
376381
onAction = viewModel::onAction,
377382
onSettingsAction = settingsViewModel::onAction,
378383
setShowArticleLanguageSheet = { showArticleLanguageSheet = it },
@@ -381,53 +386,13 @@ fun AppScreen(
381386
modifier = Modifier.fillMaxSize()
382387
)
383388

384-
StatusBarProtection()
385-
}
386-
}
387-
388-
composable<FullScreenImage> {
389-
val uri = it.toRoute<FullScreenImage>().uri
390-
val description = it.toRoute<FullScreenImage>().description
391-
392-
if (uri == null) {
393-
if (backStack.last() is HomeSubscreen.Article) {
394-
val content = backStack.last() as HomeSubscreen.Article
395-
if (content.photo == null) navController.navigateUp()
396-
FullScreenImage(
397-
photo = content.photo,
398-
photoDesc = content.photoDesc,
399-
title = content.title,
400-
imageLoader = imageLoader,
401-
background = preferencesState.imageBackground,
402-
link = content.photo?.source,
403-
onBack = navController::navigateUp
404-
)
405-
} else if (backStack.last() is HomeSubscreen.Feed) {
406-
val content = backStack.last() as HomeSubscreen.Feed
407-
FullScreenImage(
408-
photo = WikiPhoto(
409-
source = content.image?.thumbnail?.source ?: "",
410-
width = content.image?.thumbnail?.width ?: 1,
411-
height = content.image?.thumbnail?.height ?: 1
412-
),
413-
photoDesc = content.image?.description?.text?.parseAsHtml()
414-
.toString(),
415-
title = content.image?.title ?: "",
416-
imageLoader = imageLoader,
417-
link = content.image?.filePage,
418-
background = preferencesState.imageBackground,
419-
onBack = navController::navigateUp
420-
)
389+
AnimatedVisibility(
390+
backStack.last() !is HomeSubscreen.Image,
391+
enter = fadeIn(motionScheme.slowEffectsSpec()),
392+
exit = fadeOut(motionScheme.fastEffectsSpec())
393+
) {
394+
StatusBarProtection()
421395
}
422-
} else {
423-
FullScreenImage(
424-
uri = uri,
425-
description = description ?: "",
426-
imageLoader = imageLoader,
427-
link = uri,
428-
background = preferencesState.imageBackground,
429-
onBack = navController::navigateUp
430-
)
431396
}
432397
}
433398

@@ -436,7 +401,7 @@ fun AppScreen(
436401
imageLoader = imageLoader,
437402
imageBackground = preferencesState.imageBackground,
438403
openSavedArticle = { pageId: Int, lang: String ->
439-
navController.navigateUp()
404+
navController.navigateUp()
440405
viewModel.onAction(HomeAction.LoadSavedArticle(pageId, lang))
441406
},
442407
onBack = navController::navigateUp
@@ -564,12 +529,6 @@ data class HomeScreen(
564529
val query: String? = null
565530
)
566531

567-
@Serializable
568-
data class FullScreenImage(
569-
val uri: String? = null,
570-
val description: String? = null
571-
)
572-
573532
@Serializable
574533
object SavedArticlesScreen
575534

0 commit comments

Comments
 (0)