Add transition when returning to home using gesture navigation

This commit is contained in:
MM20 2022-05-23 20:58:59 +02:00
parent cf2f353441
commit ff2c293ba6
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 44 additions and 13 deletions

View File

@ -10,17 +10,17 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.*
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.flowWithLifecycle
import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.bottomsheets.BottomSheet
@ -34,9 +34,11 @@ import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.BaseActivity import de.mm20.launcher2.ui.base.BaseActivity
import de.mm20.launcher2.ui.base.ProvideSettings import de.mm20.launcher2.ui.base.ProvideSettings
import de.mm20.launcher2.ui.component.NavBarEffects import de.mm20.launcher2.ui.component.NavBarEffects
import de.mm20.launcher2.ui.ktx.animateTo
import de.mm20.launcher2.ui.launcher.modals.EditFavoritesView import de.mm20.launcher2.ui.launcher.modals.EditFavoritesView
import de.mm20.launcher2.ui.launcher.modals.HiddenItemsSheet import de.mm20.launcher2.ui.launcher.modals.HiddenItemsSheet
import de.mm20.launcher2.ui.launcher.transitions.HomeTransitionManager import de.mm20.launcher2.ui.launcher.transitions.HomeTransitionManager
import de.mm20.launcher2.ui.launcher.transitions.HomeTransitionParams
import de.mm20.launcher2.ui.launcher.transitions.LocalHomeTransitionManager import de.mm20.launcher2.ui.launcher.transitions.LocalHomeTransitionManager
import de.mm20.launcher2.ui.locals.LocalSnackbarHostState import de.mm20.launcher2.ui.locals.LocalSnackbarHostState
import de.mm20.launcher2.ui.locals.LocalWindowSize import de.mm20.launcher2.ui.locals.LocalWindowSize
@ -79,6 +81,18 @@ class LauncherActivity : BaseActivity() {
val systemUiController = rememberSystemUiController() val systemUiController = rememberSystemUiController()
val enterTransition = remember { mutableStateOf(1f) }
LaunchedEffect(null) {
homeTransitionManager
.currentTransition
.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED)
.collect {
enterTransition.value = 0f
enterTransition.animateTo(1f)
}
}
LaunchedEffect(hideStatus) { LaunchedEffect(hideStatus) {
systemUiController.isStatusBarVisible = !hideStatus systemUiController.isStatusBarVisible = !hideStatus
} }
@ -98,7 +112,12 @@ class LauncherActivity : BaseActivity() {
PullDownScaffold( PullDownScaffold(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.systemBarsPadding(), .systemBarsPadding()
.graphicsLayer {
scaleX = 0.5f + enterTransition.value * 0.5f
scaleY = 0.5f + enterTransition.value * 0.5f
alpha = enterTransition.value
},
darkStatusBarIcons = lightStatus, darkStatusBarIcons = lightStatus,
darkNavBarIcons = lightNav, darkNavBarIcons = lightNav,
) )
@ -107,7 +126,12 @@ class LauncherActivity : BaseActivity() {
PagerScaffold( PagerScaffold(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.systemBarsPadding(), .systemBarsPadding()
.graphicsLayer {
scaleX = enterTransition.value
scaleY = enterTransition.value
alpha = enterTransition.value
},
darkStatusBarIcons = lightStatus, darkStatusBarIcons = lightStatus,
darkNavBarIcons = lightNav, darkNavBarIcons = lightNav,
) )
@ -116,7 +140,9 @@ class LauncherActivity : BaseActivity() {
} }
SnackbarHost( SnackbarHost(
snackbarHostState, snackbarHostState,
modifier = Modifier.navigationBarsPadding().imePadding() modifier = Modifier
.navigationBarsPadding()
.imePadding()
) )
} }
val showHiddenItems by viewModel.isHiddenItemsShown.observeAsState(false) val showHiddenItems by viewModel.isHiddenItemsShown.observeAsState(false)

View File

@ -1,13 +1,17 @@
package de.mm20.launcher2.ui.launcher.transitions package de.mm20.launcher2.ui.launcher.transitions
import android.util.Log
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.toAndroidRectF import androidx.compose.ui.graphics.toAndroidRectF
import com.android.launcher3.GestureNavContract import com.android.launcher3.GestureNavContract
import kotlinx.coroutines.flow.MutableSharedFlow
class HomeTransitionManager { class HomeTransitionManager {
val currentTransition = MutableSharedFlow<HomeTransitionParams?>(1)
private val handlers = mutableSetOf<HomeTransitionHandler>() private val handlers = mutableSetOf<HomeTransitionHandler>()
fun resolve(gestureNavContract: GestureNavContract) { fun resolve(gestureNavContract: GestureNavContract) {
@ -15,13 +19,11 @@ class HomeTransitionManager {
val result = handler.handle(gestureNavContract) val result = handler.handle(gestureNavContract)
if (result != null) { if (result != null) {
gestureNavContract.sendEndPosition(result.targetBounds.toAndroidRectF()) gestureNavContract.sendEndPosition(result.targetBounds.toAndroidRectF())
break currentTransition.tryEmit(result)
return
} }
} }
} currentTransition.tryEmit(null)
private fun dispatch(params: HomeTransitionParams) {
} }
fun registerHandler(handler: HomeTransitionHandler) { fun registerHandler(handler: HomeTransitionHandler) {

View File

@ -1,8 +1,10 @@
package de.mm20.launcher2.ui.launcher.transitions package de.mm20.launcher2.ui.launcher.transitions
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.Rect
@Stable
data class HomeTransitionParams( data class HomeTransitionParams(
val targetBounds: Rect, val targetBounds: Rect,
val icon: (@Composable () -> Unit)? = null val icon: (@Composable () -> Unit)? = null

View File

@ -375,6 +375,7 @@ fun IconShapePreference(
LocalContext.current, LocalContext.current,
R.mipmap.ic_launcher_foreground R.mipmap.ic_launcher_foreground
)!!, )!!,
foregroundScale = 1.5f,
background = ColorDrawable(LocalContext.current.getColor(R.color.ic_launcher_background)) background = ColorDrawable(LocalContext.current.getColor(R.color.ic_launcher_background))
), ),
onClick = { onClick = {