feat: speed up transitions & home screen

This commit is contained in:
rushiiMachine 2025-05-25 02:13:38 -07:00
parent c978ab727f
commit 46fed98175
No known key found for this signature in database
GPG key ID: DCBE5952BB3B6420
4 changed files with 21 additions and 77 deletions

View file

@ -9,22 +9,23 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
import androidx.activity.compose.setContent
import androidx.compose.animation.*
import androidx.compose.animation.core.tween
import androidx.compose.animation.core.*
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.unit.IntOffset
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 cafe.adriel.voyager.transitions.SlideTransition
import com.aliucord.manager.manager.PreferencesManager
import com.aliucord.manager.ui.components.*
import com.aliucord.manager.ui.components.ManagerTheme
import com.aliucord.manager.ui.components.Theme
import com.aliucord.manager.ui.components.dialogs.StoragePermissionsDialog
import com.aliucord.manager.ui.screens.home.HomeScreen
import com.aliucord.manager.ui.widgets.updater.UpdaterDialog
import com.aliucord.manager.util.IS_CUSTOM_BUILD
import com.aliucord.manager.util.back
import org.koin.android.ext.android.inject
class MainActivity : ComponentActivity() {
@ -60,28 +61,17 @@ class MainActivity : ComponentActivity() {
navigator.back(this@MainActivity)
}
ScreenTransition(
SlideTransition(
navigator = navigator,
transition = { unifiedScreenTransition(navigator.lastEvent) }
disposeScreenAfterTransitionEnd = true,
animationSpec = spring(
stiffness = Spring.StiffnessMedium,
visibilityThreshold = IntOffset.VisibilityThreshold,
)
)
}
}
}
}
}
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()
}
}

View file

@ -1,36 +0,0 @@
package com.aliucord.manager.ui.components
import androidx.compose.animation.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import com.aliucord.manager.R
import com.aliucord.manager.ui.util.DiscordVersion
@Composable
fun AnimatedVersionDisplay(
version: DiscordVersion,
modifier: Modifier = Modifier,
) {
AnimatedVisibility(
enter = fadeIn() + slideInVertically { it * -2 },
exit = fadeOut() + slideOutVertically { it * -2 },
visible = version !is DiscordVersion.None,
modifier = modifier,
) {
VersionDisplay(
version = version,
prefix = {
withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
append(stringResource(R.string.version_supported))
append(" ")
}
},
modifier = Modifier.alpha(.5f),
)
}
}

View file

@ -4,7 +4,6 @@ import android.content.res.Configuration
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.aliucord.manager.ui.components.ManagerTheme
import com.aliucord.manager.ui.screens.logs.components.dialogs.DeleteLogsDialog
import com.aliucord.manager.ui.screens.plugins.components.dialogs.UninstallPluginDialog
@Composable

View file

@ -27,7 +27,8 @@ import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.aliucord.manager.R
import com.aliucord.manager.ui.components.*
import com.aliucord.manager.ui.components.LoadFailure
import com.aliucord.manager.ui.components.ProjectHeader
import com.aliucord.manager.ui.screens.home.components.*
import com.aliucord.manager.ui.screens.patchopts.PatchOptionsScreen
import com.aliucord.manager.ui.screens.plugins.PluginsScreen
@ -145,34 +146,24 @@ fun HomeScreenLoadedContent(
secondaryInstall = true,
onClick = onClickInstall,
modifier = Modifier
.padding(top = 10.dp)
.padding(vertical = 10.dp)
.height(50.dp)
.fillMaxWidth()
)
}
item(key = "SUPPORTED_VERSION") {
AnimatedVersionDisplay(
version = supportedVersion,
modifier = Modifier.padding(bottom = 30.dp),
)
}
val installations = (state as? InstallsState.Fetched)?.data
?: return@LazyColumn
items(installations, key = { it.packageName }) {
items(state.data, key = { it.packageName }) { item ->
AnimatedVisibility(
enter = fadeIn() + slideInHorizontally { it * -2 },
exit = fadeOut() + slideOutHorizontally { it * 2 },
visible = supportedVersion !is DiscordVersion.None,
) {
InstalledItemCard(
data = it,
onUpdate = { onUpdate(it.packageName) },
onOpenApp = { onOpenApp(it.packageName) },
onOpenInfo = { onOpenAppInfo(it.packageName) },
onOpenPlugins = { onOpenPlugins(it.packageName) },
data = item,
onUpdate = { onUpdate(item.packageName) },
onOpenApp = { onOpenApp(item.packageName) },
onOpenInfo = { onOpenAppInfo(item.packageName) },
onOpenPlugins = { onOpenPlugins(item.packageName) },
modifier = Modifier.fillMaxWidth()
)
}