diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0adda5697bb80..84a0d376d5b27 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -582,9 +582,12 @@
false
-
+
false
+
+ false
+
true
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 53baa1800c0b3..586a3698e67f1 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1283,6 +1283,7 @@
+
diff --git a/packages/Keyguard/res/layout-land/keyguard_host_view.xml b/packages/Keyguard/res/layout-land/keyguard_host_view.xml
index eeb9ee7998c11..87b8b59fad62c 100644
--- a/packages/Keyguard/res/layout-land/keyguard_host_view.xml
+++ b/packages/Keyguard/res/layout-land/keyguard_host_view.xml
@@ -51,11 +51,6 @@
androidprv:layout_maxHeight="480dp" />
-
-
-
-
-
-
- @*android:bool/config_enableLockScreenRotation
+
+ - @*android:bool/config_enableLockScreenTransparentBars
+
- @*android:integer/config_activityDefaultDur
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index 07872863e983d..aa43711202150 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -319,6 +319,7 @@ public class KeyguardHostView extends KeyguardViewBase {
}
private SlidingChallengeLayout mSlidingChallengeLayout;
+ private MultiPaneChallengeLayout mMultiPaneChallengeLayout;
@Override
public boolean onTouchEvent(MotionEvent ev) {
@@ -372,8 +373,10 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetContainer.setViewStateManager(mViewStateManager);
mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils);
+ mMultiPaneChallengeLayout =
+ (MultiPaneChallengeLayout) findViewById(R.id.multi_pane_challenge);
ChallengeLayout challenge = mSlidingChallengeLayout != null ? mSlidingChallengeLayout :
- (ChallengeLayout) findViewById(R.id.multi_pane_challenge);
+ mMultiPaneChallengeLayout;
challenge.setOnBouncerStateChangedListener(mViewStateManager);
mAppWidgetContainer.setBouncerAnimationDuration(challenge.getBouncerAnimationDuration());
mViewStateManager.setPagedView(mAppWidgetContainer);
@@ -399,6 +402,11 @@ public class KeyguardHostView extends KeyguardViewBase {
updateSecurityViews();
}
+ public void setScrimView(View scrim) {
+ if (mSlidingChallengeLayout != null) mSlidingChallengeLayout.setScrimView(scrim);
+ if (mMultiPaneChallengeLayout != null) mMultiPaneChallengeLayout.setScrimView(scrim);
+ }
+
private void setBackButtonEnabled(boolean enabled) {
if (mContext instanceof Activity) return; // always enabled in activity mode
setSystemUiVisibility(enabled ?
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java
index 893562ed40a24..bff1f93fd712c 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java
@@ -18,11 +18,6 @@ package com.android.keyguard;
import android.app.Activity;
import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.IAudioService;
import android.os.RemoteException;
@@ -45,7 +40,6 @@ import android.widget.FrameLayout;
*/
public abstract class KeyguardViewBase extends FrameLayout {
- private static final int BACKGROUND_COLOR = 0x70000000;
private AudioManager mAudioManager;
private TelephonyManager mTelephonyManager = null;
protected KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback;
@@ -55,38 +49,12 @@ public abstract class KeyguardViewBase extends FrameLayout {
// the audio service will bring up the volume dialog.
private static final boolean KEYGUARD_MANAGES_VOLUME = true;
- // This is a faster way to draw the background on devices without hardware acceleration
- private static final Drawable mBackgroundDrawable = new Drawable() {
- @Override
- public void draw(Canvas canvas) {
- canvas.drawColor(BACKGROUND_COLOR, PorterDuff.Mode.SRC);
- }
-
- @Override
- public void setAlpha(int alpha) {
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
- };
-
public KeyguardViewBase(Context context) {
this(context, null);
}
public KeyguardViewBase(Context context, AttributeSet attrs) {
super(context, attrs);
- resetBackground();
- }
-
- public void resetBackground() {
- setBackground(mBackgroundDrawable);
}
/**
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
index 483745848f28c..177e0f8361510 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
@@ -26,8 +26,12 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcelable;
@@ -67,7 +71,7 @@ public class KeyguardViewManager {
private WindowManager.LayoutParams mWindowLayoutParams;
private boolean mNeedsInput = false;
- private FrameLayout mKeyguardHost;
+ private ViewManagerHost mKeyguardHost;
private KeyguardHostView mKeyguardView;
private boolean mScreenOn = false;
@@ -108,7 +112,11 @@ public class KeyguardViewManager {
// useful on any keyguard screen but can be re-shown by dialogs or SHOW_WHEN_LOCKED
// activities. Other disabled bits are handled by the KeyguardViewMediator talking
// directly to the status bar service.
- final int visFlags = View.STATUS_BAR_DISABLE_HOME;
+ int visFlags = View.STATUS_BAR_DISABLE_HOME;
+ if (shouldEnableTransparentBars()) {
+ visFlags |= View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS
+ | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
+ }
if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")");
mKeyguardHost.setSystemUiVisibility(visFlags);
@@ -124,16 +132,81 @@ public class KeyguardViewManager {
|| res.getBoolean(R.bool.config_enableLockScreenRotation);
}
+ private boolean shouldEnableTransparentBars() {
+ Resources res = mContext.getResources();
+ return res.getBoolean(R.bool.config_enableLockScreenTransparentBars);
+ }
+
class ViewManagerHost extends FrameLayout {
- public ViewManagerHost(Context context) {
+ private static final int BACKGROUND_COLOR = 0x70000000;
+ // This is a faster way to draw the background on devices without hardware acceleration
+ private final Drawable mBackgroundDrawable = new Drawable() {
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.drawColor(BACKGROUND_COLOR, PorterDuff.Mode.SRC);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+ };
+ private final View mScrimView;
+ private boolean mExtendIntoPadding;
+ public ViewManagerHost(Context context, boolean extendIntoPadding) {
super(context);
+ mExtendIntoPadding = extendIntoPadding;
setFitsSystemWindows(true);
+ setClipToPadding(!mExtendIntoPadding);
+ setBackground(mBackgroundDrawable);
+
+ mScrimView = new View(context);
+ mScrimView.setVisibility(View.GONE);
+ mScrimView.setBackgroundColor(0x99000000);
+ addView(mScrimView);
+ }
+
+ private boolean considerPadding(View child) {
+ return !mExtendIntoPadding || child instanceof KeyguardHostView;
}
@Override
- protected boolean fitSystemWindows(Rect insets) {
- Log.v("TAG", "bug 7643792: fitSystemWindows(" + insets.toShortString() + ")");
- return super.fitSystemWindows(insets);
+ protected void measureChildWithMargins(View child,
+ int parentWidthMeasureSpec, int widthUsed,
+ int parentHeightMeasureSpec, int heightUsed) {
+ if (considerPadding(child)) {
+ // don't extend into padding (default behavior)
+ super.measureChildWithMargins(child,
+ parentWidthMeasureSpec, widthUsed,
+ parentHeightMeasureSpec, heightUsed);
+ } else {
+ // allowed to extend into padding (scrim / camera preview)
+ child.measure(parentWidthMeasureSpec, parentHeightMeasureSpec);
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ int cl = l, ct = t, cr = r, cb = b;
+ if (considerPadding(child)) {
+ cl += mPaddingLeft;
+ ct += mPaddingTop;
+ cr -= mPaddingRight;
+ cb -= mPaddingBottom;
+ }
+ child.layout(cl, ct, cr, cb);
+ }
}
@Override
@@ -179,7 +252,7 @@ public class KeyguardViewManager {
if (mKeyguardHost == null) {
if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
- mKeyguardHost = new ViewManagerHost(mContext);
+ mKeyguardHost = new ViewManagerHost(mContext, shouldEnableTransparentBars());
int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
@@ -233,6 +306,7 @@ public class KeyguardViewManager {
mKeyguardView.setViewMediatorCallback(mViewMediatorCallback);
mKeyguardView.initializeSwitchingUserState(options != null &&
options.getBoolean(IS_SWITCHING_USER));
+ mKeyguardView.setScrimView(mKeyguardHost.mScrimView);
// HACK
// The keyguard view will have set up window flags in onFinishInflate before we set
diff --git a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
index 8fd39c00a7fee..76a7fe3fa5108 100644
--- a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
+++ b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
@@ -172,10 +172,12 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
mScrimView.setOnClickListener(null);
}
mScrimView = scrim;
- mScrimView.setAlpha(mIsBouncing ? 1.0f : 0.0f);
- mScrimView.setVisibility(mIsBouncing ? VISIBLE : INVISIBLE);
- mScrimView.setFocusable(true);
- mScrimView.setOnClickListener(mScrimClickListener);
+ if (mScrimView != null) {
+ mScrimView.setAlpha(mIsBouncing ? 1.0f : 0.0f);
+ mScrimView.setVisibility(mIsBouncing ? VISIBLE : INVISIBLE);
+ mScrimView.setFocusable(true);
+ mScrimView.setOnClickListener(mScrimClickListener);
+ }
}
private int getVirtualHeight(LayoutParams lp, int height, int heightUsed) {
diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
index 05b35a12e8fac..4a4e7fa907e53 100644
--- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
+++ b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
@@ -367,9 +367,11 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mScrimView.setOnClickListener(null);
}
mScrimView = scrim;
- mScrimView.setVisibility(mIsBouncing ? VISIBLE : GONE);
- mScrimView.setFocusable(true);
- mScrimView.setOnClickListener(mScrimClickListener);
+ if (mScrimView != null) {
+ mScrimView.setVisibility(mIsBouncing ? VISIBLE : GONE);
+ mScrimView.setFocusable(true);
+ mScrimView.setOnClickListener(mScrimClickListener);
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index a600aae386d9c..e77b42060f874 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
+import android.app.StatusBarManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -111,6 +112,10 @@ public class StatusBarWindowView extends FrameLayout
if (!handled) {
handled = super.onTouchEvent(ev);
}
+ final int action = ev.getAction();
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ mService.setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
+ }
return handled;
}