diff --git a/core/java/com/android/internal/widget/RotarySelector.java b/core/java/com/android/internal/widget/RotarySelector.java index 712f1bfc056d2..750b2a96f3f01 100644 --- a/core/java/com/android/internal/widget/RotarySelector.java +++ b/core/java/com/android/internal/widget/RotarySelector.java @@ -69,12 +69,6 @@ public class RotarySelector extends View { private int mAnimatingDelta; private AccelerateInterpolator mInterpolator; - /** - * True after triggering an action if the user of {@link OnDialTriggerListener} wants to - * freeze the UI (until they transition to another screen). - */ - private boolean mFrozen = false; - /** * If the user is currently dragging something. */ @@ -119,6 +113,9 @@ public class RotarySelector extends View { private static final boolean DRAW_CENTER_DIMPLE = false; private int mEdgeTriggerThresh; + private int mDimpleWidth; + private int mBackgroundWidth; + private int mBackgroundHeight; public RotarySelector(Context context) { this(context, null); @@ -155,6 +152,11 @@ public class RotarySelector extends View { mInterpolator = new AccelerateInterpolator(); mEdgeTriggerThresh = (int) (mDensity * EDGE_TRIGGER_DIP); + + mDimpleWidth = mDimple.getIntrinsicWidth(); + + mBackgroundWidth = mBackground.getIntrinsicWidth(); + mBackgroundHeight = mBackground.getIntrinsicHeight(); } /** @@ -214,7 +216,7 @@ public class RotarySelector extends View { final int width = MeasureSpec.getSize(widthMeasureSpec); // screen width final int arrowH = mArrowShortLeftAndRight.getIntrinsicHeight(); - final int backgroundH = mBackground.getIntrinsicHeight(); + final int backgroundH = mBackgroundHeight; // by making the height less than arrow + bg, arrow and bg will be scrunched together, // overlaying somewhat (though on transparent portions of the drawable). @@ -228,9 +230,9 @@ public class RotarySelector extends View { protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - mLeftHandleX = (int) (EDGE_PADDING_DIP * mDensity) + mDimple.getIntrinsicWidth() / 2; + mLeftHandleX = (int) (EDGE_PADDING_DIP * mDensity) + mDimpleWidth / 2; mRightHandleX = - getWidth() - (int) (EDGE_PADDING_DIP * mDensity) - mDimple.getIntrinsicWidth() / 2; + getWidth() - (int) (EDGE_PADDING_DIP * mDensity) - mDimpleWidth / 2; } // private Paint mPaint = new Paint(); @@ -239,15 +241,14 @@ public class RotarySelector extends View { protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (DBG) { - log(String.format("onDraw: mAnimating=%s, mTouchDragOffset=%d, mGrabbedState=%d," + - "mFrozen=%s", - mAnimating, mTouchDragOffset, mGrabbedState, mFrozen)); + log(String.format("onDraw: mAnimating=%s, mTouchDragOffset=%d, mGrabbedState=%d", + mAnimating, mTouchDragOffset, mGrabbedState)); } final int height = getHeight(); // update animating state before we draw anything - if (mAnimating && !mFrozen) { + if (mAnimating) { long millisLeft = mAnimationEndTime - currentAnimationTimeMillis(); if (DBG) log("millisleft for animating: " + millisLeft); if (millisLeft <= 0) { @@ -260,8 +261,8 @@ public class RotarySelector extends View { } // Background: - final int backgroundW = mBackground.getIntrinsicWidth(); - final int backgroundH = mBackground.getIntrinsicHeight(); + final int backgroundW = mBackgroundWidth; + final int backgroundH = mBackgroundHeight; final int backgroundY = height - backgroundH; if (DBG) log("- Background INTRINSIC: " + backgroundW + " x " + backgroundH); mBackground.setBounds(0, backgroundY, @@ -383,12 +384,12 @@ public class RotarySelector extends View { */ @Override public boolean onTouchEvent(MotionEvent event) { - if (mAnimating || mFrozen) { + if (mAnimating) { return true; } final int eventX = (int) event.getX(); - final int hitWindow = mDimple.getIntrinsicWidth(); + final int hitWindow = mDimpleWidth; final int action = event.getAction(); switch (action) { @@ -419,14 +420,29 @@ public class RotarySelector extends View { invalidate(); if (eventX >= getRight() - mEdgeTriggerThresh && !mTriggered) { mTriggered = true; - mFrozen = dispatchTriggerEvent(OnDialTriggerListener.LEFT_HANDLE); + dispatchTriggerEvent(OnDialTriggerListener.LEFT_HANDLE); + // set up "spin around animation" + mAnimating = true; + mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS; + mAnimatingDelta = -mBackgroundWidth; + mTouchDragOffset = 0; + mGrabbedState = NOTHING_GRABBED; + invalidate(); + } } else if (mGrabbedState == RIGHT_HANDLE_GRABBED) { mTouchDragOffset = eventX - mRightHandleX; invalidate(); if (eventX <= mEdgeTriggerThresh && !mTriggered) { mTriggered = true; - mFrozen = dispatchTriggerEvent(OnDialTriggerListener.RIGHT_HANDLE); + dispatchTriggerEvent(OnDialTriggerListener.RIGHT_HANDLE); + // set up "spin around animation" + mAnimating = true; + mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS; + mAnimatingDelta = mBackgroundWidth; + mTouchDragOffset = 0; + mGrabbedState = NOTHING_GRABBED; + invalidate(); } } break; @@ -435,11 +451,13 @@ public class RotarySelector extends View { // handle animating back to start if they didn't trigger if (mGrabbedState == LEFT_HANDLE_GRABBED && Math.abs(eventX - mLeftHandleX) > 5) { + // set up "snap back" animation mAnimating = true; mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS; mAnimatingDelta = eventX - mLeftHandleX; } else if (mGrabbedState == RIGHT_HANDLE_GRABBED && Math.abs(eventX - mRightHandleX) > 5) { + // set up "snap back" animation mAnimating = true; mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS; mAnimatingDelta = eventX - mRightHandleX; @@ -504,12 +522,11 @@ public class RotarySelector extends View { /** * Dispatches a trigger event to our listener. */ - private boolean dispatchTriggerEvent(int whichHandle) { + private void dispatchTriggerEvent(int whichHandle) { vibrate(VIBRATE_LONG); if (mOnDialTriggerListener != null) { - return mOnDialTriggerListener.onDialTrigger(this, whichHandle); + mOnDialTriggerListener.onDialTrigger(this, whichHandle); } - return false; } /** @@ -529,23 +546,14 @@ public class RotarySelector extends View { */ public static final int RIGHT_HANDLE = 2; - /** - * @hide - * The center handle is currently unused. - */ - public static final int CENTER_HANDLE = 3; - /** * Called when the dial is triggered. * * @param v The view that was triggered * @param whichHandle Which "dial handle" the user grabbed, - * either {@link #LEFT_HANDLE}, {@link #RIGHT_HANDLE}, or - * {@link #CENTER_HANDLE}. - * @return Whether the widget should freeze (e.g when the action goes to another screen, - * you want the UI to stay put until the transition occurs). + * either {@link #LEFT_HANDLE}, {@link #RIGHT_HANDLE}. */ - boolean onDialTrigger(View v, int whichHandle); + void onDialTrigger(View v, int whichHandle); } diff --git a/core/res/res/drawable-hdpi/ic_lock_ringer_off.png b/core/res/res/drawable-hdpi/ic_lock_ringer_off.png new file mode 100644 index 0000000000000..e7cb234bf04e5 Binary files /dev/null and b/core/res/res/drawable-hdpi/ic_lock_ringer_off.png differ diff --git a/core/res/res/drawable-hdpi/ic_lock_ringer_on.png b/core/res/res/drawable-hdpi/ic_lock_ringer_on.png new file mode 100644 index 0000000000000..ce0cfab936b2e Binary files /dev/null and b/core/res/res/drawable-hdpi/ic_lock_ringer_on.png differ diff --git a/core/res/res/drawable-mdpi/ic_lock_ringer_off.png b/core/res/res/drawable-mdpi/ic_lock_ringer_off.png new file mode 100644 index 0000000000000..98cfb11e40818 Binary files /dev/null and b/core/res/res/drawable-mdpi/ic_lock_ringer_off.png differ diff --git a/core/res/res/drawable-mdpi/ic_lock_ringer_on.png b/core/res/res/drawable-mdpi/ic_lock_ringer_on.png new file mode 100644 index 0000000000000..691b99e3b2000 Binary files /dev/null and b/core/res/res/drawable-mdpi/ic_lock_ringer_on.png differ diff --git a/core/res/res/layout/keyguard_screen_rotary_unlock.xml b/core/res/res/layout/keyguard_screen_rotary_unlock.xml index cf97d04a2ebb5..9f1812442b84a 100644 --- a/core/res/res/layout/keyguard_screen_rotary_unlock.xml +++ b/core/res/res/layout/keyguard_screen_rotary_unlock.xml @@ -83,6 +83,7 @@ android:layout_marginTop="6dip" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?android:attr/textColorSecondary" + android:drawablePadding="4dip" /> - +