Merge "Merge PanelEventsEmitter into ShadeExpansionStateManager" into tm-qpr-dev

This commit is contained in:
Justin Weir
2022-10-27 15:11:11 +00:00
committed by Android (Google) Code Review
11 changed files with 69 additions and 125 deletions

View File

@@ -43,7 +43,8 @@ import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.shade.NotifPanelEvents
import com.android.systemui.shade.ShadeStateEvents
import com.android.systemui.shade.ShadeStateEvents.ShadeStateEventsListener
import com.android.systemui.statusbar.CrossFadeHelper
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
@@ -96,7 +97,7 @@ constructor(
private val dreamOverlayStateController: DreamOverlayStateController,
configurationController: ConfigurationController,
wakefulnessLifecycle: WakefulnessLifecycle,
panelEventsEvents: NotifPanelEvents,
panelEventsEvents: ShadeStateEvents,
private val secureSettings: SecureSettings,
@Main private val handler: Handler,
) {
@@ -534,8 +535,8 @@ constructor(
mediaHosts.forEach { it?.updateViewVisibility() }
}
panelEventsEvents.registerListener(
object : NotifPanelEvents.Listener {
panelEventsEvents.addShadeStateEventsListener(
object : ShadeStateEventsListener {
override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
skipQqsOnExpansion = isExpandImmediateEnabled
updateDesiredLocation()

View File

@@ -135,7 +135,6 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.camera.CameraGestureHelper;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.DisplayId;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeLog;
@@ -231,7 +230,6 @@ import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.util.Compile;
import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.ListenerSet;
import com.android.systemui.util.Utils;
import com.android.systemui.util.time.SystemClock;
import com.android.wm.shell.animation.FlingAnimationUtils;
@@ -372,7 +370,6 @@ public final class NotificationPanelViewController {
private final TapAgainViewController mTapAgainViewController;
private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController;
private final RecordingController mRecordingController;
private final PanelEventsEmitter mPanelEventsEmitter;
private final boolean mVibrateOnOpening;
private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
private final FlingAnimationUtils mFlingAnimationUtilsClosing;
@@ -880,7 +877,6 @@ public final class NotificationPanelViewController {
Provider<KeyguardBottomAreaViewController> keyguardBottomAreaViewControllerProvider,
KeyguardUnlockAnimationController keyguardUnlockAnimationController,
NotificationListContainer notificationListContainer,
PanelEventsEmitter panelEventsEmitter,
NotificationStackSizeCalculator notificationStackSizeCalculator,
UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
ShadeTransitionController shadeTransitionController,
@@ -993,7 +989,6 @@ public final class NotificationPanelViewController {
mMediaDataManager = mediaDataManager;
mTapAgainViewController = tapAgainViewController;
mSysUiState = sysUiState;
mPanelEventsEmitter = panelEventsEmitter;
pulseExpansionHandler.setPulseExpandAbortListener(() -> {
if (mQs != null) {
mQs.animateHeaderSlidingOut();
@@ -1948,7 +1943,7 @@ public final class NotificationPanelViewController {
private void setQsExpandImmediate(boolean expandImmediate) {
if (expandImmediate != mQsExpandImmediate) {
mQsExpandImmediate = expandImmediate;
mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate);
mShadeExpansionStateManager.notifyExpandImmediateChange(expandImmediate);
}
}
@@ -3889,7 +3884,7 @@ public final class NotificationPanelViewController {
boolean wasRunning = mIsLaunchAnimationRunning;
mIsLaunchAnimationRunning = running;
if (wasRunning != mIsLaunchAnimationRunning) {
mPanelEventsEmitter.notifyLaunchingActivityChanged(running);
mShadeExpansionStateManager.notifyLaunchingActivityChanged(running);
}
}
@@ -3898,7 +3893,7 @@ public final class NotificationPanelViewController {
boolean wasClosing = isClosing();
mClosing = isClosing;
if (wasClosing != isClosing) {
mPanelEventsEmitter.notifyPanelCollapsingChanged(isClosing);
mShadeExpansionStateManager.notifyPanelCollapsingChanged(isClosing);
}
mAmbientState.setIsClosing(isClosing);
}
@@ -5921,44 +5916,6 @@ public final class NotificationPanelViewController {
}
}
@SysUISingleton
static class PanelEventsEmitter implements NotifPanelEvents {
private final ListenerSet<Listener> mListeners = new ListenerSet<>();
@Inject
PanelEventsEmitter() {
}
@Override
public void registerListener(@androidx.annotation.NonNull @NonNull Listener listener) {
mListeners.addIfAbsent(listener);
}
@Override
public void unregisterListener(@androidx.annotation.NonNull @NonNull Listener listener) {
mListeners.remove(listener);
}
private void notifyLaunchingActivityChanged(boolean isLaunchingActivity) {
for (Listener cb : mListeners) {
cb.onLaunchingActivityChanged(isLaunchingActivity);
}
}
private void notifyPanelCollapsingChanged(boolean isCollapsing) {
for (NotifPanelEvents.Listener cb : mListeners) {
cb.onPanelCollapsingChanged(isCollapsing);
}
}
private void notifyExpandImmediateChange(boolean expandImmediateEnabled) {
for (NotifPanelEvents.Listener cb : mListeners) {
cb.onExpandImmediateChanged(expandImmediateEnabled);
}
}
}
/** Handles MotionEvents for the Shade. */
public final class TouchHandler implements View.OnTouchListener {
private long mLastTouchDownTime = -1L;

View File

@@ -21,10 +21,9 @@ import com.android.systemui.dagger.SysUISingleton;
import dagger.Binds;
import dagger.Module;
/** Provides a {@link NotifPanelEvents} in {@link SysUISingleton} scope. */
/** Provides a {@link ShadeStateEvents} in {@link SysUISingleton} scope. */
@Module
public abstract class NotifPanelEventsModule {
public abstract class ShadeEventsModule {
@Binds
abstract NotifPanelEvents bindPanelEvents(
NotificationPanelViewController.PanelEventsEmitter impl);
abstract ShadeStateEvents bindShadeEvents(ShadeExpansionStateManager impl);
}

View File

@@ -20,6 +20,7 @@ import android.annotation.IntDef
import android.util.Log
import androidx.annotation.FloatRange
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.shade.ShadeStateEvents.ShadeStateEventsListener
import com.android.systemui.util.Compile
import java.util.concurrent.CopyOnWriteArrayList
import javax.inject.Inject
@@ -30,11 +31,12 @@ import javax.inject.Inject
* TODO(b/200063118): Make this class the one source of truth for the state of panel expansion.
*/
@SysUISingleton
class ShadeExpansionStateManager @Inject constructor() {
class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {
private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
private val qsExpansionListeners = CopyOnWriteArrayList<ShadeQsExpansionListener>()
private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()
private val shadeStateEventsListeners = CopyOnWriteArrayList<ShadeStateEventsListener>()
@PanelState private var state: Int = STATE_CLOSED
@FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
@@ -79,6 +81,14 @@ class ShadeExpansionStateManager @Inject constructor() {
stateListeners.remove(listener)
}
override fun addShadeStateEventsListener(listener: ShadeStateEventsListener) {
shadeStateEventsListeners.addIfAbsent(listener)
}
override fun removeShadeStateEventsListener(listener: ShadeStateEventsListener) {
shadeStateEventsListeners.remove(listener)
}
/** Returns true if the panel is currently closed and false otherwise. */
fun isClosed(): Boolean = state == STATE_CLOSED
@@ -162,6 +172,24 @@ class ShadeExpansionStateManager @Inject constructor() {
stateListeners.forEach { it.onPanelStateChanged(state) }
}
fun notifyLaunchingActivityChanged(isLaunchingActivity: Boolean) {
for (cb in shadeStateEventsListeners) {
cb.onLaunchingActivityChanged(isLaunchingActivity)
}
}
fun notifyPanelCollapsingChanged(isCollapsing: Boolean) {
for (cb in shadeStateEventsListeners) {
cb.onPanelCollapsingChanged(isCollapsing)
}
}
fun notifyExpandImmediateChange(expandImmediateEnabled: Boolean) {
for (cb in shadeStateEventsListeners) {
cb.onExpandImmediateChanged(expandImmediateEnabled)
}
}
private fun debugLog(msg: String) {
if (!DEBUG) return
Log.v(TAG, msg)

View File

@@ -16,27 +16,25 @@
package com.android.systemui.shade
/** Provides certain notification panel events. */
interface NotifPanelEvents {
/** Provides certain notification panel events. */
interface ShadeStateEvents {
/** Registers callbacks to be invoked when notification panel events occur. */
fun registerListener(listener: Listener)
/** Registers callbacks to be invoked when notification panel events occur. */
fun addShadeStateEventsListener(listener: ShadeStateEventsListener)
/** Unregisters callbacks previously registered via [registerListener] */
fun unregisterListener(listener: Listener)
/** Unregisters callbacks previously registered via [addShadeStateEventsListener] */
fun removeShadeStateEventsListener(listener: ShadeStateEventsListener)
/** Callbacks for certain notification panel events. */
interface Listener {
interface ShadeStateEventsListener {
/** Invoked when the notification panel starts or stops collapsing. */
@JvmDefault
fun onPanelCollapsingChanged(isCollapsing: Boolean) {}
@JvmDefault fun onPanelCollapsingChanged(isCollapsing: Boolean) {}
/**
* Invoked when the notification panel starts or stops launching an [android.app.Activity].
*/
@JvmDefault
fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {}
@JvmDefault fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {}
/**
* Invoked when the "expand immediate" attribute changes.
@@ -47,7 +45,6 @@ interface NotifPanelEvents {
* Another example is when full QS is showing, and we swipe up from the bottom. Instead of
* going to QQS, the panel fully collapses.
*/
@JvmDefault
fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {}
@JvmDefault fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {}
}
}

View File

@@ -28,7 +28,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shade.NotifPanelEvents;
import com.android.systemui.shade.ShadeStateEvents;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
@@ -55,12 +55,12 @@ import javax.inject.Inject;
// TODO(b/204468557): Move to @CoordinatorScope
@SysUISingleton
public class VisualStabilityCoordinator implements Coordinator, Dumpable,
NotifPanelEvents.Listener {
ShadeStateEvents.ShadeStateEventsListener {
public static final String TAG = "VisualStability";
public static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.VERBOSE);
private final DelayableExecutor mDelayableExecutor;
private final HeadsUpManager mHeadsUpManager;
private final NotifPanelEvents mNotifPanelEvents;
private final ShadeStateEvents mShadeStateEvents;
private final StatusBarStateController mStatusBarStateController;
private final VisualStabilityProvider mVisualStabilityProvider;
private final WakefulnessLifecycle mWakefulnessLifecycle;
@@ -92,7 +92,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
DelayableExecutor delayableExecutor,
DumpManager dumpManager,
HeadsUpManager headsUpManager,
NotifPanelEvents notifPanelEvents,
ShadeStateEvents shadeStateEvents,
StatusBarStateController statusBarStateController,
VisualStabilityProvider visualStabilityProvider,
WakefulnessLifecycle wakefulnessLifecycle) {
@@ -101,7 +101,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
mWakefulnessLifecycle = wakefulnessLifecycle;
mStatusBarStateController = statusBarStateController;
mDelayableExecutor = delayableExecutor;
mNotifPanelEvents = notifPanelEvents;
mShadeStateEvents = shadeStateEvents;
dumpManager.registerDumpable(this);
}
@@ -114,7 +114,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
mPulsing = mStatusBarStateController.isPulsing();
mNotifPanelEvents.registerListener(this);
mShadeStateEvents.addShadeStateEventsListener(this);
pipeline.setVisualStabilityManager(mNotifStabilityManager);
}

View File

@@ -32,8 +32,8 @@ import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.settings.UserContextProvider;
import com.android.systemui.shade.NotifPanelEventsModule;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.ShadeEventsModule;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
@@ -93,7 +93,7 @@ import dagger.Provides;
@Module(includes = {
CoordinatorsModule.class,
KeyguardNotificationVisibilityProviderModule.class,
NotifPanelEventsModule.class,
ShadeEventsModule.class,
NotifPipelineChoreographerModule.class,
NotificationSectionHeadersModule.class,
})

View File

@@ -31,7 +31,7 @@ import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.shade.testing.FakeNotifPanelEvents
import com.android.systemui.shade.ShadeExpansionStateManager
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.phone.KeyguardBypassController
@@ -89,7 +89,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
private lateinit var mediaHierarchyManager: MediaHierarchyManager
private lateinit var mediaFrame: ViewGroup
private val configurationController = FakeConfigurationController()
private val notifPanelEvents = FakeNotifPanelEvents()
private val notifPanelEvents = ShadeExpansionStateManager()
private val settings = FakeSettings()
private lateinit var testableLooper: TestableLooper
private lateinit var fakeHandler: FakeHandler
@@ -346,7 +346,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
@Test
fun isCurrentlyInGuidedTransformation_hostsVisible_expandImmediateEnabled_returnsFalse() {
notifPanelEvents.changeExpandImmediate(expandImmediate = true)
notifPanelEvents.notifyExpandImmediateChange(true)
goToLockscreen()
enterGuidedTransformation()
whenever(lockHost.visible).thenReturn(true)

View File

@@ -438,8 +438,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
mMainHandler = new Handler(Looper.getMainLooper());
NotificationPanelViewController.PanelEventsEmitter panelEventsEmitter =
new NotificationPanelViewController.PanelEventsEmitter();
mNotificationPanelViewController = new NotificationPanelViewController(
mView,
@@ -495,7 +493,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
() -> mKeyguardBottomAreaViewController,
mKeyguardUnlockAnimationController,
mNotificationListContainer,
panelEventsEmitter,
mNotificationStackSizeCalculator,
mUnlockedScreenOffAnimationController,
mShadeTransitionController,

View File

@@ -1,37 +0,0 @@
/*
* Copyright (C) 2022 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.shade.testing
import com.android.systemui.shade.NotifPanelEvents
/** Fake implementation of [NotifPanelEvents] for testing. */
class FakeNotifPanelEvents : NotifPanelEvents {
private val listeners = mutableListOf<NotifPanelEvents.Listener>()
override fun registerListener(listener: NotifPanelEvents.Listener) {
listeners.add(listener)
}
override fun unregisterListener(listener: NotifPanelEvents.Listener) {
listeners.remove(listener)
}
fun changeExpandImmediate(expandImmediate: Boolean) {
listeners.forEach { it.onExpandImmediateChanged(expandImmediate) }
}
}

View File

@@ -36,7 +36,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shade.NotifPanelEvents;
import com.android.systemui.shade.ShadeStateEvents;
import com.android.systemui.shade.ShadeStateEvents.ShadeStateEventsListener;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
@@ -71,12 +72,12 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
@Mock private StatusBarStateController mStatusBarStateController;
@Mock private Pluggable.PluggableListener<NotifStabilityManager> mInvalidateListener;
@Mock private HeadsUpManager mHeadsUpManager;
@Mock private NotifPanelEvents mNotifPanelEvents;
@Mock private ShadeStateEvents mShadeStateEvents;
@Mock private VisualStabilityProvider mVisualStabilityProvider;
@Captor private ArgumentCaptor<WakefulnessLifecycle.Observer> mWakefulnessObserverCaptor;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
@Captor private ArgumentCaptor<NotifPanelEvents.Listener> mNotifPanelEventsCallbackCaptor;
@Captor private ArgumentCaptor<ShadeStateEventsListener> mNotifPanelEventsCallbackCaptor;
@Captor private ArgumentCaptor<NotifStabilityManager> mNotifStabilityManagerCaptor;
private FakeSystemClock mFakeSystemClock = new FakeSystemClock();
@@ -84,7 +85,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
private WakefulnessLifecycle.Observer mWakefulnessObserver;
private StatusBarStateController.StateListener mStatusBarStateListener;
private NotifPanelEvents.Listener mNotifPanelEventsCallback;
private ShadeStateEvents.ShadeStateEventsListener mNotifPanelEventsCallback;
private NotifStabilityManager mNotifStabilityManager;
private NotificationEntry mEntry;
private GroupEntry mGroupEntry;
@@ -97,7 +98,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
mFakeExecutor,
mDumpManager,
mHeadsUpManager,
mNotifPanelEvents,
mShadeStateEvents,
mStatusBarStateController,
mVisualStabilityProvider,
mWakefulnessLifecycle);
@@ -111,7 +112,8 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
verify(mStatusBarStateController).addCallback(mSBStateListenerCaptor.capture());
mStatusBarStateListener = mSBStateListenerCaptor.getValue();
verify(mNotifPanelEvents).registerListener(mNotifPanelEventsCallbackCaptor.capture());
verify(mShadeStateEvents).addShadeStateEventsListener(
mNotifPanelEventsCallbackCaptor.capture());
mNotifPanelEventsCallback = mNotifPanelEventsCallbackCaptor.getValue();
verify(mNotifPipeline).setVisualStabilityManager(mNotifStabilityManagerCaptor.capture());