diff options
24 files changed, 280 insertions, 106 deletions
diff --git a/api/current.txt b/api/current.txt index 1ad4377..964454f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1226,6 +1226,8 @@ package android { field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c field public static final int windowTitleSize = 16842842; // 0x101005a field public static final int windowTitleStyle = 16842843; // 0x101005b + field public static final int windowTranslucentNavigation = 16843760; // 0x10103f0 + field public static final int windowTranslucentStatus = 16843759; // 0x10103ef field public static final int writePermission = 16842760; // 0x1010008 field public static final int x = 16842924; // 0x10100ac field public static final int xlargeScreens = 16843455; // 0x10102bf @@ -1758,10 +1760,12 @@ package android { field public static final int Theme_DeviceDefault_Light_NoActionBar = 16974124; // 0x103012c field public static final int Theme_DeviceDefault_Light_NoActionBar_Fullscreen = 16974125; // 0x103012d field public static final int Theme_DeviceDefault_Light_NoActionBar_Overscan = 16974304; // 0x10301e0 + field public static final int Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor = 16974308; // 0x10301e4 field public static final int Theme_DeviceDefault_Light_Panel = 16974139; // 0x103013b field public static final int Theme_DeviceDefault_NoActionBar = 16974121; // 0x1030129 field public static final int Theme_DeviceDefault_NoActionBar_Fullscreen = 16974122; // 0x103012a field public static final int Theme_DeviceDefault_NoActionBar_Overscan = 16974303; // 0x10301df + field public static final int Theme_DeviceDefault_NoActionBar_TranslucentDecor = 16974307; // 0x10301e3 field public static final int Theme_DeviceDefault_Panel = 16974138; // 0x103013a field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d @@ -1785,10 +1789,12 @@ package android { field public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0 field public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1 field public static final int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de + field public static final int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2 field public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c field public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c field public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d field public static final int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd + field public static final int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1 field public static final int Theme_Holo_Panel = 16973947; // 0x103007b field public static final int Theme_Holo_Wallpaper = 16973949; // 0x103007d field public static final int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e @@ -28395,8 +28401,6 @@ package android.view { field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200 field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100 field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1 - field public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 8192; // 0x2000 - field public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 4096; // 0x1000 field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0 field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600 field public static final int TEXT_ALIGNMENT_CENTER = 4; // 0x4 @@ -29132,6 +29136,8 @@ package android.view { field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000 field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000 field public static final int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40 + field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000 + field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000 field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000 field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000 field public static final int FORMAT_CHANGED = 8; // 0x8 diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f763d19..caeb1d8 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2448,24 +2448,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800; /** - * Flag for {@link #setSystemUiVisibility(int)}: View would like the status bar to have - * transparency. - * - * <p>The transparency request may be denied if the bar is in another mode with a specific - * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}. - */ - public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000; - - /** - * Flag for {@link #setSystemUiVisibility(int)}: View would like the navigation bar to have - * transparency. - * - * <p>The transparency request may be denied if the bar is in another mode with a specific - * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}. - */ - public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000; - - /** * @deprecated Use {@link #SYSTEM_UI_FLAG_LOW_PROFILE} instead. */ public static final int STATUS_BAR_HIDDEN = SYSTEM_UI_FLAG_LOW_PROFILE; @@ -2626,6 +2608,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to specify that the status bar is displayed in translucent mode. + */ + public static final int STATUS_BAR_TRANSLUCENT = 0x40000000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to specify that the navigation bar is displayed in translucent mode. + */ + public static final int NAVIGATION_BAR_TRANSLUCENT = 0x80000000; + + /** + * @hide */ public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = 0x0000FFFF; @@ -16934,9 +16936,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param visibility Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE}, - * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, - * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}. */ public void setSystemUiVisibility(int visibility) { if (visibility != mSystemUiVisibility) { @@ -16952,9 +16952,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE}, - * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, - * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}. */ public int getSystemUiVisibility() { return mSystemUiVisibility; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7e3ee5f..beb7366 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -754,6 +754,11 @@ public final class ViewRootImpl implements ViewParent, attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility; attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility; mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs); + if ((mWindowAttributesChangesFlag + & WindowManager.LayoutParams.TRANSLUCENT_FLAGS_CHANGED) != 0) { + // Recompute system ui visibility. + mAttachInfo.mRecomputeGlobalAttributes = true; + } if (mWindowAttributes.packageName == null) { mWindowAttributes.packageName = mBasePackageName; } @@ -1026,6 +1031,7 @@ public final class ViewRootImpl implements ViewParent, mView.dispatchCollectViewAttributes(attachInfo, 0); attachInfo.mSystemUiVisibility &= ~attachInfo.mDisabledSystemUiVisibility; WindowManager.LayoutParams params = mWindowAttributes; + attachInfo.mSystemUiVisibility |= getImpliedSystemUiVisibility(params); if (attachInfo.mKeepScreenOn != oldScreenOn || attachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility || attachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) { @@ -1039,6 +1045,18 @@ public final class ViewRootImpl implements ViewParent, return false; } + private int getImpliedSystemUiVisibility(WindowManager.LayoutParams params) { + int vis = 0; + // Translucent decor window flags imply stable system ui visibility. + if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) { + vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + } + if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) != 0) { + vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + } + return vis; + } + private boolean measureHierarchy(final View host, final WindowManager.LayoutParams lp, final Resources res, final int desiredWindowWidth, final int desiredWindowHeight) { int childWidthMeasureSpec; diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 815b97c..ea3c931 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -838,6 +838,44 @@ public interface WindowManager extends ViewManager { */ public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000; + /** + * Window flag: request a translucent status bar with minimal system-provided + * background protection. + * + * <p>This flag can be controlled in your theme through the + * {@link android.R.attr#windowTranslucentStatus} attribute; this attribute + * is automatically set for you in the standard translucent decor themes + * such as + * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and + * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p> + * + * <p>When this flag is enabled for a window, it automatically sets + * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and + * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}.</p> + */ + public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000; + + /** + * Window flag: request a translucent navigation bar with minimal system-provided + * background protection. + * + * <p>This flag can be controlled in your theme through the + * {@link android.R.attr#windowTranslucentNavigation} attribute; this attribute + * is automatically set for you in the standard translucent decor themes + * such as + * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and + * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p> + * + * <p>When this flag is enabled for a window, it automatically sets + * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and + * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}.</p> + */ + public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000; + // ----- HIDDEN FLAGS. // These start at the high bit and go down. @@ -956,7 +994,11 @@ public interface WindowManager extends ViewManager { @ViewDebug.FlagToString(mask = FLAG_HARDWARE_ACCELERATED, equals = FLAG_HARDWARE_ACCELERATED, name = "FLAG_HARDWARE_ACCELERATED"), @ViewDebug.FlagToString(mask = FLAG_LOCAL_FOCUS_MODE, equals = FLAG_LOCAL_FOCUS_MODE, - name = "FLAG_LOCAL_FOCUS_MODE") + name = "FLAG_LOCAL_FOCUS_MODE"), + @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_STATUS, equals = FLAG_TRANSLUCENT_STATUS, + name = "FLAG_TRANSLUCENT_STATUS"), + @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_NAVIGATION, equals = FLAG_TRANSLUCENT_NAVIGATION, + name = "FLAG_TRANSLUCENT_NAVIGATION") }) public int flags; @@ -1046,6 +1088,11 @@ public interface WindowManager extends ViewManager { * {@hide} */ public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100; + /** Window flag: maintain the previous transparent decor state when this window + * becomes top-most. + * {@hide} */ + public static final int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR = 0x00000200; + /** * Control flags that are private to the platform. * @hide @@ -1576,6 +1623,8 @@ public interface WindowManager extends ViewManager { /** {@hide} */ public static final int USER_ACTIVITY_TIMEOUT_CHANGED = 1<<18; /** {@hide} */ + public static final int TRANSLUCENT_FLAGS_CHANGED = 1<<19; + /** {@hide} */ public static final int EVERYTHING_CHANGED = 0xffffffff; // internal buffer to backup/restore parameters under compatibility mode. @@ -1621,6 +1670,10 @@ public interface WindowManager extends ViewManager { changes |= TYPE_CHANGED; } if (flags != o.flags) { + final int diff = flags ^ o.flags; + if ((diff & (FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION)) != 0) { + changes |= TRANSLUCENT_FLAGS_CHANGED; + } flags = o.flags; changes |= FLAGS_CHANGED; } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index c3dc4ff..9ee8bae 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -439,6 +439,14 @@ or later. --> <attr name="windowCloseOnTouchOutside" format="boolean" /> + <!-- Flag indicating whether this window requests a translucent status bar. Corresponds + to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS}. --> + <attr name="windowTranslucentStatus" format="boolean" /> + + <!-- Flag indicating whether this window requests a translucent navigation bar. Corresponds + to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION}. --> + <attr name="windowTranslucentNavigation" format="boolean" /> + <!-- ============ --> <!-- Alert Dialog styles --> <!-- ============ --> @@ -1594,6 +1602,8 @@ <attr name="windowSplitActionBar" /> <attr name="windowEnableSplitTouch" /> <attr name="windowCloseOnTouchOutside" /> + <attr name="windowTranslucentStatus" /> + <attr name="windowTranslucentNavigation" /> <!-- The minimum width the window is allowed to be, along the major axis of the screen. That is, when in landscape. Can be either an absolute dimension or a fraction of the screen size in that diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ea42f38..429a8a4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -585,8 +585,8 @@ <!-- Disable lockscreen rotation by default --> <bool name="config_enableLockScreenRotation">false</bool> - <!-- Disable lockscreen transparent bars by default --> - <bool name="config_enableLockScreenTransparentBars">false</bool> + <!-- Disable lockscreen translucent decor by default --> + <bool name="config_enableLockScreenTranslucentDecor">false</bool> <!-- Enable puk unlockscreen by default. If unlock screen is disabled, the puk should be unlocked through Emergency Dialer --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 431fe82..4635733 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2078,5 +2078,12 @@ <public type="attr" name="requireDeviceUnlock" id="0x010103ec" /> <public type="attr" name="apduServiceBanner" id="0x010103ed" /> <public type="attr" name="accessibilityLiveRegion" id="0x010103ee" /> + <public type="attr" name="windowTranslucentStatus" id="0x010103ef" /> + <public type="attr" name="windowTranslucentNavigation" id="0x010103f0" /> + + <public type="style" name="Theme.Holo.NoActionBar.TranslucentDecor" id="0x010301e1" /> + <public type="style" name="Theme.Holo.Light.NoActionBar.TranslucentDecor" id="0x010301e2" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" id="0x010301e3" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" id="0x010301e4" /> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a403345..ad9144c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1290,7 +1290,7 @@ <java-symbol type="bool" name="config_disableMenuKeyInLockScreen" /> <java-symbol type="bool" name="config_enableLockBeforeUnlockScreen" /> <java-symbol type="bool" name="config_enableLockScreenRotation" /> - <java-symbol type="bool" name="config_enableLockScreenTransparentBars" /> + <java-symbol type="bool" name="config_enableLockScreenTranslucentDecor" /> <java-symbol type="bool" name="config_lidControlsSleep" /> <java-symbol type="bool" name="config_reverseDefaultRotation" /> <java-symbol type="bool" name="config_showNavigationBar" /> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index eb39926..4c80e7d 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -178,6 +178,8 @@ please see themes_device_defaults.xml. <item name="windowActionBar">false</item> <item name="windowActionModeOverlay">false</item> <item name="windowCloseOnTouchOutside">false</item> + <item name="windowTranslucentStatus">false</item> + <item name="windowTranslucentNavigation">false</item> <!-- Define these here; ContextThemeWrappers around themes that define them should always clear these values. --> @@ -1584,6 +1586,15 @@ please see themes_device_defaults.xml. <item name="android:windowContentOverlay">@null</item> </style> + <!-- Variant of the holographic (dark) theme that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.Holo.NoActionBar.TranslucentDecor"> + <item name="android:windowTranslucentStatus">true</item> + <item name="android:windowTranslucentNavigation">true</item> + <item name="android:windowContentOverlay">@null</item> + </style> + <!-- Variant of the holographic (light) theme with no action bar. --> <style name="Theme.Holo.Light.NoActionBar"> <item name="android:windowActionBar">false</item> @@ -1608,6 +1619,15 @@ please see themes_device_defaults.xml. <item name="android:windowContentOverlay">@null</item> </style> + <!-- Variant of the holographic (light) theme that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.Holo.Light.NoActionBar.TranslucentDecor"> + <item name="android:windowTranslucentStatus">true</item> + <item name="android:windowTranslucentNavigation">true</item> + <item name="android:windowContentOverlay">@null</item> + </style> + <!-- Dialog themes for Holo --> <eat-comment /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 87b1c9d..721c6b0 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -216,6 +216,12 @@ easier. <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Holo.NoActionBar.Overscan" > </style> + <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Holo.NoActionBar.TranslucentDecor" > + </style> + <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style --> <style name="Theme.DeviceDefault.Light" parent="Theme.Holo.Light" > <!-- Text styles --> @@ -376,6 +382,12 @@ easier. <style name="Theme.DeviceDefault.Light.NoActionBar.Overscan" parent="Theme.Holo.Light.NoActionBar.Overscan" > </style> + <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" + parent="Theme.Holo.Light.NoActionBar.TranslucentDecor" > + </style> <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog. --> diff --git a/packages/Keyguard/res/values/alias.xml b/packages/Keyguard/res/values/alias.xml index b22311e..e6657a1 100644 --- a/packages/Keyguard/res/values/alias.xml +++ b/packages/Keyguard/res/values/alias.xml @@ -43,8 +43,8 @@ <!-- Alias used to reference framework configuration for screen rotation. --> <item type="bool" name="config_enableLockScreenRotation">@*android:bool/config_enableLockScreenRotation</item> - <!-- Alias used to reference framework configuration for transparent bars. --> - <item type="bool" name="config_enableLockScreenTransparentBars">@*android:bool/config_enableLockScreenTransparentBars</item> + <!-- Alias used to reference framework configuration for translucent decor. --> + <item type="bool" name="config_enableLockScreenTranslucentDecor">@*android:bool/config_enableLockScreenTranslucentDecor</item> <!-- Alias used to reference framework activity duration. --> <item type="integer" name="config_activityDefaultDur">@*android:integer/config_activityDefaultDur</item> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java index 2084a16..6584180 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java @@ -124,9 +124,9 @@ public class KeyguardViewManager { // activities. Other disabled bits are handled by the KeyguardViewMediator talking // directly to the status bar service. int visFlags = View.STATUS_BAR_DISABLE_HOME; - if (shouldEnableTransparentBars()) { - visFlags |= View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; + if (shouldEnableTranslucentDecor()) { + mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; } if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")"); mKeyguardHost.setSystemUiVisibility(visFlags); @@ -143,9 +143,9 @@ public class KeyguardViewManager { || res.getBoolean(R.bool.config_enableLockScreenRotation); } - private boolean shouldEnableTransparentBars() { + private boolean shouldEnableTranslucentDecor() { Resources res = mContext.getResources(); - return res.getBoolean(R.bool.config_enableLockScreenTransparentBars); + return res.getBoolean(R.bool.config_enableLockScreenTranslucentDecor); } class ViewManagerHost extends FrameLayout { diff --git a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java index 67d0d5a..528f988 100644 --- a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java +++ b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java @@ -79,7 +79,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo final Resources res = getResources(); mDisplayMetrics = res.getDisplayMetrics(); - setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE); + setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } public void setInsets(Rect insets) { diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java index 9718c9b..4f377a3 100644 --- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java +++ b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java @@ -260,7 +260,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout mChallengeBottomBound = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding); setWillNotDraw(false); - setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE); + setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } public void setInsets(Rect insets) { diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml index b06166d..b2ba25a 100644 --- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml @@ -41,15 +41,15 @@ android:fadingEdge="horizontal" android:scrollbars="none" android:layout_gravity="right" - android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length" - android:fitsSystemWindows="true"> + android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length"> <LinearLayout android:id="@+id/recents_linear_layout" android:layout_width="wrap_content" android:layout_height="match_parent" android:layoutDirection="ltr" android:layout_gravity="left" - android:orientation="horizontal"> + android:orientation="horizontal" + android:fitsSystemWindows="true"> </LinearLayout> </com.android.systemui.recent.RecentsHorizontalScrollView> diff --git a/packages/SystemUI/res/layout/status_bar_recent_panel.xml b/packages/SystemUI/res/layout/status_bar_recent_panel.xml index 305aaf2..e41475b 100644 --- a/packages/SystemUI/res/layout/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout/status_bar_recent_panel.xml @@ -45,13 +45,13 @@ android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length" android:layout_gravity="bottom|start" android:clipToPadding="false" - android:clipChildren="false" - android:fitsSystemWindows="true"> + android:clipChildren="false"> <LinearLayout android:id="@+id/recents_linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:fitsSystemWindows="true" android:clipToPadding="false" android:clipChildren="false"> </LinearLayout> diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java index 818c2980..09a7a5e 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java @@ -177,10 +177,14 @@ public class RecentsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + getWindow().addPrivateFlags( + WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR); setContentView(R.layout.status_bar_recent_panel); mRecentsPanel = (RecentsPanelView) findViewById(R.id.recents_root); mRecentsPanel.setOnTouchListener(new TouchOutsideListener(mRecentsPanel)); - mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); final RecentTasksLoader recentTasksLoader = RecentTasksLoader.getInstance(this); recentTasksLoader.setRecentsPanel(mRecentsPanel, mRecentsPanel); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index ce578e5..7b1df91 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -35,7 +35,7 @@ public class BarTransitions { public static final int MODE_OPAQUE = 0; public static final int MODE_SEMI_TRANSPARENT = 1; - public static final int MODE_TRANSPARENT = 2; + public static final int MODE_TRANSLUCENT = 2; public static final int MODE_LIGHTS_OUT = 3; public static final int LIGHTS_IN_DURATION = 250; @@ -125,7 +125,7 @@ public class BarTransitions { mColorDrawable.setColor(newColor); } } - if (oldColor != null && newColor == null && mColorDrawableShowing) { + if (newColor == null && mColorDrawableShowing) { if (DEBUG) Log.d(mTag, "Hide color layer"); if (animate) { mTransitionDrawable.reverseTransition(BACKGROUND_DURATION); @@ -133,9 +133,8 @@ public class BarTransitions { mTransitionDrawable.resetTransition(); } mColorDrawableShowing = false; - } else if (oldColor == null && newColor != null && !mColorDrawableShowing) { + } else if (newColor != null && !mColorDrawableShowing) { if (DEBUG) Log.d(mTag, "Show color layer"); - mTransitionDrawable.setCrossFadeEnabled(!animate); mTransitionDrawable.startTransition(animate ? BACKGROUND_DURATION : 0); mColorDrawableShowing = true; } @@ -158,7 +157,7 @@ public class BarTransitions { public static String modeToString(int mode) { if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; - if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; + if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; throw new IllegalArgumentException("Unknown mode " + mode); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index 4e92179..5d4b995 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -58,8 +58,8 @@ public final class NavigationBarTransitions extends BarTransitions { @Override public void transitionTo(int mode, boolean animate) { mRequestedMode = mode; - if (mVertical && mode == MODE_TRANSPARENT) { - // fully transparent mode not allowed when vertical + if (mVertical && mode == MODE_TRANSLUCENT) { + // translucent mode not allowed when vertical mode = MODE_OPAQUE; } super.transitionTo(mode, animate); 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 c47d0eb..93a9b92 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -22,7 +22,7 @@ import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.windowStateToString; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; import android.animation.Animator; @@ -1853,12 +1853,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // update status bar mode final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(), - View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS); + View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_TRANSLUCENT); // update navigation bar mode final int nbMode = mNavigationBarView == null ? -1 : computeBarMode( oldVal, newVal, mNavigationBarView.getBarTransitions(), - View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION); + View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_TRANSLUCENT); final boolean sbModeChanged = sbMode != -1; final boolean nbModeChanged = nbMode != -1; boolean checkBarModes = false; @@ -1896,18 +1896,18 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } private int computeBarMode(int oldVis, int newVis, BarTransitions transitions, - int transientFlag, int transparentFlag) { - final int oldMode = barMode(oldVis, transientFlag, transparentFlag); - final int newMode = barMode(newVis, transientFlag, transparentFlag); + int transientFlag, int translucentFlag) { + final int oldMode = barMode(oldVis, transientFlag, translucentFlag); + final int newMode = barMode(newVis, transientFlag, translucentFlag); if (oldMode == newMode) { return -1; // no mode change } return newMode; } - private int barMode(int vis, int transientFlag, int transparentFlag) { + private int barMode(int vis, int transientFlag, int translucentFlag) { return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT - : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT + : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT : (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0 ? MODE_LIGHTS_OUT : MODE_OPAQUE; } @@ -2737,7 +2737,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (command.equals(COMMAND_BARS)) { String mode = args.getString("mode"); int barMode = "opaque".equals(mode) ? MODE_OPAQUE : - "transparent".equals(mode) ? MODE_TRANSPARENT : + "translucent".equals(mode) ? MODE_TRANSLUCENT : "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT : -1; if (barMode != -1) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java index 6bb6776..8406565 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java @@ -20,13 +20,12 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.res.Resources; -import android.graphics.drawable.GradientDrawable.Orientation; import android.view.View; import com.android.systemui.R; public final class PhoneStatusBarTransitions extends BarTransitions { - private static final float ICON_ALPHA_WHEN_TRANSPARENT = 1; + private static final float ICON_ALPHA_WHEN_NOT_OPAQUE = 1; private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_BATTERY_CLOCK = 0.5f; private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK = 0; @@ -59,7 +58,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { private float getNonBatteryClockAlphaFor(int mode) { return mode == MODE_LIGHTS_OUT ? ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK - : isTransparent(mode) ? ICON_ALPHA_WHEN_TRANSPARENT + : !isOpaque(mode) ? ICON_ALPHA_WHEN_NOT_OPAQUE : mIconAlphaWhenOpaque; } @@ -68,8 +67,8 @@ public final class PhoneStatusBarTransitions extends BarTransitions { : getNonBatteryClockAlphaFor(mode); } - private boolean isTransparent(int mode) { - return mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; + private boolean isOpaque(int mode) { + return !(mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT); } @Override diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java index 57c9675..8d97fc8 100644 --- a/policy/src/com/android/internal/policy/impl/BarController.java +++ b/policy/src/com/android/internal/policy/impl/BarController.java @@ -23,6 +23,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.util.Slog; import android.view.View; +import android.view.WindowManager; import android.view.WindowManagerPolicy.WindowState; import com.android.internal.statusbar.IStatusBarService; @@ -39,13 +40,14 @@ public class BarController { private static final int TRANSIENT_BAR_SHOWING = 1; private static final int TRANSIENT_BAR_HIDING = 2; - private static final int TRANSPARENT_ANIMATION_DELAY_MS = 1000; + private static final int TRANSLUCENT_ANIMATION_DELAY_MS = 1000; private final String mTag; private final int mTransientFlag; private final int mUnhideFlag; - private final int mTransparentFlag; + private final int mTranslucentFlag; private final int mStatusBarManagerId; + private final int mTranslucentWmFlag; private final Handler mHandler; private final Object mServiceAquireLock = new Object(); private IStatusBarService mStatusBarService; @@ -54,15 +56,16 @@ public class BarController { private int mState = StatusBarManager.WINDOW_STATE_SHOWING; private int mTransientBarState; private boolean mPendingShow; - private long mLastTransparent; + private long mLastTranslucent; - public BarController(String tag, int transientFlag, int unhideFlag, int transparentFlag, - int statusBarManagerId) { + public BarController(String tag, int transientFlag, int unhideFlag, int translucentFlag, + int statusBarManagerId, int translucentWmFlag) { mTag = "BarController." + tag; mTransientFlag = transientFlag; mUnhideFlag = unhideFlag; - mTransparentFlag = transparentFlag; + mTranslucentFlag = translucentFlag; mStatusBarManagerId = statusBarManagerId; + mTranslucentWmFlag = translucentWmFlag; mHandler = new Handler(); } @@ -84,8 +87,8 @@ public class BarController { return mTransientBarState == TRANSIENT_BAR_SHOWING; } - public boolean wasRecentlyTransparent() { - return (SystemClock.uptimeMillis() - mLastTransparent) < TRANSPARENT_ANIMATION_DELAY_MS; + public boolean wasRecentlyTranslucent() { + return (SystemClock.uptimeMillis() - mLastTranslucent) < TRANSLUCENT_ANIMATION_DELAY_MS; } public void adjustSystemUiVisibilityLw(int oldVis, int vis) { @@ -100,6 +103,22 @@ public class BarController { } } + public int applyTranslucentFlagLw(WindowState win, int vis, int oldVis) { + if (mWin != null) { + if (win != null && (win.getAttrs().privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) == 0) { + if ((win.getAttrs().flags & mTranslucentWmFlag) != 0) { + vis |= mTranslucentFlag; + } else { + vis &= ~mTranslucentFlag; + } + } else { + vis = (vis & ~mTranslucentFlag) | (oldVis & mTranslucentFlag); + } + } + return vis; + } + public boolean setBarShowingLw(final boolean show) { if (mWin == null) return false; if (show && mTransientBarState == TRANSIENT_BAR_HIDING) { @@ -186,10 +205,10 @@ public class BarController { } } - public int updateVisibilityLw(boolean allowed, int oldVis, int vis) { + public int updateVisibilityLw(boolean transientAllowed, int oldVis, int vis) { if (mWin == null) return vis; if (mTransientBarState == TRANSIENT_BAR_SHOWING) { // transient bar requested - if (allowed) { + if (transientAllowed) { vis |= mTransientFlag; if ((oldVis & mTransientFlag) == 0) { vis |= mUnhideFlag; // tell sysui we're ready to unhide @@ -202,8 +221,8 @@ public class BarController { vis |= mTransientFlag; // ignore clear requests until transition completes vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; // never show transient bars in low profile } - if ((vis & mTransparentFlag) != 0 || (oldVis & mTransparentFlag) != 0) { - mLastTransparent = SystemClock.uptimeMillis(); + if ((vis & mTranslucentFlag) != 0 || (oldVis & mTranslucentFlag) != 0) { + mLastTranslucent = SystemClock.uptimeMillis(); } return vis; } @@ -211,7 +230,7 @@ public class BarController { private void setTransientBarState(int state) { if (mWin != null && state != mTransientBarState) { if (mTransientBarState == TRANSIENT_BAR_SHOWING || state == TRANSIENT_BAR_SHOWING) { - mLastTransparent = SystemClock.uptimeMillis(); + mLastTranslucent = SystemClock.uptimeMillis(); } mTransientBarState = state; if (DEBUG) Slog.d(mTag, "mTransientBarState: " + transientBarStateToString(state)); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 11913ee..d8af007 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -2750,6 +2750,18 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags())); } + if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentStatus, + false)) { + setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS + & (~getForcedWindowFlags())); + } + + if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentNavigation, + false)) { + setFlags(FLAG_TRANSLUCENT_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION + & (~getForcedWindowFlags())); + } + if (a.getBoolean(com.android.internal.R.styleable.Window_windowOverscan, false)) { setFlags(FLAG_LAYOUT_IN_OVERSCAN, FLAG_LAYOUT_IN_OVERSCAN&(~getForcedWindowFlags())); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 3232a1e..dd4f3d1 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -163,9 +163,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { */ static final int SYSTEM_UI_CHANGING_LAYOUT = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; + | View.SYSTEM_UI_FLAG_FULLSCREEN; /** * Keyguard stuff @@ -557,14 +555,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { private final BarController mStatusBarController = new BarController("StatusBar", View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_UNHIDE, - View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS, - StatusBarManager.WINDOW_STATUS_BAR); + View.STATUS_BAR_TRANSLUCENT, + StatusBarManager.WINDOW_STATUS_BAR, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); private final BarController mNavigationBarController = new BarController("NavigationBar", View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_UNHIDE, - View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION, - StatusBarManager.WINDOW_NAVIGATION_BAR); + View.NAVIGATION_BAR_TRANSLUCENT, + StatusBarManager.WINDOW_NAVIGATION_BAR, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); private TransientNavigationConfirmation mTransientNavigationConfirmation; @@ -2694,9 +2694,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { // drive nav being hidden only by whether it is requested. final int sysui = mLastSystemUiFlags; boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; - boolean navTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) != 0; + boolean navTranslucent = (sysui & View.NAVIGATION_BAR_TRANSLUCENT) != 0; boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; - navTransparent &= !transientAllowed; // transient trumps transparent + navTranslucent &= !transientAllowed; // transient trumps translucent // When the navigation bar isn't visible, we put up a fake // input window to catch all touch events. This way we can @@ -2733,7 +2733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { - mNavigationBarHeightForRotation[displayRotation]; mTmpNavigationFrame.set(0, top, displayWidth, displayHeight - overscanBottom); mStableBottom = mStableFullscreenBottom = mTmpNavigationFrame.top; - if (transientNavBarShowing || navTransparent) { + if (transientNavBarShowing || navTranslucent) { mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { mNavigationBarController.setBarShowingLw(true); @@ -2744,8 +2744,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBarController.setBarShowingLw(false); } - if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw() - && !mNavigationBarController.wasRecentlyTransparent()) { + if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw() + && !mNavigationBarController.wasRecentlyTranslucent()) { // If the opaque nav bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2757,7 +2757,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { - mNavigationBarWidthForRotation[displayRotation]; mTmpNavigationFrame.set(left, 0, displayWidth - overscanRight, displayHeight); mStableRight = mStableFullscreenRight = mTmpNavigationFrame.left; - if (transientNavBarShowing || navTransparent) { + if (transientNavBarShowing || navTranslucent) { mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { mNavigationBarController.setBarShowingLw(true); @@ -2768,8 +2768,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBarController.setBarShowingLw(false); } - if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw() - && !mNavigationBarController.wasRecentlyTransparent()) { + if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw() + && !mNavigationBarController.wasRecentlyTranslucent()) { // If the nav bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2816,7 +2816,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mStableTop = mUnrestrictedScreenTop + mStatusBarHeight; boolean statusBarTransient = (sysui & View.STATUS_BAR_TRANSIENT) != 0; - boolean statusBarTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) != 0; + boolean statusBarTranslucent = (sysui & View.STATUS_BAR_TRANSLUCENT) != 0; // If the status bar is hidden, we don't want to cause // windows behind it to scroll. @@ -2839,8 +2839,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mCurLeft, mCurTop, mCurRight, mCurBottom)); } if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw() - && !statusBarTransient && !statusBarTransparent - && !mStatusBarController.wasRecentlyTransparent()) { + && !statusBarTransient && !statusBarTranslucent + && !mStatusBarController.wasRecentlyTranslucent()) { // If the opaque status bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2999,15 +2999,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { dcf.top = mSystemTop; dcf.right = mSystemRight; dcf.bottom = mSystemBottom; + final boolean inheritTranslucentDecor = (attrs.privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) != 0; if (attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW - && attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW) { - if ((attrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0 - && (sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 - && (sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) == 0) { + && attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW + && !inheritTranslucentDecor) { + if ((sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 + && (fl & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0 + && (fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) == 0) { // Ensure policy decor includes status bar dcf.top = mStableTop; } - if ((sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) == 0 + if ((fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0 && (sysUiFl & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { // Ensure policy decor includes navigation bar dcf.bottom = mStableBottom; @@ -3257,6 +3260,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { + mRestrictedScreenWidth; pf.bottom = df.bottom = of.bottom = cf.bottom = mRestrictedScreenTop + mRestrictedScreenHeight; + } else if (attrs.type == TYPE_TOAST || attrs.type == TYPE_SYSTEM_ALERT) { + // Toasts are stable to interim decor changes. + pf.left = df.left = of.left = cf.left = mStableLeft; + pf.top = df.top = of.top = cf.top = mStableTop; + pf.right = df.right = of.right = cf.right = mStableRight; + pf.bottom = df.bottom = of.bottom = cf.bottom = mStableBottom; } else { pf.left = mContentLeft; pf.top = mContentTop; @@ -5061,22 +5070,30 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private int updateSystemBarsLw(WindowState win, int oldVis, int vis) { + // apply translucent bar vis flags + WindowState transWin = mKeyguard != null && mKeyguard.isVisibleLw() && !mHideLockScreen + ? mKeyguard + : mTopFullscreenOpaqueWindowState; + vis = mStatusBarController.applyTranslucentFlagLw(transWin, vis, oldVis); + vis = mNavigationBarController.applyTranslucentFlagLw(transWin, vis, oldVis); + // prevent status bar interaction from clearing certain flags boolean statusBarHasFocus = win.getAttrs().type == TYPE_STATUS_BAR; if (statusBarHasFocus) { int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE - | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; - vis = (vis & ~flags) | (mLastSystemUiFlags & flags); + | View.STATUS_BAR_TRANSLUCENT + | View.NAVIGATION_BAR_TRANSLUCENT; + vis = (vis & ~flags) | (oldVis & flags); } // update status bar boolean transientAllowed = (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; boolean hideStatusBarWM = - (win.getAttrs().flags + mTopFullscreenOpaqueWindowState != null && + (mTopFullscreenOpaqueWindowState.getAttrs().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; boolean hideStatusBarSysui = (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; |