From 4d9d587366018e6e794322e2a644712f241cda08 Mon Sep 17 00:00:00 2001 From: arkon Date: Mon, 18 Jul 2022 18:51:36 -0400 Subject: [PATCH] Migrate More screen to full Compose --- .../eu/kanade/presentation/more/MoreScreen.kt | 183 ++++++++++-------- .../ui/base/controller/ConductorExtensions.kt | 8 - .../controller/NoAppBarElevationController.kt | 3 - .../kanade/tachiyomi/ui/main/MainActivity.kt | 3 - .../tachiyomi/ui/more/MoreController.kt | 12 +- .../widget/TachiyomiCoordinatorLayout.kt | 18 +- 6 files changed, 105 insertions(+), 122 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NoAppBarElevationController.kt diff --git a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt index ef28b725f5..3050d90714 100644 --- a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt @@ -3,6 +3,7 @@ package eu.kanade.presentation.more import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.CloudOff import androidx.compose.material.icons.outlined.GetApp @@ -16,15 +17,16 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.Divider import eu.kanade.presentation.components.PreferenceRow +import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.ScrollbarLazyColumn import eu.kanade.presentation.components.SwitchPreference +import eu.kanade.presentation.util.plus import eu.kanade.presentation.util.quantityStringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.more.DownloadQueueState @@ -33,7 +35,6 @@ import eu.kanade.tachiyomi.ui.more.MorePresenter @Composable fun MoreScreen( - nestedScrollInterop: NestedScrollConnection, presenter: MorePresenter, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, @@ -44,92 +45,108 @@ fun MoreScreen( val uriHandler = LocalUriHandler.current val downloadQueueState by presenter.downloadQueueState.collectAsState() - ScrollbarLazyColumn( - modifier = Modifier.nestedScroll(nestedScrollInterop), - contentPadding = WindowInsets.navigationBars.asPaddingValues(), - ) { - item { - LogoHeader() - } - - item { - SwitchPreference( - preference = presenter.downloadedOnly, - title = stringResource(R.string.label_downloaded_only), - subtitle = stringResource(R.string.downloaded_only_summary), - painter = rememberVectorPainter(Icons.Outlined.CloudOff), + Scaffold( + modifier = Modifier.statusBarsPadding(), + topBar = { + AppBar( + title = stringResource(R.string.label_more), + downloadedOnlyMode = presenter.downloadedOnly.value, + incognitoMode = presenter.incognitoMode.value, ) - } - item { - SwitchPreference( - preference = presenter.incognitoMode, - title = stringResource(R.string.pref_incognito_mode), - subtitle = stringResource(R.string.pref_incognito_mode_summary), - painter = painterResource(R.drawable.ic_glasses_24dp), - ) - } + }, + ) { paddingValues -> + ScrollbarLazyColumn( + contentPadding = paddingValues + WindowInsets.navigationBars.asPaddingValues(), + ) { + item { + LogoHeader() + } - item { Divider() } + item { + SwitchPreference( + preference = presenter.downloadedOnly, + title = stringResource(R.string.label_downloaded_only), + subtitle = stringResource(R.string.downloaded_only_summary), + painter = rememberVectorPainter(Icons.Outlined.CloudOff), + ) + } + item { + SwitchPreference( + preference = presenter.incognitoMode, + title = stringResource(R.string.pref_incognito_mode), + subtitle = stringResource(R.string.pref_incognito_mode_summary), + painter = painterResource(R.drawable.ic_glasses_24dp), + ) + } - item { - PreferenceRow( - title = stringResource(R.string.label_download_queue), - subtitle = when (downloadQueueState) { - DownloadQueueState.Stopped -> null - is DownloadQueueState.Paused -> { - val pending = (downloadQueueState as DownloadQueueState.Paused).pending - if (pending == 0) { - stringResource(R.string.paused) - } else { - "${stringResource(R.string.paused)} • ${quantityStringResource(R.plurals.download_queue_summary, pending, pending)}" + item { Divider() } + + item { + PreferenceRow( + title = stringResource(R.string.label_download_queue), + subtitle = when (downloadQueueState) { + DownloadQueueState.Stopped -> null + is DownloadQueueState.Paused -> { + val pending = (downloadQueueState as DownloadQueueState.Paused).pending + if (pending == 0) { + stringResource(R.string.paused) + } else { + "${stringResource(R.string.paused)} • ${ + quantityStringResource( + R.plurals.download_queue_summary, + pending, + pending, + ) + }" + } } - } - is DownloadQueueState.Downloading -> { - val pending = (downloadQueueState as DownloadQueueState.Downloading).pending - quantityStringResource(R.plurals.download_queue_summary, pending, pending) - } - }, - painter = rememberVectorPainter(Icons.Outlined.GetApp), - onClick = onClickDownloadQueue, - ) - } - item { - PreferenceRow( - title = stringResource(R.string.categories), - painter = rememberVectorPainter(Icons.Outlined.Label), - onClick = onClickCategories, - ) - } - item { - PreferenceRow( - title = stringResource(R.string.label_backup), - painter = rememberVectorPainter(Icons.Outlined.SettingsBackupRestore), - onClick = onClickBackupAndRestore, - ) - } + is DownloadQueueState.Downloading -> { + val pending = (downloadQueueState as DownloadQueueState.Downloading).pending + quantityStringResource(R.plurals.download_queue_summary, pending, pending) + } + }, + painter = rememberVectorPainter(Icons.Outlined.GetApp), + onClick = onClickDownloadQueue, + ) + } + item { + PreferenceRow( + title = stringResource(R.string.categories), + painter = rememberVectorPainter(Icons.Outlined.Label), + onClick = onClickCategories, + ) + } + item { + PreferenceRow( + title = stringResource(R.string.label_backup), + painter = rememberVectorPainter(Icons.Outlined.SettingsBackupRestore), + onClick = onClickBackupAndRestore, + ) + } - item { Divider() } + item { Divider() } - item { - PreferenceRow( - title = stringResource(R.string.label_settings), - painter = rememberVectorPainter(Icons.Outlined.Settings), - onClick = onClickSettings, - ) - } - item { - PreferenceRow( - title = stringResource(R.string.pref_category_about), - painter = rememberVectorPainter(Icons.Outlined.Info), - onClick = onClickAbout, - ) - } - item { - PreferenceRow( - title = stringResource(R.string.label_help), - painter = rememberVectorPainter(Icons.Outlined.HelpOutline), - onClick = { uriHandler.openUri(MoreController.URL_HELP) }, - ) + item { + PreferenceRow( + title = stringResource(R.string.label_settings), + painter = rememberVectorPainter(Icons.Outlined.Settings), + onClick = onClickSettings, + ) + } + item { + PreferenceRow( + title = stringResource(R.string.pref_category_about), + painter = rememberVectorPainter(Icons.Outlined.Info), + onClick = onClickAbout, + ) + } + item { + PreferenceRow( + title = stringResource(R.string.label_help), + painter = rememberVectorPainter(Icons.Outlined.HelpOutline), + onClick = { uriHandler.openUri(MoreController.URL_HELP) }, + ) + } } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt index b2afdb5d3e..4f72df8f55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt @@ -6,7 +6,6 @@ import androidx.core.net.toUri import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Router import com.bluelinelabs.conductor.RouterTransaction -import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.openInBrowser fun Router.setRoot(controller: Controller, id: Int) { @@ -44,10 +43,3 @@ fun Controller.withFadeTransaction(): RouterTransaction { fun Controller.openInBrowser(url: String) { activity?.openInBrowser(url.toUri()) } - -/** - * Returns [MainActivity]'s app bar height - */ -fun Controller.getMainAppBarHeight(): Int { - return (activity as? MainActivity)?.binding?.appbar?.measuredHeight ?: 0 -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NoAppBarElevationController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NoAppBarElevationController.kt deleted file mode 100644 index c3fa65aa3a..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NoAppBarElevationController.kt +++ /dev/null @@ -1,3 +0,0 @@ -package eu.kanade.tachiyomi.ui.base.controller - -interface NoAppBarElevationController diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 442b7c2708..a25adc8455 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -44,7 +44,6 @@ import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.FabController import eu.kanade.tachiyomi.ui.base.controller.FullComposeContentController -import eu.kanade.tachiyomi.ui.base.controller.NoAppBarElevationController import eu.kanade.tachiyomi.ui.base.controller.RootController import eu.kanade.tachiyomi.ui.base.controller.TabbedController import eu.kanade.tachiyomi.ui.base.controller.pushController @@ -639,8 +638,6 @@ class MainActivity : BaseActivity() { backstackLiftState.remove(it.instanceId) } } - - binding.root.isLiftAppBarOnScroll = internalTo !is NoAppBarElevationController } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt index 1b09c6be22..80c0052d3c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreController.kt @@ -1,11 +1,9 @@ package eu.kanade.tachiyomi.ui.more import androidx.compose.runtime.Composable -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import eu.kanade.presentation.more.MoreScreen import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.ui.base.controller.ComposeController -import eu.kanade.tachiyomi.ui.base.controller.NoAppBarElevationController +import eu.kanade.tachiyomi.ui.base.controller.FullComposeController import eu.kanade.tachiyomi.ui.base.controller.RootController import eu.kanade.tachiyomi.ui.base.controller.pushController import eu.kanade.tachiyomi.ui.category.CategoryController @@ -14,18 +12,16 @@ import eu.kanade.tachiyomi.ui.setting.SettingsBackupController import eu.kanade.tachiyomi.ui.setting.SettingsMainController class MoreController : - ComposeController(), - RootController, - NoAppBarElevationController { + FullComposeController(), + RootController { override fun getTitle() = resources?.getString(R.string.label_more) override fun createPresenter() = MorePresenter() @Composable - override fun ComposeContent(nestedScrollInterop: NestedScrollConnection) { + override fun ComposeContent() { MoreScreen( - nestedScrollInterop = nestedScrollInterop, presenter = presenter, onClickDownloadQueue = { router.pushController(DownloadController()) }, onClickCategories = { router.pushController(CategoryController()) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiCoordinatorLayout.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiCoordinatorLayout.kt index 16b1c96a00..b7e6a41df6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiCoordinatorLayout.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiCoordinatorLayout.kt @@ -34,25 +34,9 @@ class TachiyomiCoordinatorLayout @JvmOverloads constructor( defStyleAttr: Int = R.attr.coordinatorLayoutStyle, ) : CoordinatorLayout(context, attrs, defStyleAttr) { - /** - * Keep lifted state and do nothing on tablet UI - */ - private val isTablet = context.isTablet() - private var appBarLayout: AppBarLayout? = null private var tabLayout: TabLayout? = null - /** - * If true, [AppBarLayout] child will be lifted on nested scroll. - */ - var isLiftAppBarOnScroll = true - - /** - * Internal check - */ - private val canLiftAppBarOnScroll - get() = !isTablet && isLiftAppBarOnScroll - override fun onNestedScroll( target: View, dxConsumed: Int, @@ -64,7 +48,7 @@ class TachiyomiCoordinatorLayout @JvmOverloads constructor( ) { super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type, consumed) // Disable elevation overlay when tabs are visible - if (canLiftAppBarOnScroll) { + if (context.isTablet().not()) { if (target is ComposeView) { val scrollCondition = if (type == ViewCompat.TYPE_NON_TOUCH) { dyUnconsumed >= 0