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

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

Merge "Remove expensive queries for lock task mode (screen pinning)" into tm-qpr-dev

parents 0e0d95d6 e1054919
Loading
Loading
Loading
Loading
+0 −11
Original line number Original line Diff line number Diff line
@@ -282,17 +282,6 @@ public class ActivityManagerWrapper {
        }
        }
    }
    }


    /**
     * @return whether screen pinning is active.
     */
    public boolean isScreenPinningActive() {
        try {
            return getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED;
        } catch (RemoteException e) {
            return false;
        }
    }

    /**
    /**
     * @return whether screen pinning is enabled.
     * @return whether screen pinning is enabled.
     */
     */
+53 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.shared.system;
package com.android.systemui.shared.system;


import android.annotation.NonNull;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityTaskManager;
import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.app.TaskStackListener;
@@ -27,6 +28,8 @@ import android.os.Trace;
import android.util.Log;
import android.util.Log;
import android.window.TaskSnapshot;
import android.window.TaskSnapshot;


import androidx.annotation.VisibleForTesting;

import com.android.internal.os.SomeArgs;
import com.android.internal.os.SomeArgs;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.model.ThumbnailData;


@@ -43,14 +46,50 @@ public class TaskStackChangeListeners {


    private final Impl mImpl;
    private final Impl mImpl;


    /**
     * Proxies calls to the given handler callback synchronously for testing purposes.
     */
    private static class TestSyncHandler extends Handler {
        private Handler.Callback mCb;

        public TestSyncHandler() {
            super(Looper.getMainLooper());
        }

        public void setCallback(Handler.Callback cb) {
            mCb = cb;
        }

        @Override
        public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
            return mCb.handleMessage(msg);
        }
    }

    private TaskStackChangeListeners() {
    private TaskStackChangeListeners() {
        mImpl = new Impl(Looper.getMainLooper());
        mImpl = new Impl(Looper.getMainLooper());
    }
    }


    private TaskStackChangeListeners(Handler h) {
        mImpl = new Impl(h);
    }

    public static TaskStackChangeListeners getInstance() {
    public static TaskStackChangeListeners getInstance() {
        return INSTANCE;
        return INSTANCE;
    }
    }


    /**
     * Returns an instance of the listeners that can be called upon synchronously for testsing
     * purposes.
     */
    @VisibleForTesting
    public static TaskStackChangeListeners getTestInstance() {
        TestSyncHandler h = new TestSyncHandler();
        TaskStackChangeListeners l = new TaskStackChangeListeners(h);
        h.setCallback(l.mImpl);
        return l;
    }

    /**
    /**
     * Registers a task stack listener with the system.
     * Registers a task stack listener with the system.
     * This should be called on the main thread.
     * This should be called on the main thread.
@@ -71,7 +110,15 @@ public class TaskStackChangeListeners {
        }
        }
    }
    }


    private static class Impl extends TaskStackListener implements Handler.Callback {
    /**
     * Returns an instance of the listener to call upon from tests.
     */
    @VisibleForTesting
    public TaskStackListener getListenerImpl() {
        return mImpl;
    }

    private class Impl extends TaskStackListener implements Handler.Callback {


        private static final int ON_TASK_STACK_CHANGED = 1;
        private static final int ON_TASK_STACK_CHANGED = 1;
        private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
        private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
@@ -104,10 +151,14 @@ public class TaskStackChangeListeners {
        private final Handler mHandler;
        private final Handler mHandler;
        private boolean mRegistered;
        private boolean mRegistered;


        Impl(Looper looper) {
        private Impl(Looper looper) {
            mHandler = new Handler(looper, this);
            mHandler = new Handler(looper, this);
        }
        }


        private Impl(Handler handler) {
            mHandler = handler;
        }

        public void addListener(TaskStackChangeListener listener) {
        public void addListener(TaskStackChangeListener listener) {
            synchronized (mTaskStackListeners) {
            synchronized (mTaskStackListeners) {
                mTaskStackListeners.add(listener);
                mTaskStackListeners.add(listener);
+27 −8
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.navigationbar;
package com.android.systemui.navigationbar;


import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN;
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
@@ -44,6 +45,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
@@ -136,9 +138,10 @@ import com.android.systemui.shared.navigationbar.RegionSamplingHelper;
import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.rotation.RotationButton;
import com.android.systemui.shared.rotation.RotationButton;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -252,6 +255,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    private final AutoHideController.Factory mAutoHideControllerFactory;
    private final AutoHideController.Factory mAutoHideControllerFactory;
    private final Optional<TelecomManager> mTelecomManagerOptional;
    private final Optional<TelecomManager> mTelecomManagerOptional;
    private final InputMethodManager mInputMethodManager;
    private final InputMethodManager mInputMethodManager;
    private final TaskStackChangeListeners mTaskStackChangeListeners;


    @VisibleForTesting
    @VisibleForTesting
    public int mDisplayId;
    public int mDisplayId;
@@ -488,6 +492,18 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
            }
            }
    };
    };


    private boolean mScreenPinningActive = false;
    private final TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() {
        @Override
        public void onLockTaskModeChanged(int mode) {
            mScreenPinningActive = (mode == LOCK_TASK_MODE_PINNED);
            mSysUiFlagsContainer.setFlag(SYSUI_STATE_SCREEN_PINNING, mScreenPinningActive)
                    .commitUpdate(mDisplayId);
            mView.setInScreenPinning(mScreenPinningActive);
            updateScreenPinningGestures();
        }
    };

    @Inject
    @Inject
    NavigationBar(
    NavigationBar(
            NavigationBarView navigationBarView,
            NavigationBarView navigationBarView,
@@ -529,7 +545,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
            EdgeBackGestureHandler edgeBackGestureHandler,
            EdgeBackGestureHandler edgeBackGestureHandler,
            Optional<BackAnimation> backAnimation,
            Optional<BackAnimation> backAnimation,
            UserContextProvider userContextProvider,
            UserContextProvider userContextProvider,
            WakefulnessLifecycle wakefulnessLifecycle) {
            WakefulnessLifecycle wakefulnessLifecycle,
            TaskStackChangeListeners taskStackChangeListeners) {
        super(navigationBarView);
        super(navigationBarView);
        mFrame = navigationBarFrame;
        mFrame = navigationBarFrame;
        mContext = context;
        mContext = context;
@@ -568,6 +585,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        mInputMethodManager = inputMethodManager;
        mInputMethodManager = inputMethodManager;
        mUserContextProvider = userContextProvider;
        mUserContextProvider = userContextProvider;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mTaskStackChangeListeners = taskStackChangeListeners;


        mNavColorSampleMargin = getResources()
        mNavColorSampleMargin = getResources()
                .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
                .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
@@ -676,6 +694,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        mCommandQueue.recomputeDisableFlags(mDisplayId, false);
        mCommandQueue.recomputeDisableFlags(mDisplayId, false);


        mNotificationShadeDepthController.addListener(mDepthListener);
        mNotificationShadeDepthController.addListener(mDepthListener);
        mTaskStackChangeListeners.registerTaskStackListener(mTaskStackListener);
    }
    }


    public void destroyView() {
    public void destroyView() {
@@ -689,6 +708,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        mNotificationShadeDepthController.removeListener(mDepthListener);
        mNotificationShadeDepthController.removeListener(mDepthListener);


        mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
        mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
        mTaskStackChangeListeners.unregisterTaskStackListener(mTaskStackListener);
    }
    }


    @Override
    @Override
@@ -990,6 +1010,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        pw.println("  mTransientShown=" + mTransientShown);
        pw.println("  mTransientShown=" + mTransientShown);
        pw.println("  mTransientShownFromGestureOnSystemBar="
        pw.println("  mTransientShownFromGestureOnSystemBar="
                + mTransientShownFromGestureOnSystemBar);
                + mTransientShownFromGestureOnSystemBar);
        pw.println("  mScreenPinningActive=" + mScreenPinningActive);
        dumpBarTransitions(pw, "mNavigationBarView", getBarTransitions());
        dumpBarTransitions(pw, "mNavigationBarView", getBarTransitions());


        pw.println("  mOrientedHandleSamplingRegion: " + mOrientedHandleSamplingRegion);
        pw.println("  mOrientedHandleSamplingRegion: " + mOrientedHandleSamplingRegion);
@@ -1213,10 +1234,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements


    private void updateScreenPinningGestures() {
    private void updateScreenPinningGestures() {
        // Change the cancel pin gesture to home and back if recents button is invisible
        // Change the cancel pin gesture to home and back if recents button is invisible
        boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
        ButtonDispatcher backButton = mView.getBackButton();
        ButtonDispatcher backButton = mView.getBackButton();
        ButtonDispatcher recentsButton = mView.getRecentsButton();
        ButtonDispatcher recentsButton = mView.getRecentsButton();
        if (pinningActive) {
        if (mScreenPinningActive) {
            boolean recentsVisible = mView.isRecentsButtonVisible();
            boolean recentsVisible = mView.isRecentsButtonVisible();
            backButton.setOnLongClickListener(recentsVisible
            backButton.setOnLongClickListener(recentsVisible
                    ? this::onLongPressBackRecents
                    ? this::onLongPressBackRecents
@@ -1227,8 +1247,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
            recentsButton.setOnLongClickListener(null);
            recentsButton.setOnLongClickListener(null);
        }
        }
        // Note, this needs to be set after even if we're setting the listener to null
        // Note, this needs to be set after even if we're setting the listener to null
        backButton.setLongClickable(pinningActive);
        backButton.setLongClickable(mScreenPinningActive);
        recentsButton.setLongClickable(pinningActive);
        recentsButton.setLongClickable(mScreenPinningActive);
    }
    }


    private void notifyNavigationBarScreenOn() {
    private void notifyNavigationBarScreenOn() {
@@ -1311,8 +1331,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements


    @VisibleForTesting
    @VisibleForTesting
    boolean onHomeLongClick(View v) {
    boolean onHomeLongClick(View v) {
        if (!mView.isRecentsButtonVisible()
        if (!mView.isRecentsButtonVisible() && mScreenPinningActive) {
                && ActivityManagerWrapper.getInstance().isScreenPinningActive()) {
            return onLongPressBackHome(v);
            return onLongPressBackHome(v);
        }
        }
        if (shouldDisableNavbarGestures()) {
        if (shouldDisableNavbarGestures()) {
+3 −4
Original line number Original line Diff line number Diff line
@@ -57,6 +57,7 @@ import com.android.systemui.flags.Flags;
import com.android.systemui.model.SysUiState;
import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.AutoHideController;
@@ -88,7 +89,6 @@ public class NavigationBarController implements
    private FeatureFlags mFeatureFlags;
    private FeatureFlags mFeatureFlags;
    private final DisplayManager mDisplayManager;
    private final DisplayManager mDisplayManager;
    private final TaskbarDelegate mTaskbarDelegate;
    private final TaskbarDelegate mTaskbarDelegate;
    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    private int mNavMode;
    private int mNavMode;
    @VisibleForTesting boolean mIsTablet;
    @VisibleForTesting boolean mIsTablet;


@@ -112,10 +112,10 @@ public class NavigationBarController implements
            NavBarHelper navBarHelper,
            NavBarHelper navBarHelper,
            TaskbarDelegate taskbarDelegate,
            TaskbarDelegate taskbarDelegate,
            NavigationBarComponent.Factory navigationBarComponentFactory,
            NavigationBarComponent.Factory navigationBarComponentFactory,
            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
            DumpManager dumpManager,
            DumpManager dumpManager,
            AutoHideController autoHideController,
            AutoHideController autoHideController,
            LightBarController lightBarController,
            LightBarController lightBarController,
            TaskStackChangeListeners taskStackChangeListeners,
            Optional<Pip> pipOptional,
            Optional<Pip> pipOptional,
            Optional<BackAnimation> backAnimation,
            Optional<BackAnimation> backAnimation,
            FeatureFlags featureFlags) {
            FeatureFlags featureFlags) {
@@ -129,11 +129,10 @@ public class NavigationBarController implements
        mConfigChanges.applyNewConfig(mContext.getResources());
        mConfigChanges.applyNewConfig(mContext.getResources());
        mNavMode = navigationModeController.addListener(this);
        mNavMode = navigationModeController.addListener(this);
        mTaskbarDelegate = taskbarDelegate;
        mTaskbarDelegate = taskbarDelegate;
        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
        mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
        mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
                navBarHelper, navigationModeController, sysUiFlagsContainer,
                navBarHelper, navigationModeController, sysUiFlagsContainer,
                dumpManager, autoHideController, lightBarController, pipOptional,
                dumpManager, autoHideController, lightBarController, pipOptional,
                backAnimation.orElse(null));
                backAnimation.orElse(null), taskStackChangeListeners);
        mIsTablet = isTablet(mContext);
        mIsTablet = isTablet(mContext);
        dumpManager.registerDumpable(this);
        dumpManager.registerDumpable(this);
    }
    }
+10 −6
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.navigationbar;
package com.android.systemui.navigationbar;


import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons;
import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;


@@ -80,6 +81,7 @@ import com.android.systemui.shared.rotation.RotationButton.RotationButtonUpdates
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
@@ -160,6 +162,7 @@ public class NavigationBarView extends FrameLayout {
     * fully locked mode we only show that unlocking is blocked.
     * fully locked mode we only show that unlocking is blocked.
     */
     */
    private ScreenPinningNotify mScreenPinningNotify;
    private ScreenPinningNotify mScreenPinningNotify;
    private boolean mScreenPinningActive = false;


    /**
    /**
     * {@code true} if the IME can render the back button and the IME switcher button.
     * {@code true} if the IME can render the back button and the IME switcher button.
@@ -636,14 +639,13 @@ public class NavigationBarView extends FrameLayout {
        // When screen pinning, don't hide back and home when connected service or back and
        // When screen pinning, don't hide back and home when connected service or back and
        // recents buttons when disconnected from launcher service in screen pinning mode,
        // recents buttons when disconnected from launcher service in screen pinning mode,
        // as they are used for exiting.
        // as they are used for exiting.
        final boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
        if (mOverviewProxyEnabled) {
        if (mOverviewProxyEnabled) {
            // Force disable recents when not in legacy mode
            // Force disable recents when not in legacy mode
            disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode);
            disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode);
            if (pinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) {
            if (mScreenPinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) {
                disableBack = disableHome = false;
                disableBack = disableHome = false;
            }
            }
        } else if (pinningActive) {
        } else if (mScreenPinningActive) {
            disableBack = disableRecent = false;
            disableBack = disableRecent = false;
        }
        }


@@ -738,9 +740,7 @@ public class NavigationBarView extends FrameLayout {
    public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
    public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
        int displayId = mContext.getDisplayId();
        int displayId = mContext.getDisplayId();


        sysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING,
        sysUiState.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
                        ActivityManagerWrapper.getInstance().isScreenPinningActive())
                .setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
                        (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
                        (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
                .setFlag(SYSUI_STATE_HOME_DISABLED,
                .setFlag(SYSUI_STATE_HOME_DISABLED,
                        (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
                        (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
@@ -749,6 +749,10 @@ public class NavigationBarView extends FrameLayout {
                .commitUpdate(displayId);
                .commitUpdate(displayId);
    }
    }


    public void setInScreenPinning(boolean active) {
        mScreenPinningActive = active;
    }

    private void updatePanelSystemUiStateFlags() {
    private void updatePanelSystemUiStateFlags() {
        if (SysUiState.DEBUG) {
        if (SysUiState.DEBUG) {
            Log.d(TAG, "Updating panel sysui state flags: panelView=" + mPanelView);
            Log.d(TAG, "Updating panel sysui state flags: panelView=" + mPanelView);
Loading