fix(ui): migrate to androidx-navigation-animation & ui bug fix (#717)
This commit is contained in:
parent
44ad6f3e2c
commit
0d0477e4ff
@ -181,7 +181,6 @@ dependencies {
|
|||||||
// https://github.com/google/accompanist/releases
|
// https://github.com/google/accompanist/releases
|
||||||
implementation "com.google.accompanist:accompanist-pager:$accompanist"
|
implementation "com.google.accompanist:accompanist-pager:$accompanist"
|
||||||
implementation "com.google.accompanist:accompanist-flowlayout:$accompanist"
|
implementation "com.google.accompanist:accompanist-flowlayout:$accompanist"
|
||||||
implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist"
|
|
||||||
implementation "com.google.accompanist:accompanist-swiperefresh:$accompanist"
|
implementation "com.google.accompanist:accompanist-swiperefresh:$accompanist"
|
||||||
|
|
||||||
implementation platform("androidx.compose:compose-bom:$composeBom")
|
implementation platform("androidx.compose:compose-bom:$composeBom")
|
||||||
|
@ -9,55 +9,18 @@
|
|||||||
package me.ash.reader.ui.ext
|
package me.ash.reader.ui.ext
|
||||||
|
|
||||||
import androidx.compose.animation.*
|
import androidx.compose.animation.*
|
||||||
import androidx.compose.animation.core.tween
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.navigation.NamedNavArgument
|
import androidx.navigation.NamedNavArgument
|
||||||
import androidx.navigation.NavBackStackEntry
|
import androidx.navigation.NavBackStackEntry
|
||||||
import androidx.navigation.NavDeepLink
|
import androidx.navigation.NavDeepLink
|
||||||
import androidx.navigation.NavGraphBuilder
|
import androidx.navigation.NavGraphBuilder
|
||||||
import com.google.accompanist.navigation.animation.composable
|
import androidx.navigation.compose.composable
|
||||||
import me.ash.reader.ui.motion.materialSharedAxisXIn
|
import me.ash.reader.ui.motion.materialSharedAxisXIn
|
||||||
import me.ash.reader.ui.motion.materialSharedAxisXOut
|
import me.ash.reader.ui.motion.materialSharedAxisXOut
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
|
||||||
@Deprecated(message = "Migrate to Forward and backward transition", replaceWith = ReplaceWith("forwardAndBackwardComposable(route = route, arguments = arguments, deepLinks = deepLinks) { content() }")
|
|
||||||
)
|
|
||||||
fun NavGraphBuilder.animatedComposable(
|
|
||||||
route: String,
|
|
||||||
arguments: List<NamedNavArgument> = emptyList(),
|
|
||||||
deepLinks: List<NavDeepLink> = emptyList(),
|
|
||||||
content: @Composable AnimatedVisibilityScope.(NavBackStackEntry) -> Unit,
|
|
||||||
) = composable(
|
|
||||||
route = route,
|
|
||||||
arguments = arguments,
|
|
||||||
deepLinks = deepLinks,
|
|
||||||
enterTransition = {
|
|
||||||
fadeIn(animationSpec = tween(220, delayMillis = 90)) +
|
|
||||||
scaleIn(
|
|
||||||
initialScale = 0.92f,
|
|
||||||
animationSpec = tween(220, delayMillis = 90)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
exitTransition = {
|
|
||||||
fadeOut(animationSpec = tween(90))
|
|
||||||
},
|
|
||||||
popEnterTransition = {
|
|
||||||
fadeIn(animationSpec = tween(220, delayMillis = 90)) +
|
|
||||||
scaleIn(
|
|
||||||
initialScale = 0.92f,
|
|
||||||
animationSpec = tween(220, delayMillis = 90)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
popExitTransition = {
|
|
||||||
fadeOut(animationSpec = tween(90))
|
|
||||||
},
|
|
||||||
content = content
|
|
||||||
)
|
|
||||||
|
|
||||||
private const val INITIAL_OFFSET_FACTOR = 0.10f
|
private const val INITIAL_OFFSET_FACTOR = 0.10f
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
fun NavGraphBuilder.animatedComposable(
|
||||||
fun NavGraphBuilder.forwardAndBackwardComposable(
|
|
||||||
route: String,
|
route: String,
|
||||||
arguments: List<NamedNavArgument> = emptyList(),
|
arguments: List<NamedNavArgument> = emptyList(),
|
||||||
deepLinks: List<NavDeepLink> = emptyList(),
|
deepLinks: List<NavDeepLink> = emptyList(),
|
||||||
|
@ -3,6 +3,7 @@ package me.ash.reader.ui.page.common
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.animation.ExperimentalAnimationApi
|
import androidx.compose.animation.ExperimentalAnimationApi
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
@ -14,8 +15,8 @@ import androidx.compose.runtime.setValue
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import com.google.accompanist.navigation.animation.AnimatedNavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import me.ash.reader.domain.model.general.Filter
|
import me.ash.reader.domain.model.general.Filter
|
||||||
@ -23,7 +24,7 @@ import me.ash.reader.infrastructure.preference.LocalDarkTheme
|
|||||||
import me.ash.reader.infrastructure.preference.LocalReadingDarkTheme
|
import me.ash.reader.infrastructure.preference.LocalReadingDarkTheme
|
||||||
import me.ash.reader.ui.ext.collectAsStateValue
|
import me.ash.reader.ui.ext.collectAsStateValue
|
||||||
import me.ash.reader.ui.ext.findActivity
|
import me.ash.reader.ui.ext.findActivity
|
||||||
import me.ash.reader.ui.ext.forwardAndBackwardComposable
|
import me.ash.reader.ui.ext.animatedComposable
|
||||||
import me.ash.reader.ui.ext.initialFilter
|
import me.ash.reader.ui.ext.initialFilter
|
||||||
import me.ash.reader.ui.ext.initialPage
|
import me.ash.reader.ui.ext.initialPage
|
||||||
import me.ash.reader.ui.ext.isFirstLaunch
|
import me.ash.reader.ui.ext.isFirstLaunch
|
||||||
@ -54,7 +55,7 @@ import me.ash.reader.ui.page.settings.troubleshooting.TroubleshootingPage
|
|||||||
import me.ash.reader.ui.page.startup.StartupPage
|
import me.ash.reader.ui.page.startup.StartupPage
|
||||||
import me.ash.reader.ui.theme.AppTheme
|
import me.ash.reader.ui.theme.AppTheme
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class, androidx.compose.material.ExperimentalMaterialApi::class)
|
@OptIn(androidx.compose.material.ExperimentalMaterialApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun HomeEntry(
|
fun HomeEntry(
|
||||||
homeViewModel: HomeViewModel = hiltViewModel(),
|
homeViewModel: HomeViewModel = hiltViewModel(),
|
||||||
@ -64,7 +65,7 @@ fun HomeEntry(
|
|||||||
var isReadingPage by rememberSaveable { mutableStateOf(false) }
|
var isReadingPage by rememberSaveable { mutableStateOf(false) }
|
||||||
val filterUiState = homeViewModel.filterUiState.collectAsStateValue()
|
val filterUiState = homeViewModel.filterUiState.collectAsStateValue()
|
||||||
val subscribeUiState = subscribeViewModel.subscribeUiState.collectAsStateValue()
|
val subscribeUiState = subscribeViewModel.subscribeUiState.collectAsStateValue()
|
||||||
val navController = rememberAnimatedNavController()
|
val navController = rememberNavController()
|
||||||
|
|
||||||
val intent by rememberSaveable { mutableStateOf(context.findActivity()?.intent) }
|
val intent by rememberSaveable { mutableStateOf(context.findActivity()?.intent) }
|
||||||
var openArticleId by rememberSaveable {
|
var openArticleId by rememberSaveable {
|
||||||
@ -142,104 +143,106 @@ fun HomeEntry(
|
|||||||
else LocalDarkTheme.current.isDarkTheme()
|
else LocalDarkTheme.current.isDarkTheme()
|
||||||
) {
|
) {
|
||||||
|
|
||||||
AnimatedNavHost(
|
NavHost(
|
||||||
modifier = Modifier.background(MaterialTheme.colorScheme.surface),
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(MaterialTheme.colorScheme.surface),
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = if (context.isFirstLaunch) RouteName.STARTUP else RouteName.FEEDS,
|
startDestination = if (context.isFirstLaunch) RouteName.STARTUP else RouteName.FEEDS,
|
||||||
) {
|
) {
|
||||||
// Startup
|
// Startup
|
||||||
forwardAndBackwardComposable(route = RouteName.STARTUP) {
|
animatedComposable(route = RouteName.STARTUP) {
|
||||||
StartupPage(navController)
|
StartupPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Home
|
// Home
|
||||||
forwardAndBackwardComposable(route = RouteName.FEEDS) {
|
animatedComposable(route = RouteName.FEEDS) {
|
||||||
FeedsPage(
|
FeedsPage(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
homeViewModel = homeViewModel,
|
homeViewModel = homeViewModel,
|
||||||
subscribeViewModel = subscribeViewModel
|
subscribeViewModel = subscribeViewModel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.FLOW) {
|
animatedComposable(route = RouteName.FLOW) {
|
||||||
FlowPage(
|
FlowPage(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
homeViewModel = homeViewModel,
|
homeViewModel = homeViewModel,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = "${RouteName.READING}/{articleId}") {
|
animatedComposable(route = "${RouteName.READING}/{articleId}") {
|
||||||
ReadingPage(navController = navController, homeViewModel = homeViewModel)
|
ReadingPage(navController = navController, homeViewModel = homeViewModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
forwardAndBackwardComposable(route = RouteName.SETTINGS) {
|
animatedComposable(route = RouteName.SETTINGS) {
|
||||||
SettingsPage(navController)
|
SettingsPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accounts
|
// Accounts
|
||||||
forwardAndBackwardComposable(route = RouteName.ACCOUNTS) {
|
animatedComposable(route = RouteName.ACCOUNTS) {
|
||||||
AccountsPage(navController)
|
AccountsPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
forwardAndBackwardComposable(route = "${RouteName.ACCOUNT_DETAILS}/{accountId}") {
|
animatedComposable(route = "${RouteName.ACCOUNT_DETAILS}/{accountId}") {
|
||||||
AccountDetailsPage(navController)
|
AccountDetailsPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
forwardAndBackwardComposable(route = RouteName.ADD_ACCOUNTS) {
|
animatedComposable(route = RouteName.ADD_ACCOUNTS) {
|
||||||
AddAccountsPage(navController)
|
AddAccountsPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Color & Style
|
// Color & Style
|
||||||
forwardAndBackwardComposable(route = RouteName.COLOR_AND_STYLE) {
|
animatedComposable(route = RouteName.COLOR_AND_STYLE) {
|
||||||
ColorAndStylePage(navController)
|
ColorAndStylePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.DARK_THEME) {
|
animatedComposable(route = RouteName.DARK_THEME) {
|
||||||
DarkThemePage(navController)
|
DarkThemePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.FEEDS_PAGE_STYLE) {
|
animatedComposable(route = RouteName.FEEDS_PAGE_STYLE) {
|
||||||
FeedsPageStylePage(navController)
|
FeedsPageStylePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.FLOW_PAGE_STYLE) {
|
animatedComposable(route = RouteName.FLOW_PAGE_STYLE) {
|
||||||
FlowPageStylePage(navController)
|
FlowPageStylePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_PAGE_STYLE) {
|
animatedComposable(route = RouteName.READING_PAGE_STYLE) {
|
||||||
ReadingStylePage(navController)
|
ReadingStylePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_DARK_THEME) {
|
animatedComposable(route = RouteName.READING_DARK_THEME) {
|
||||||
ReadingDarkThemePage(navController)
|
ReadingDarkThemePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_PAGE_TITLE) {
|
animatedComposable(route = RouteName.READING_PAGE_TITLE) {
|
||||||
ReadingTitlePage(navController)
|
ReadingTitlePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_PAGE_TEXT) {
|
animatedComposable(route = RouteName.READING_PAGE_TEXT) {
|
||||||
ReadingTextPage(navController)
|
ReadingTextPage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_PAGE_IMAGE) {
|
animatedComposable(route = RouteName.READING_PAGE_IMAGE) {
|
||||||
ReadingImagePage(navController)
|
ReadingImagePage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.READING_PAGE_VIDEO) {
|
animatedComposable(route = RouteName.READING_PAGE_VIDEO) {
|
||||||
ReadingVideoPage(navController)
|
ReadingVideoPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interaction
|
// Interaction
|
||||||
forwardAndBackwardComposable(route = RouteName.INTERACTION) {
|
animatedComposable(route = RouteName.INTERACTION) {
|
||||||
InteractionPage(navController)
|
InteractionPage(navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Languages
|
// Languages
|
||||||
forwardAndBackwardComposable(route = RouteName.LANGUAGES) {
|
animatedComposable(route = RouteName.LANGUAGES) {
|
||||||
LanguagesPage(navController = navController)
|
LanguagesPage(navController = navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Troubleshooting
|
// Troubleshooting
|
||||||
forwardAndBackwardComposable(route = RouteName.TROUBLESHOOTING) {
|
animatedComposable(route = RouteName.TROUBLESHOOTING) {
|
||||||
TroubleshootingPage(navController = navController)
|
TroubleshootingPage(navController = navController)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tips & Support
|
// Tips & Support
|
||||||
forwardAndBackwardComposable(route = RouteName.TIPS_AND_SUPPORT) {
|
animatedComposable(route = RouteName.TIPS_AND_SUPPORT) {
|
||||||
TipsAndSupportPage(navController)
|
TipsAndSupportPage(navController)
|
||||||
}
|
}
|
||||||
forwardAndBackwardComposable(route = RouteName.LICENSE_LIST) {
|
animatedComposable(route = RouteName.LICENSE_LIST) {
|
||||||
LicenseListPage(navController)
|
LicenseListPage(navController)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import me.ash.reader.R
|
import me.ash.reader.R
|
||||||
import me.ash.reader.infrastructure.preference.KeepArchivedPreference
|
import me.ash.reader.infrastructure.preference.KeepArchivedPreference
|
||||||
import me.ash.reader.infrastructure.preference.SyncBlockListPreference
|
import me.ash.reader.infrastructure.preference.SyncBlockListPreference
|
||||||
@ -76,7 +76,7 @@ import java.util.Date
|
|||||||
@OptIn(ExperimentalAnimationApi::class)
|
@OptIn(ExperimentalAnimationApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun AccountDetailsPage(
|
fun AccountDetailsPage(
|
||||||
navController: NavHostController = rememberAnimatedNavController(),
|
navController: NavHostController = rememberNavController(),
|
||||||
viewModel: AccountViewModel = hiltViewModel(),
|
viewModel: AccountViewModel = hiltViewModel(),
|
||||||
) {
|
) {
|
||||||
val uiState = viewModel.accountUiState.collectAsStateValue()
|
val uiState = viewModel.accountUiState.collectAsStateValue()
|
||||||
|
@ -17,7 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import me.ash.reader.R
|
import me.ash.reader.R
|
||||||
import me.ash.reader.ui.component.base.*
|
import me.ash.reader.ui.component.base.*
|
||||||
import me.ash.reader.ui.ext.collectAsStateValue
|
import me.ash.reader.ui.ext.collectAsStateValue
|
||||||
@ -25,10 +25,9 @@ import me.ash.reader.ui.page.common.RouteName
|
|||||||
import me.ash.reader.ui.page.settings.SettingItem
|
import me.ash.reader.ui.page.settings.SettingItem
|
||||||
import me.ash.reader.ui.theme.palette.onLight
|
import me.ash.reader.ui.theme.palette.onLight
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AccountsPage(
|
fun AccountsPage(
|
||||||
navController: NavHostController = rememberAnimatedNavController(),
|
navController: NavHostController = rememberNavController(),
|
||||||
viewModel: AccountViewModel = hiltViewModel(),
|
viewModel: AccountViewModel = hiltViewModel(),
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
@ -16,7 +16,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import me.ash.reader.R
|
import me.ash.reader.R
|
||||||
import me.ash.reader.ui.component.base.DisplayText
|
import me.ash.reader.ui.component.base.DisplayText
|
||||||
import me.ash.reader.ui.component.base.FeedbackIconButton
|
import me.ash.reader.ui.component.base.FeedbackIconButton
|
||||||
@ -26,10 +26,9 @@ import me.ash.reader.ui.page.settings.SettingItem
|
|||||||
import me.ash.reader.ui.page.settings.accounts.addition.*
|
import me.ash.reader.ui.page.settings.accounts.addition.*
|
||||||
import me.ash.reader.ui.theme.palette.onLight
|
import me.ash.reader.ui.theme.palette.onLight
|
||||||
|
|
||||||
@OptIn(ExperimentalAnimationApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AddAccountsPage(
|
fun AddAccountsPage(
|
||||||
navController: NavHostController = rememberAnimatedNavController(),
|
navController: NavHostController = rememberNavController(),
|
||||||
viewModel: AccountViewModel = hiltViewModel(),
|
viewModel: AccountViewModel = hiltViewModel(),
|
||||||
additionViewModel: AdditionViewModel = hiltViewModel(),
|
additionViewModel: AdditionViewModel = hiltViewModel(),
|
||||||
) {
|
) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user