Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c351d62 authored by Jim Miller's avatar Jim Miller
Browse files

Fix 6040870: Update MultiWaveView for new device

This change allows more flexibility in target placement in MultiWaveView.
It now supports a new way of specifying chevron drawables that allows
them to be moved in directions corresponding to more than the four basic
directions (right, up, left, down).

Chevron drawables can now be updated in an overlay.

This change also adds a place holder and makes a minor tweak to the layout
on 720dp devices where the navbar buttons weren't centered.

Change-Id: Icd319ec5f276870380e27737c873e78f599ff751
parent 86f23aaa
Loading
Loading
Loading
Loading
+61 −38
Original line number Original line Diff line number Diff line
@@ -181,23 +181,37 @@ public class MultiWaveView extends View {
        mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false);
        mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false);
        mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP);
        mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP);


        // Read chevron animation drawables
        // Read array of chevron drawables
        final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable,
        TypedValue outValue = new TypedValue();
        if (a.getValue(R.styleable.MultiWaveView_chevronDrawables, outValue)) {
            ArrayList<TargetDrawable> chevrons = loadDrawableArray(outValue.resourceId);
            for (int i = 0; i < chevrons.size(); i++) {
                final TargetDrawable chevron = chevrons.get(i);
                for (int k = 0; k < mFeedbackCount; k++) {
                    mChevronDrawables.add(chevron == null ? null : new TargetDrawable(chevron));
                }
            }
        }

        // Support old-style chevron specification if new specification not found
        if (mChevronDrawables.size() == 0) {
            final int chevronResIds[] = {
                    R.styleable.MultiWaveView_rightChevronDrawable,
                    R.styleable.MultiWaveView_rightChevronDrawable,
                    R.styleable.MultiWaveView_topChevronDrawable,
                    R.styleable.MultiWaveView_topChevronDrawable,
                    R.styleable.MultiWaveView_leftChevronDrawable,
                    R.styleable.MultiWaveView_bottomChevronDrawable
                    R.styleable.MultiWaveView_bottomChevronDrawable
            };
            };


        for (int chevron : chevrons) {
            for (int i = 0; i < chevronResIds.length; i++) {
            TypedValue typedValue = a.peekValue(chevron);
                TypedValue typedValue = a.peekValue(chevronResIds[i]);
            for (int i = 0; i < mFeedbackCount; i++) {
                for (int k = 0; k < mFeedbackCount; k++) {
                    mChevronDrawables.add(
                    mChevronDrawables.add(
                        typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null);
                        typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null);
                }
                }
            }
            }
        }


        // Read array of target drawables
        // Read array of target drawables
        TypedValue outValue = new TypedValue();
        if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) {
        if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) {
            internalSetTargetResources(outValue.resourceId);
            internalSetTargetResources(outValue.resourceId);
        }
        }
