diff options
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 Binary files differindex 136d3adfa80d..5fb5a01505a4 100644 --- a/core/res/res/drawable-hdpi/kg_security_lock.png +++ b/core/res/res/drawable-hdpi/kg_security_lock.png diff --git a/core/res/res/drawable-hdpi/security_frame.9.png b/core/res/res/drawable-hdpi/security_frame.9.png Binary files differdeleted file mode 100644 index 9eeadc4d118f..000000000000 --- a/core/res/res/drawable-hdpi/security_frame.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/security_handle.png b/core/res/res/drawable-hdpi/security_handle.png Binary files differdeleted file mode 100644 index bd4640f7228c..000000000000 --- a/core/res/res/drawable-hdpi/security_handle.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/kg_security_lock.png b/core/res/res/drawable-mdpi/kg_security_lock.png Binary files differindex 861760da8d1b..e75c82e6cfbd 100644 --- a/core/res/res/drawable-mdpi/kg_security_lock.png +++ b/core/res/res/drawable-mdpi/kg_security_lock.png diff --git a/core/res/res/drawable-mdpi/security_frame.9.png b/core/res/res/drawable-mdpi/security_frame.9.png Binary files differdeleted file mode 100644 index 9eeadc4d118f..000000000000 --- a/core/res/res/drawable-mdpi/security_frame.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/security_handle.png b/core/res/res/drawable-mdpi/security_handle.png Binary files differdeleted file mode 100644 index bd4640f7228c..000000000000 --- a/core/res/res/drawable-mdpi/security_handle.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/kg_security_lock.png b/core/res/res/drawable-xhdpi/kg_security_lock.png Binary files differindex 45445845d015..93cdf10f83d2 100644 --- a/core/res/res/drawable-xhdpi/kg_security_lock.png +++ b/core/res/res/drawable-xhdpi/kg_security_lock.png diff --git a/core/res/res/drawable-xhdpi/security_frame.9.png b/core/res/res/drawable-xhdpi/security_frame.9.png Binary files differdeleted file mode 100644 index 9eeadc4d118f..000000000000 --- a/core/res/res/drawable-xhdpi/security_frame.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/security_handle.png b/core/res/res/drawable-xhdpi/security_handle.png Binary files differdeleted file mode 100644 index bd4640f7228c..000000000000 --- a/core/res/res/drawable-xhdpi/security_handle.png +++ /dev/null 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 |