summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/res/layout/keyguard_widget_pager.xml5
-rwxr-xr-xcore/res/res/values/attrs.xml1
-rw-r--r--core/res/res/values/dimens.xml4
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java32
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java22
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/PagedView.java7
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java47
8 files changed, 102 insertions, 17 deletions
diff --git a/core/res/res/layout/keyguard_widget_pager.xml b/core/res/res/layout/keyguard_widget_pager.xml
index fae1db661f56..6662f83ce62b 100644
--- a/core/res/res/layout/keyguard_widget_pager.xml
+++ b/core/res/res/layout/keyguard_widget_pager.xml
@@ -28,6 +28,5 @@
android:paddingBottom="25dp"
android:clipChildren="false"
android:clipToPadding="false"
- androidprv:pageSpacing="10dp"
- androidprv:edgeSwipeRegionSize="8dp">
-</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager> \ No newline at end of file
+ androidprv:pageSpacing="10dp">
+</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 176103d733ba..932811e73be9 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -5766,7 +5766,6 @@
<!-- The padding for the scroll indicator area -->
<attr name="scrollIndicatorPaddingLeft" format="dimension" />
<attr name="scrollIndicatorPaddingRight" format="dimension" />
- <attr name="edgeSwipeRegionSize" format="dimension" />
</declare-styleable>
<declare-styleable name="KeyguardGlowStripView">
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index fd6ab50b2bef..f377c847a9eb 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -323,4 +323,8 @@
<!-- Size of the text under the avator on the multiuser lockscreen. -->
<dimen name="keyguard_avatar_name_size">10sp</dimen>
+
+ <!-- Size of the region along the edge of the screen that will accept
+ swipes to scroll the widget area. -->
+ <dimen name="kg_edge_swipe_region_size">16dp</dimen>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 24cfa648e0f9..f518e7f3d87a 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1214,6 +1214,7 @@
<java-symbol type="dimen" name="keyguard_avatar_size" />
<java-symbol type="dimen" name="keyguard_avatar_frame_stroke_width" />
<java-symbol type="dimen" name="keyguard_avatar_frame_shadow_radius" />
+ <java-symbol type="dimen" name="kg_edge_swipe_region_size" />
<java-symbol type="drawable" name="ic_jog_dial_sound_off" />
<java-symbol type="drawable" name="ic_jog_dial_sound_on" />
<java-symbol type="drawable" name="ic_jog_dial_unlock" />
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
index ba97a66b0bfe..605a7380775c 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/ChallengeLayout.java
@@ -57,4 +57,36 @@ public interface ChallengeLayout {
* potentially blocking access to other child views.
*/
boolean isBouncing();
+
+ /**
+ * Set a listener that will respond to changes in bouncer state.
+ *
+ * @param listener listener to register
+ */
+ void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener);
+
+ /**
+ * Listener interface that reports changes in bouncer state.
+ * The bouncer is
+ */
+ public interface OnBouncerStateChangedListener {
+ /**
+ * Called when the bouncer state changes.
+ * The bouncer is activated when the user must pass a security challenge
+ * to proceed with the requested action.
+ *
+ * <p>This differs from simply showing or hiding the security challenge
+ * as the bouncer will prevent interaction with other elements of the UI.
+ * If the user attempts to escape from the bouncer, it will be dismissed,
+ * this method will be called with false as the parameter, and the action
+ * should be canceled. If the security component reports a successful
+ * authentication and the containing code calls hideBouncer() as a result,
+ * this method will also be called with a false parameter. It is up to the
+ * caller of hideBouncer to be ready for this.</p>
+ *
+ * @param bouncerActive true if the bouncer is now active,
+ * false if the bouncer was dismissed.
+ */
+ public void onBouncerStateChanged(boolean bouncerActive);
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
index 1a976dc12fde..b6cada83e0ac 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/MultiPaneChallengeLayout.java
@@ -40,6 +40,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
private View mChallengeView;
private View mUserSwitcherView;
private View mScrimView;
+ private OnBouncerStateChangedListener mBouncerListener;
private final Rect mTempRect = new Rect();
@@ -89,6 +90,9 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
if (mScrimView != null) {
mScrimView.setVisibility(GONE);
}
+ if (mBouncerListener != null) {
+ mBouncerListener.onBouncerStateChanged(true);
+ }
}
@Override
@@ -98,6 +102,9 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
if (mScrimView != null) {
mScrimView.setVisibility(GONE);
}
+ if (mBouncerListener != null) {
+ mBouncerListener.onBouncerStateChanged(false);
+ }
}
@Override
@@ -105,6 +112,21 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo
return mIsBouncing;
}
+ @Override
+ public void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener) {
+ mBouncerListener = listener;
+ }
+
+ @Override
+ public void requestChildFocus(View child, View focused) {
+ if (mIsBouncing && child != mChallengeView) {
+ // Clear out of the bouncer if the user tries to move focus outside of
+ // the security challenge view.
+ hideBouncer();
+ }
+ super.requestChildFocus(child, focused);
+ }
+
void setScrimView(View scrim) {
if (mScrimView != null) {
mScrimView.setOnClickListener(null);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
index dfad015dc506..76bd005ad024 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
@@ -253,11 +253,12 @@ public class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeL
mScrollIndicatorPaddingLeft =
a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingLeft, 0);
mScrollIndicatorPaddingRight =
- a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingRight, 0);
- mEdgeSwipeRegionSize =
- a.getDimensionPixelSize(R.styleable.PagedView_edgeSwipeRegionSize, 0);
+ a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingRight, 0);
a.recycle();
+ mEdgeSwipeRegionSize =
+ getResources().getDimensionPixelSize(R.dimen.kg_edge_swipe_region_size);
+
setHapticFeedbackEnabled(false);
init();
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
index 36d719269286..165fbe73d38e 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
@@ -55,7 +55,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private final Scroller mScroller;
private int mScrollState;
- private OnChallengeScrolledListener mListener;
+ private OnChallengeScrolledListener mScrollListener;
+ private OnBouncerStateChangedListener mBouncerListener;
public static final int SCROLL_STATE_IDLE = 0;
public static final int SCROLL_STATE_DRAGGING = 1;
@@ -77,6 +78,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private int mMaxVelocity;
private float mLastTouchY;
private int mDragHandleSize;
+ private int mDragHandleEdgeSlop;
private static final int DRAG_HANDLE_DEFAULT_SIZE = 32; // dp
@@ -172,6 +174,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mMinVelocity = vc.getScaledMinimumFlingVelocity();
mMaxVelocity = vc.getScaledMaximumFlingVelocity();
+ mDragHandleEdgeSlop = getResources().getDimensionPixelSize(
+ R.dimen.kg_edge_swipe_region_size);
+
setWillNotDraw(false);
}
@@ -187,20 +192,24 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
private void sendInitialListenerUpdates() {
- if (mListener != null) {
+ if (mScrollListener != null) {
int challengeTop = mChallengeView != null ? mChallengeView.getTop() : 0;
- mListener.onScrollPositionChanged(mChallengeOffset, challengeTop);
- mListener.onScrollStateChanged(mScrollState);
+ mScrollListener.onScrollPositionChanged(mChallengeOffset, challengeTop);
+ mScrollListener.onScrollStateChanged(mScrollState);
}
}
public void setOnChallengeScrolledListener(OnChallengeScrolledListener listener) {
- mListener = listener;
+ mScrollListener = listener;
if (mHasLayout) {
sendInitialListenerUpdates();
}
}
+ public void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener) {
+ mBouncerListener = listener;
+ }
+
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
@@ -216,6 +225,16 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mHasLayout = false;
}
+ @Override
+ public void requestChildFocus(View child, View focused) {
+ if (mIsBouncing && child != mChallengeView) {
+ // Clear out of the bouncer if the user tries to move focus outside of
+ // the security challenge view.
+ hideBouncer();
+ }
+ super.requestChildFocus(child, focused);
+ }
+
// We want the duration of the page snap animation to be influenced by the distance that
// the screen has to travel, however, we don't want this duration to be effected in a
// purely linear fashion. Instead, we use this method to moderate the effect that the distance
@@ -230,8 +249,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
if (mScrollState != state) {
mScrollState = state;
- if (mListener != null) {
- mListener.onScrollStateChanged(state);
+ if (mScrollListener != null) {
+ mScrollListener.onScrollStateChanged(state);
}
}
}
@@ -325,6 +344,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
if (mScrimView != null) {
mScrimView.setVisibility(GONE);
}
+ if (mBouncerListener != null) {
+ mBouncerListener.onBouncerStateChanged(true);
+ }
}
@Override
@@ -335,6 +357,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
if (mScrimView != null) {
mScrimView.setVisibility(GONE);
}
+ if (mBouncerListener != null) {
+ mBouncerListener.onBouncerStateChanged(false);
+ }
}
@Override
@@ -477,7 +502,9 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private boolean isInDragHandle(float x, float y) {
if (mChallengeView == null) return false;
- return x >= 0 && y >= mChallengeView.getTop() && x < getWidth() &&
+ return x >= mDragHandleEdgeSlop &&
+ y >= mChallengeView.getTop() &&
+ x < getWidth() - mDragHandleEdgeSlop &&
y < mChallengeView.getTop() + mDragHandleSize;
}
@@ -644,8 +671,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
bottom - mChallengeView.getHeight(), mChallengeView.getRight(), bottom);
mChallengeView.setAlpha(offset);
- if (mListener != null) {
- mListener.onScrollPositionChanged(offset, mChallengeView.getTop());
+ if (mScrollListener != null) {
+ mScrollListener.onScrollPositionChanged(offset, mChallengeView.getTop());
}
postInvalidateOnAnimation();
return true;