@@ -318,23 +332,24 @@ public class MultiWaveView extends View {
     * mFeedbackCount items in the order: left, right, top, bottom.
     * mFeedbackCount items in the order: left, right, top, bottom.
     */
     */
    private void startChevronAnimation() {
    private void startChevronAnimation() {
        final float r = mHandleDrawable.getWidth() * 0.4f;
        final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f;
        final float chevronAnimationDistance = mOuterRadius * 0.9f / 2.0f;
        final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f;
        final float from[][] = {
                { -r, 0},  // left
                { +r, 0},  // right
                {0, -r},  // top
                {0, +r} }; // bottom
        final float to[][] = {
                { -chevronAnimationDistance, 0},  // left
                { chevronAnimationDistance, 0},  // right
                { 0, -chevronAnimationDistance},  // top
                { 0, +chevronAnimationDistance} }; // bottom

        mChevronAnimations.clear();
        mChevronAnimations.clear();
        final float startScale = 0.5f;
        final float startScale = 0.5f;
        final float endScale = 2.0f;
        final float endScale = 2.0f;
        for (int direction = 0; direction < 4; direction++) {

        final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0;

        // Add an animation for all chevron drawables.  There are mFeedbackCount drawables
        // in each direction and directionCount directions.
        for (int direction = 0; direction < directionCount; direction++) {
            double angle = 2.0 * Math.PI * direction / directionCount;
            final float sx = (float) Math.cos(angle);
            final float sy = 0.0f - (float) Math.sin(angle);
            final float[] xrange = new float[]
                 {sx * chevronStartDistance, sx * chevronStopDistance};
            final float[] yrange = new float[]
                 {sy * chevronStartDistance, sy * chevronStopDistance};
            for (int count = 0; count < mFeedbackCount; count++) {
            for (int count = 0; count < mFeedbackCount; count++) {
                int delay = count * CHEVRON_INCREMENTAL_DELAY;
                int delay = count * CHEVRON_INCREMENTAL_DELAY;
                final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count);
                final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count);
@@ -344,8 +359,8 @@ public class MultiWaveView extends View {
                mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION,
                mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION,
                        "ease", mChevronAnimationInterpolator,
                        "ease", mChevronAnimationInterpolator,
                        "delay", delay,
                        "delay", delay,
                        "x", new float[] { from[direction][0], to[direction][0] },
                        "x", xrange,
                        "y", new float[] { from[direction][1], to[direction][1] },
                        "y", yrange,
                        "alpha", new float[] {1.0f, 0.0f},
                        "alpha", new float[] {1.0f, 0.0f},
                        "scaleX", new float[] {startScale, endScale},
                        "scaleX", new float[] {startScale, endScale},
                        "scaleY", new float[] {startScale, endScale},
                        "scaleY", new float[] {startScale, endScale},
@@ -529,22 +544,31 @@ public class MultiWaveView extends View {
        }
        }
    }
    }


    private void internalSetTargetResources(int resourceId) {
    private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) {
        Resources res = getContext().getResources();
        Resources res = getContext().getResources();
        TypedArray array = res.obtainTypedArray(resourceId);
        TypedArray array = res.obtainTypedArray(resourceId);
        int count = array.length();
        final int count = array.length();
        ArrayList<TargetDrawable> targetDrawables = new ArrayList<TargetDrawable>(count);
        ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count);
        int maxWidth = mHandleDrawable.getWidth();
        int maxHeight = mHandleDrawable.getHeight();
        for (int i = 0; i < count; i++) {
        for (int i = 0; i < count; i++) {
            TypedValue value = array.peekValue(i);
            TypedValue value = array.peekValue(i);
            TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0);
            TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0);
            targetDrawables.add(target);
            drawables.add(target);
        }
        array.recycle();
        return drawables;
    }

    private void internalSetTargetResources(int resourceId) {
        mTargetDrawables = loadDrawableArray(resourceId);
        mTargetResourceId = resourceId;
        final int count = mTargetDrawables.size();
        int maxWidth = mHandleDrawable.getWidth();
        int maxHeight = mHandleDrawable.getHeight();
        for (int i = 0; i < count; i++) {
            TargetDrawable target = mTargetDrawables.get(i);
            maxWidth = Math.max(maxWidth, target.getWidth());
            maxWidth = Math.max(maxWidth, target.getWidth());
            maxHeight = Math.max(maxHeight, target.getHeight());
            maxHeight = Math.max(maxHeight, target.getHeight());
        }
        }
        mTargetResourceId = resourceId;
        mTargetDrawables = targetDrawables;
        if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) {
        if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) {
            mMaxTargetWidth = maxWidth;
            mMaxTargetWidth = maxWidth;
            mMaxTargetHeight = maxHeight;
            mMaxTargetHeight = maxHeight;
@@ -553,7 +577,6 @@ public class MultiWaveView extends View {
            updateTargetPositions(mWaveCenterX, mWaveCenterY);
            updateTargetPositions(mWaveCenterX, mWaveCenterY);
            updateChevronPositions(mWaveCenterX, mWaveCenterY);
            updateChevronPositions(mWaveCenterX, mWaveCenterY);
        }
        }
        array.recycle();
    }
    }


    /**
    /**
+8 −0
Original line number Original line Diff line number Diff line
@@ -85,6 +85,14 @@ public class TargetDrawable {
        setState(STATE_INACTIVE);
        setState(STATE_INACTIVE);
    }
    }


    public TargetDrawable(TargetDrawable other) {
        mResourceId = other.mResourceId;
        // Mutate the drawable so we can animate shared drawable properties.
        mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null;
        resizeDrawables();
        setState(STATE_INACTIVE);
    }

    public void setState(int [] state) {
    public void setState(int [] state) {
        if (mDrawable instanceof StateListDrawable) {
        if (mDrawable instanceof StateListDrawable) {
            StateListDrawable d = (StateListDrawable) mDrawable;
            StateListDrawable d = (StateListDrawable) mDrawable;
+1 −1
Original line number Original line Diff line number Diff line
@@ -98,7 +98,7 @@
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
            android:chevronDrawables="@array/lockscreen_chevron_drawables"
            android:feedbackCount="3"
            android:feedbackCount="3"
            android:vibrationDuration="20"
            android:vibrationDuration="20"
            />
            />
+1 −1
Original line number Original line Diff line number Diff line
@@ -98,7 +98,7 @@
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
            android:chevronDrawables="@array/lockscreen_chevron_drawables"
            android:feedbackCount="3"
            android:feedbackCount="3"
            android:vibrationDuration="20"
            android:vibrationDuration="20"
        />
        />
+1 −1
Original line number Original line Diff line number Diff line
@@ -139,7 +139,7 @@
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:outerRadius="@dimen/multiwaveview_target_placement_radius"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:snapMargin="@dimen/multiwaveview_snap_margin"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:hitRadius="@dimen/multiwaveview_hit_radius"
            android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
            android:chevronDrawables="@array/lockscreen_chevron_drawables"
            android:feedbackCount="3"
            android:feedbackCount="3"
            android:vibrationDuration="20"
            android:vibrationDuration="20"
            />
            />
Loading