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 9462e7ca2..579ce7a97 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 adbd251c6..000000000 --- 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 418a8856c..cf849609e 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 d5dd0642e..7bd5a815a 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 94b0ed0f3..b49c9372b 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 f767020f6..11d1439c3 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 39beffe0d..06bc2f145 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 635ce0997..4bdc53564 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 98e63ad49..9a2a6ed03 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" />