From e3646dd8d96fb9756c8a7a4757ad5277e3801aed Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Thu, 1 Sep 2011 12:46:28 -0400 Subject: [PATCH] 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: Mike Lockwood --- .../statusbar/phone/NavigationBarView.java | 8 ++++ .../statusbar/phone/PhoneStatusBar.java | 39 +++++++++++----- .../statusbar/tablet/TabletStatusBar.java | 45 ++++++++++--------- .../policy/impl/KeyguardViewMediator.java | 20 +++++---- 4 files changed, 72 insertions(+), 40 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index e6c0b96019e38..98dca92218997 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 7868626f81f60..4ba514a0bf8f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -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. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index 2ab667d52121e..00f611f44d80b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -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); - } else { - Slog.i(TAG, "DISABLE_BACK: no"); - mBackButton.setEnabled(true); - mInputMethodSwitchButton.setScreenLocked(false); - } + } + + 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 { + 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) { diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java index 162381d0d4295..a5441672052ce 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java @@ -1185,15 +1185,19 @@ 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; - flags |= StatusBarManager.DISABLE_CLOCK; - } - if (mShowing && (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND)) { - // showing secure lockscreen; disable expanding. - flags |= StatusBarManager.DISABLE_EXPAND; + 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 (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND) { + // showing secure lockscreen; disable expanding. + flags |= StatusBarManager.DISABLE_EXPAND; + } } if (DEBUG) {