Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba0c161e authored by Justin Weir's avatar Justin Weir
Browse files

Merge PanelEventsEmitter into ShadeExpansionStateManager

The purpose is to further consolidate and standardize how changes
in the shade state are propogated throughout the system. The change
renames NotifPanelEvents, merges the PanelEventsEmmitter impl into
ShadeExpansionStateManager, and deletes the FakeNotifPanelEvents impl,
which is unnecessary given the simplicity of ShadeExpansionStateManager.

Bug: 254512692
Test: atest and manual verification
Change-Id: I4d3e580eb2e8838b84b32fd1f1cdb05098db49ff
parent 3c10ee01
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -43,7 +43,8 @@ import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
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.CrossFadeHelper
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.SysuiStatusBarStateController
@@ -96,7 +97,7 @@ constructor(
    private val dreamOverlayStateController: DreamOverlayStateController,
    private val dreamOverlayStateController: DreamOverlayStateController,
    configurationController: ConfigurationController,
    configurationController: ConfigurationController,
    wakefulnessLifecycle: WakefulnessLifecycle,
    wakefulnessLifecycle: WakefulnessLifecycle,
    panelEventsEvents: NotifPanelEvents,
    panelEventsEvents: ShadeStateEvents,
    private val secureSettings: SecureSettings,
    private val secureSettings: SecureSettings,
    @Main private val handler: Handler,
    @Main private val handler: Handler,
) {
) {
@@ -534,8 +535,8 @@ constructor(
            mediaHosts.forEach { it?.updateViewVisibility() }
            mediaHosts.forEach { it?.updateViewVisibility() }
        }
        }


        panelEventsEvents.registerListener(
        panelEventsEvents.addShadeStateEventsListener(
            object : NotifPanelEvents.Listener {
            object : ShadeStateEventsListener {
                override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
                override fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {
                    skipQqsOnExpansion = isExpandImmediateEnabled
                    skipQqsOnExpansion = isExpandImmediateEnabled
                    updateDesiredLocation()
                    updateDesiredLocation()
+3 −46
Original line number Original line Diff line number Diff line
@@ -135,7 +135,6 @@ import com.android.systemui.biometrics.AuthController;
import com.android.systemui.camera.CameraGestureHelper;
import com.android.systemui.camera.CameraGestureHelper;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.classifier.FalsingCollector;
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.DisplayId;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeLog;
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.unfold.SysUIUnfoldComponent;
import com.android.systemui.util.Compile;
import com.android.systemui.util.Compile;
import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.ListenerSet;
import com.android.systemui.util.Utils;
import com.android.systemui.util.Utils;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.util.time.SystemClock;
import com.android.wm.shell.animation.FlingAnimationUtils;
import com.android.wm.shell.animation.FlingAnimationUtils;
@@ -372,7 +370,6 @@ public final class NotificationPanelViewController {
    private final TapAgainViewController mTapAgainViewController;
    private final TapAgainViewController mTapAgainViewController;
    private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController;
    private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController;
    private final RecordingController mRecordingController;
    private final RecordingController mRecordingController;
    private final PanelEventsEmitter mPanelEventsEmitter;
    private final boolean mVibrateOnOpening;
    private final boolean mVibrateOnOpening;
    private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
    private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
    private final FlingAnimationUtils mFlingAnimationUtilsClosing;
    private final FlingAnimationUtils mFlingAnimationUtilsClosing;
@@ -880,7 +877,6 @@ public final class NotificationPanelViewController {
            Provider<KeyguardBottomAreaViewController> keyguardBottomAreaViewControllerProvider,
            Provider<KeyguardBottomAreaViewController> keyguardBottomAreaViewControllerProvider,
            KeyguardUnlockAnimationController keyguardUnlockAnimationController,
            KeyguardUnlockAnimationController keyguardUnlockAnimationController,
            NotificationListContainer notificationListContainer,
            NotificationListContainer notificationListContainer,
            PanelEventsEmitter panelEventsEmitter,
            NotificationStackSizeCalculator notificationStackSizeCalculator,
            NotificationStackSizeCalculator notificationStackSizeCalculator,
            UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
            UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
            ShadeTransitionController shadeTransitionController,
            ShadeTransitionController shadeTransitionController,
@@ -993,7 +989,6 @@ public final class NotificationPanelViewController {
        mMediaDataManager = mediaDataManager;
        mMediaDataManager = mediaDataManager;
        mTapAgainViewController = tapAgainViewController;
        mTapAgainViewController = tapAgainViewController;
        mSysUiState = sysUiState;
        mSysUiState = sysUiState;
        mPanelEventsEmitter = panelEventsEmitter;
        pulseExpansionHandler.setPulseExpandAbortListener(() -> {
        pulseExpansionHandler.setPulseExpandAbortListener(() -> {
            if (mQs != null) {
            if (mQs != null) {
                mQs.animateHeaderSlidingOut();
                mQs.animateHeaderSlidingOut();
@@ -1948,7 +1943,7 @@ public final class NotificationPanelViewController {
    private void setQsExpandImmediate(boolean expandImmediate) {
    private void setQsExpandImmediate(boolean expandImmediate) {
        if (expandImmediate != mQsExpandImmediate) {
        if (expandImmediate != mQsExpandImmediate) {
            mQsExpandImmediate = expandImmediate;
            mQsExpandImmediate = expandImmediate;
            mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate);
            mShadeExpansionStateManager.notifyExpandImmediateChange(expandImmediate);
        }
        }
    }
    }


@@ -3889,7 +3884,7 @@ public final class NotificationPanelViewController {
        boolean wasRunning = mIsLaunchAnimationRunning;
        boolean wasRunning = mIsLaunchAnimationRunning;
        mIsLaunchAnimationRunning = running;
        mIsLaunchAnimationRunning = running;
        if (wasRunning != mIsLaunchAnimationRunning) {
        if (wasRunning != mIsLaunchAnimationRunning) {
            mPanelEventsEmitter.notifyLaunchingActivityChanged(running);
            mShadeExpansionStateManager.notifyLaunchingActivityChanged(running);
        }
        }
    }
    }


@@ -3898,7 +3893,7 @@ public final class NotificationPanelViewController {
        boolean wasClosing = isClosing();
        boolean wasClosing = isClosing();
        mClosing = isClosing;
        mClosing = isClosing;
        if (wasClosing != isClosing) {
        if (wasClosing != isClosing) {
            mPanelEventsEmitter.notifyPanelCollapsingChanged(isClosing);
            mShadeExpansionStateManager.notifyPanelCollapsingChanged(isClosing);
        }
        }
        mAmbientState.setIsClosing(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. */
    /** Handles MotionEvents for the Shade. */
    public final class TouchHandler implements View.OnTouchListener {
    public final class TouchHandler implements View.OnTouchListener {
        private long mLastTouchDownTime = -1L;
        private long mLastTouchDownTime = -1L;
+3 −4
Original line number Original line Diff line number Diff line
@@ -21,10 +21,9 @@ import com.android.systemui.dagger.SysUISingleton;
import dagger.Binds;
import dagger.Binds;
import dagger.Module;
import dagger.Module;


/** Provides a {@link NotifPanelEvents} in {@link SysUISingleton} scope. */
/** Provides a {@link ShadeStateEvents} in {@link SysUISingleton} scope. */
@Module
@Module
public abstract class NotifPanelEventsModule {
public abstract class ShadeEventsModule {
    @Binds
    @Binds
    abstract NotifPanelEvents bindPanelEvents(
    abstract ShadeStateEvents bindShadeEvents(ShadeExpansionStateManager impl);
            NotificationPanelViewController.PanelEventsEmitter impl);
}
}
+29 −1
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.IntDef
import android.util.Log
import android.util.Log
import androidx.annotation.FloatRange
import androidx.annotation.FloatRange
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.shade.ShadeStateEvents.ShadeStateEventsListener
import com.android.systemui.util.Compile
import com.android.systemui.util.Compile
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList
import javax.inject.Inject
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.
 * TODO(b/200063118): Make this class the one source of truth for the state of panel expansion.
 */
 */
@SysUISingleton
@SysUISingleton
class ShadeExpansionStateManager @Inject constructor() {
class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {


    private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
    private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
    private val qsExpansionListeners = CopyOnWriteArrayList<ShadeQsExpansionListener>()
    private val qsExpansionListeners = CopyOnWriteArrayList<ShadeQsExpansionListener>()
    private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()
    private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()
    private val shadeStateEventsListeners = CopyOnWriteArrayList<ShadeStateEventsListener>()


    @PanelState private var state: Int = STATE_CLOSED
    @PanelState private var state: Int = STATE_CLOSED
    @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
    @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
@@ -79,6 +81,14 @@ class ShadeExpansionStateManager @Inject constructor() {
        stateListeners.remove(listener)
        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. */
    /** Returns true if the panel is currently closed and false otherwise. */
    fun isClosed(): Boolean = state == STATE_CLOSED
    fun isClosed(): Boolean = state == STATE_CLOSED


@@ -162,6 +172,24 @@ class ShadeExpansionStateManager @Inject constructor() {
        stateListeners.forEach { it.onPanelStateChanged(state) }
        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) {
    private fun debugLog(msg: String) {
        if (!DEBUG) return
        if (!DEBUG) return
        Log.v(TAG, msg)
        Log.v(TAG, msg)
+10 −13
Original line number Original line Diff line number Diff line
@@ -17,26 +17,24 @@
package com.android.systemui.shade
package com.android.systemui.shade


/** Provides certain notification panel events. */
/** Provides certain notification panel events. */
interface NotifPanelEvents {
interface ShadeStateEvents {


    /** Registers callbacks to be invoked when notification panel events occur. */
    /** Registers callbacks to be invoked when notification panel events occur. */
    fun registerListener(listener: Listener)
    fun addShadeStateEventsListener(listener: ShadeStateEventsListener)


    /** Unregisters callbacks previously registered via [registerListener]  */
    /** Unregisters callbacks previously registered via [addShadeStateEventsListener] */
    fun unregisterListener(listener: Listener)
    fun removeShadeStateEventsListener(listener: ShadeStateEventsListener)


    /** Callbacks for certain notification panel events. */
    /** Callbacks for certain notification panel events. */
    interface Listener {
    interface ShadeStateEventsListener {


        /** Invoked when the notification panel starts or stops collapsing. */
        /** Invoked when the notification panel starts or stops collapsing. */
        @JvmDefault
        @JvmDefault fun onPanelCollapsingChanged(isCollapsing: Boolean) {}
        fun onPanelCollapsingChanged(isCollapsing: Boolean) {}


        /**
        /**
         * Invoked when the notification panel starts or stops launching an [android.app.Activity].
         * Invoked when the notification panel starts or stops launching an [android.app.Activity].
         */
         */
        @JvmDefault
        @JvmDefault fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {}
        fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {}


        /**
        /**
         * Invoked when the "expand immediate" attribute changes.
         * 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
         * Another example is when full QS is showing, and we swipe up from the bottom. Instead of
         * going to QQS, the panel fully collapses.
         * going to QQS, the panel fully collapses.
         */
         */
        @JvmDefault
        @JvmDefault fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {}
        fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {}
    }
    }
}
}
Loading