From 7477167d8dafed9a772fba4822fa05fd67df246b Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Wed, 9 Apr 2025 21:10:30 -0700 Subject: [PATCH] feat: unified screen navigation transitions --- app/proguard-rules.pro | 2 +- .../com/aliucord/manager/MainActivity.kt | 47 +++++++------------ .../com/aliucord/manager/util/Context.kt | 2 +- .../kotlin/com/aliucord/manager/util/Utils.kt | 2 +- 4 files changed, 20 insertions(+), 33 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 15bead7..874efdb 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -33,7 +33,7 @@ } # Keep class names of patching steps since they're used via reflection --keepnames com.aliucord.manager.patcher.steps.** +-keepnames class com.aliucord.manager.patcher.steps.** # Uncomment this to preserve the line number information for # debugging stack traces. diff --git a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt index 573986b..cd53a4b 100644 --- a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt +++ b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt @@ -16,15 +16,13 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat import cafe.adriel.voyager.core.annotation.ExperimentalVoyagerApi +import cafe.adriel.voyager.core.stack.StackEvent import cafe.adriel.voyager.navigator.* import cafe.adriel.voyager.transitions.ScreenTransition import com.aliucord.manager.manager.PreferencesManager import com.aliucord.manager.ui.components.* import com.aliucord.manager.ui.components.dialogs.StoragePermissionsDialog import com.aliucord.manager.ui.screens.home.HomeScreen -import com.aliucord.manager.ui.screens.iconopts.IconOptionsScreen -import com.aliucord.manager.ui.screens.patching.PatchingScreen -import com.aliucord.manager.ui.screens.patchopts.PatchOptionsScreen import com.aliucord.manager.ui.widgets.updater.UpdaterDialog import com.aliucord.manager.util.IS_CUSTOM_BUILD import org.koin.android.ext.android.inject @@ -64,37 +62,26 @@ class MainActivity : ComponentActivity() { ScreenTransition( navigator = navigator, - transition = block@{ - val fadeIn = fadeIn(tween(durationMillis = 300)) - val fadeOut = fadeOut(tween(durationMillis = 750, delayMillis = 200)) - - when { - // Going from Home -> InstallOptions - initialState is HomeScreen && targetState is PatchOptionsScreen -> - slideInVertically { (it * 1.5).toInt() } + fadeIn togetherWith fadeOut - // Going from InstallOptions -> Home - initialState is PatchOptionsScreen && targetState is HomeScreen -> - fadeIn togetherWith slideOutVertically { it * 2 } + fadeOut - // Going from InstallOptions -> Install - initialState is PatchOptionsScreen && targetState is PatchingScreen -> - slideInHorizontally { it * 2 } + fadeIn togetherWith fadeOut - // Going from PatchOptions -> IconOptions - initialState is PatchOptionsScreen && targetState is IconOptionsScreen -> - slideInHorizontally { it * 2 } + fadeIn togetherWith fadeOut - // Going from IconOptions -> PatchOptions - initialState is IconOptionsScreen && targetState is PatchOptionsScreen -> - fadeIn togetherWith slideOutHorizontally { it * 2 } + fadeOut - // Going from Install -> InstallOptions - initialState is PatchingScreen && targetState is PatchOptionsScreen -> - fadeIn togetherWith slideOutHorizontally { it * 2 } + fadeOut - - else -> fadeIn togetherWith fadeOut - } - } + transition = { unifiedScreenTransition(navigator.lastEvent) } ) } } } } } + + private fun unifiedScreenTransition(lastEvent: StackEvent): ContentTransform = when (lastEvent) { + StackEvent.Push, StackEvent.Replace -> ContentTransform( + targetContentEnter = slideInHorizontally { it * 2 } + fadeIn(tween(durationMillis = 400)), + initialContentExit = fadeOut(tween(durationMillis = 400, delayMillis = 300)), + ) + + StackEvent.Pop -> ContentTransform( + targetContentEnter = EnterTransition.None, + targetContentZIndex = -1f, + initialContentExit = slideOutHorizontally { it * 2 } + fadeOut(tween(durationMillis = 400, delayMillis = 300)), + ) + + StackEvent.Idle -> fadeIn() togetherWith fadeOut() + } } diff --git a/app/src/main/kotlin/com/aliucord/manager/util/Context.kt b/app/src/main/kotlin/com/aliucord/manager/util/Context.kt index 3b6ed70..046f508 100644 --- a/app/src/main/kotlin/com/aliucord/manager/util/Context.kt +++ b/app/src/main/kotlin/com/aliucord/manager/util/Context.kt @@ -103,7 +103,7 @@ fun Context.requestNoBatteryOptimizations() { startActivity(intent) } -/* +/** * Get the raw bytes for a resource. * @param id The resource identifier * @return The resource's raw bytes as stored inside the APK diff --git a/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt b/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt index 70c98f0..d291a90 100644 --- a/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt +++ b/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt @@ -28,7 +28,7 @@ inline fun ObjectList.find(block: (E) -> Boolean): E? { /** * Whether this manager build is not an official release. */ -@Suppress("KotlinConstantConditions") +@Suppress("KotlinConstantConditions", "SimplifyBooleanWithConstants") val IS_CUSTOM_BUILD by lazy { BuildConfig.GIT_BRANCH != "release" || BuildConfig.GIT_LOCAL_CHANGES