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

Commit 84de69dc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Status Bar Refactor] Move logic about hiding status bar icons for...

Merge "[Status Bar Refactor] Move logic about hiding status bar icons for bouncer into a separate class and reference that in CollapsedStatusBarFragment." into sc-v2-dev
parents 33bb0ba3 c3f9521f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    private final NotificationIconAreaController mNotificationIconAreaController;
    private final PanelExpansionStateManager mPanelExpansionStateManager;
    private final StatusBarIconController mStatusBarIconController;
    private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;

    private List<String> mBlockedIcons = new ArrayList<>();

@@ -134,6 +135,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            FeatureFlags featureFlags,
            Lazy<Optional<StatusBar>> statusBarOptionalLazy,
            StatusBarIconController statusBarIconController,
            StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
            KeyguardStateController keyguardStateController,
            NetworkController networkController,
            StatusBarStateController statusBarStateController,
@@ -149,6 +151,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        mFeatureFlags = featureFlags;
        mStatusBarOptionalLazy = statusBarOptionalLazy;
        mStatusBarIconController = statusBarIconController;
        mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager;
        mKeyguardStateController = keyguardStateController;
        mNetworkController = networkController;
        mStatusBarStateController = statusBarStateController;
@@ -374,10 +377,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
                        StatusBar::hideStatusBarIconsWhenExpanded).orElse(false)) {
            return true;
        }
        if (statusBarOptional.map(StatusBar::hideStatusBarIconsForBouncer).orElse(false)) {
            return true;
        }
        return false;
        return mStatusBarHideIconsForBouncerManager.getShouldHideStatusBarIconsForBouncer();
    }

    private void hideSystemIconArea(boolean animate) {
+14 −52
Original line number Diff line number Diff line
@@ -340,6 +340,12 @@ public class StatusBar extends SystemUI implements
    void setWindowState(int state) {
        mStatusBarWindowState =  state;
        mStatusBarWindowHidden = state == WINDOW_STATE_HIDDEN;
        mStatusBarHideIconsForBouncerManager.setStatusBarWindowHidden(mStatusBarWindowHidden);
        if (getStatusBarView() != null) {
            // Should #updateHideIconsForBouncer always be called, regardless of whether we have a
            //   status bar view? If so, we can make #updateHideIconsForBouncer private.
            mStatusBarHideIconsForBouncerManager.updateHideIconsForBouncer(/* animate= */ false);
        }
    }

    void acquireGestureWakeLock(long time) {
@@ -359,14 +365,6 @@ public class StatusBar extends SystemUI implements
        return mStatusBarMode;
    }

    boolean getWereIconsJustHidden() {
        return mWereIconsJustHidden;
    }

    void setWereIconsJustHidden(boolean justHidden) {
        mWereIconsJustHidden = justHidden;
    }

    void resendMessage(int msg) {
        mMessageRouter.cancelMessages(msg);
        mMessageRouter.sendMessage(msg);
@@ -509,6 +507,7 @@ public class StatusBar extends SystemUI implements
    private final SystemStatusAnimationScheduler mAnimationScheduler;
    private final StatusBarLocationPublisher mStatusBarLocationPublisher;
    private final StatusBarIconController mStatusBarIconController;
    private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;

    // expanded notifications
    // the sliding/resizing panel within the notification window
@@ -641,10 +640,7 @@ public class StatusBar extends SystemUI implements
    private int mLastLoggedStateFingerprint;
    private boolean mTopHidesStatusBar;
    private boolean mStatusBarWindowHidden;
    private boolean mHideIconsForBouncer;
    private boolean mIsOccluded;
    private boolean mWereIconsJustHidden;
    private boolean mBouncerWasShowingWhenHidden;
    private boolean mIsLaunchingActivityOverLockscreen;

    private final UserSwitcherController mUserSwitcherController;
@@ -777,6 +773,7 @@ public class StatusBar extends SystemUI implements
            SystemStatusAnimationScheduler animationScheduler,
            StatusBarLocationPublisher locationPublisher,
            StatusBarIconController statusBarIconController,
            StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
            LockscreenShadeTransitionController lockscreenShadeTransitionController,
            FeatureFlags featureFlags,
            KeyguardUnlockAnimationController keyguardUnlockAnimationController,
@@ -873,6 +870,7 @@ public class StatusBar extends SystemUI implements
        mAnimationScheduler = animationScheduler;
        mStatusBarLocationPublisher = locationPublisher;
        mStatusBarIconController = statusBarIconController;
        mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager;
        mFeatureFlags = featureFlags;
        mKeyguardUnlockAnimationController = keyguardUnlockAnimationController;
        mMainHandler = mainHandler;
@@ -938,6 +936,7 @@ public class StatusBar extends SystemUI implements
        mDisplay = mContext.getDisplay();
        mDisplayId = mDisplay.getDisplayId();
        updateDisplaySize();
        mStatusBarHideIconsForBouncerManager.setDisplayId(mDisplayId);

        // start old BaseStatusBar.start().
        mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
@@ -1197,6 +1196,7 @@ public class StatusBar extends SystemUI implements
                                mFeatureFlags,
                                () -> Optional.of(this),
                                mStatusBarIconController,
                                mStatusBarHideIconsForBouncerManager,
                                mKeyguardStateController,
                                mNetworkController,
                                mStatusBarStateController,
@@ -1871,7 +1871,7 @@ public class StatusBar extends SystemUI implements
            mNotificationLogger.onPanelExpandedChanged(isExpanded);
        }
        mPanelExpanded = isExpanded;
        updateHideIconsForBouncer(false /* animate */);
        mStatusBarHideIconsForBouncerManager.setPanelExpandedAndTriggerUpdate(isExpanded);
        mNotificationShadeWindowController.setPanelExpanded(isExpanded);
        mStatusBarStateController.setPanelExpanded(isExpanded);
        if (isExpanded && mStatusBarStateController.getState() != StatusBarState.KEYGUARD) {
@@ -1915,46 +1915,8 @@ public class StatusBar extends SystemUI implements

    public void setOccluded(boolean occluded) {
        mIsOccluded = occluded;
        mStatusBarHideIconsForBouncerManager.setIsOccludedAndTriggerUpdate(occluded);
        mScrimController.setKeyguardOccluded(occluded);
        updateHideIconsForBouncer(false /* animate */);
    }

    public boolean hideStatusBarIconsForBouncer() {
        return mHideIconsForBouncer || mWereIconsJustHidden;
    }

    /**
     * Decides if the status bar (clock + notifications + signal cluster) should be visible
     * or not when showing the bouncer.
     *
     * We want to hide it when:
     * • User swipes up on the keyguard
     * • Locked activity that doesn't show a status bar requests the bouncer
     *
     * @param animate should the change of the icons be animated.
     */
    void updateHideIconsForBouncer(boolean animate) {
        boolean hideBecauseApp = mTopHidesStatusBar && mIsOccluded
                && (mStatusBarWindowHidden || mBouncerShowing);
        boolean hideBecauseKeyguard = !mPanelExpanded && !mIsOccluded && mBouncerShowing;
        boolean shouldHideIconsForBouncer = hideBecauseApp || hideBecauseKeyguard;
        if (mHideIconsForBouncer != shouldHideIconsForBouncer) {
            mHideIconsForBouncer = shouldHideIconsForBouncer;
            if (!shouldHideIconsForBouncer && mBouncerWasShowingWhenHidden) {
                // We're delaying the showing, since most of the time the fullscreen app will
                // hide the icons again and we don't want them to fade in and out immediately again.
                mWereIconsJustHidden = true;
                mMainExecutor.executeDelayed(() -> {
                    mWereIconsJustHidden = false;
                    mCommandQueue.recomputeDisableFlags(mDisplayId, true);
                }, 500);
            } else {
                mCommandQueue.recomputeDisableFlags(mDisplayId, animate);
            }
        }
        if (shouldHideIconsForBouncer) {
            mBouncerWasShowingWhenHidden = mBouncerShowing;
        }
    }

    public boolean headsUpShouldBeVisible() {
@@ -3499,7 +3461,7 @@ public class StatusBar extends SystemUI implements
        mKeyguardBypassController.setBouncerShowing(bouncerShowing);
        mPulseExpansionHandler.setBouncerShowing(bouncerShowing);
        setBouncerShowingForStatusBarComponents(bouncerShowing);
        updateHideIconsForBouncer(true /* animate */);
        mStatusBarHideIconsForBouncerManager.setBouncerShowingAndTriggerUpdate(bouncerShowing);
        mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */);
        updateScrimController();
        if (!mBouncerShowing) {
+8 −13
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
    private final SysuiStatusBarStateController mStatusBarStateController;
    private final NotificationShadeWindowView mNotificationShadeWindowView;
    private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
    private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;
    private final PowerManager mPowerManager;
    private final VibratorHelper mVibratorHelper;
    private final Optional<Vibrator> mVibratorOptional;
@@ -132,6 +133,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
            SysuiStatusBarStateController statusBarStateController,
            NotificationShadeWindowView notificationShadeWindowView,
            NotificationStackScrollLayoutController notificationStackScrollLayoutController,
            StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
            PowerManager powerManager,
            VibratorHelper vibratorHelper,
            Optional<Vibrator> vibratorOptional,
@@ -158,6 +160,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
        mStatusBarStateController = statusBarStateController;
        mNotificationShadeWindowView = notificationShadeWindowView;
        mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
        mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager;
        mPowerManager = powerManager;
        mVibratorHelper = vibratorHelper;
        mVibratorOptional = vibratorOptional;
@@ -509,14 +512,8 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {

    @Override
    public void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) {
        mStatusBar.setTopHidesStatusBar(topAppHidesStatusBar);
        if (!topAppHidesStatusBar && mStatusBar.getWereIconsJustHidden()) {
            // Immediately update the icon hidden state, since that should only apply if we're
            // staying fullscreen.
            mStatusBar.setWereIconsJustHidden(false);
            mCommandQueue.recomputeDisableFlags(mDisplayId, true);
        }
        mStatusBar.updateHideIconsForBouncer(true /* animate */);
        mStatusBarHideIconsForBouncerManager
                .setTopAppHidesStatusBarAndTriggerUpdate(topAppHidesStatusBar);
    }

    @Override
@@ -534,14 +531,12 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
            if (StatusBar.DEBUG_WINDOW_STATE) {
                Log.d(StatusBar.TAG, "Status bar " + windowStateToString(state));
            }
            if (mStatusBar.getStatusBarView() != null) {
                if (!showing && mStatusBarStateController.getState() == StatusBarState.SHADE) {
            if (mStatusBar.getStatusBarView() != null
                    && !showing
                    && mStatusBarStateController.getState() == StatusBarState.SHADE) {
                    mNotificationPanelViewController.collapsePanel(
                            false /* animate */, false /* delayed */, 1.0f /* speedUpFactor */);
            }

                mStatusBar.updateHideIconsForBouncer(false /* animate */);
            }
        }

        mStatusBar.updateBubblesVisibility();
+133 −0
Original line number Diff line number Diff line
package com.android.systemui.statusbar.phone

import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.util.concurrency.DelayableExecutor
import java.io.FileDescriptor
import java.io.PrintWriter
import javax.inject.Inject

/**
 * A class that manages if the status bar (clock + notifications + signal cluster) should be visible
 * or not when showing the bouncer.
 *
 * We want to hide it when:
 * • User swipes up on the keyguard
 * • Locked activity that doesn't show a status bar requests the bouncer.
 *
 * [getShouldHideStatusBarIconsForBouncer] is the main exported method for this class. The other
 * methods set state variables that are used in the calculation or manually trigger an update.
 */
@SysUISingleton
class StatusBarHideIconsForBouncerManager @Inject constructor(
    private val commandQueue: CommandQueue,
    @Main private val mainExecutor: DelayableExecutor,
    dumpManager: DumpManager
) : Dumpable {
    // State variables set by external classes.
    private var panelExpanded: Boolean = false
    private var isOccluded: Boolean = false
    private var bouncerShowing: Boolean = false
    private var topAppHidesStatusBar: Boolean = false
    private var statusBarWindowHidden: Boolean = false
    private var displayId: Int = 0

    // State variables calculated internally.
    private var hideIconsForBouncer: Boolean = false
    private var bouncerWasShowingWhenHidden: Boolean = false
    private var wereIconsJustHidden: Boolean = false

    init {
        dumpManager.registerDumpable(this)
    }

    /** Returns true if the status bar icons should be hidden in the bouncer. */
    fun getShouldHideStatusBarIconsForBouncer(): Boolean {
        return hideIconsForBouncer || wereIconsJustHidden
    }

    fun setStatusBarWindowHidden(statusBarWindowHidden: Boolean) {
        this.statusBarWindowHidden = statusBarWindowHidden
    }

    fun setDisplayId(displayId: Int) {
        this.displayId = displayId
    }

    fun setPanelExpandedAndTriggerUpdate(panelExpanded: Boolean) {
        this.panelExpanded = panelExpanded
        updateHideIconsForBouncer(animate = false)
    }

    fun setIsOccludedAndTriggerUpdate(isOccluded: Boolean) {
        this.isOccluded = isOccluded
        updateHideIconsForBouncer(animate = false)
    }

    fun setBouncerShowingAndTriggerUpdate(bouncerShowing: Boolean) {
        this.bouncerShowing = bouncerShowing
        updateHideIconsForBouncer(animate = true)
    }

    fun setTopAppHidesStatusBarAndTriggerUpdate(topAppHidesStatusBar: Boolean) {
        this.topAppHidesStatusBar = topAppHidesStatusBar
        if (!topAppHidesStatusBar && wereIconsJustHidden) {
            // Immediately update the icon hidden state, since that should only apply if we're
            // staying fullscreen.
            wereIconsJustHidden = false
            commandQueue.recomputeDisableFlags(displayId, /* animate= */ true)
        }
        updateHideIconsForBouncer(animate = true)
    }

    /**
     * Updates whether the status bar icons should be hidden in the bouncer. May trigger
     * [commandQueue.recomputeDisableFlags] if the icon visibility status changes.
     */
    fun updateHideIconsForBouncer(animate: Boolean) {
        val hideBecauseApp =
            topAppHidesStatusBar &&
                    isOccluded &&
                    (statusBarWindowHidden || bouncerShowing)
        val hideBecauseKeyguard = !panelExpanded && !isOccluded && bouncerShowing
        val shouldHideIconsForBouncer = hideBecauseApp || hideBecauseKeyguard
        if (hideIconsForBouncer != shouldHideIconsForBouncer) {
            hideIconsForBouncer = shouldHideIconsForBouncer
            if (!shouldHideIconsForBouncer && bouncerWasShowingWhenHidden) {
                // We're delaying the showing, since most of the time the fullscreen app will
                // hide the icons again and we don't want them to fade in and out immediately again.
                wereIconsJustHidden = true
                mainExecutor.executeDelayed(
                    {
                        wereIconsJustHidden = false
                        commandQueue.recomputeDisableFlags(displayId, true)
                    },
                    500
                )
            } else {
                commandQueue.recomputeDisableFlags(displayId, animate)
            }
        }
        if (shouldHideIconsForBouncer) {
            bouncerWasShowingWhenHidden = bouncerShowing
        }
    }

    override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
        pw.println("---- State variables set externally ----")
        pw.println("panelExpanded=$panelExpanded")
        pw.println("isOccluded=$isOccluded")
        pw.println("bouncerShowing=$bouncerShowing")
        pw.println("topAppHideStatusBar=$topAppHidesStatusBar")
        pw.println("statusBarWindowHidden=$statusBarWindowHidden")
        pw.println("displayId=$displayId")

        pw.println("---- State variables calculated internally ----")
        pw.println("hideIconsForBouncer=$hideIconsForBouncer")
        pw.println("bouncerWasShowingWhenHidden=$bouncerWasShowingWhenHidden")
        pw.println("wereIconsJustHidden=$wereIconsJustHidden")
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
@@ -224,6 +225,7 @@ public interface StatusBarPhoneModule {
            SystemStatusAnimationScheduler animationScheduler,
            StatusBarLocationPublisher locationPublisher,
            StatusBarIconController statusBarIconController,
            StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
            LockscreenShadeTransitionController transitionController,
            FeatureFlags featureFlags,
            KeyguardUnlockAnimationController keyguardUnlockAnimationController,
@@ -322,6 +324,7 @@ public interface StatusBarPhoneModule {
                animationScheduler,
                locationPublisher,
                statusBarIconController,
                statusBarHideIconsForBouncerManager,
                transitionController,
                featureFlags,
                keyguardUnlockAnimationController,
Loading