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

Commit 42af140f authored by Selim Cinek's avatar Selim Cinek Committed by Android Git Automerger
Browse files

am 8f7a7e01: am a07177f0: Merge "Launching the camera now from systemUI...

am 8f7a7e01: am a07177f0: Merge "Launching the camera now from systemUI including animations" into mnc-dr-dev

* commit '8f7a7e01':
  Launching the camera now from systemUI including animations
parents 5897f6ad 8f7a7e01
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -69,5 +69,10 @@ oneway interface IStatusBar

    void showAssistDisclosure();
    void startAssist(in Bundle args);

    /**
     * Notifies the status bar that a camera launch gesture has been detected.
     */
    void onCameraLaunchGestureDetected();
}
+13 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ public class CommandQueue extends IStatusBar.Stub {
    private static final int MSG_APP_TRANSITION_STARTING    = 21 << MSG_SHIFT;
    private static final int MSG_ASSIST_DISCLOSURE          = 22 << MSG_SHIFT;
    private static final int MSG_START_ASSIST               = 23 << MSG_SHIFT;
    private static final int MSG_CAMERA_LAUNCH_GESTURE      = 24 << MSG_SHIFT;

    public static final int FLAG_EXCLUDE_NONE = 0;
    public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -109,6 +110,7 @@ public class CommandQueue extends IStatusBar.Stub {
        public void appTransitionStarting(long startTime, long duration);
        public void showAssistDisclosure();
        public void startAssist(Bundle args);
        public void onCameraLaunchGestureDetected();
    }

    public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -293,6 +295,14 @@ public class CommandQueue extends IStatusBar.Stub {
        }
    }

    @Override
    public void onCameraLaunchGestureDetected() {
        synchronized (mList) {
            mHandler.removeMessages(MSG_CAMERA_LAUNCH_GESTURE);
            mHandler.obtainMessage(MSG_CAMERA_LAUNCH_GESTURE).sendToTarget();
        }
    }

    private final class H extends Handler {
        public void handleMessage(Message msg) {
            final int what = msg.what & MSG_MASK;
@@ -391,6 +401,9 @@ public class CommandQueue extends IStatusBar.Stub {
                case MSG_START_ASSIST:
                    mCallbacks.startAssist((Bundle) msg.obj);
                    break;
                case MSG_CAMERA_LAUNCH_GESTURE:
                    mCallbacks.onCameraLaunchGestureDetected();
                    break;
            }
        }
    }
+46 −4
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.view.ViewAnimationUtils;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.ImageView;

