From 63048d2f0b57477aecb4fd91f1f8c20a66ec9e18 Mon Sep 17 00:00:00 2001
From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com>
Date: Sun, 26 Feb 2023 02:44:35 +0700
Subject: [PATCH] Fix banners-related issues (#9143)

This is most likely Compose issue so these changes will
be reevaluated when new Compose ver is out.
---
 .../kanade/presentation/components/Banners.kt | 13 +++++++--
 .../eu/kanade/presentation/util/Navigator.kt  |  4 ++-
 .../eu/kanade/tachiyomi/ui/home/HomeScreen.kt | 28 ++++++++-----------
 .../kanade/tachiyomi/ui/main/MainActivity.kt  | 10 +++----
 4 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/app/src/main/java/eu/kanade/presentation/components/Banners.kt b/app/src/main/java/eu/kanade/presentation/components/Banners.kt
index 14525e137..5f288d7e2 100644
--- a/app/src/main/java/eu/kanade/presentation/components/Banners.kt
+++ b/app/src/main/java/eu/kanade/presentation/components/Banners.kt
@@ -69,7 +69,8 @@ fun AppStateBanners(
     val mainInsets = WindowInsets.statusBars
     val mainInsetsTop = mainInsets.getTop(density)
     SubcomposeLayout(modifier = modifier) { constraints ->
-        val indexingPlaceable = subcompose(0) {
+        val indexingId = if (indexing) 0 else -1
+        val indexingPlaceable = subcompose(indexingId) {
             AnimatedVisibility(
                 visible = indexing,
                 enter = expandVertically(),
@@ -82,7 +83,8 @@ fun AppStateBanners(
         }.fastMap { it.measure(constraints) }
         val indexingHeight = indexingPlaceable.fastMaxBy { it.height }?.height ?: 0
 
-        val downloadedOnlyPlaceable = subcompose(1) {
+        val downloadedId = if (indexing) 1 else 0
+        val downloadedOnlyPlaceable = subcompose(downloadedId) {
             AnimatedVisibility(
                 visible = downloadedOnlyMode,
                 enter = expandVertically(),
@@ -96,7 +98,12 @@ fun AppStateBanners(
         }.fastMap { it.measure(constraints) }
         val downloadedOnlyHeight = downloadedOnlyPlaceable.fastMaxBy { it.height }?.height ?: 0
 
-        val incognitoPlaceable = subcompose(2) {
+        val incognitoId = when {
+            indexing && downloadedOnlyMode -> 3
+            indexing || downloadedOnlyMode -> 2
+            else -> 1
+        }
+        val incognitoPlaceable = subcompose(incognitoId) {
             AnimatedVisibility(
                 visible = incognitoMode,
                 enter = expandVertically(),
diff --git a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt
index fe89516d6..eab459b14 100644
--- a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt
+++ b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt
@@ -3,6 +3,7 @@ package eu.kanade.presentation.util
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.Modifier
 import cafe.adriel.voyager.core.screen.Screen
 import cafe.adriel.voyager.core.screen.ScreenKey
 import cafe.adriel.voyager.core.screen.uniqueScreenKey
@@ -33,7 +34,7 @@ interface AssistContentScreen {
 }
 
 @Composable
-fun DefaultNavigatorScreenTransition(navigator: Navigator) {
+fun DefaultNavigatorScreenTransition(navigator: Navigator, modifier: Modifier = Modifier) {
     val slideDistance = rememberSlideDistance()
     ScreenTransition(
         navigator = navigator,
@@ -43,5 +44,6 @@ fun DefaultNavigatorScreenTransition(navigator: Navigator) {
                 slideDistance = slideDistance,
             )
         },
+        modifier = modifier,
     )
 }
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt
index 60dd21e0f..30af8215a 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt
@@ -6,7 +6,6 @@ import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.animation.expandVertically
 import androidx.compose.animation.shrinkVertically
 import androidx.compose.animation.with
-import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.consumeWindowInsets
@@ -113,24 +112,21 @@ object HomeScreen : Screen() {
                     },
                     contentWindowInsets = WindowInsets(0),
                 ) { contentPadding ->
-                    Box(
+                    AnimatedContent(
                         modifier = Modifier
                             .padding(contentPadding)
                             .consumeWindowInsets(contentPadding),
-                    ) {
-                        AnimatedContent(
-                            targetState = tabNavigator.current,
-                            transitionSpec = {
-                                materialFadeThroughIn(initialScale = 1f, durationMillis = TabFadeDuration) with
-                                    materialFadeThroughOut(durationMillis = TabFadeDuration)
-                            },
-                            content = {
-                                tabNavigator.saveableState(key = "currentTab", it) {
-                                    it.Content()
-                                }
-                            },
-                        )
-                    }
+                        targetState = tabNavigator.current,
+                        transitionSpec = {
+                            materialFadeThroughIn(initialScale = 1f, durationMillis = TabFadeDuration) with
+                                materialFadeThroughOut(durationMillis = TabFadeDuration)
+                        },
+                        content = {
+                            tabNavigator.saveableState(key = "currentTab", it) {
+                                it.Content()
+                            }
+                        },
+                    )
                 }
             }
 
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 ccb86bafa..9eede468c 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
@@ -13,7 +13,6 @@ import android.widget.Toast
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.BackHandler
 import androidx.compose.foundation.isSystemInDarkTheme
-import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.WindowInsetsSides
 import androidx.compose.foundation.layout.consumeWindowInsets
@@ -222,15 +221,14 @@ class MainActivity : BaseActivity() {
                     },
                     contentWindowInsets = scaffoldInsets,
                 ) { contentPadding ->
+                    // Shows current screen
                     // Consume insets already used by app state banners
-                    Box(
+                    DefaultNavigatorScreenTransition(
+                        navigator = navigator,
                         modifier = Modifier
                             .padding(contentPadding)
                             .consumeWindowInsets(contentPadding),
-                    ) {
-                        // Shows current screen
-                        DefaultNavigatorScreenTransition(navigator = navigator)
-                    }
+                    )
                 }
 
                 // Pop source-related screens when incognito mode is turned off