From 80c7a453286f296ae4d5d3531c805e63db9ca424 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 16 Jul 2022 17:58:43 -0400 Subject: [PATCH] Remove top app bar scroll behavior This lets us make it more consistent with the Compose screens for now. Maybe it'll return in the future. This also includes making the AboutController a full Compose controller with a new abstracted TopAppBar composable. --- .../presentation/category/CategoryScreen.kt | 6 +- .../category/components/CategoryTopAppBar.kt | 30 --- .../kanade/presentation/components/AppBar.kt | 27 +++ .../presentation/more/about/AboutScreen.kt | 195 +++++++++--------- .../presentation/webview/WebViewScreen.kt | 25 +-- .../ui/base/controller/ComposeController.kt | 21 ++ .../kanade/tachiyomi/ui/main/MainActivity.kt | 4 +- .../tachiyomi/ui/more/AboutController.kt | 12 +- app/src/main/res/layout/main_activity.xml | 3 +- 9 files changed, 168 insertions(+), 155 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/presentation/category/components/CategoryTopAppBar.kt diff --git a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt index 9462e7ca25..579ce7a971 100644 --- a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt @@ -7,15 +7,16 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import eu.kanade.presentation.category.components.CategoryContent import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.CategoryRenameDialog -import eu.kanade.presentation.category.components.CategoryTopAppBar import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.LoadingScreen import eu.kanade.presentation.components.Scaffold +import eu.kanade.presentation.components.TopAppBar import eu.kanade.presentation.util.horizontalPadding import eu.kanade.presentation.util.plus import eu.kanade.presentation.util.topPaddingValues @@ -34,7 +35,8 @@ fun CategoryScreen( Scaffold( modifier = Modifier.statusBarsPadding(), topBar = { - CategoryTopAppBar( + TopAppBar( + title = stringResource(R.string.action_edit_categories), navigateUp = navigateUp, ) }, diff --git a/app/src/main/java/eu/kanade/presentation/category/components/CategoryTopAppBar.kt b/app/src/main/java/eu/kanade/presentation/category/components/CategoryTopAppBar.kt deleted file mode 100644 index adbd251c6a..0000000000 --- a/app/src/main/java/eu/kanade/presentation/category/components/CategoryTopAppBar.kt +++ /dev/null @@ -1,30 +0,0 @@ -package eu.kanade.presentation.category.components - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.SmallTopAppBar -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R - -@Composable -fun CategoryTopAppBar( - navigateUp: () -> Unit, -) { - SmallTopAppBar( - navigationIcon = { - IconButton(onClick = navigateUp) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = stringResource(R.string.abc_action_bar_up_description), - ) - } - }, - title = { - Text(text = stringResource(R.string.action_edit_categories)) - }, - ) -} diff --git a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt index 418a8856c1..cf849609eb 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt @@ -1,12 +1,15 @@ package eu.kanade.presentation.components import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.RowScope import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SmallTopAppBar import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -19,6 +22,30 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import eu.kanade.tachiyomi.R +@Composable +fun TopAppBar( + title: String?, + subtitle: String? = null, + navigateUp: () -> Unit, + navigationIcon: ImageVector = Icons.Default.ArrowBack, + actions: @Composable RowScope.() -> Unit = {}, +) { + SmallTopAppBar( + navigationIcon = { + IconButton(onClick = navigateUp) { + Icon( + imageVector = navigationIcon, + contentDescription = stringResource(R.string.abc_action_bar_up_description), + ) + } + }, + title = { + AppBarTitle(title, subtitle) + }, + actions = actions, + ) +} + @Composable fun AppBarTitle( title: String?, diff --git a/app/src/main/java/eu/kanade/presentation/more/about/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/about/AboutScreen.kt index d5dd0642eb..7bd5a815a2 100644 --- a/app/src/main/java/eu/kanade/presentation/more/about/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/about/AboutScreen.kt @@ -6,21 +6,23 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Public import androidx.compose.runtime.Composable 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.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import eu.kanade.presentation.components.LinkIcon import eu.kanade.presentation.components.PreferenceRow +import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.ScrollbarLazyColumn +import eu.kanade.presentation.components.TopAppBar import eu.kanade.presentation.more.LogoHeader +import eu.kanade.presentation.util.plus import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.updater.RELEASE_URL @@ -29,7 +31,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard @Composable fun AboutScreen( - nestedScrollInterop: NestedScrollConnection, + navigateUp: () -> Unit, checkVersion: () -> Unit, getFormattedBuildTime: () -> String, onClickLicenses: () -> Unit, @@ -37,108 +39,117 @@ fun AboutScreen( val context = LocalContext.current val uriHandler = LocalUriHandler.current - ScrollbarLazyColumn( - modifier = Modifier.nestedScroll(nestedScrollInterop), - contentPadding = WindowInsets.navigationBars.asPaddingValues(), - ) { - item { - LogoHeader() - } - - item { - PreferenceRow( - title = stringResource(R.string.version), - subtitle = when { - BuildConfig.DEBUG -> { - "Debug ${BuildConfig.COMMIT_SHA} (${getFormattedBuildTime()})" - } - BuildConfig.PREVIEW -> { - "Preview r${BuildConfig.COMMIT_COUNT} (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" - } - else -> { - "Stable ${BuildConfig.VERSION_NAME} (${getFormattedBuildTime()})" - } - }, - onClick = { - val deviceInfo = CrashLogUtil(context).getDebugInfo() - context.copyToClipboard("Debug information", deviceInfo) - }, + Scaffold( + modifier = Modifier.statusBarsPadding(), + topBar = { + TopAppBar( + title = stringResource(R.string.pref_category_about), + navigateUp = navigateUp, ) - } + }, + ) { paddingValues -> + ScrollbarLazyColumn( + contentPadding = paddingValues + WindowInsets.navigationBars.asPaddingValues(), + ) { + item { + LogoHeader() + } - if (BuildConfig.INCLUDE_UPDATER) { item { PreferenceRow( - title = stringResource(R.string.check_for_updates), - onClick = checkVersion, + title = stringResource(R.string.version), + subtitle = when { + BuildConfig.DEBUG -> { + "Debug ${BuildConfig.COMMIT_SHA} (${getFormattedBuildTime()})" + } + BuildConfig.PREVIEW -> { + "Preview r${BuildConfig.COMMIT_COUNT} (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" + } + else -> { + "Stable ${BuildConfig.VERSION_NAME} (${getFormattedBuildTime()})" + } + }, + onClick = { + val deviceInfo = CrashLogUtil(context).getDebugInfo() + context.copyToClipboard("Debug information", deviceInfo) + }, ) } - } - if (!BuildConfig.DEBUG) { + + if (BuildConfig.INCLUDE_UPDATER) { + item { + PreferenceRow( + title = stringResource(R.string.check_for_updates), + onClick = checkVersion, + ) + } + } + if (!BuildConfig.DEBUG) { + item { + PreferenceRow( + title = stringResource(R.string.whats_new), + onClick = { uriHandler.openUri(RELEASE_URL) }, + ) + } + } + item { PreferenceRow( - title = stringResource(R.string.whats_new), - onClick = { uriHandler.openUri(RELEASE_URL) }, + title = stringResource(R.string.help_translate), + onClick = { uriHandler.openUri("https://tachiyomi.org/help/contribution/#translation") }, ) } - } - item { - PreferenceRow( - title = stringResource(R.string.help_translate), - onClick = { uriHandler.openUri("https://tachiyomi.org/help/contribution/#translation") }, - ) - } + item { + PreferenceRow( + title = stringResource(R.string.licenses), + onClick = onClickLicenses, + ) + } - item { - PreferenceRow( - title = stringResource(R.string.licenses), - onClick = onClickLicenses, - ) - } + item { + PreferenceRow( + title = stringResource(R.string.privacy_policy), + onClick = { uriHandler.openUri("https://tachiyomi.org/privacy") }, + ) + } - item { - PreferenceRow( - title = stringResource(R.string.privacy_policy), - onClick = { uriHandler.openUri("https://tachiyomi.org/privacy") }, - ) - } - - item { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center, - ) { - LinkIcon( - label = stringResource(R.string.website), - painter = rememberVectorPainter(Icons.Outlined.Public), - url = "https://tachiyomi.org", - ) - LinkIcon( - label = "Discord", - painter = painterResource(R.drawable.ic_discord_24dp), - url = "https://discord.gg/tachiyomi", - ) - LinkIcon( - label = "Twitter", - painter = painterResource(R.drawable.ic_twitter_24dp), - url = "https://twitter.com/tachiyomiorg", - ) - LinkIcon( - label = "Facebook", - painter = painterResource(R.drawable.ic_facebook_24dp), - url = "https://facebook.com/tachiyomiorg", - ) - LinkIcon( - label = "Reddit", - painter = painterResource(R.drawable.ic_reddit_24dp), - url = "https://www.reddit.com/r/Tachiyomi", - ) - LinkIcon( - label = "GitHub", - painter = painterResource(R.drawable.ic_github_24dp), - url = "https://github.com/tachiyomiorg", - ) + item { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + ) { + LinkIcon( + label = stringResource(R.string.website), + painter = rememberVectorPainter(Icons.Outlined.Public), + url = "https://tachiyomi.org", + ) + LinkIcon( + label = "Discord", + painter = painterResource(R.drawable.ic_discord_24dp), + url = "https://discord.gg/tachiyomi", + ) + LinkIcon( + label = "Twitter", + painter = painterResource(R.drawable.ic_twitter_24dp), + url = "https://twitter.com/tachiyomiorg", + ) + LinkIcon( + label = "Facebook", + painter = painterResource(R.drawable.ic_facebook_24dp), + url = "https://facebook.com/tachiyomiorg", + ) + LinkIcon( + label = "Reddit", + painter = painterResource(R.drawable.ic_reddit_24dp), + url = "https://www.reddit.com/r/Tachiyomi", + ) + LinkIcon( + label = "GitHub", + painter = painterResource(R.drawable.ic_github_24dp), + url = "https://github.com/tachiyomiorg", + ) + } } } } diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreen.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreen.kt index 94b0ed0f36..b49c9372b0 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreen.kt @@ -11,10 +11,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowForward import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator -import androidx.compose.material3.SmallTopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -28,7 +25,7 @@ import com.google.accompanist.web.rememberWebViewNavigator import com.google.accompanist.web.rememberWebViewState import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions -import eu.kanade.presentation.components.AppBarTitle +import eu.kanade.presentation.components.TopAppBar import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.setDefaultSettings @@ -48,21 +45,11 @@ fun WebViewScreen( val navigator = rememberWebViewNavigator() Column { - SmallTopAppBar( - title = { - AppBarTitle( - title = state.pageTitle ?: initialTitle, - subtitle = state.content.getCurrentUrl(), - ) - }, - navigationIcon = { - IconButton(onClick = onUp) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.action_close), - ) - } - }, + TopAppBar( + title = state.pageTitle ?: initialTitle, + subtitle = state.content.getCurrentUrl(), + navigateUp = onUp, + navigationIcon = Icons.Default.Close, actions = { AppBarActions( listOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt index f767020f69..11d1439c33 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt @@ -73,6 +73,27 @@ abstract class BasicComposeController : } } +/** + * Basic Compose controller without a presenter. + */ +abstract class BasicFullComposeController : + BaseController(), + FullComposeContentController { + + override fun createBinding(inflater: LayoutInflater) = + ComposeControllerBinding.inflate(inflater) + + override fun onViewCreated(view: View) { + super.onViewCreated(view) + + binding.root.apply { + setComposeContent { + ComposeContent() + } + } + } +} + abstract class SearchableComposeController