import com.android.systemui.R;
import com.android.systemui.statusbar.phone.KeyguardAffordanceHelper;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
@@ -79,6 +80,7 @@ public class KeyguardAffordanceView extends ImageView {
    private float mRestingAlpha = KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT;
    private boolean mSupportHardware;
    private boolean mFinishing;
    private boolean mLaunchingAffordance;

    private CanvasProperty<Float> mHwCircleRadius;
    private CanvasProperty<Float> mHwCenterX;
@@ -152,7 +154,7 @@ public class KeyguardAffordanceView extends ImageView {

    @Override
    protected void onDraw(Canvas canvas) {
        mSupportHardware = canvas.isHardwareAccelerated();
        mSupportHardware = false;//canvas.isHardwareAccelerated();
        drawBackgroundCircle(canvas);
        canvas.save();
        canvas.scale(mImageScale, mImageScale, getWidth() / 2, getHeight() / 2);
@@ -161,9 +163,11 @@ public class KeyguardAffordanceView extends ImageView {
    }

    public void setPreviewView(View v) {
        View oldPreviewView = mPreviewView;
        mPreviewView = v;
        if (mPreviewView != null) {
            mPreviewView.setVisibility(INVISIBLE);
            mPreviewView.setVisibility(mLaunchingAffordance
                    ? oldPreviewView.getVisibility() : INVISIBLE);
        }
    }

@@ -176,7 +180,7 @@ public class KeyguardAffordanceView extends ImageView {
    }

    private void drawBackgroundCircle(Canvas canvas) {
        if (mCircleRadius > 0) {
        if (mCircleRadius > 0 || mFinishing) {
            if (mFinishing && mSupportHardware) {
                DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
                displayListCanvas.drawCircle(mHwCenterX, mHwCenterY, mHwCircleRadius,
@@ -207,11 +211,12 @@ public class KeyguardAffordanceView extends ImageView {
        cancelAnimator(mPreviewClipper);
        mFinishing = true;
        mCircleStartRadius = mCircleRadius;
        float maxCircleSize = getMaxCircleSize();
        final float maxCircleSize = getMaxCircleSize();
        Animator animatorToRadius;
        if (mSupportHardware) {
            initHwProperties();
            animatorToRadius = getRtAnimatorToRadius(maxCircleSize);
            startRtAlphaFadeIn();
        } else {
            animatorToRadius = getAnimatorToRadius(maxCircleSize);
        }
@@ -222,6 +227,8 @@ public class KeyguardAffordanceView extends ImageView {
            public void onAnimationEnd(Animator animation) {
                mAnimationEndRunnable.run();
                mFinishing = false;
                mCircleRadius = maxCircleSize;
                invalidate();
            }
        });
        animatorToRadius.start();
@@ -241,6 +248,36 @@ public class KeyguardAffordanceView extends ImageView {
        }
    }

    /**
     * Fades in the Circle on the RenderThread. It's used when finishing the circle when it had
     * alpha 0 in the beginning.
     */
    private void startRtAlphaFadeIn() {
        if (mCircleRadius == 0 && mPreviewView == null) {
            Paint modifiedPaint = new Paint(mCirclePaint);
            modifiedPaint.setColor(mCircleColor);
            modifiedPaint.setAlpha(0);
            mHwCirclePaint = CanvasProperty.createPaint(modifiedPaint);
            RenderNodeAnimator animator = new RenderNodeAnimator(mHwCirclePaint,
                    RenderNodeAnimator.PAINT_ALPHA, 255);
            animator.setTarget(this);
            animator.setInterpolator(PhoneStatusBar.ALPHA_IN);
            animator.setDuration(250);
            animator.start();
        }
    }

    public void instantFinishAnimation() {
        cancelAnimator(mPreviewClipper);
        if (mPreviewView != null) {
            mPreviewView.setClipBounds(null);
            mPreviewView.setVisibility(View.VISIBLE);
        }
        mCircleRadius = getMaxCircleSize();
        setImageAlpha(0, false);
        invalidate();
    }

    private void startRtCircleFadeOut(long duration) {
        RenderNodeAnimator animator = new RenderNodeAnimator(mHwCirclePaint,
                RenderNodeAnimator.PAINT_ALPHA, 0);
@@ -443,6 +480,7 @@ public class KeyguardAffordanceView extends ImageView {
    public void setImageAlpha(float alpha, boolean animate, long duration,
            Interpolator interpolator, Runnable runnable) {
        cancelAnimator(mAlphaAnimator);
        alpha = mLaunchingAffordance ? 0 : alpha;
        int endAlpha = (int) (alpha * 255);
        final Drawable background = getBackground();
        if (!animate) {
@@ -509,4 +547,8 @@ public class KeyguardAffordanceView extends ImageView {
            return false;
        }
    }

    public void setLaunchingAffordance(boolean launchingAffordance) {
        mLaunchingAffordance = launchingAffordance;
    }
}
+61 −23
Original line number Diff line number Diff line
@@ -86,9 +86,9 @@ public class KeyguardAffordanceHelper {
        mContext = context;
        mCallback = callback;
        initIcons();
        updateIcon(mLeftIcon, 0.0f, mLeftIcon.getRestingAlpha(), false, false, true);
        updateIcon(mCenterIcon, 0.0f, mCenterIcon.getRestingAlpha(), false, false, true);
        updateIcon(mRightIcon, 0.0f, mRightIcon.getRestingAlpha(), false, false, true);
        updateIcon(mLeftIcon, 0.0f, mLeftIcon.getRestingAlpha(), false, false, true, false);
        updateIcon(mCenterIcon, 0.0f, mCenterIcon.getRestingAlpha(), false, false, true, false);
        updateIcon(mRightIcon, 0.0f, mRightIcon.getRestingAlpha(), false, false, true, false);
        initDimens();
    }

@@ -144,9 +144,7 @@ public class KeyguardAffordanceHelper {
                } else {
                    mTouchSlopExeeded = false;
                }
                mCallback.onSwipingStarted(targetView == mRightIcon);
                mSwipingInProgress = true;
                mTargetedView = targetView;
                startSwiping(targetView);
                mInitialTouchX = x;
                mInitialTouchY = y;
                mTranslationOnDown = mTranslation;
@@ -192,6 +190,12 @@ public class KeyguardAffordanceHelper {
        return true;
    }

    private void startSwiping(View targetView) {
        mCallback.onSwipingStarted(targetView == mRightIcon);
        mSwipingInProgress = true;
        mTargetedView = targetView;
    }

    private View getIconAtPosition(float x, float y) {
        if (leftSwipePossible() && isOnIcon(mLeftIcon, x, y)) {
            return mLeftIcon;
@@ -324,7 +328,7 @@ public class KeyguardAffordanceHelper {
        boolean velIsInWrongDirection = vel * mTranslation < 0;
        snapBack |= Math.abs(vel) > mMinFlingVelocity && velIsInWrongDirection;
        vel = snapBack ^ velIsInWrongDirection ? 0 : vel;
        fling(vel, snapBack || forceSnapBack);
        fling(vel, snapBack || forceSnapBack, mTranslation < 0);
    }

    private boolean isBelowFalsingThreshold() {
@@ -336,9 +340,8 @@ public class KeyguardAffordanceHelper {
        return (int) (mMinTranslationAmount * factor);
    }

    private void fling(float vel, final boolean snapBack) {
        float target = mTranslation < 0
                ? -mCallback.getMaxTranslationDistance()
    private void fling(float vel, final boolean snapBack, boolean right) {
        float target = right ? -mCallback.getMaxTranslationDistance()
                : mCallback.getMaxTranslationDistance();
        target = snapBack ? 0 : target;

@@ -352,8 +355,8 @@ public class KeyguardAffordanceHelper {
        });
        animator.addListener(mFlingEndListener);
        if (!snapBack) {
            startFinishingCircleAnimation(vel * 0.375f, mAnimationEndRunnable);
            mCallback.onAnimationToSideStarted(mTranslation < 0, mTranslation, vel);
            startFinishingCircleAnimation(vel * 0.375f, mAnimationEndRunnable, right);
            mCallback.onAnimationToSideStarted(right, mTranslation, vel);
        } else {
            reset(true);
        }
@@ -364,8 +367,9 @@ public class KeyguardAffordanceHelper {
        }
    }

    private void startFinishingCircleAnimation(float velocity, Runnable mAnimationEndRunnable) {
        KeyguardAffordanceView targetView = mTranslation > 0 ? mLeftIcon : mRightIcon;
    private void startFinishingCircleAnimation(float velocity, Runnable mAnimationEndRunnable,
            boolean right) {
        KeyguardAffordanceView targetView = right ? mRightIcon : mLeftIcon;
        targetView.finishAnimation(velocity, mAnimationEndRunnable);
    }

@@ -383,19 +387,20 @@ public class KeyguardAffordanceHelper {
            fadeOutAlpha = Math.max(fadeOutAlpha, 0.0f);

            boolean animateIcons = isReset && animateReset;
            boolean forceNoCircleAnimation = isReset && !animateReset;
            float radius = getRadiusFromTranslation(absTranslation);
            boolean slowAnimation = isReset && isBelowFalsingThreshold();
            if (!isReset) {
                updateIcon(targetView, radius, alpha + fadeOutAlpha * targetView.getRestingAlpha(),
                        false, false, false);
                        false, false, false, false);
            } else {
                updateIcon(targetView, 0.0f, fadeOutAlpha * targetView.getRestingAlpha(),
                        animateIcons, slowAnimation, false);
                        animateIcons, slowAnimation, false, forceNoCircleAnimation);
            }
            updateIcon(otherView, 0.0f, fadeOutAlpha * otherView.getRestingAlpha(),
                    animateIcons, slowAnimation, false);
                    animateIcons, slowAnimation, false, forceNoCircleAnimation);
            updateIcon(mCenterIcon, 0.0f, fadeOutAlpha * mCenterIcon.getRestingAlpha(),
                    animateIcons, slowAnimation, false);
                    animateIcons, slowAnimation, false, forceNoCircleAnimation);

            mTranslation = translation;
        }
@@ -431,16 +436,21 @@ public class KeyguardAffordanceHelper {

    public void animateHideLeftRightIcon() {
        cancelAnimation();
        updateIcon(mRightIcon, 0f, 0f, true, false, false);
        updateIcon(mLeftIcon, 0f, 0f, true, false, false);
        updateIcon(mRightIcon, 0f, 0f, true, false, false, false);
        updateIcon(mLeftIcon, 0f, 0f, true, false, false, false);
    }

    private void updateIcon(KeyguardAffordanceView view, float circleRadius, float alpha,
            boolean animate, boolean slowRadiusAnimation, boolean force) {
                            boolean animate, boolean slowRadiusAnimation, boolean force,
                            boolean forceNoCircleAnimation) {
        if (view.getVisibility() != View.VISIBLE && !force) {
            return;
        }
        if (forceNoCircleAnimation) {
            view.setCircleRadiusWithoutAnimation(circleRadius);
        } else {
            view.setCircleRadius(circleRadius, slowRadiusAnimation);
        }
        updateIconAlpha(view, alpha, animate);
    }

@@ -503,9 +513,37 @@ public class KeyguardAffordanceHelper {
        mMotionCancelled = true;
        if (mSwipingInProgress) {
            mCallback.onSwipingAborted();
        }
            mSwipingInProgress = false;
        }
    }

    public boolean isSwipingInProgress() {
        return mSwipingInProgress;
    }

    public void launchAffordance(boolean animate, boolean left) {
        if (mSwipingInProgress) {
            // We don't want to mess with the state if the user is actually swiping already.
            return;
        }
        KeyguardAffordanceView targetView = left ? mLeftIcon : mRightIcon;
        KeyguardAffordanceView otherView = left ? mRightIcon : mLeftIcon;
        startSwiping(targetView);
        if (animate) {
            fling(0, false, !left);
            updateIcon(otherView, 0.0f, 0, true, false, true, false);
            updateIcon(mCenterIcon, 0.0f, 0, true, false, true, false);
        } else {
            mCallback.onAnimationToSideStarted(!left, mTranslation, 0);
            mTranslation = left ? mCallback.getMaxTranslationDistance()
                    : mCallback.getMaxTranslationDistance();
            updateIcon(mCenterIcon, 0.0f, 0.0f, false, false, true, false);
            updateIcon(otherView, 0.0f, 0.0f, false, false, true, false);
            targetView.instantFinishAnimation();
            mFlingEndListener.onAnimationEnd(null);
            mAnimationEndRunnable.run();
        }
    }

    public interface Callback {

+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
    private static final Intent SECURE_CAMERA_INTENT =
            new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE)
                    .addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    private static final Intent INSECURE_CAMERA_INTENT =
    public static final Intent INSECURE_CAMERA_INTENT =
            new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
    private static final Intent PHONE_INTENT = new Intent(Intent.ACTION_DIAL);
    private static final int DOZE_ANIMATION_STAGGER_DELAY = 48;
Loading