Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt +27 −8 Original line number Diff line number Diff line Loading @@ -21,12 +21,16 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.Layout import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntRect import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope Loading @@ -42,6 +46,7 @@ import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection import com.android.systemui.keyguard.ui.composable.section.StatusBarSection import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import com.android.systemui.res.R import java.util.Optional import javax.inject.Inject import kotlin.math.roundToInt Loading Loading @@ -117,7 +122,7 @@ constructor( with(notificationSection) { Notifications( areNotificationsVisible = areNotificationsVisible, isShadeLayoutWide = isShadeLayoutWide, isShadeLayoutWide = true, burnInParams = null, modifier = Modifier.fillMaxWidth(0.5f) Loading @@ -127,13 +132,27 @@ constructor( } } } if (!isShadeLayoutWide && !isBypassEnabled) { val aodIconPadding: Dp = dimensionResource(R.dimen.below_clock_padding_start_icons) with(notificationSection) { if (!isShadeLayoutWide && !isBypassEnabled) { Box(modifier = Modifier.weight(weight = 1f)) { AodNotificationIcons( modifier = Modifier.align(alignment = Alignment.TopStart) .padding(start = aodIconPadding), ) Notifications( areNotificationsVisible = areNotificationsVisible, isShadeLayoutWide = isShadeLayoutWide, isShadeLayoutWide = false, burnInParams = null, modifier = Modifier.weight(weight = 1f) ) } } else { AodNotificationIcons( modifier = Modifier.padding(start = aodIconPadding), ) } } Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +76 −0 Original line number Diff line number Diff line Loading @@ -17,32 +17,60 @@ package com.android.systemui.keyguard.ui.composable.section import android.view.ViewGroup import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.compose.modifiers.thenIf import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.MigrateClocksToBlueprint import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn import com.android.systemui.keyguard.ui.composable.modifier.burnInAware import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.notifications.ui.composable.ConstrainedNotificationStack import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.res.R import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.ui.SystemBarUtilsState import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating import com.android.systemui.util.ui.value import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.launch @SysUISingleton class NotificationSection Loading @@ -55,6 +83,13 @@ constructor( sharedNotificationContainerViewModel: SharedNotificationContainerViewModel, stackScrollLayout: NotificationStackScrollLayout, sharedNotificationContainerBinder: SharedNotificationContainerBinder, private val keyguardRootViewModel: KeyguardRootViewModel, private val configurationState: ConfigurationState, private val iconBindingFailureTracker: StatusBarIconViewBindingFailureTracker, private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, private val systemBarUtilsState: SystemBarUtilsState, private val clockInteractor: KeyguardClockInteractor, ) { init { Loading @@ -79,6 +114,47 @@ constructor( ) } @Composable fun AodNotificationIcons(modifier: Modifier = Modifier) { val isVisible by keyguardRootViewModel.isNotifIconContainerVisible.collectAsStateWithLifecycle() val transitionState = remember { MutableTransitionState(isVisible.value) } LaunchedEffect(key1 = isVisible, key2 = transitionState.isIdle) { transitionState.targetState = isVisible.value if (isVisible.isAnimating && transitionState.isIdle) { isVisible.stopAnimating() } } val burnIn = rememberBurnIn(clockInteractor) AnimatedVisibility( visibleState = transitionState, enter = fadeIn(), exit = fadeOut(), modifier = modifier .height(dimensionResource(R.dimen.notification_shelf_height)) .burnInAware(aodBurnInViewModel, burnIn.parameters), ) { val scope = rememberCoroutineScope() AndroidView( factory = { context -> NotificationIconContainer(context, null).also { nic -> scope.launch { NotificationIconContainerViewBinder.bind( nic, nicAodViewModel, configurationState, systemBarUtilsState, iconBindingFailureTracker, nicAodIconViewStore, ) } } }, ) } } @Composable fun SceneScope.HeadsUpNotifications() { SnoozeableHeadsUpNotificationSpace( Loading packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ import kotlinx.coroutines.flow.transformLatest /** * A state comprised of a [value] of type [T] paired with a boolean indicating whether or not the * [value] [isAnimating] in the UI. * value [isAnimating][isAnimating] in the UI. */ sealed interface AnimatedValue<out T> { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt +27 −8 Original line number Diff line number Diff line Loading @@ -21,12 +21,16 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.Layout import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntRect import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope Loading @@ -42,6 +46,7 @@ import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection import com.android.systemui.keyguard.ui.composable.section.StatusBarSection import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import com.android.systemui.res.R import java.util.Optional import javax.inject.Inject import kotlin.math.roundToInt Loading Loading @@ -117,7 +122,7 @@ constructor( with(notificationSection) { Notifications( areNotificationsVisible = areNotificationsVisible, isShadeLayoutWide = isShadeLayoutWide, isShadeLayoutWide = true, burnInParams = null, modifier = Modifier.fillMaxWidth(0.5f) Loading @@ -127,13 +132,27 @@ constructor( } } } if (!isShadeLayoutWide && !isBypassEnabled) { val aodIconPadding: Dp = dimensionResource(R.dimen.below_clock_padding_start_icons) with(notificationSection) { if (!isShadeLayoutWide && !isBypassEnabled) { Box(modifier = Modifier.weight(weight = 1f)) { AodNotificationIcons( modifier = Modifier.align(alignment = Alignment.TopStart) .padding(start = aodIconPadding), ) Notifications( areNotificationsVisible = areNotificationsVisible, isShadeLayoutWide = isShadeLayoutWide, isShadeLayoutWide = false, burnInParams = null, modifier = Modifier.weight(weight = 1f) ) } } else { AodNotificationIcons( modifier = Modifier.padding(start = aodIconPadding), ) } } Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +76 −0 Original line number Diff line number Diff line Loading @@ -17,32 +17,60 @@ package com.android.systemui.keyguard.ui.composable.section import android.view.ViewGroup import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.compose.modifiers.thenIf import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.MigrateClocksToBlueprint import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn import com.android.systemui.keyguard.ui.composable.modifier.burnInAware import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.notifications.ui.composable.ConstrainedNotificationStack import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.res.R import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.ui.SystemBarUtilsState import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating import com.android.systemui.util.ui.value import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.launch @SysUISingleton class NotificationSection Loading @@ -55,6 +83,13 @@ constructor( sharedNotificationContainerViewModel: SharedNotificationContainerViewModel, stackScrollLayout: NotificationStackScrollLayout, sharedNotificationContainerBinder: SharedNotificationContainerBinder, private val keyguardRootViewModel: KeyguardRootViewModel, private val configurationState: ConfigurationState, private val iconBindingFailureTracker: StatusBarIconViewBindingFailureTracker, private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, private val systemBarUtilsState: SystemBarUtilsState, private val clockInteractor: KeyguardClockInteractor, ) { init { Loading @@ -79,6 +114,47 @@ constructor( ) } @Composable fun AodNotificationIcons(modifier: Modifier = Modifier) { val isVisible by keyguardRootViewModel.isNotifIconContainerVisible.collectAsStateWithLifecycle() val transitionState = remember { MutableTransitionState(isVisible.value) } LaunchedEffect(key1 = isVisible, key2 = transitionState.isIdle) { transitionState.targetState = isVisible.value if (isVisible.isAnimating && transitionState.isIdle) { isVisible.stopAnimating() } } val burnIn = rememberBurnIn(clockInteractor) AnimatedVisibility( visibleState = transitionState, enter = fadeIn(), exit = fadeOut(), modifier = modifier .height(dimensionResource(R.dimen.notification_shelf_height)) .burnInAware(aodBurnInViewModel, burnIn.parameters), ) { val scope = rememberCoroutineScope() AndroidView( factory = { context -> NotificationIconContainer(context, null).also { nic -> scope.launch { NotificationIconContainerViewBinder.bind( nic, nicAodViewModel, configurationState, systemBarUtilsState, iconBindingFailureTracker, nicAodIconViewStore, ) } } }, ) } } @Composable fun SceneScope.HeadsUpNotifications() { SnoozeableHeadsUpNotificationSpace( Loading
packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ import kotlinx.coroutines.flow.transformLatest /** * A state comprised of a [value] of type [T] paired with a boolean indicating whether or not the * [value] [isAnimating] in the UI. * value [isAnimating][isAnimating] in the UI. */ sealed interface AnimatedValue<out T> { Loading