From 4d9d587366018e6e794322e2a644712f241cda08 Mon Sep 17 00:00:00 2001
From: arkon <eugcheung94@gmail.com>
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<MorePresenter>(),
-    RootController,
-    NoAppBarElevationController {
+    FullComposeController<MorePresenter>(),
+    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