>(bundle: Bundle? = null) : SearchableNucleusController(bundle), ComposeContentController { 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 39beffe0da..06bc2f1454 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 @@ -43,7 +43,7 @@ import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi 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.FullComposeController +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 @@ -606,7 +606,7 @@ class MainActivity : BaseActivity() { binding.fabLayout.rootFab.hide() } - val isFullComposeController = internalTo is FullComposeController<*> + val isFullComposeController = internalTo is FullComposeContentController binding.appbar.isVisible = !isFullComposeController binding.controllerContainer.enableScrollingBehavior(!isFullComposeController) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt index 635ce09971..4bdc53564f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt @@ -1,15 +1,13 @@ package eu.kanade.tachiyomi.ui.more import androidx.compose.runtime.Composable -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import eu.kanade.presentation.more.about.AboutScreen import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.updater.AppUpdateChecker import eu.kanade.tachiyomi.data.updater.AppUpdateResult -import eu.kanade.tachiyomi.ui.base.controller.BasicComposeController -import eu.kanade.tachiyomi.ui.base.controller.NoAppBarElevationController +import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController import eu.kanade.tachiyomi.ui.base.controller.pushController import eu.kanade.tachiyomi.util.lang.launchNow import eu.kanade.tachiyomi.util.lang.toDateTimestampString @@ -22,17 +20,15 @@ import java.text.SimpleDateFormat import java.util.Locale import java.util.TimeZone -class AboutController : BasicComposeController(), NoAppBarElevationController { +class AboutController : BasicFullComposeController() { private val preferences: PreferencesHelper by injectLazy() private val updateChecker by lazy { AppUpdateChecker() } - override fun getTitle() = resources?.getString(R.string.pref_category_about) - @Composable - override fun ComposeContent(nestedScrollInterop: NestedScrollConnection) { + override fun ComposeContent() { AboutScreen( - nestedScrollInterop = nestedScrollInterop, + navigateUp = router::popCurrentController, checkVersion = this::checkVersion, getFormattedBuildTime = this::getFormattedBuildTime, onClickLicenses = { router.pushController(LicensesController()) }, diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 98e63ad494..9a2a6ed03a 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -23,8 +23,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:theme="?attr/actionBarTheme" - app:layout_scrollFlags="scroll|enterAlways|snap" /> + android:theme="?attr/actionBarTheme" />