summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java9
-rw-r--r--core/res/res/drawable-hdpi/kg_security_lock.pngbin1898 -> 2722 bytes
-rw-r--r--core/res/res/drawable-hdpi/security_frame.9.pngbin6384 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/security_handle.pngbin516 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/kg_security_lock.pngbin1530 -> 1933 bytes
-rw-r--r--core/res/res/drawable-mdpi/security_frame.9.pngbin6384 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/security_handle.pngbin516 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/kg_security_lock.pngbin2484 -> 3730 bytes
-rw-r--r--core/res/res/drawable-xhdpi/security_frame.9.pngbin6384 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/security_handle.pngbin516 -> 0 bytes
-rw-r--r--core/res/res/layout-port/keyguard_host_view.xml1
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--media/java/android/media/AudioService.java38
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java9
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java60
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java53
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java175
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/PagedView.java13
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java95
19 files changed, 304 insertions, 151 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 074460a7696c..f482335721ff 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5300,6 +5300,14 @@ public final class Settings {
"always_finish_activities";
/**
+ * Use Dock audio output for media:
+ * 0 = disabled
+ * 1 = enabled
+ * @hide
+ */
+ public static final String DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
+
+ /**
* Settings to backup. This is here so that it's in the same place as the settings
* keys and easy to update.
*
@@ -5330,6 +5338,7 @@ public final class Settings {
WIFI_NUM_OPEN_NETWORKS_KEPT,
EMERGENCY_TONE,
CALL_AUTO_RETRY,
+ DOCK_AUDIO_MEDIA_ENABLED
};
// Populated lazily, guarded by class object:
diff --git a/core/res/res/drawable-hdpi/kg_security_lock.png b/core/res/res/drawable-hdpi/kg_security_lock.png
index 136d3adfa80d..5fb5a01505a4 100644
--- a/core/res/res/drawable-hdpi/kg_security_lock.png
+++ b/core/res/res/drawable-hdpi/kg_security_lock.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/security_frame.9.png b/core/res/res/drawable-hdpi/security_frame.9.png
deleted file mode 100644
index 9eeadc4d118f..000000000000
--- a/core/res/res/drawable-hdpi/security_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/security_handle.png b/core/res/res/drawable-hdpi/security_handle.png
deleted file mode 100644
index bd4640f7228c..000000000000
--- a/core/res/res/drawable-hdpi/security_handle.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/kg_security_lock.png b/core/res/res/drawable-mdpi/kg_security_lock.png
index 861760da8d1b..e75c82e6cfbd 100644
--- a/core/res/res/drawable-mdpi/kg_security_lock.png
+++ b/core/res/res/drawable-mdpi/kg_security_lock.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/security_frame.9.png b/core/res/res/drawable-mdpi/security_frame.9.png
deleted file mode 100644
index 9eeadc4d118f..000000000000
--- a/core/res/res/drawable-mdpi/security_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/security_handle.png b/core/res/res/drawable-mdpi/security_handle.png
deleted file mode 100644
index bd4640f7228c..000000000000
--- a/core/res/res/drawable-mdpi/security_handle.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/kg_security_lock.png b/core/res/res/drawable-xhdpi/kg_security_lock.png
index 45445845d015..93cdf10f83d2 100644
--- a/core/res/res/drawable-xhdpi/kg_security_lock.png
+++ b/core/res/res/drawable-xhdpi/kg_security_lock.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/security_frame.9.png b/core/res/res/drawable-xhdpi/security_frame.9.png
deleted file mode 100644
index 9eeadc4d118f..000000000000
--- a/core/res/res/drawable-xhdpi/security_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/security_handle.png b/core/res/res/drawable-xhdpi/security_handle.png
deleted file mode 100644
index bd4640f7228c..000000000000
--- a/core/res/res/drawable-xhdpi/security_handle.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/layout-port/keyguard_host_view.xml b/core/res/res/layout-port/keyguard_host_view.xml
index 15e984443092..2caa72f000db 100644
--- a/core/res/res/layout-port/keyguard_host_view.xml
+++ b/core/res/res/layout-port/keyguard_host_view.xml
@@ -32,7 +32,6 @@
android:id="@+id/sliding_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- androidprv:dragHandle="@drawable/kg_security_grip"
androidprv:dragIcon="@drawable/kg_security_lock">
<FrameLayout
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 60a2e9139cf5..7ebf7e7bfd6b 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1234,7 +1234,7 @@
<java-symbol type="drawable" name="magnified_region_frame" />
<java-symbol type="drawable" name="menu_background" />
<java-symbol type="drawable" name="stat_sys_secure" />
- <java-symbol type="drawable" name="security_frame" />
+ <java-symbol type="drawable" name="kg_bouncer_bg_white" />
<java-symbol type="id" name="action_mode_bar_stub" />
<java-symbol type="id" name="alarm_status" />
<java-symbol type="id" name="backspace" />
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index aa0d8c3b1aa0..a5c60d41e060 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -429,10 +429,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// Devices for which the volume is fixed and VolumePanel slider should be disabled
final int mFixedVolumeDevices = AudioSystem.DEVICE_OUT_AUX_DIGITAL |
AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET |
+ AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET |
AudioSystem.DEVICE_OUT_ALL_USB;
private final boolean mMonitorOrientation;
+ private boolean mDockAudioMediaEnabled = true;
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -630,6 +633,27 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
+ private void readDockAudioSettings(ContentResolver cr)
+ {
+ mDockAudioMediaEnabled = Settings.Global.getInt(
+ cr, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 1) == 1;
+
+ if (mDockAudioMediaEnabled) {
+ mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;
+ } else {
+ mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;
+ }
+
+ sendMsg(mAudioHandler,
+ MSG_SET_FORCE_USE,
+ SENDMSG_QUEUE,
+ AudioSystem.FOR_DOCK,
+ mDockAudioMediaEnabled ?
+ AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE,
+ null,
+ 0);
+ }
+
private void readPersistedSettings() {
final ContentResolver cr = mContentResolver;
@@ -693,6 +717,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
Settings.System.MODE_RINGER_STREAMS_AFFECTED,
mRingerModeAffectedStreams,
UserHandle.USER_CURRENT);
+
+ readDockAudioSettings(cr);
}
mMuteAffectedStreams = System.getIntForUser(cr,
@@ -3408,6 +3434,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
super(new Handler());
mContentResolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this);
+ mContentResolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this);
}
@Override
@@ -3443,6 +3471,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
mRingerModeAffectedStreams = ringerModeAffectedStreams;
setRingerModeInt(getRingerMode(), false);
}
+ readDockAudioSettings(mContentResolver);
}
}
}
@@ -3722,7 +3751,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
config = AudioSystem.FORCE_BT_CAR_DOCK;
break;
case Intent.EXTRA_DOCK_STATE_LE_DESK:
- config = AudioSystem.FORCE_ANALOG_DOCK;
+ synchronized (mSettingsLock) {
+ if (mDockAudioMediaEnabled) {
+ config = AudioSystem.FORCE_ANALOG_DOCK;
+ } else {
+ config = AudioSystem.FORCE_NONE;
+ }
+ }
break;
case Intent.EXTRA_DOCK_STATE_HE_DESK:
config = AudioSystem.FORCE_DIGITAL_DOCK;
@@ -3731,6 +3766,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
default:
config = AudioSystem.FORCE_NONE;
}
+
AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config);
} else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
index c163b975fbc9..806c6f096fee 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewStateManager.java
@@ -17,7 +17,6 @@ package com.android.internal.policy.impl.keyguard;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.View;
public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChallengeScrolledListener {
@@ -29,6 +28,7 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle
private KeyguardSecurityView mKeyguardSecurityContainer;
private int[] mTmpPoint = new int[2];
private static final int SCREEN_ON_HINT_DURATION = 1000;
+ private static final int SCREEN_ON_RING_HINT_DELAY = 300;
Handler mMainQueue = new Handler(Looper.myLooper());
int mChallengeTop = 0;
@@ -147,7 +147,12 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle
}
public void showUsabilityHints() {
- mKeyguardSecurityContainer.showUsabilityHint();
+ mMainQueue.postDelayed( new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardSecurityContainer.showUsabilityHint();
+ }
+ } , SCREEN_ON_RING_HINT_DELAY);
mPagedView.showInitialPageHints();
mHideHintsRunnable = new Runnable() {
@Override
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java
index 02c32d4d6e32..cf16ef2a715d 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetCarousel.java
@@ -17,12 +17,14 @@ package com.android.internal.policy.impl.keyguard;
import android.content.Context;
import android.util.AttributeSet;
+import android.view.View;
import com.android.internal.R;
public class KeyguardWidgetCarousel extends KeyguardWidgetPager {
private float mAdjacentPagesAngle;
+ private static float MAX_SCROLL_PROGRESS = 1.3f;
private static float CAMERA_DISTANCE = 10000;
public KeyguardWidgetCarousel(Context context, AttributeSet attrs) {
@@ -39,43 +41,73 @@ public class KeyguardWidgetCarousel extends KeyguardWidgetPager {
}
protected float getMaxScrollProgress() {
- return 1.5f;
+ return MAX_SCROLL_PROGRESS;
+ }
+
+ public float getAlphaForPage(int screenCenter, int index) {
+ View child = getChildAt(index);
+ if (child == null) return 0f;
+
+ float scrollProgress = getScrollProgress(screenCenter, child, index);
+ if (!isOverScrollChild(index, scrollProgress)) {
+ scrollProgress = getBoundedScrollProgress(screenCenter, child, index);
+ float alpha = 1 - Math.abs(scrollProgress / MAX_SCROLL_PROGRESS);
+ return alpha;
+ } else {
+ return 1f;
+ }
}
private void updatePageAlphaValues(int screenCenter) {
- boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX;
- if (!isInOverscroll) {
+ if (mChildrenOutlineFadeAnimation != null) {
+ mChildrenOutlineFadeAnimation.cancel();
+ mChildrenOutlineFadeAnimation = null;
+ }
+ if (!isReordering(false)) {
for (int i = 0; i < getChildCount(); i++) {
KeyguardWidgetFrame child = getWidgetPageAt(i);
if (child != null) {
- float scrollProgress = getScrollProgress(screenCenter, child, i);
- if (!isReordering(false)) {
- child.setBackgroundAlphaMultiplier(
- backgroundAlphaInterpolator(Math.abs(scrollProgress)));
- } else {
- child.setBackgroundAlphaMultiplier(1f);
- }
+ float alpha = getAlphaForPage(screenCenter, i);
+ child.setBackgroundAlpha(alpha);
+ child.setContentAlpha(alpha);
}
}
}
+
}
@Override
protected void screenScrolled(int screenCenter) {
+ mScreenCenter = screenCenter;
updatePageAlphaValues(screenCenter);
for (int i = 0; i < getChildCount(); i++) {
KeyguardWidgetFrame v = getWidgetPageAt(i);
- if (v == mDragView) continue;
- if (v != null) {
- float scrollProgress = getScrollProgress(screenCenter, v, i);
+ float scrollProgress = getScrollProgress(screenCenter, v, i);
+ if (v == mDragView || v == null) continue;
+ v.setCameraDistance(CAMERA_DISTANCE);
+
+ if (isOverScrollChild(i, scrollProgress)) {
+ v.setRotationY(- OVERSCROLL_MAX_ROTATION * scrollProgress);
+ v.setOverScrollAmount(Math.abs(scrollProgress), scrollProgress < 0);
+ } else {
+ scrollProgress = getBoundedScrollProgress(screenCenter, v, i);
int width = v.getMeasuredWidth();
float pivotX = (width / 2f) + scrollProgress * (width / 2f);
float pivotY = v.getMeasuredHeight() / 2;
float rotationY = - mAdjacentPagesAngle * scrollProgress;
- v.setCameraDistance(CAMERA_DISTANCE);
v.setPivotX(pivotX);
v.setPivotY(pivotY);
v.setRotationY(rotationY);
+ v.setOverScrollAmount(0f, false);
+ }
+
+ float alpha = v.getAlpha();
+ // If the view has 0 alpha, we set it to be invisible so as to prevent
+ // it from accepting touches
+ if (alpha == 0) {
+ v.setVisibility(INVISIBLE);
+ } else if (v.getVisibility() != VISIBLE) {
+ v.setVisibility(VISIBLE);
}
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
index 9e1189c3bf26..20e86ad5475d 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
@@ -51,6 +51,7 @@ public class KeyguardWidgetFrame extends FrameLayout {
private CheckLongPressHelper mLongPressHelper;
private float mBackgroundAlpha;
+ private float mContentAlpha;
private float mBackgroundAlphaMultiplier = 1.0f;
private Drawable mBackgroundDrawable;
private Rect mBackgroundRect = new Rect();
@@ -74,7 +75,7 @@ public class KeyguardWidgetFrame extends FrameLayout {
int padding = (int) (res.getDisplayMetrics().density * 8);
setPadding(padding, padding, padding, padding);
- mBackgroundDrawable = res.getDrawable(R.drawable.security_frame);
+ mBackgroundDrawable = res.getDrawable(R.drawable.kg_bouncer_bg_white);
mGradientColor = res.getColor(com.android.internal.R.color.kg_widget_pager_gradient);
mGradientPaint.setXfermode(sAddBlendMode);
}
@@ -133,6 +134,23 @@ public class KeyguardWidgetFrame extends FrameLayout {
mLongPressHelper.cancelLongPress();
}
+
+ private void drawGradientOverlay(Canvas c) {
+ mGradientPaint.setShader(mForegroundGradient);
+ mGradientPaint.setAlpha(mForegroundAlpha);
+ c.drawRect(mForegroundRect, mGradientPaint);
+ }
+
+ protected void drawBg(Canvas canvas) {
+ if (mBackgroundAlpha > 0.0f) {
+ Drawable bg = mBackgroundDrawable;
+
+ bg.setAlpha((int) (mBackgroundAlpha * mBackgroundAlphaMultiplier * 255));
+ bg.setBounds(mBackgroundRect);
+ bg.draw(canvas);
+ }
+ }
+
@Override
protected void dispatchDraw(Canvas canvas) {
drawBg(canvas);
@@ -164,6 +182,14 @@ public class KeyguardWidgetFrame extends FrameLayout {
}
}
+ public void enableHardwareLayers() {
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+ }
+
+ public void disableHardwareLayers() {
+ setLayerType(LAYER_TYPE_NONE, null);
+ }
+
public View getContent() {
return getChildAt(0);
}
@@ -177,28 +203,12 @@ public class KeyguardWidgetFrame extends FrameLayout {
}
}
- private void drawGradientOverlay(Canvas c) {
- mGradientPaint.setShader(mForegroundGradient);
- mGradientPaint.setAlpha(mForegroundAlpha);
- c.drawRect(mForegroundRect, mGradientPaint);
- }
-
- protected void drawBg(Canvas canvas) {
- if (mBackgroundAlpha > 0.0f) {
- Drawable bg = mBackgroundDrawable;
-
- bg.setAlpha((int) (mBackgroundAlpha * mBackgroundAlphaMultiplier * 255));
- bg.setBounds(mBackgroundRect);
- bg.draw(canvas);
- }
- }
-
public float getBackgroundAlpha() {
return mBackgroundAlpha;
}
public void setBackgroundAlphaMultiplier(float multiplier) {
- if (mBackgroundAlphaMultiplier != multiplier) {
+ if (Float.compare(mBackgroundAlphaMultiplier, multiplier) != 0) {
mBackgroundAlphaMultiplier = multiplier;
invalidate();
}
@@ -209,13 +219,18 @@ public class KeyguardWidgetFrame extends FrameLayout {
}
public void setBackgroundAlpha(float alpha) {
- if (mBackgroundAlpha != alpha) {
+ if (Float.compare(mBackgroundAlpha, alpha) != 0) {
mBackgroundAlpha = alpha;
invalidate();
}
}
+ public float getContentAlpha() {
+ return mContentAlpha;
+ }
+
public void setContentAlpha(float alpha) {
+ mContentAlpha = alpha;
View content = getContent();
if (content != null) {
content.setAlpha(alpha);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
index bd885e655e89..09ce4db4e10b 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java
@@ -15,6 +15,9 @@
*/
package com.android.internal.policy.impl.keyguard;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
@@ -27,33 +30,32 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import com.android.internal.R;
import com.android.internal.widget.LockPatternUtils;
+import java.util.ArrayList;
+
public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwitchListener,
OnLongClickListener {
ZInterpolator mZInterpolator = new ZInterpolator(0.5f);
private static float CAMERA_DISTANCE = 10000;
- private static float TRANSITION_MAX_ROTATION = 30;
+ protected static float OVERSCROLL_MAX_ROTATION = 30;
private static final boolean PERFORM_OVERSCROLL_ROTATION = true;
private KeyguardViewStateManager mViewStateManager;
private LockPatternUtils mLockPatternUtils;
// Related to the fading in / out background outlines
- private static final int CHILDREN_OUTLINE_FADE_OUT_DELAY = 0;
private static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 375;
- private static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 100;
- private ObjectAnimator mChildrenOutlineFadeInAnimation;
- private ObjectAnimator mChildrenOutlineFadeOutAnimation;
+ private static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 75;
+ protected AnimatorSet mChildrenOutlineFadeAnimation;
private float mChildrenOutlineAlpha = 0;
private float mSidePagesAlpha = 1f;
+ protected int mScreenCenter;
private static final long CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT = 30000;
@@ -251,13 +253,6 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
@Override
protected void onPageBeginMoving() {
- // Enable hardware layers while pages are moving
- // TODO: We should only do this for the two views that are actually moving
- int children = getChildCount();
- for (int i = 0; i < children; i++) {
- getWidgetPageAt(i).enableHardwareLayersForContent();
- }
-
if (mViewStateManager != null) {
mViewStateManager.onPageBeginMoving();
}
@@ -266,16 +261,24 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
@Override
protected void onPageEndMoving() {
- // Disable hardware layers while pages are moving
+ if (mViewStateManager != null) {
+ mViewStateManager.onPageEndMoving();
+ }
+ hideOutlinesAndSidePages();
+ }
+
+ private void enablePageLayers() {
int children = getChildCount();
for (int i = 0; i < children; i++) {
- getWidgetPageAt(i).disableHardwareLayersForContent();
+ getWidgetPageAt(i).enableHardwareLayersForContent();
}
+ }
- if (mViewStateManager != null) {
- mViewStateManager.onPageEndMoving();
+ private void disablePageLayers() {
+ int children = getChildCount();
+ for (int i = 0; i < children; i++) {
+ getWidgetPageAt(i).disableHardwareLayersForContent();
}
- hideOutlinesAndSidePages();
}
/*
@@ -323,25 +326,21 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
private void updatePageAlphaValues(int screenCenter) {
+ }
+
+ public float getAlphaForPage(int screenCenter, int index) {
+ return 1f;
+ }
+
+ protected boolean isOverScrollChild(int index, float scrollProgress) {
boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX;
- if (!isInOverscroll) {
- for (int i = 0; i < getChildCount(); i++) {
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- if (child != null) {
- float scrollProgress = getScrollProgress(screenCenter, child, i);
- if (!isReordering(false)) {
- child.setBackgroundAlphaMultiplier(
- backgroundAlphaInterpolator(Math.abs(scrollProgress)));
- } else {
- child.setBackgroundAlphaMultiplier(1f);
- }
- }
- }
- }
+ return (isInOverscroll && (index == 0 && scrollProgress < 0 ||
+ index == getChildCount() - 1 && scrollProgress > 0));
}
@Override
protected void screenScrolled(int screenCenter) {
+ mScreenCenter = screenCenter;
updatePageAlphaValues(screenCenter);
for (int i = 0; i < getChildCount(); i++) {
KeyguardWidgetFrame v = getWidgetPageAt(i);
@@ -349,30 +348,17 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
if (v != null) {
float scrollProgress = getScrollProgress(screenCenter, v, i);
- float alpha = 1.0f;
-
v.setCameraDistance(mDensity * CAMERA_DISTANCE);
- if (PERFORM_OVERSCROLL_ROTATION) {
- if (i == 0 && scrollProgress < 0) {
- // Over scroll to the left
- v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress);
- v.setOverScrollAmount(Math.abs(scrollProgress), true);
- alpha = 1.0f;
- // On the first page, we don't want the page to have any lateral motion
- } else if (i == getChildCount() - 1 && scrollProgress > 0) {
- // Over scroll to the right
- v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress);
- alpha = 1.0f;
- v.setOverScrollAmount(Math.abs(scrollProgress), false);
- // On the last page, we don't want the page to have any lateral motion.
- } else {
- v.setRotationY(0f);
- v.setOverScrollAmount(0, false);
- }
+ if (isOverScrollChild(i, scrollProgress) && PERFORM_OVERSCROLL_ROTATION) {
+ v.setRotationY(- OVERSCROLL_MAX_ROTATION * scrollProgress);
+ v.setOverScrollAmount(Math.abs(scrollProgress), scrollProgress < 0);
+ } else {
+ v.setRotationY(0f);
+ v.setOverScrollAmount(0, false);
}
- v.setAlpha(alpha);
+ float alpha = v.getAlpha();
// If the view has 0 alpha, we set it to be invisible so as to prevent
// it from accepting touches
if (alpha == 0) {
@@ -383,6 +369,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
}
}
+
@Override
void boundByReorderablePages(boolean isReordering, int[] range) {
if (isReordering) {
@@ -416,7 +403,6 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
@Override
protected void onStartReordering() {
super.onStartReordering();
- setChildrenOutlineMultiplier(1.0f);
showOutlinesAndSidePages();
}
@@ -427,43 +413,62 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
void showOutlinesAndSidePages() {
- if (mChildrenOutlineFadeOutAnimation != null) mChildrenOutlineFadeOutAnimation.cancel();
- if (mChildrenOutlineFadeInAnimation != null) mChildrenOutlineFadeInAnimation.cancel();
-
- PropertyValuesHolder outlinesAlpha =
- PropertyValuesHolder.ofFloat("childrenOutlineAlpha", 1.0f);
- PropertyValuesHolder sidePagesAlpha = PropertyValuesHolder.ofFloat("sidePagesAlpha", 1.0f);
- mChildrenOutlineFadeInAnimation =
- ObjectAnimator.ofPropertyValuesHolder(this, outlinesAlpha, sidePagesAlpha);
+ enablePageLayers();
+ animateOutlinesAndSidePages(true);
+ }
- mChildrenOutlineFadeInAnimation.setDuration(CHILDREN_OUTLINE_FADE_IN_DURATION);
- mChildrenOutlineFadeInAnimation.start();
+ void hideOutlinesAndSidePages() {
+ animateOutlinesAndSidePages(false);
}
public void showInitialPageHints() {
- // We start with everything showing
- setChildrenOutlineAlpha(1.0f);
- setSidePagesAlpha(1.0f);
- setChildrenOutlineMultiplier(1.0f);
-
- int currPage = getCurrentPage();
- KeyguardWidgetFrame frame = getWidgetPageAt(currPage);
- frame.setBackgroundAlphaMultiplier(0f);
+ showOutlinesAndSidePages();
}
- void hideOutlinesAndSidePages() {
- if (mChildrenOutlineFadeInAnimation != null) mChildrenOutlineFadeInAnimation.cancel();
- if (mChildrenOutlineFadeOutAnimation != null) mChildrenOutlineFadeOutAnimation.cancel();
-
- PropertyValuesHolder outlinesAlpha =
- PropertyValuesHolder.ofFloat("childrenOutlineAlpha", 0f);
- PropertyValuesHolder sidePagesAlpha = PropertyValuesHolder.ofFloat("sidePagesAlpha", 0f);
- mChildrenOutlineFadeOutAnimation =
- ObjectAnimator.ofPropertyValuesHolder(this, outlinesAlpha, sidePagesAlpha);
-
- mChildrenOutlineFadeOutAnimation.setDuration(CHILDREN_OUTLINE_FADE_OUT_DURATION);
- mChildrenOutlineFadeOutAnimation.setStartDelay(CHILDREN_OUTLINE_FADE_OUT_DELAY);
- mChildrenOutlineFadeOutAnimation.start();
+ void animateOutlinesAndSidePages(final boolean show) {
+ if (mChildrenOutlineFadeAnimation != null) {
+ mChildrenOutlineFadeAnimation.cancel();
+ mChildrenOutlineFadeAnimation = null;
+ }
+
+ int count = getChildCount();
+ PropertyValuesHolder alpha;
+ PropertyValuesHolder outlineAlpha;
+ ArrayList<Animator> anims = new ArrayList<Animator>();
+
+ int curPage = getNextPage();
+ for (int i = 0; i < count; i++) {
+ float finalContentAlpha;
+ if (show) {
+ finalContentAlpha = getAlphaForPage(mScreenCenter, i);
+ } else if (!show && i == curPage) {
+ finalContentAlpha = 1f;
+ } else {
+ finalContentAlpha = 0f;
+ }
+ float finalOutlineAlpha = show ? getAlphaForPage(mScreenCenter, i) : 0f;
+ KeyguardWidgetFrame child = getWidgetPageAt(i);
+ alpha = PropertyValuesHolder.ofFloat("contentAlpha", finalContentAlpha);
+ outlineAlpha = PropertyValuesHolder.ofFloat("backgroundAlpha",finalOutlineAlpha);
+ ObjectAnimator a = ObjectAnimator.ofPropertyValuesHolder(child, alpha, outlineAlpha);
+ anims.add(a);
+ }
+
+ int duration = show ? CHILDREN_OUTLINE_FADE_IN_DURATION :
+ CHILDREN_OUTLINE_FADE_OUT_DURATION;
+ mChildrenOutlineFadeAnimation = new AnimatorSet();
+ mChildrenOutlineFadeAnimation.playTogether(anims);
+
+ mChildrenOutlineFadeAnimation.setDuration(duration);
+ mChildrenOutlineFadeAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!show) {
+ disablePageLayers();
+ }
+ }
+ });
+ mChildrenOutlineFadeAnimation.start();
}
public void setChildrenOutlineAlpha(float alpha) {
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 3562071a2a1c..25ce6d0f1dba 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/PagedView.java
@@ -201,8 +201,8 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
// We use the min scale to determine how much to expand the actually PagedView measured
// dimensions such that when we are zoomed out, the view is not clipped
private int REORDERING_DROP_REPOSITION_DURATION = 200;
- private int REORDERING_REORDER_REPOSITION_DURATION = 350;
- private int REORDERING_ZOOM_IN_OUT_DURATION = 250;
+ protected int REORDERING_REORDER_REPOSITION_DURATION = 350;
+ protected int REORDERING_ZOOM_IN_OUT_DURATION = 250;
private int REORDERING_SIDE_PAGE_HOVER_TIMEOUT = 500;
private float REORDERING_SIDE_PAGE_BUFFER_PERCENTAGE = 0.1f;
private float mMinScale = 1f;
@@ -1162,6 +1162,15 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
return 1.0f;
}
+ protected float getBoundedScrollProgress(int screenCenter, View v, int page) {
+ final int halfScreenSize = getViewportWidth() / 2;
+
+ screenCenter = Math.min(mScrollX + halfScreenSize, screenCenter);
+ screenCenter = Math.max(halfScreenSize, screenCenter);
+
+ return getScrollProgress(screenCenter, v, page);
+ }
+
protected float getScrollProgress(int screenCenter, View v, int page) {
final int halfScreenSize = getViewportWidth() / 2;
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 506b79d208df..304171c28dab 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.FloatProperty;
@@ -44,6 +45,18 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private static final String TAG = "SlidingChallengeLayout";
private static final boolean DEBUG = false;
+ // The drag handle is measured in dp above & below the top edge of the
+ // challenge view; these parameters change based on whether the challenge
+ // is open or closed.
+ private static final int DRAG_HANDLE_CLOSED_ABOVE = 32; // dp
+ private static final int DRAG_HANDLE_CLOSED_BELOW = 32; // dp
+ private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp
+ private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp
+
+ private static final boolean OPEN_ON_CLICK = true;
+
+ private static final int HANDLE_ANIMATE_DURATION = 200; // ms
+
// Drawn to show the drag handle in closed state; crossfades to the challenge view
// when challenge is fully visible
private Drawable mHandleDrawable;
@@ -82,13 +95,20 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
private VelocityTracker mVelocityTracker;
private int mMinVelocity;
private int mMaxVelocity;
- private float mGestureStartY; // where did you touch the screen to start this gesture?
+ private float mGestureStartX, mGestureStartY; // where did you first touch the screen?
private int mGestureStartChallengeBottom; // where was the challenge at that time?
- private int mDragHandleSize; // handle hitrect extension into the challenge view
- private int mDragHandleHeadroom; // extend the handle's hitrect this far above the line
+
+ private int mDragHandleClosedBelow; // handle hitrect extension into the challenge view
+ private int mDragHandleClosedAbove; // extend the handle's hitrect this far above the line
+ private int mDragHandleOpenBelow; // handle hitrect extension into the challenge view
+ private int mDragHandleOpenAbove; // extend the handle's hitrect this far above the line
+
private int mDragHandleEdgeSlop;
private int mChallengeBottomBound; // Number of pixels from the top of the challenge view
// that should remain on-screen
+
+ private int mTouchSlop;
+
float mHandleAlpha;
float mFrameAlpha;
private ObjectAnimator mHandleAnimation;
@@ -125,9 +145,6 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
};
- private static final int DRAG_HANDLE_DEFAULT_SIZE = 32; // dp
- private static final int HANDLE_ANIMATE_DURATION = 200; // ms
-
// True if at least one layout pass has happened since the view was attached.
private boolean mHasLayout;
@@ -224,20 +241,25 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
mDragHandleEdgeSlop = getResources().getDimensionPixelSize(
R.dimen.kg_edge_swipe_region_size);
+ mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
setWillNotDraw(false);
}
public void setDragDrawables(Drawable handle, Drawable icon) {
final float density = getResources().getDisplayMetrics().density;
- final int defaultSize = (int) (DRAG_HANDLE_DEFAULT_SIZE * density + 0.5f);
final int handleHeight = handle != null ? handle.getIntrinsicHeight() : 0;
final int iconHeight = icon != null ? icon.getIntrinsicHeight() : 0;
- mDragHandleSize = Math.max(handleHeight > 0 ? handleHeight : defaultSize,
- iconHeight > 0 ? iconHeight : defaultSize);
// top half of the lock icon, plus another 25% to be sure
- mDragHandleHeadroom = (int) (iconHeight * 0.75f);
- mChallengeBottomBound = (mDragHandleSize + mDragHandleHeadroom + handleHeight) / 2;
+ mDragHandleClosedAbove = (int) (DRAG_HANDLE_CLOSED_ABOVE * density + 0.5f);
+ mDragHandleClosedBelow = (int) (DRAG_HANDLE_CLOSED_BELOW * density + 0.5f);
+ mDragHandleOpenAbove = (int) (DRAG_HANDLE_OPEN_ABOVE * density + 0.5f);
+ mDragHandleOpenBelow = (int) (DRAG_HANDLE_OPEN_BELOW * density + 0.5f);
+
+ // how much space to account for in the handle when closed
+ mChallengeBottomBound =
+ (mDragHandleClosedBelow + mDragHandleClosedAbove + handleHeight) / 2;
mHandleDrawable = handle;
mDragIconDrawable = icon;
@@ -477,9 +499,12 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
mVelocityTracker.addMovement(ev);
+ //Log.v(TAG, "onIntercept: " + ev);
+
final int action = ev.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
+ mGestureStartX = ev.getX();
mGestureStartY = ev.getY();
mBlockDrag = false;
break;
@@ -500,7 +525,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
(isInChallengeView(x, y) && mScrollState == SCROLL_STATE_SETTLING)) &&
mActivePointerId == INVALID_POINTER) {
mActivePointerId = ev.getPointerId(i);
- mGestureStartY = ev.getY();
+ mGestureStartX = x;
+ mGestureStartY = y;
mGestureStartChallengeBottom = getChallengeBottom();
mDragging = true;
} else if (isInChallengeView(x, y)) {
@@ -532,10 +558,13 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
}
mVelocityTracker.addMovement(ev);
+ //Log.v(TAG, "onTouch: " + ev);
+
final int action = ev.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
mBlockDrag = false;
+ mGestureStartX = ev.getX();
mGestureStartY = ev.getY();
break;
@@ -551,7 +580,12 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
break;
}
case MotionEvent.ACTION_UP:
- if (mDragging) {
+ if (OPEN_ON_CLICK
+ && isInDragHandle(mGestureStartX, mGestureStartY)
+ && Math.abs(ev.getX() - mGestureStartX) <= mTouchSlop
+ && Math.abs(ev.getY() - mGestureStartY) <= mTouchSlop) {
+ showChallenge(true);
+ } else if (mDragging) {
mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
showChallenge((int) mVelocityTracker.getYVelocity(mActivePointerId));
}
@@ -568,6 +602,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
if ((isInDragHandle(x, y) || crossedDragHandle(x, y, mGestureStartY) ||
(isInChallengeView(x, y) && mScrollState == SCROLL_STATE_SETTLING))
&& mActivePointerId == INVALID_POINTER) {
+ mGestureStartX = x;
mGestureStartY = y;
mActivePointerId = ev.getPointerId(i);
mGestureStartChallengeBottom = getChallengeBottom();
@@ -605,8 +640,11 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
* We only want to add additional vertical space to the drag handle when the panel is fully
* closed.
*/
- private int getDragHandleHeadroom() {
- return isChallengeShowing() ? 0 : mDragHandleHeadroom;
+ private int getDragHandleSizeAbove() {
+ return isChallengeShowing() ? mDragHandleOpenAbove : mDragHandleClosedAbove;
+ }
+ private int getDragHandleSizeBelow() {
+ return isChallengeShowing() ? mDragHandleOpenBelow : mDragHandleClosedBelow;
}
private boolean isInChallengeView(float x, float y) {
@@ -620,17 +658,17 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
if (mChallengeView == null) return false;
return x >= mDragHandleEdgeSlop &&
- y >= mChallengeView.getTop() - getDragHandleHeadroom() &&
+ y >= mChallengeView.getTop() - getDragHandleSizeAbove() &&
x < getWidth() - mDragHandleEdgeSlop &&
- y < mChallengeView.getTop() + mDragHandleSize;
+ y < mChallengeView.getTop() + getDragHandleSizeBelow();
}
private boolean crossedDragHandle(float x, float y, float initialY) {
final int challengeTop = mChallengeView.getTop();
return x >= 0 &&
x < getWidth() &&
- initialY < (challengeTop - getDragHandleHeadroom()) &&
- y > challengeTop + mDragHandleSize;
+ initialY < (challengeTop - getDragHandleSizeAbove()) &&
+ y > challengeTop + getDragHandleSizeBelow();
}
@Override
@@ -760,20 +798,25 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
debugPaint.setColor(0x40FF00CC);
// show the isInDragHandle() rect
c.drawRect(mDragHandleEdgeSlop,
- mChallengeView.getTop() - getDragHandleHeadroom(),
+ mChallengeView.getTop() - getDragHandleSizeAbove(),
getWidth() - mDragHandleEdgeSlop,
- mChallengeView.getTop() + mDragHandleSize,
+ mChallengeView.getTop() + getDragHandleSizeBelow(),
debugPaint);
}
- if (mChallengeView != null && mHandleAlpha > 0 && mHandleDrawable != null) {
+ if (mChallengeView != null && mHandleAlpha > 0) {
final int top = mChallengeView.getTop();
- final int handleHeight = mHandleDrawable.getIntrinsicHeight();
+ final int handleHeight;
final int challengeLeft = mChallengeView.getLeft();
final int challengeRight = mChallengeView.getRight();
- mHandleDrawable.setBounds(challengeLeft, top, challengeRight, top + handleHeight);
- mHandleDrawable.setAlpha((int) (mHandleAlpha * 0xFF));
- mHandleDrawable.draw(c);
+ if (mHandleDrawable != null) {
+ handleHeight = mHandleDrawable.getIntrinsicHeight();
+ mHandleDrawable.setBounds(challengeLeft, top, challengeRight, top + handleHeight);
+ mHandleDrawable.setAlpha((int) (mHandleAlpha * 0xFF));
+ mHandleDrawable.draw(c);
+ } else {
+ handleHeight = 0;
+ }
if (DEBUG) {
// now show the actual drag handle