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

Commit e3646dd8 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

Show back button in status bar when in an activity in front of the lockscreen.



When the lockscreen is up we still enable the home and recent app buttons,
but the back button is only enabled if the lockscreen is not obscured by other activities

Fixes problem escaping from the DeskClock app when the screen is locked.

Bug: 5206013

Change-Id: I68c9e4513018f51e2ee4fc11254e42ecbef834e4
Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 6c859576
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -70,6 +70,14 @@ public class NavigationBarView extends LinearLayout {
        return mCurrentView.findViewById(R.id.menu);
    }

    public View getBackButton() {
        return mCurrentView.findViewById(R.id.back);
    }

    public View getHomeButton() {
        return mCurrentView.findViewById(R.id.home);
    }

    public NavigationBarView(Context context, AttributeSet attrs) {
        super(context, attrs);

+27 −12
Original line number Diff line number Diff line
@@ -1091,18 +1091,9 @@ public class PhoneStatusBar extends StatusBar {
            }
        }

        if ((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) {
            if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
                Slog.d(TAG, "DISABLE_NAVIGATION: yes");

                // close recents if it's visible
                mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
                mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
            }

            if (mNavigationBarView != null) {
                mNavigationBarView.setEnabled((state & StatusBarManager.DISABLE_NAVIGATION) == 0);
            }
        if ((diff & (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK)) != 0) {
            setNavigationVisibility(state &
                    (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK));
        }

        if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
@@ -1127,6 +1118,30 @@ public class PhoneStatusBar extends StatusBar {
        }
    }

    private void setNavigationVisibility(int visibility) {
        boolean disableNavigation = ((visibility & StatusBarManager.DISABLE_NAVIGATION) != 0);
        boolean disableBack = ((visibility & StatusBarManager.DISABLE_BACK) != 0);

        Slog.i(TAG, "DISABLE_BACK: " + (disableBack ? "yes" : "no"));
        Slog.i(TAG, "DISABLE_NAVIGATION: " + (disableNavigation ? "yes" : "no"));

        if (disableNavigation && disableBack) {
            mNavigationBarView.setEnabled(false);
        } else {
            mNavigationBarView.getBackButton().setEnabled(!disableBack);
            mNavigationBarView.getHomeButton().setEnabled(!disableNavigation);
            mNavigationBarView.getRecentsButton().setEnabled(!disableNavigation);

            if (disableNavigation) {
                // close recents if it's visible
                mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
                mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
            }

            mNavigationBarView.setEnabled(true);
        }
    }

    /**
     * All changes to the status bar and notifications funnel through here and are batched.
     */
+25 −20
Original line number Diff line number Diff line
@@ -949,29 +949,34 @@ public class TabletStatusBar extends StatusBar implements
                mTicker.halt();
            }
        }
        if ((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) {
            if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
                Slog.i(TAG, "DISABLE_NAVIGATION: yes");
                mNavigationArea.setVisibility(View.INVISIBLE);
                mInputMethodSwitchButton.setScreenLocked(true);
            } else {
                Slog.i(TAG, "DISABLE_NAVIGATION: no");
                mNavigationArea.setVisibility(View.VISIBLE);
                mInputMethodSwitchButton.setScreenLocked(false);
        if ((diff & (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK)) != 0) {
            setNavigationVisibility(state &
                    (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK));
        }
    }
        if ((diff & StatusBarManager.DISABLE_BACK) != 0) {
            if ((state & StatusBarManager.DISABLE_BACK) != 0) {
                Slog.i(TAG, "DISABLE_BACK: yes");
                mBackButton.setEnabled(false);
                mInputMethodSwitchButton.setScreenLocked(true);

    private void setNavigationVisibility(int visibility) {
        boolean disableNavigation = ((visibility & StatusBarManager.DISABLE_NAVIGATION) != 0);
        boolean disableBack = ((visibility & StatusBarManager.DISABLE_BACK) != 0);

        Slog.i(TAG, "DISABLE_BACK: " + (disableBack ? "yes" : "no"));
        Slog.i(TAG, "DISABLE_NAVIGATION: " + (disableNavigation ? "yes" : "no"));

        if (disableNavigation && disableBack) {
            mNavigationArea.setVisibility(View.INVISIBLE);
        } else {
                Slog.i(TAG, "DISABLE_BACK: no");
                mBackButton.setEnabled(true);
                mInputMethodSwitchButton.setScreenLocked(false);
            }
            int backVisiblity = (disableBack ? View.INVISIBLE : View.VISIBLE);
            int navVisibility = (disableNavigation ? View.INVISIBLE : View.VISIBLE);

            mBackButton.setVisibility(backVisiblity);
            mHomeButton.setVisibility(navVisibility);
            mRecentButton.setVisibility(navVisibility);
            // don't change menu button visibility here

            mNavigationArea.setVisibility(View.VISIBLE);
        }

        mInputMethodSwitchButton.setScreenLocked(disableNavigation);
    }

    private boolean hasTicker(Notification n) {
+12 −8
Original line number Diff line number Diff line
@@ -1185,16 +1185,20 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
            }

            int flags = StatusBarManager.DISABLE_NONE;
            if (mShowing && !mHidden) {
                // showing lockscreen exclusively; disable various extra
                // statusbar components.
            if (mShowing) {
                // disable navigation status bar components if lock screen is up
                flags |= StatusBarManager.DISABLE_NAVIGATION;
                if (!mHidden) {
                    // showing lockscreen exclusively (no activities in front of it)
                    // disable clock and back button too
                    flags |= StatusBarManager.DISABLE_BACK;
                    flags |= StatusBarManager.DISABLE_CLOCK;
                }
            if (mShowing && (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND)) {
                if (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND) {
                    // showing secure lockscreen; disable expanding.
                    flags |= StatusBarManager.DISABLE_EXPAND;
                }
            }

            if (DEBUG) {
                Log.d(TAG,