diff options
10 files changed, 17 insertions, 397 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index 1dd4abfa0767..236c5b8ed2d7 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -48,7 +48,6 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule; -import com.android.systemui.statusbar.events.StatusBarEventsModule; import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.phone.HeadsUpModule; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -99,7 +98,6 @@ import javax.inject.Named; ReferenceScreenshotModule.class, RotationLockModule.class, SceneContainerFrameworkModule.class, - StatusBarEventsModule.class, StartCentralSurfacesModule.class, VolumeModule.class, WallpaperModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index a41bb2f67ad2..7915088b4642 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -96,6 +96,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.connectivity.ConnectivityModule; import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.disableflags.dagger.DisableFlagsModule; +import com.android.systemui.statusbar.events.StatusBarEventsModule; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.collection.NotifPipeline; @@ -209,6 +210,7 @@ import javax.inject.Named; SettingsUtilModule.class, SmartRepliesInflationModule.class, SmartspaceModule.class, + StatusBarEventsModule.class, StatusBarModule.class, StatusBarPipelineModule.class, StatusBarPolicyModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index f4a9f739d187..3a931cbf5d97 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -410,9 +410,6 @@ object Flags { val FILTER_PROVISIONING_NETWORK_SUBSCRIPTIONS = releasedFlag("filter_provisioning_network_subscriptions") - // TODO(b/265892345): Tracking Bug - val PLUG_IN_STATUS_BAR_CHIP = releasedFlag("plug_in_status_bar_chip") - // TODO(b/292533677): Tracking Bug val WIFI_TRACKER_LIB_FOR_WIFI_ICON = unreleasedFlag("wifi_tracker_lib_for_wifi_icon", teamfood = true) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt index 84796f9acbc0..ed964821a5c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusBarEventsModule.kt @@ -17,19 +17,11 @@ package com.android.systemui.statusbar.events import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.statusbar.window.StatusBarWindowController -import com.android.systemui.util.concurrency.DelayableExecutor -import com.android.systemui.util.time.SystemClock +import dagger.Binds import dagger.Module import dagger.Provides -import kotlinx.coroutines.CoroutineScope @Module interface StatusBarEventsModule { @@ -42,41 +34,11 @@ interface StatusBarEventsModule { fun provideSystemStatusAnimationSchedulerLogBuffer(factory: LogBufferFactory): LogBuffer { return factory.create("SystemStatusAnimationSchedulerLog", 60) } - - @Provides - @SysUISingleton - fun provideSystemStatusAnimationScheduler( - featureFlags: FeatureFlags, - coordinator: SystemEventCoordinator, - chipAnimationController: SystemEventChipAnimationController, - statusBarWindowController: StatusBarWindowController, - dumpManager: DumpManager, - systemClock: SystemClock, - @Application coroutineScope: CoroutineScope, - @Main executor: DelayableExecutor, - logger: SystemStatusAnimationSchedulerLogger - ): SystemStatusAnimationScheduler { - return if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { - SystemStatusAnimationSchedulerImpl( - coordinator, - chipAnimationController, - statusBarWindowController, - dumpManager, - systemClock, - coroutineScope, - logger - ) - } else { - SystemStatusAnimationSchedulerLegacyImpl( - coordinator, - chipAnimationController, - statusBarWindowController, - dumpManager, - systemClock, - executor - ) - } - } } -} + @Binds + @SysUISingleton + fun bindSystemStatusAnimationScheduler( + systemStatusAnimationSchedulerImpl: SystemStatusAnimationSchedulerImpl + ): SystemStatusAnimationScheduler +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt index 73c0bfec69a1..fec176523b4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt @@ -32,8 +32,6 @@ import androidx.core.animation.AnimatorSet import androidx.core.animation.ValueAnimator import com.android.internal.annotations.VisibleForTesting import com.android.systemui.res.R -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController @@ -47,8 +45,7 @@ import kotlin.math.roundToInt class SystemEventChipAnimationController @Inject constructor( private val context: Context, private val statusBarWindowController: StatusBarWindowController, - private val contentInsetsProvider: StatusBarContentInsetsProvider, - private val featureFlags: FeatureFlags, + private val contentInsetsProvider: StatusBarContentInsetsProvider ) : SystemStatusAnimationCallback { private lateinit var animationWindowView: FrameLayout @@ -317,15 +314,8 @@ class SystemEventChipAnimationController @Inject constructor( it.marginEnd = marginEnd } - private fun initializeAnimRect() = if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { - animRect.set(chipBounds) - } else { - animRect.set( - chipLeft, - currentAnimatedView!!.view.top, - chipRight, - currentAnimatedView!!.view.bottom) - } + private fun initializeAnimRect() = animRect.set(chipBounds) + /** * To be called during an animation, sets the width and updates the current animated chip view diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt index e9d5deccac94..a73d517a00e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventCoordinator.kt @@ -24,8 +24,7 @@ import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor -import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.State import com.android.systemui.privacy.PrivacyChipBuilder import com.android.systemui.privacy.PrivacyItem import com.android.systemui.privacy.PrivacyItemController @@ -49,7 +48,6 @@ constructor( private val batteryController: BatteryController, private val privacyController: PrivacyItemController, private val context: Context, - private val featureFlags: FeatureFlags, @Application private val appScope: CoroutineScope, connectedDisplayInteractor: ConnectedDisplayInteractor ) { @@ -76,9 +74,7 @@ constructor( } fun notifyPluggedIn(@IntRange(from = 0, to = 100) batteryLevel: Int) { - if (featureFlags.isEnabled(Flags.PLUG_IN_STATUS_BAR_CHIP)) { - scheduler.onStatusEvent(BatteryEvent(batteryLevel)) - } + scheduler.onStatusEvent(BatteryEvent(batteryLevel)) } fun notifyPrivacyItemsEmpty() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt deleted file mode 100644 index 6b5a548b0afe..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLegacyImpl.kt +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.events - -import android.os.Process -import android.provider.DeviceConfig -import android.util.Log -import androidx.core.animation.Animator -import androidx.core.animation.AnimatorListenerAdapter -import androidx.core.animation.AnimatorSet -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.dump.DumpManager -import com.android.systemui.statusbar.window.StatusBarWindowController -import com.android.systemui.util.Assert -import com.android.systemui.util.concurrency.DelayableExecutor -import com.android.systemui.util.time.SystemClock -import java.io.PrintWriter -import javax.inject.Inject - -/** - * Dead-simple scheduler for system status events. Obeys the following principles (all values TBD): - * ``` - * - Avoiding log spam by only allowing 12 events per minute (1event/5s) - * - Waits 100ms to schedule any event for debouncing/prioritization - * - Simple prioritization: Privacy > Battery > connectivity (encoded in [StatusEvent]) - * - Only schedules a single event, and throws away lowest priority events - * ``` - * - * There are 4 basic stages of animation at play here: - * ``` - * 1. System chrome animation OUT - * 2. Chip animation IN - * 3. Chip animation OUT; potentially into a dot - * 4. System chrome animation IN - * ``` - * - * Thus we can keep all animations synchronized with two separate ValueAnimators, one for system - * chrome and the other for the chip. These can animate from 0,1 and listeners can parameterize - * their respective views based on the progress of the animator. Interpolation differences TBD - */ -open class SystemStatusAnimationSchedulerLegacyImpl -@Inject -constructor( - private val coordinator: SystemEventCoordinator, - private val chipAnimationController: SystemEventChipAnimationController, - private val statusBarWindowController: StatusBarWindowController, - private val dumpManager: DumpManager, - private val systemClock: SystemClock, - @Main private val executor: DelayableExecutor -) : SystemStatusAnimationScheduler { - - companion object { - private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator" - } - - fun isImmersiveIndicatorEnabled(): Boolean { - return DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_PRIVACY, - PROPERTY_ENABLE_IMMERSIVE_INDICATOR, - true - ) - } - - @SystemAnimationState private var animationState: Int = IDLE - - /** True if the persistent privacy dot should be active */ - var hasPersistentDot = false - protected set - - private var scheduledEvent: StatusEvent? = null - - val listeners = mutableSetOf<SystemStatusAnimationCallback>() - - init { - coordinator.attachScheduler(this) - dumpManager.registerDumpable(TAG, this) - } - - @SystemAnimationState override fun getAnimationState() = animationState - - override fun onStatusEvent(event: StatusEvent) { - // Ignore any updates until the system is up and running. However, for important events that - // request to be force visible (like privacy), ignore whether it's too early. - if ((isTooEarly() && !event.forceVisible) || !isImmersiveIndicatorEnabled()) { - return - } - - // Don't deal with threading for now (no need let's be honest) - Assert.isMainThread() - if ( - (event.priority > (scheduledEvent?.priority ?: -1)) && - animationState != ANIMATING_OUT && - animationState != SHOWING_PERSISTENT_DOT - ) { - // events can only be scheduled if a higher priority or no other event is in progress - if (DEBUG) { - Log.d(TAG, "scheduling event $event") - } - - scheduleEvent(event) - } else if (scheduledEvent?.shouldUpdateFromEvent(event) == true) { - if (DEBUG) { - Log.d(TAG, "updating current event from: $event. animationState=$animationState") - } - scheduledEvent?.updateFromEvent(event) - if (event.forceVisible) { - hasPersistentDot = true - // If we missed the chance to show the persistent dot, do it now - if (animationState == IDLE) { - notifyTransitionToPersistentDot() - } - } - } else { - if (DEBUG) { - Log.d(TAG, "ignoring event $event") - } - } - } - - override fun removePersistentDot() { - if (!hasPersistentDot || !isImmersiveIndicatorEnabled()) { - return - } - - hasPersistentDot = false - notifyHidePersistentDot() - return - } - - fun isTooEarly(): Boolean { - return systemClock.uptimeMillis() - Process.getStartUptimeMillis() < MIN_UPTIME - } - - /** Clear the scheduled event (if any) and schedule a new one */ - private fun scheduleEvent(event: StatusEvent) { - scheduledEvent = event - - if (event.forceVisible) { - hasPersistentDot = true - } - - // If animations are turned off, we'll transition directly to the dot - if (!event.showAnimation && event.forceVisible) { - notifyTransitionToPersistentDot() - scheduledEvent = null - return - } - - chipAnimationController.prepareChipAnimation(scheduledEvent!!.viewCreator) - animationState = ANIMATION_QUEUED - executor.executeDelayed({ runChipAnimation() }, DEBOUNCE_DELAY) - } - - /** - * 1. Define a total budget for the chip animation (1500ms) - * 2. Send out callbacks to listeners so that they can generate animations locally - * 3. Update the scheduler state so that clients know where we are - * 4. Maybe: provide scaffolding such as: dot location, margins, etc - * 5. Maybe: define a maximum animation length and enforce it. Probably only doable if we - * collect all of the animators and run them together. - */ - private fun runChipAnimation() { - statusBarWindowController.setForceStatusBarVisible(true) - animationState = ANIMATING_IN - - val animSet = collectStartAnimations() - if (animSet.totalDuration > 500) { - throw IllegalStateException( - "System animation total length exceeds budget. " + - "Expected: 500, actual: ${animSet.totalDuration}" - ) - } - animSet.addListener( - object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - animationState = RUNNING_CHIP_ANIM - } - } - ) - animSet.start() - - executor.executeDelayed( - { - val animSet2 = collectFinishAnimations() - animationState = ANIMATING_OUT - animSet2.addListener( - object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - animationState = - if (hasPersistentDot) { - SHOWING_PERSISTENT_DOT - } else { - IDLE - } - - statusBarWindowController.setForceStatusBarVisible(false) - } - } - ) - animSet2.start() - scheduledEvent = null - }, - DISPLAY_LENGTH - ) - } - - private fun collectStartAnimations(): AnimatorSet { - val animators = mutableListOf<Animator>() - listeners.forEach { listener -> - listener.onSystemEventAnimationBegin()?.let { anim -> animators.add(anim) } - } - animators.add(chipAnimationController.onSystemEventAnimationBegin()) - val animSet = AnimatorSet().also { it.playTogether(animators) } - - return animSet - } - - private fun collectFinishAnimations(): AnimatorSet { - val animators = mutableListOf<Animator>() - listeners.forEach { listener -> - listener.onSystemEventAnimationFinish(hasPersistentDot)?.let { anim -> - animators.add(anim) - } - } - animators.add(chipAnimationController.onSystemEventAnimationFinish(hasPersistentDot)) - if (hasPersistentDot) { - val dotAnim = notifyTransitionToPersistentDot() - if (dotAnim != null) { - animators.add(dotAnim) - } - } - val animSet = AnimatorSet().also { it.playTogether(animators) } - - return animSet - } - - private fun notifyTransitionToPersistentDot(): Animator? { - val anims: List<Animator> = - listeners.mapNotNull { - it.onSystemStatusAnimationTransitionToPersistentDot( - scheduledEvent?.contentDescription - ) - } - if (anims.isNotEmpty()) { - val aSet = AnimatorSet() - aSet.playTogether(anims) - return aSet - } - - return null - } - - private fun notifyHidePersistentDot(): Animator? { - val anims: List<Animator> = listeners.mapNotNull { it.onHidePersistentDot() } - - if (animationState == SHOWING_PERSISTENT_DOT) { - animationState = IDLE - } - - if (anims.isNotEmpty()) { - val aSet = AnimatorSet() - aSet.playTogether(anims) - return aSet - } - - return null - } - - override fun addCallback(listener: SystemStatusAnimationCallback) { - Assert.isMainThread() - - if (listeners.isEmpty()) { - coordinator.startObserving() - } - listeners.add(listener) - } - - override fun removeCallback(listener: SystemStatusAnimationCallback) { - Assert.isMainThread() - - listeners.remove(listener) - if (listeners.isEmpty()) { - coordinator.stopObserving() - } - } - - override fun dump(pw: PrintWriter, args: Array<out String>) { - pw.println("Scheduled event: $scheduledEvent") - pw.println("Has persistent privacy dot: $hasPersistentDot") - pw.println("Animation state: $animationState") - pw.println("Listeners:") - if (listeners.isEmpty()) { - pw.println("(none)") - } else { - listeners.forEach { pw.println(" $it") } - } - } -} - -private const val DEBUG = false -private const val TAG = "SystemStatusAnimationSchedulerLegacyImpl" diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt index 2e223f6d8c1f..df257ab113b3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventChipAnimationControllerTest.kt @@ -27,7 +27,6 @@ import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.animation.AnimatorTestRule -import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController @@ -88,8 +87,7 @@ class SystemEventChipAnimationControllerTest : SysuiTestCase() { SystemEventChipAnimationController( context = mContext, statusBarWindowController = sbWindowController, - contentInsetsProvider = insetsProvider, - featureFlags = FakeFeatureFlags(), + contentInsetsProvider = insetsProvider ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventCoordinatorTest.kt index c289ff3bc19d..bbc63f2009b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemEventCoordinatorTest.kt @@ -21,7 +21,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.PendingDisplay -import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.display.domain.interactor.ConnectedDisplayInteractor.State.CONNECTED import com.android.systemui.privacy.PrivacyItemController import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.util.mockito.any @@ -48,7 +48,6 @@ import org.mockito.MockitoAnnotations class SystemEventCoordinatorTest : SysuiTestCase() { private val fakeSystemClock = FakeSystemClock() - private val featureFlags = FakeFeatureFlags() private val testScope = TestScope(UnconfinedTestDispatcher()) private val connectedDisplayInteractor = FakeConnectedDisplayInteractor() @@ -66,7 +65,6 @@ class SystemEventCoordinatorTest : SysuiTestCase() { batteryController, privacyController, context, - featureFlags, TestScope(UnconfinedTestDispatcher()), connectedDisplayInteractor ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt index fee8b82a3038..5f01b5a56e4c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt @@ -26,8 +26,6 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.animation.AnimatorTestRule import com.android.systemui.dump.DumpManager -import com.android.systemui.flags.FakeFeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.statusbar.BatteryStatusChip import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider @@ -76,7 +74,6 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { private lateinit var systemClock: FakeSystemClock private lateinit var chipAnimationController: SystemEventChipAnimationController private lateinit var systemStatusAnimationScheduler: SystemStatusAnimationScheduler - private val fakeFeatureFlags = FakeFeatureFlags() @get:Rule val animatorTestRule = AnimatorTestRule() @@ -84,15 +81,12 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { fun setup() { MockitoAnnotations.initMocks(this) - fakeFeatureFlags.set(Flags.PLUG_IN_STATUS_BAR_CHIP, true) - systemClock = FakeSystemClock() chipAnimationController = SystemEventChipAnimationController( mContext, statusBarWindowController, - statusBarContentInsetProvider, - fakeFeatureFlags + statusBarContentInsetProvider ) // StatusBarContentInsetProvider is mocked. Ensure that it returns some mocked values. |