diff options
Diffstat (limited to 'policy/src')
-rw-r--r-- | policy/src/com/android/internal/policy/impl/ImmersiveModeConfirmation.java (renamed from policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java) | 39 | ||||
-rw-r--r-- | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 98 |
2 files changed, 78 insertions, 59 deletions
diff --git a/policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java b/policy/src/com/android/internal/policy/impl/ImmersiveModeConfirmation.java index 3c7902c..dfdcdad5 100644 --- a/policy/src/com/android/internal/policy/impl/TransientNavigationConfirmation.java +++ b/policy/src/com/android/internal/policy/impl/ImmersiveModeConfirmation.java @@ -49,11 +49,11 @@ import com.android.internal.R; import java.util.Arrays; /** - * Helper to manage showing/hiding a confirmation prompt when the transient navigation bar - * is hidden. + * Helper to manage showing/hiding a confirmation prompt when the navigation bar is hidden + * entering immersive mode. */ -public class TransientNavigationConfirmation { - private static final String TAG = "TransientNavigationConfirmation"; +public class ImmersiveModeConfirmation { + private static final String TAG = "ImmersiveModeConfirmation"; private static final boolean DEBUG = false; private static final boolean DEBUG_SHOW_EVERY_TIME = false; // super annoying, use with caution @@ -70,12 +70,12 @@ public class TransientNavigationConfirmation { private String mPanicPackage; private WindowManager mWindowManager; - public TransientNavigationConfirmation(Context context) { + public ImmersiveModeConfirmation(Context context) { mContext = context; mHandler = new H(); mShowDelayMs = getNavBarExitDuration() * 3; mPanicThresholdMs = context.getResources() - .getInteger(R.integer.config_transient_navigation_confirmation_panic); + .getInteger(R.integer.config_immersive_mode_confirmation_panic); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); } @@ -91,7 +91,7 @@ public class TransientNavigationConfirmation { String packages = null; try { packages = Settings.Secure.getStringForUser(mContext.getContentResolver(), - Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS, + Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS, UserHandle.USER_CURRENT); if (packages != null) { mConfirmedPackages.addAll(Arrays.asList(packages.split(","))); @@ -107,7 +107,7 @@ public class TransientNavigationConfirmation { try { final String packages = TextUtils.join(",", mConfirmedPackages); Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS, + Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS, packages, UserHandle.USER_CURRENT); if (DEBUG) Slog.d(TAG, "Saved packages=" + packages); @@ -116,12 +116,12 @@ public class TransientNavigationConfirmation { } } - public void transientNavigationChanged(String pkg, boolean isNavTransient) { + public void immersiveModeChanged(String pkg, boolean isImmersiveMode) { if (pkg == null) { return; } mHandler.removeMessages(H.SHOW); - if (isNavTransient) { + if (isImmersiveMode) { mLastPackage = pkg; if (DEBUG_SHOW_EVERY_TIME || !mConfirmedPackages.contains(pkg)) { mHandler.sendMessageDelayed(mHandler.obtainMessage(H.SHOW, pkg), mShowDelayMs); @@ -132,13 +132,13 @@ public class TransientNavigationConfirmation { } } - public void onPowerKeyDown(boolean isScreenOn, long time, boolean transientNavigationAllowed) { + public void onPowerKeyDown(boolean isScreenOn, long time, boolean inImmersiveMode) { if (mPanicPackage != null && !isScreenOn && (time - mPanicTime < mPanicThresholdMs)) { // turning the screen back on within the panic threshold unconfirmPackage(mPanicPackage); } - if (isScreenOn && transientNavigationAllowed) { - // turning the screen off, remember if we were hiding the transient nav + if (isScreenOn && inImmersiveMode) { + // turning the screen off, remember if we were in immersive mode mPanicTime = time; mPanicPackage = mLastPackage; } else { @@ -153,7 +153,7 @@ public class TransientNavigationConfirmation { private void unconfirmPackage(String pkg) { if (pkg != null) { - if (DEBUG) Slog.d(TAG, "Unconfirming transient navigation for " + pkg); + if (DEBUG) Slog.d(TAG, "Unconfirming immersive mode confirmation for " + pkg); mConfirmedPackages.remove(pkg); saveSetting(); } @@ -161,8 +161,7 @@ public class TransientNavigationConfirmation { private void handleHide() { if (mClingWindow != null) { - if (DEBUG) Slog.d(TAG, - "Hiding transient navigation confirmation for " + mPromptPackage); + if (DEBUG) Slog.d(TAG, "Hiding immersive mode confirmation for " + mPromptPackage); mWindowManager.removeView(mClingWindow); mClingWindow = null; } @@ -179,7 +178,7 @@ public class TransientNavigationConfirmation { | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED , PixelFormat.TRANSLUCENT); - lp.setTitle("TransientNavigationConfirmation"); + lp.setTitle("ImmersiveModeConfirmation"); lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications; lp.gravity = Gravity.FILL; return lp; @@ -230,7 +229,7 @@ public class TransientNavigationConfirmation { // create the confirmation cling mClingLayout = (ViewGroup) - View.inflate(getContext(), R.layout.transient_navigation_cling, null); + View.inflate(getContext(), R.layout.immersive_mode_cling, null); final Button ok = (Button) mClingLayout.findViewById(R.id.ok); ok.setOnClickListener(new OnClickListener() { @@ -292,7 +291,7 @@ public class TransientNavigationConfirmation { private void handleShow(String pkg) { mPromptPackage = pkg; - if (DEBUG) Slog.d(TAG, "Showing transient navigation confirmation for " + pkg); + if (DEBUG) Slog.d(TAG, "Showing immersive mode confirmation for " + pkg); mClingWindow = new ClingWindowView(mContext, confirmAction(pkg)); @@ -311,7 +310,7 @@ public class TransientNavigationConfirmation { @Override public void run() { if (pkg != null && !mConfirmedPackages.contains(pkg)) { - if (DEBUG) Slog.d(TAG, "Confirming transient navigation for " + pkg); + if (DEBUG) Slog.d(TAG, "Confirming immersive mode for " + pkg); mConfirmedPackages.add(pkg); saveSetting(); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 5ab9c1b..1c43014 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -297,6 +297,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; boolean mHasSoftInput = false; boolean mTouchExplorationEnabled = false; + boolean mTranslucentDecorEnabled = true; int mPointerLocationMode = 0; // guarded by mLock @@ -532,7 +533,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Secure.DEFAULT_INPUT_METHOD), false, this, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( - Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS), false, this, + Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS), false, this, UserHandle.USER_ALL); updateSettings(); } @@ -570,7 +571,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { StatusBarManager.WINDOW_NAVIGATION_BAR, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); - private TransientNavigationConfirmation mTransientNavigationConfirmation; + private ImmersiveModeConfirmation mImmersiveModeConfirmation; private SystemGesturesPointerEventListener mSystemGestures; @@ -901,6 +902,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { com.android.internal.R.integer.config_lidNavigationAccessibility); mLidControlsSleep = mContext.getResources().getBoolean( com.android.internal.R.bool.config_lidControlsSleep); + mTranslucentDecorEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableTranslucentDecor); readConfigurationDependentBehaviors(); // register for dock events @@ -953,7 +956,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // no-op } }); - mTransientNavigationConfirmation = new TransientNavigationConfirmation(mContext); + mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext); mWindowManagerFuncs.registerPointerEventListener(mSystemGestures); mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); @@ -1169,8 +1172,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHasSoftInput = hasSoftInput; updateRotation = true; } - if (mTransientNavigationConfirmation != null) { - mTransientNavigationConfirmation.loadSetting(); + if (mImmersiveModeConfirmation != null) { + mImmersiveModeConfirmation.loadSetting(); } } if (updateRotation) { @@ -2699,15 +2702,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { final int sysui = mLastSystemUiFlags; boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; boolean navTranslucent = (sysui & View.NAVIGATION_BAR_TRANSLUCENT) != 0; - boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; - navTranslucent &= !transientAllowed; // transient trumps translucent - navTranslucent &= isTranslucentNavigationAllowed(); + boolean immersive = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; + boolean immersiveSticky = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0; + boolean navAllowedHidden = immersive || immersiveSticky; + navTranslucent &= !immersiveSticky; // transient trumps translucent + navTranslucent &= areTranslucentBarsAllowed(); // When the navigation bar isn't visible, we put up a fake // input window to catch all touch events. This way we can // detect when the user presses anywhere to bring back the nav // bar and ensure the application doesn't see the event. - if (navVisible || transientAllowed) { + if (navVisible || navAllowedHidden) { if (mHideNavFakeWindow != null) { mHideNavFakeWindow.dismiss(); mHideNavFakeWindow = null; @@ -2822,6 +2827,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean statusBarTransient = (sysui & View.STATUS_BAR_TRANSIENT) != 0; boolean statusBarTranslucent = (sysui & View.STATUS_BAR_TRANSLUCENT) != 0; + statusBarTranslucent &= areTranslucentBarsAllowed(); // If the status bar is hidden, we don't want to cause // windows behind it to scroll. @@ -3946,8 +3952,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyEvent.KEYCODE_POWER: { result &= ~ACTION_PASS_TO_USER; if (down) { - mTransientNavigationConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(), - isTransientNavigationAllowed(mLastSystemUiFlags)); + mImmersiveModeConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(), + isImmersiveMode(mLastSystemUiFlags)); if (isScreenOn && !mPowerKeyTriggered && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { mPowerKeyTriggered = true; @@ -4226,7 +4232,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (sb) mStatusBarController.showTransient(); if (nb) mNavigationBarController.showTransient(); - mTransientNavigationConfirmation.confirmCurrentPrompt(); + mImmersiveModeConfirmation.confirmCurrentPrompt(); updateSystemUiVisibilityLw(); } } @@ -5109,71 +5115,85 @@ public class PhoneWindowManager implements WindowManagerPolicy { int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.STATUS_BAR_TRANSLUCENT | View.NAVIGATION_BAR_TRANSLUCENT; vis = (vis & ~flags) | (oldVis & flags); } - if (!isTranslucentNavigationAllowed()) { - vis &= ~View.NAVIGATION_BAR_TRANSLUCENT; + if (!areTranslucentBarsAllowed()) { + vis &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.STATUS_BAR_TRANSLUCENT); } // update status bar - boolean transientAllowed = - (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; + boolean immersiveSticky = + (vis & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0; boolean hideStatusBarWM = mTopFullscreenOpaqueWindowState != null && (mTopFullscreenOpaqueWindowState.getAttrs().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; boolean hideStatusBarSysui = (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + boolean hideNavBarSysui = + (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0; boolean transientStatusBarAllowed = mStatusBar != null && ( hideStatusBarWM - || (hideStatusBarSysui && transientAllowed) + || (hideStatusBarSysui && immersiveSticky) || statusBarHasFocus); - if (mStatusBarController.isTransientShowing() - && !transientStatusBarAllowed && hideStatusBarSysui) { + boolean transientNavBarAllowed = + mNavigationBar != null && + hideNavBarSysui && immersiveSticky; + + boolean denyTransientStatus = mStatusBarController.isTransientShowing() + && !transientStatusBarAllowed && hideStatusBarSysui; + boolean denyTransientNav = mNavigationBarController.isTransientShowing() + && !transientNavBarAllowed; + if (denyTransientStatus || denyTransientNav) { // clear the clearable flags instead - int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS; - if (newVal != mResettingSystemUiFlags) { - mResettingSystemUiFlags = newVal; - mWindowManagerFuncs.reevaluateStatusBarVisibility(); - } + clearClearableFlagsLw(); } vis = mStatusBarController.updateVisibilityLw(transientStatusBarAllowed, oldVis, vis); // update navigation bar - boolean oldTransientNav = isTransientNavigationAllowed(oldVis); - boolean isTransientNav = isTransientNavigationAllowed(vis); - if (win != null && oldTransientNav != isTransientNav) { + boolean oldImmersiveMode = isImmersiveMode(oldVis); + boolean newImmersiveMode = isImmersiveMode(vis); + if (win != null && oldImmersiveMode != newImmersiveMode) { final String pkg = win.getOwningPackage(); - mTransientNavigationConfirmation.transientNavigationChanged(pkg, isTransientNav); + mImmersiveModeConfirmation.immersiveModeChanged(pkg, newImmersiveMode); } - vis = mNavigationBarController.updateVisibilityLw(isTransientNav, oldVis, vis); - // don't send low profile updates if the system bars are hidden - if (mStatusBarController.isHidden() && mNavigationBarController.isHidden()) { - vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; - } + vis = mNavigationBarController.updateVisibilityLw(transientNavBarAllowed, oldVis, vis); + return vis; } - private boolean isTransientNavigationAllowed(int vis) { + private void clearClearableFlagsLw() { + int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS; + if (newVal != mResettingSystemUiFlags) { + mResettingSystemUiFlags = newVal; + mWindowManagerFuncs.reevaluateStatusBarVisibility(); + } + } + + private boolean isImmersiveMode(int vis) { + final int flags = View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; return mNavigationBar != null && (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 - && (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; + && (vis & flags) != 0; } /** - * @return whether the navigation bar can be made translucent, e.g. touch - * exploration is not enabled + * @return whether the navigation or status bar can be made translucent + * + * This should return true unless touch exploration is not enabled or + * R.boolean.config_enableTranslucentDecor is false. */ - private boolean isTranslucentNavigationAllowed() { - return !mTouchExplorationEnabled; + private boolean areTranslucentBarsAllowed() { + return mTranslucentDecorEnabled && !mTouchExplorationEnabled; } // Use this instead of checking config_showNavigationBar so that it can be consistently |