diff options
| author | 2024-09-11 16:33:51 +0000 | |
|---|---|---|
| committer | 2024-09-11 16:33:51 +0000 | |
| commit | 5a55c817f02850b6298678ce177d01d7c440c9bd (patch) | |
| tree | 2f62fbf86ce8ee3f71a264bdfe7ad5afa51da45a | |
| parent | e86aa79ca28c14caa729ef8328b44247269c46b8 (diff) | |
| parent | 31721aa17a94a191e6468ed387f662bd0bc13795 (diff) | |
Merge "[flexiglass] Add NotifIconContainer to Lockscreen" into main
3 files changed, 104 insertions, 9 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt index 8d5189eb34e9..2a2c2fc4934e 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt @@ -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 @@ -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 @@ -117,7 +122,7 @@ constructor( with(notificationSection) { Notifications( areNotificationsVisible = areNotificationsVisible, - isShadeLayoutWide = isShadeLayoutWide, + isShadeLayoutWide = true, burnInParams = null, modifier = Modifier.fillMaxWidth(0.5f) @@ -127,13 +132,27 @@ constructor( } } } - if (!isShadeLayoutWide && !isBypassEnabled) { - with(notificationSection) { - Notifications( - areNotificationsVisible = areNotificationsVisible, - isShadeLayoutWide = isShadeLayoutWide, - burnInParams = null, - modifier = Modifier.weight(weight = 1f) + + 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 = false, + burnInParams = null, + ) + } + } else { + AodNotificationIcons( + modifier = Modifier.padding(start = aodIconPadding), ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt index 18e1092fba2e..6fc51e4d0f65 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt @@ -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 @@ -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 { @@ -80,6 +115,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( stackScrollView = stackScrollView.get(), diff --git a/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt b/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt index 1112d6f4f25c..a5c8af588667 100644 --- a/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt +++ b/packages/SystemUI/src/com/android/systemui/util/ui/AnimatedValue.kt @@ -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> { |