summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Miller <jaggies@google.com>2011-06-30 15:56:47 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-30 15:56:47 -0700
commitd0c18aabac682709e47b9b4a2fdd19cbb6820b7c (patch)
tree4d640bf3c413643ecf8e79b53db4aac4bdecef29
parent4dfecf55c1afcc7ffe0cef931df67c4934a13e34 (diff)
parent1c8d207201150c29ac92c424e1320c715a64b5bc (diff)
downloadframeworks_base-d0c18aabac682709e47b9b4a2fdd19cbb6820b7c.zip
frameworks_base-d0c18aabac682709e47b9b4a2fdd19cbb6820b7c.tar.gz
frameworks_base-d0c18aabac682709e47b9b4a2fdd19cbb6820b7c.tar.bz2
Merge "Fix 4691563: Polish MultiWaveView experience in LockScreen and InCall screen Better activation experience: - Hold off on switching out targets until current animation has finished. - Hide unselected targets when a target is selected. Code simplification: - Use explicit callback objects to handle animation updates instead of having MWV implement the interface. - More compact chevron-loading code. - Don't use animations for properties that need to change immediately."
-rw-r--r--core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java281
-rw-r--r--policy/src/com/android/internal/policy/impl/LockScreen.java167
2 files changed, 289 insertions, 159 deletions
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index 5b35104..04bb689 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -20,7 +20,7 @@ import java.util.ArrayList;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
-import android.animation.ObjectAnimator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
@@ -43,9 +43,9 @@ import com.android.internal.R;
* A special widget containing a center and outer ring. Moving the center ring to the outer ring
* causes an event that can be caught by implementing OnTriggerListener.
*/
-public class MultiWaveView extends View implements AnimatorUpdateListener {
+public class MultiWaveView extends View {
private static final String TAG = "MultiWaveView";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
// Wave state machine
private static final int STATE_IDLE = 0;
@@ -67,14 +67,15 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
}
// Tune-able parameters
- private static final int CHEVRON_INCREMENTAL_DELAY = 50;
- private static final int CHEVRON_ANIMATION_DURATION = 1000;
- private static final int RETURN_TO_HOME_DURATION = 150;
- private static final int HIDE_ANIMATION_DELAY = 500;
- private static final int HIDE_ANIMATION_DURACTION = 2000;
+ private static final int CHEVRON_INCREMENTAL_DELAY = 160;
+ private static final int CHEVRON_ANIMATION_DURATION = 650;
+ private static final int RETURN_TO_HOME_DELAY = 1200;
+ private static final int RETURN_TO_HOME_DURATION = 300;
+ private static final int HIDE_ANIMATION_DELAY = 200;
+ private static final int HIDE_ANIMATION_DURATION = RETURN_TO_HOME_DELAY;
private static final int SHOW_ANIMATION_DURATION = 0;
private static final int SHOW_ANIMATION_DELAY = 0;
- private TimeInterpolator mChevronAnimationInterpolator = Ease.Quint.easeOut;
+ private TimeInterpolator mChevronAnimationInterpolator = Ease.Quad.easeOut;
private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>();
private ArrayList<TargetDrawable> mChevronDrawables = new ArrayList<TargetDrawable>();
@@ -99,14 +100,31 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
private float mHitRadius = 0.0f;
private float mSnapMargin = 0.0f;
private boolean mDragging;
+ private int mNewTargetResources;
- private AnimatorListener mResetListener = new Animator.AnimatorListener() {
- public void onAnimationStart(Animator animation) { }
- public void onAnimationRepeat(Animator animation) { }
- public void onAnimationEnd(Animator animation) {
+ private AnimatorListener mResetListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
}
- public void onAnimationCancel(Animator animation) { }
+ };
+
+ private AnimatorUpdateListener mUpdateListener = new AnimatorUpdateListener() {
+ public void onAnimationUpdate(ValueAnimator animation) {
+ invalidateGlobalRegion(mHandleDrawable);
+ invalidate();
+ }
+ };
+
+ private boolean mAnimatingTargets;
+ private AnimatorListener mTargetUpdateListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ if (mNewTargetResources != 0) {
+ internalSetTargetResources(mNewTargetResources);
+ mNewTargetResources = 0;
+ hideTargets(false);
+ }
+ mAnimatingTargets = false;
+ }
};
public MultiWaveView(Context context) {
@@ -135,31 +153,23 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
mOuterRing = new TargetDrawable(res, a.getDrawable(R.styleable.MultiWaveView_waveDrawable));
// Read chevron animation drawables
- Drawable leftChevron = a.getDrawable(R.styleable.MultiWaveView_leftChevronDrawable);
- for (int i = 0; i < mFeedbackCount; i++) {
- mChevronDrawables.add(
- leftChevron != null ? new TargetDrawable(res, leftChevron) : null);
- }
- Drawable rightChevron = a.getDrawable(R.styleable.MultiWaveView_rightChevronDrawable);
- for (int i = 0; i < mFeedbackCount; i++) {
- mChevronDrawables.add(
- rightChevron != null ? new TargetDrawable(res, rightChevron) : null);
- }
- Drawable topChevron = a.getDrawable(R.styleable.MultiWaveView_topChevronDrawable);
- for (int i = 0; i < mFeedbackCount; i++) {
- mChevronDrawables.add(
- topChevron != null ? new TargetDrawable(res, topChevron) : null);
- }
- Drawable bottomChevron = a.getDrawable(R.styleable.MultiWaveView_bottomChevronDrawable);
- for (int i = 0; i < mFeedbackCount; i++) {
- mChevronDrawables.add(
- bottomChevron != null ? new TargetDrawable(res, bottomChevron) : null);
+ final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable,
+ R.styleable.MultiWaveView_rightChevronDrawable,
+ R.styleable.MultiWaveView_topChevronDrawable,
+ R.styleable.MultiWaveView_bottomChevronDrawable
+ };
+ for (int chevron : chevrons) {
+ Drawable chevronDrawable = a.getDrawable(chevron);
+ for (int i = 0; i < mFeedbackCount; i++) {
+ mChevronDrawables.add(
+ chevronDrawable != null ? new TargetDrawable(res, chevronDrawable) : null);
+ }
}
// Read array of target drawables
TypedValue outValue = new TypedValue();
if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) {
- setTargetResources(outValue.resourceId);
+ internalSetTargetResources(outValue.resourceId);
}
if (mTargetDrawables == null || mTargetDrawables.size() == 0) {
throw new IllegalStateException("Must specify at least one target drawable");
@@ -205,7 +215,7 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
case STATE_FIRST_TOUCH:
stopHandleAnimation();
deactivateTargets();
- showTargets();
+ showTargets(true);
mHandleDrawable.setState(TargetDrawable.STATE_ACTIVE);
setGrabbedState(OnTriggerListener.CENTER_HANDLE);
break;
@@ -228,17 +238,18 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
* mFeedbackCount items in the order: left, right, top, bottom.
*/
private void startChevronAnimation() {
- final float r = mHandleDrawable.getWidth() / 2;
+ final float r = mHandleDrawable.getWidth() * 0.4f;
+ final float chevronAnimationDistance = mOuterRadius * 0.8f;
final float from[][] = {
{mWaveCenterX - r, mWaveCenterY}, // left
{mWaveCenterX + r, mWaveCenterY}, // right
{mWaveCenterX, mWaveCenterY - r}, // top
{mWaveCenterX, mWaveCenterY + r} }; // bottom
final float to[][] = {
- {mWaveCenterX - mOuterRadius, mWaveCenterY}, // left
- {mWaveCenterX + mOuterRadius, mWaveCenterY}, // right
- {mWaveCenterX, mWaveCenterY - mOuterRadius}, // top
- {mWaveCenterX, mWaveCenterY + mOuterRadius} }; // bottom
+ {mWaveCenterX - chevronAnimationDistance, mWaveCenterY}, // left
+ {mWaveCenterX + chevronAnimationDistance, mWaveCenterY}, // right
+ {mWaveCenterX, mWaveCenterY - chevronAnimationDistance}, // top
+ {mWaveCenterX, mWaveCenterY + chevronAnimationDistance} }; // bottom
mChevronAnimations.clear();
for (int direction = 0; direction < 4; direction++) {
@@ -254,7 +265,7 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
"x", new float[] { from[direction][0], to[direction][0] },
"y", new float[] { from[direction][1], to[direction][1] },
"alpha", new float[] {1.0f, 0.0f},
- "onUpdate", this));
+ "onUpdate", mUpdateListener));
}
}
}
@@ -308,70 +319,109 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
}
private void doFinish() {
- // Inform listener of any active targets. Typically only one will be active.
final int activeTarget = mActiveTarget;
boolean targetHit = activeTarget != -1;
- if (targetHit) {
- Log.v(TAG, "Finish with target hit = " + targetHit);
- dispatchTriggerEvent(mActiveTarget);
- }
-
- setGrabbedState(OnTriggerListener.NO_HANDLE);
-
- // Animate finger outline back to home position
- mHandleDrawable.setAlpha(targetHit ? 0.0f : 1.0f);
- mHandleAnimation = Tweener.to(mHandleDrawable, RETURN_TO_HOME_DURATION,
- "ease", Ease.Quart.easeOut,
- "delay", targetHit ? HIDE_ANIMATION_DELAY : 0,
- "alpha", 1.0f,
- "x", mWaveCenterX,
- "y", mWaveCenterY,
- "onUpdate", this,
- "onComplete", mResetListener);
// Hide unselected targets
hideTargets(true);
// Highlight the selected one
+ mHandleDrawable.setAlpha(targetHit ? 0.0f : 1.0f);
if (targetHit) {
mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE);
+
+ hideUnselected(activeTarget);
+
+ // Inform listener of any active targets. Typically only one will be active.
+ if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit);
+ dispatchTriggerEvent(mActiveTarget);
+ mHandleAnimation = Tweener.to(mHandleDrawable, 0,
+ "ease", Ease.Quart.easeOut,
+ "delay", RETURN_TO_HOME_DELAY,
+ "alpha", 1.0f,
+ "x", mWaveCenterX,
+ "y", mWaveCenterY,
+ "onUpdate", mUpdateListener,
+ "onComplete", mResetListener);
+ } else {
+ // Animate finger outline back to home position
+ mHandleAnimation = Tweener.to(mHandleDrawable, RETURN_TO_HOME_DURATION,
+ "ease", Ease.Quart.easeOut,
+ "delay", 0,
+ "alpha", 1.0f,
+ "x", mWaveCenterX,
+ "y", mWaveCenterY,
+ "onUpdate", mUpdateListener,
+ "onComplete", mResetListener);
}
+
+ setGrabbedState(OnTriggerListener.NO_HANDLE);
+ }
+
+ private void hideUnselected(int active) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ if (i != active) {
+ mTargetDrawables.get(i).setAlpha(0.0f);
+ }
+ }
+ mOuterRing.setAlpha(0.0f);
}
private void hideTargets(boolean animate) {
if (mTargetAnimations.size() > 0) {
stopTargetAnimation();
}
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- mTargetAnimations.add(Tweener.to(target,
- animate ? HIDE_ANIMATION_DURACTION : 0,
+ // Note: these animations should complete at the same time so that we can swap out
+ // the target assets asynchronously from the setTargetResources() call.
+ mAnimatingTargets = animate;
+ if (animate) {
+ final int duration = animate ? HIDE_ANIMATION_DURATION : 0;
+ for (TargetDrawable target : mTargetDrawables) {
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "alpha", 0.0f,
+ "delay", HIDE_ANIMATION_DELAY,
+ "onUpdate", mUpdateListener));
+ }
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
"alpha", 0.0f,
"delay", HIDE_ANIMATION_DELAY,
- "onUpdate", this));
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+ } else {
+ for (TargetDrawable target : mTargetDrawables) {
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ target.setAlpha(0.0f);
+ }
+ mOuterRing.setAlpha(0.0f);
}
- mTargetAnimations.add(Tweener.to(mOuterRing,
- animate ? HIDE_ANIMATION_DURACTION : 0,
- "alpha", 0.0f,
- "delay", HIDE_ANIMATION_DELAY,
- "onUpdate", this));
}
- private void showTargets() {
+ private void showTargets(boolean animate) {
if (mTargetAnimations.size() > 0) {
stopTargetAnimation();
}
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- mTargetAnimations.add(Tweener.to(target, SHOW_ANIMATION_DURATION,
+ mAnimatingTargets = animate;
+ if (animate) {
+ for (TargetDrawable target : mTargetDrawables) {
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, SHOW_ANIMATION_DURATION,
+ "alpha", 1.0f,
+ "delay", SHOW_ANIMATION_DELAY,
+ "onUpdate", mUpdateListener));
+ }
+ mTargetAnimations.add(Tweener.to(mOuterRing, SHOW_ANIMATION_DURATION,
"alpha", 1.0f,
"delay", SHOW_ANIMATION_DELAY,
- "onUpdate", this));
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+ } else {
+ for (TargetDrawable target : mTargetDrawables) {
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ target.setAlpha(1.0f);
+ }
+ mOuterRing.setAlpha(1.0f);
}
- mTargetAnimations.add(Tweener.to(mOuterRing, SHOW_ANIMATION_DURATION,
- "alpha", 1.0f,
- "delay", SHOW_ANIMATION_DELAY,
- "onUpdate", this));
}
private void stopTargetAnimation() {
@@ -387,12 +437,7 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
}
}
- /**
- * Loads an array of drawables from the given resourceId.
- *
- * @param resourceId
- */
- public void setTargetResources(int resourceId) {
+ private void internalSetTargetResources(int resourceId) {
Resources res = getContext().getResources();
TypedArray array = res.obtainTypedArray(resourceId);
int count = array.length();
@@ -402,6 +447,21 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
targetDrawables.add(new TargetDrawable(res, drawable));
}
mTargetDrawables = targetDrawables;
+ updateTargetPositions();
+ }
+
+ /**
+ * Loads an array of drawables from the given resourceId.
+ *
+ * @param resourceId
+ */
+ public void setTargetResources(int resourceId) {
+ if (mAnimatingTargets) {
+ // postpone this change until we return to the initial state
+ mNewTargetResources = resourceId;
+ } else {
+ internalSetTargetResources(resourceId);
+ }
}
/**
@@ -590,20 +650,9 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
}
}
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- final int width = right - left;
- final int height = bottom - top;
-
- mWaveCenterX = mHorizontalOffset + Math.max(width, mOuterRing.getWidth() ) / 2;
- mWaveCenterY = mVerticalOffset + Math.max(height, mOuterRing.getHeight()) / 2;
- moveHandleTo(mWaveCenterX, mWaveCenterY, false);
- mOuterRing.setX(mWaveCenterX);
- mOuterRing.setY(Math.max(mWaveCenterY, mWaveCenterY));
- mOuterRing.setAlpha(0.0f);
+ private void performInitialLayout(float centerX, float centerY) {
if (mOuterRadius == 0.0f) {
- mOuterRadius = 0.5f*(float) Math.sqrt(dist2(mWaveCenterX, mWaveCenterY));
+ mOuterRadius = 0.5f*(float) Math.sqrt(dist2(centerX, centerY));
}
if (mHitRadius == 0.0f) {
// Use the radius of inscribed circle of the first target.
@@ -613,6 +662,35 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());
}
+ hideChevrons();
+ hideTargets(false);
+ moveHandleTo(centerX, centerY, false);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ final int width = right - left;
+ final int height = bottom - top;
+ float newWaveCenterX = mHorizontalOffset + Math.max(width, mOuterRing.getWidth() ) / 2;
+ float newWaveCenterY = mVerticalOffset + Math.max(height, mOuterRing.getHeight()) / 2;
+ if (newWaveCenterX != mWaveCenterX || newWaveCenterY != mWaveCenterY) {
+ if (mWaveCenterX == 0 && mWaveCenterY == 0) {
+ performInitialLayout(newWaveCenterX, newWaveCenterY);
+ }
+ mWaveCenterX = newWaveCenterX;
+ mWaveCenterY = newWaveCenterY;
+
+ mOuterRing.setX(mWaveCenterX);
+ mOuterRing.setY(Math.max(mWaveCenterY, mWaveCenterY));
+
+ updateTargetPositions();
+ }
+ if (DEBUG) dump();
+ }
+
+ private void updateTargetPositions() {
+ // Reposition the target drawables if the view changed.
for (int i = 0; i < mTargetDrawables.size(); i++) {
final TargetDrawable targetIcon = mTargetDrawables.get(i);
double angle = -2.0f * Math.PI * i / mTargetDrawables.size();
@@ -620,11 +698,7 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
float yPosition = mWaveCenterY + mOuterRadius * (float) Math.sin(angle);
targetIcon.setX(xPosition);
targetIcon.setY(yPosition);
- targetIcon.setAlpha(0.0f);
}
- hideChevrons();
- hideTargets(false);
- if (DEBUG) dump();
}
private void hideChevrons() {
@@ -655,11 +729,6 @@ public class MultiWaveView extends View implements AnimatorUpdateListener {
mOnTriggerListener = listener;
}
- public void onAnimationUpdate(ValueAnimator animation) {
- invalidateGlobalRegion(mHandleDrawable);
- invalidate();
- }
-
private float square(float d) {
return d * d;
}
diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java
index 8b7a61e..1c4084c 100644
--- a/policy/src/com/android/internal/policy/impl/LockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/LockScreen.java
@@ -64,7 +64,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
private KeyguardUpdateMonitor mUpdateMonitor;
private KeyguardScreenCallback mCallback;
- private SlidingTab mSlidingTab;
private TextView mScreenLocked;
private TextView mEmergencyCallText;
private Button mEmergencyCallButton;
@@ -89,11 +88,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
private boolean mEnableMenuKeyInLockScreen;
private StatusView mStatusView;
- private WaveView mEnergyWave;
- private SlidingTabMethods mSlidingTabMethods;
- private WaveViewMethods mWaveViewMethods;
- private MultiWaveView mMultiWaveView;
- private MultiWaveViewMethods mMultiWaveViewMethods;
+ private UnlockWidgetCommonMethods mUnlockWidgetMethods;
+ private View mUnlockWidget;
+
/**
* The status of this lock screen.
@@ -151,9 +148,28 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
}
}
- class SlidingTabMethods implements SlidingTab.OnTriggerListener {
+ private interface UnlockWidgetCommonMethods {
+ // Update resources based on phone state
+ public void updateResources();
+
+ // Get the view associated with this widget
+ public View getView();
- private void updateRightTabResources() {
+ // Reset the view
+ public void reset(boolean animate);
+
+ // Animate the widget if it supports ping()
+ public void ping();
+ }
+
+ class SlidingTabMethods implements SlidingTab.OnTriggerListener, UnlockWidgetCommonMethods {
+ private final SlidingTab mSlidingTab;
+
+ SlidingTabMethods(SlidingTab slidingTab) {
+ mSlidingTab = slidingTab;
+ }
+
+ public void updateResources() {
boolean vibe = mSilentMode
&& (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE);
@@ -175,7 +191,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
mCallback.goToUnlockScreen();
} else if (whichHandle == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
toggleRingMode();
- updateRightTabResources();
doSilenceRingToast();
mCallback.pokeWakelock();
}
@@ -195,12 +210,29 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
mCallback.pokeWakelock();
}
}
+
+ public View getView() {
+ return mSlidingTab;
+ }
+
+ public void reset(boolean animate) {
+ mSlidingTab.reset(animate);
+ }
+
+ public void ping() {
+ }
}
private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
private static final int STAY_ON_WHILE_GRABBED_TIMEOUT = 30000;
- class WaveViewMethods implements WaveView.OnTriggerListener {
+ class WaveViewMethods implements WaveView.OnTriggerListener, UnlockWidgetCommonMethods {
+
+ private final WaveView mWaveView;
+
+ WaveViewMethods(WaveView waveView) {
+ mWaveView = waveView;
+ }
/** {@inheritDoc} */
public void onTrigger(View v, int whichHandle) {
if (whichHandle == WaveView.OnTriggerListener.CENTER_HANDLE) {
@@ -210,8 +242,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
/** {@inheritDoc} */
public void onGrabbedStateChange(View v, int grabbedState) {
- if (DBG) Log.v(TAG, "*** LockScreen accel is "
- + (mEnergyWave.isHardwareAccelerated() ? "on":"off"));
// Don't poke the wake lock when returning to a state where the handle is
// not grabbed since that can happen when the system (instead of the user)
// cancels the grab.
@@ -219,30 +249,51 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
mCallback.pokeWakelock(STAY_ON_WHILE_GRABBED_TIMEOUT);
}
}
+
+ public void updateResources() {
+ }
+
+ public View getView() {
+ return mWaveView;
+ }
+ public void reset(boolean animate) {
+ mWaveView.reset();
+ }
+ public void ping() {
+ }
}
- class MultiWaveViewMethods implements MultiWaveView.OnTriggerListener {
+ class MultiWaveViewMethods implements MultiWaveView.OnTriggerListener,
+ UnlockWidgetCommonMethods {
+
+ private final MultiWaveView mMultiWaveView;
+
+ MultiWaveViewMethods(MultiWaveView multiWaveView) {
+ mMultiWaveView = multiWaveView;
+ }
+
+ public void updateResources() {
+ mMultiWaveView.setTargetResources(mSilentMode ? R.array.lockscreen_targets_when_silent
+ : R.array.lockscreen_targets_when_soundon);
+ }
+
public void onGrabbed(View v, int handle) {
}
+
public void onReleased(View v, int handle) {
}
+
public void onTrigger(View v, int target) {
if (target == 0) { // TODO: Use resources to determine which handle was used
mCallback.goToUnlockScreen();
} else if (target == 2) {
toggleRingMode();
- updateResources();
doSilenceRingToast();
+ mUnlockWidgetMethods.updateResources();
mCallback.pokeWakelock();
}
-
- }
-
- private void updateResources() {
- mMultiWaveView.setTargetResources(mSilentMode ? R.array.lockscreen_targets_when_silent
- : R.array.lockscreen_targets_when_soundon);
}
public void onGrabbedStateChange(View v, int handle) {
@@ -253,6 +304,18 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
mCallback.pokeWakelock();
}
}
+
+ public View getView() {
+ return mMultiWaveView;
+ }
+
+ public void reset(boolean animate) {
+ mMultiWaveView.reset(animate);
+ }
+
+ public void ping() {
+ mMultiWaveView.ping();
+ }
}
private void requestUnlockScreen() {
@@ -371,32 +434,39 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
mSilentMode = isSilentMode();
- View unlockWidget = findViewById(R.id.unlock_widget);
- if (unlockWidget instanceof SlidingTab) {
- mSlidingTab = (SlidingTab) unlockWidget;
- mSlidingTab.setHoldAfterTrigger(true, false);
- mSlidingTab.setLeftHintText(R.string.lockscreen_unlock_label);
- mSlidingTab.setLeftTabResources(
+ mUnlockWidget = findViewById(R.id.unlock_widget);
+ if (mUnlockWidget instanceof SlidingTab) {
+ SlidingTab slidingTabView = (SlidingTab) mUnlockWidget;
+ slidingTabView.setHoldAfterTrigger(true, false);
+ slidingTabView.setLeftHintText(R.string.lockscreen_unlock_label);
+ slidingTabView.setLeftTabResources(
R.drawable.ic_jog_dial_unlock,
R.drawable.jog_tab_target_green,
R.drawable.jog_tab_bar_left_unlock,
R.drawable.jog_tab_left_unlock);
- mSlidingTabMethods = new SlidingTabMethods();
- mSlidingTab.setOnTriggerListener(mSlidingTabMethods);
- mSlidingTabMethods.updateRightTabResources();
- } else if (unlockWidget instanceof WaveView) {
- mEnergyWave = (WaveView) unlockWidget;
- mWaveViewMethods = new WaveViewMethods();
- mEnergyWave.setOnTriggerListener(mWaveViewMethods);
- } else if (unlockWidget instanceof MultiWaveView) {
- mMultiWaveView = (MultiWaveView) unlockWidget;
- mMultiWaveViewMethods = new MultiWaveViewMethods();
- mMultiWaveViewMethods.updateResources(); // update silence/ring resources
- mMultiWaveView.setOnTriggerListener(mMultiWaveViewMethods);
+ SlidingTabMethods slidingTabMethods = new SlidingTabMethods(slidingTabView);
+ slidingTabView.setOnTriggerListener(slidingTabMethods);
+ mUnlockWidgetMethods = slidingTabMethods;
+ } else if (mUnlockWidget instanceof WaveView) {
+ WaveView waveView = (WaveView) mUnlockWidget;
+ WaveViewMethods waveViewMethods = new WaveViewMethods(waveView);
+ waveView.setOnTriggerListener(waveViewMethods);
+ mUnlockWidgetMethods = waveViewMethods;
+ } else if (mUnlockWidget instanceof MultiWaveView) {
+ MultiWaveView multiWaveView = (MultiWaveView) mUnlockWidget;
+ MultiWaveViewMethods multiWaveViewMethods = new MultiWaveViewMethods(multiWaveView);
+ multiWaveView.setOnTriggerListener(multiWaveViewMethods);
+ mUnlockWidgetMethods = multiWaveViewMethods;
} else {
- throw new IllegalStateException("Unrecognized unlock widget: " + unlockWidget);
+ throw new IllegalStateException("Unrecognized unlock widget: " + mUnlockWidget);
}
+ // Update widget with initial ring state
+ mUnlockWidgetMethods.updateResources();
+
+ if (DBG) Log.v(TAG, "*** LockScreen accel is "
+ + (mUnlockWidget.isHardwareAccelerated() ? "on":"off"));
+
resetStatusInfo(updateMonitor);
}
@@ -540,16 +610,14 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
* Enables unlocking of this screen. Typically just shows the unlock widget.
*/
private void enableUnlock() {
- if (mEnergyWave != null) mEnergyWave.setVisibility(View.VISIBLE);
- if (mSlidingTab != null) mSlidingTab.setVisibility(View.VISIBLE);
+ mUnlockWidgetMethods.getView().setVisibility(View.VISIBLE);
}
/**
* Disable unlocking of this screen. Typically just hides the unlock widget.
*/
private void disableUnlock() {
- if (mEnergyWave != null) mEnergyWave.setVisibility(View.GONE);
- if (mSlidingTab != null) mSlidingTab.setVisibility(View.GONE);
+ mUnlockWidgetMethods.getView().setVisibility(View.GONE);
}
/**
@@ -728,20 +796,13 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
/** {@inheritDoc} */
public void onPause() {
- if (mEnergyWave != null) {
- mEnergyWave.reset();
- }
- if (mMultiWaveView != null) {
- mMultiWaveView.reset(false);
- }
+ mUnlockWidgetMethods.reset(false);
}
/** {@inheritDoc} */
public void onResume() {
resetStatusInfo(mUpdateMonitor);
- if (mMultiWaveView != null) {
- mMultiWaveView.ping();
- }
+ mUnlockWidgetMethods.ping();
}
/** {@inheritDoc} */
@@ -757,7 +818,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
boolean silent = AudioManager.RINGER_MODE_NORMAL != state;
if (silent != mSilentMode) {
mSilentMode = silent;
- if (mSlidingTabMethods != null) mSlidingTabMethods.updateRightTabResources();
+ mUnlockWidgetMethods.updateResources();
}
}