Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isTrue() assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() val factory = latest!!.transitionManager!!.controllerFactory assertThat(factory!!.component).isEqualTo(component) Loading @@ -538,6 +539,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isTrue() // Start the return transition [InCall(isAppVisible=true), ReturnRequested -> // Returning]. Loading @@ -545,12 +547,14 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the return transition [InCall(isAppVisible=true), Returning -> NoTransition]. controller.onTransitionAnimationEnd(isExpandingFullyAbove = false) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Settle the return transition [InCall(isAppVisible=true) -> // InCall(isAppVisible=false), NoTransition]. Loading @@ -558,6 +562,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Trigger a launch transition [InCall(isAppVisible=false) -> InCall(isAppVisible=true), // NoTransition]. Loading @@ -565,6 +570,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Request the return transition [InCall(isAppVisible=true), NoTransition -> // LaunchRequested]. Loading @@ -572,6 +578,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Start the return transition [InCall(isAppVisible=true), LaunchRequested -> // Launching]. Loading @@ -579,12 +586,14 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the return transition [InCall(isAppVisible=true), Launching -> NoTransition]. controller.onTransitionAnimationStart(isExpandingFullyAbove = false) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the call with the app visible [InCall(isAppVisible=true) -> NoCall, // NoTransition]. Loading packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt +9 −3 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ constructor( oldTransitionState = oldTransitionState, newTransitionState = newTransitionState, ), transitionState = newTransitionState, ) } } Loading Loading @@ -177,6 +178,7 @@ constructor( state: OngoingCallModel.InCall, systemClock: SystemClock, isHidden: Boolean, transitionState: TransitionState = TransitionState.NoTransition, ): OngoingActivityChipModel.Active { val key = state.notificationKey val contentDescription = getContentDescription(state.appName) Loading Loading @@ -209,7 +211,7 @@ constructor( onClickListenerLegacy = getOnClickListener(state.intent), clickBehavior = getClickBehavior(state.intent), isHidden = isHidden, transitionManager = getTransitionManager(state), transitionManager = getTransitionManager(state, transitionState), ) } else { val startTimeInElapsedRealtime = Loading @@ -222,7 +224,7 @@ constructor( onClickListenerLegacy = getOnClickListener(state.intent), clickBehavior = getClickBehavior(state.intent), isHidden = isHidden, transitionManager = getTransitionManager(state), transitionManager = getTransitionManager(state, transitionState), ) } } Loading Loading @@ -285,7 +287,8 @@ constructor( } private fun getTransitionManager( state: OngoingCallModel state: OngoingCallModel, transitionState: TransitionState = TransitionState.NoTransition, ): OngoingActivityChipModel.TransitionManager? { if (!StatusBarChipsReturnAnimations.isEnabled) return null return if (state is OngoingCallModel.NoCall) { Loading @@ -301,6 +304,9 @@ constructor( registerTransition = { activityStarter.registerTransition(cookie, factory, scope) }, // Make the chip invisible at the beginning of the return transition to avoid // it flickering. hideChipForTransition = transitionState is TransitionState.ReturnRequested, ) } else { // Without a component we can't instantiate a controller factory, and without a Loading packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt +15 −4 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource Loading Loading @@ -84,11 +85,21 @@ fun OngoingActivityChip( shape = RoundedCornerShape(dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius)), modifier = modifier.height(dimensionResource(R.dimen.ongoing_appops_chip_height)).semantics { modifier .height(dimensionResource(R.dimen.ongoing_appops_chip_height)) .semantics { if (contentDescription != null) { this.contentDescription = contentDescription } }, } .graphicsLayer( alpha = if (model.transitionManager?.hideChipForTransition == true) { 0f } else { 1f } ), borderStroke = borderStroke, onClick = onClick, useModifierBasedImplementation = StatusBarChipsReturnAnimations.isEnabled, Loading packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/OngoingActivityChipModel.kt +6 −0 Original line number Diff line number Diff line Loading @@ -301,5 +301,11 @@ sealed class OngoingActivityChipModel { val registerTransition: () -> Unit = {}, /** Used to remove the existing registration for this chip, if any. */ val unregisterTransition: () -> Unit = {}, /** * Whether the chip should be made invisible (0 opacity) while still being composed. This is * necessary to avoid flickers at the beginning of return transitions, when the chip must * not be visible but must be composed in order for the animation to start. */ val hideChipForTransition: Boolean = false, ) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isTrue() assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() val factory = latest!!.transitionManager!!.controllerFactory assertThat(factory!!.component).isEqualTo(component) Loading @@ -538,6 +539,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isTrue() // Start the return transition [InCall(isAppVisible=true), ReturnRequested -> // Returning]. Loading @@ -545,12 +547,14 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the return transition [InCall(isAppVisible=true), Returning -> NoTransition]. controller.onTransitionAnimationEnd(isExpandingFullyAbove = false) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Settle the return transition [InCall(isAppVisible=true) -> // InCall(isAppVisible=false), NoTransition]. Loading @@ -558,6 +562,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Trigger a launch transition [InCall(isAppVisible=false) -> InCall(isAppVisible=true), // NoTransition]. Loading @@ -565,6 +570,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Request the return transition [InCall(isAppVisible=true), NoTransition -> // LaunchRequested]. Loading @@ -572,6 +578,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // Start the return transition [InCall(isAppVisible=true), LaunchRequested -> // Launching]. Loading @@ -579,12 +586,14 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the return transition [InCall(isAppVisible=true), Launching -> NoTransition]. controller.onTransitionAnimationStart(isExpandingFullyAbove = false) assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java) assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse() assertThat(latest!!.transitionManager!!.controllerFactory).isEqualTo(factory) assertThat(latest!!.transitionManager!!.hideChipForTransition).isFalse() // End the call with the app visible [InCall(isAppVisible=true) -> NoCall, // NoTransition]. Loading
packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt +9 −3 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ constructor( oldTransitionState = oldTransitionState, newTransitionState = newTransitionState, ), transitionState = newTransitionState, ) } } Loading Loading @@ -177,6 +178,7 @@ constructor( state: OngoingCallModel.InCall, systemClock: SystemClock, isHidden: Boolean, transitionState: TransitionState = TransitionState.NoTransition, ): OngoingActivityChipModel.Active { val key = state.notificationKey val contentDescription = getContentDescription(state.appName) Loading Loading @@ -209,7 +211,7 @@ constructor( onClickListenerLegacy = getOnClickListener(state.intent), clickBehavior = getClickBehavior(state.intent), isHidden = isHidden, transitionManager = getTransitionManager(state), transitionManager = getTransitionManager(state, transitionState), ) } else { val startTimeInElapsedRealtime = Loading @@ -222,7 +224,7 @@ constructor( onClickListenerLegacy = getOnClickListener(state.intent), clickBehavior = getClickBehavior(state.intent), isHidden = isHidden, transitionManager = getTransitionManager(state), transitionManager = getTransitionManager(state, transitionState), ) } } Loading Loading @@ -285,7 +287,8 @@ constructor( } private fun getTransitionManager( state: OngoingCallModel state: OngoingCallModel, transitionState: TransitionState = TransitionState.NoTransition, ): OngoingActivityChipModel.TransitionManager? { if (!StatusBarChipsReturnAnimations.isEnabled) return null return if (state is OngoingCallModel.NoCall) { Loading @@ -301,6 +304,9 @@ constructor( registerTransition = { activityStarter.registerTransition(cookie, factory, scope) }, // Make the chip invisible at the beginning of the return transition to avoid // it flickering. hideChipForTransition = transitionState is TransitionState.ReturnRequested, ) } else { // Without a component we can't instantiate a controller factory, and without a Loading
packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt +15 −4 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource Loading Loading @@ -84,11 +85,21 @@ fun OngoingActivityChip( shape = RoundedCornerShape(dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius)), modifier = modifier.height(dimensionResource(R.dimen.ongoing_appops_chip_height)).semantics { modifier .height(dimensionResource(R.dimen.ongoing_appops_chip_height)) .semantics { if (contentDescription != null) { this.contentDescription = contentDescription } }, } .graphicsLayer( alpha = if (model.transitionManager?.hideChipForTransition == true) { 0f } else { 1f } ), borderStroke = borderStroke, onClick = onClick, useModifierBasedImplementation = StatusBarChipsReturnAnimations.isEnabled, Loading
packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/OngoingActivityChipModel.kt +6 −0 Original line number Diff line number Diff line Loading @@ -301,5 +301,11 @@ sealed class OngoingActivityChipModel { val registerTransition: () -> Unit = {}, /** Used to remove the existing registration for this chip, if any. */ val unregisterTransition: () -> Unit = {}, /** * Whether the chip should be made invisible (0 opacity) while still being composed. This is * necessary to avoid flickers at the beginning of return transitions, when the chip must * not be visible but must be composed in order for the animation to start. */ val hideChipForTransition: Boolean = false, ) }