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

Commit d9910249 authored by John Spurlock's avatar John Spurlock Committed by Android (Google) Code Review
Browse files

Merge ""Implement grace period for camera widget." -> frame/base" into jb-mr1-lockscreen-dev

parents c864d952 4b976ea1
Loading
Loading
Loading
Loading
+84 −9
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -32,10 +33,11 @@ import android.widget.ImageView.ScaleType;

import com.android.internal.policy.impl.keyguard.KeyguardActivityLauncher.CameraWidgetInfo;

public class CameraWidgetFrame extends KeyguardWidgetFrame {
public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnClickListener {
    private static final String TAG = CameraWidgetFrame.class.getSimpleName();
    private static final boolean DEBUG = KeyguardHostView.DEBUG;
    private static final int WIDGET_ANIMATION_DURATION = 250;
    private static final int WIDGET_WAIT_DURATION = 650;

    interface Callbacks {
        void onLaunchingCamera();
@@ -49,6 +51,10 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
    private View mWidgetView;
    private long mLaunchCameraStart;
    private boolean mRendered;
    private boolean mActive;
    private boolean mChallengeActive;
    private boolean mTransitioning;
    private boolean mDown;

    private final Runnable mLaunchCameraRunnable = new Runnable() {
        @Override
@@ -63,6 +69,12 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
            render();
        }};

    private final Runnable mTransitionToCameraRunnable = new Runnable() {
        @Override
        public void run() {
            transitionToCamera();
        }};

    private CameraWidgetFrame(Context context, Callbacks callbacks,
            KeyguardActivityLauncher activityLauncher) {
        super(context);
@@ -93,10 +105,12 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
        CameraWidgetFrame cameraWidgetFrame = new CameraWidgetFrame(context, callbacks, launcher);
        cameraWidgetFrame.addView(preview);
        cameraWidgetFrame.mWidgetView = widgetView;
        preview.setOnClickListener(cameraWidgetFrame);
        return cameraWidgetFrame;
    }

    private static View inflateWidgetView(Context context, CameraWidgetInfo widgetInfo) {
        if (DEBUG) Log.d(TAG, "inflateWidgetView: " + widgetInfo.contextPackage);
        View widgetView = null;
        Exception exception = null;
        try {
@@ -118,6 +132,7 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
    }

    private static View inflateGenericWidgetView(Context context) {
        if (DEBUG) Log.d(TAG, "inflateGenericWidgetView");
        ImageView iv = new ImageView(context);
        iv.setImageResource(com.android.internal.R.drawable.ic_lockscreen_camera);
        iv.setScaleType(ScaleType.CENTER);
@@ -154,6 +169,9 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
    }

    private void transitionToCamera() {
        if (mTransitioning || mChallengeActive || mDown) return;
        if (DEBUG) Log.d(TAG, "Transitioning to camera...");
        mTransitioning = true;
        int startWidth = getChildAt(0).getWidth();
        int startHeight = getChildAt(0).getHeight();

@@ -173,11 +191,22 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {
        mCallbacks.onLaunchingCamera();
    }

    @Override
    public void onClick(View v) {
        if (DEBUG) Log.d(TAG, "clicked");
        if (mTransitioning) return;
        if (mActive && !mChallengeActive) {
            cancelTransitionToCamera();
            transitionToCamera();
        }
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);

        if (DEBUG) Log.d(TAG, "onWindowFocusChanged: " + hasWindowFocus);
        if (!hasWindowFocus) {
            mTransitioning = false;
            if (mLaunchCameraStart > 0) {
                long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart;
                if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime));
@@ -189,23 +218,69 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame {

    @Override
    public void onActive(boolean isActive) {
        if (isActive) {
            mHandler.post(new Runnable(){
                @Override
                public void run() {
                    transitionToCamera();
                }});
        mActive = isActive;
        if (mActive) {
            rescheduleTransitionToCamera();
        } else {
            reset();
        }
    }

    @Override
    public boolean onUserInteraction(int action) {
        if (mTransitioning) return true;
        if (DEBUG) Log.d(TAG, "onUserInteraction " + action);
        mDown = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE;
        if (mActive && !mChallengeActive) {
            rescheduleTransitionToCamera();
        }
        return false;
    }

    @Override
    protected void onFocusLost() {
        Log.d(TAG, "onFocusLost");
        cancelTransitionToCamera();
        super.onFocusLost();
    }

    @Override
    public void onChallengeActive(boolean challengeActive) {
        if (DEBUG) Log.d(TAG, "onChallengeActive: " + challengeActive);
        mChallengeActive = challengeActive;
        if (mTransitioning) return;
        if (mActive) {
            if (mChallengeActive) {
                cancelTransitionToCamera();
            } else {
                rescheduleTransitionToCamera();
            }
        }
    }

    private void rescheduleTransitionToCamera() {
        if (DEBUG) Log.d(TAG, "rescheduleTransitionToCamera at " + SystemClock.uptimeMillis());
        mHandler.removeCallbacks(mTransitionToCameraRunnable);
        mHandler.postDelayed(mTransitionToCameraRunnable, WIDGET_WAIT_DURATION);
    }

    private void cancelTransitionToCamera() {
        if (DEBUG) Log.d(TAG, "cancelTransitionToCamera at " + SystemClock.uptimeMillis());
        mHandler.removeCallbacks(mTransitionToCameraRunnable);
    }

    private void onCameraLaunched() {
        reset();
        mCallbacks.onCameraLaunched();
        reset();
    }

    private void reset() {
        if (DEBUG) Log.d(TAG, "reset");
        mLaunchCameraStart = 0;
        mTransitioning = false;
        mChallengeActive = false;
        mDown = false;
        cancelTransitionToCamera();
        animate().cancel();
        setScaleX(1);
        setScaleY(1);
+3 −3
Original line number Diff line number Diff line
@@ -835,14 +835,14 @@ public class KeyguardHostView extends KeyguardViewBase {

            @Override
            public void onCameraLaunched() {
                if (isCameraPage(mAppWidgetContainer.getCurrentPage())) {
                    mAppWidgetContainer.scrollLeft();
                }
                SlidingChallengeLayout slider = locateSlider();
                if (slider != null) {
                    slider.showHandle(true);
                    slider.showChallenge(true);
                }
                if (isCameraPage(mAppWidgetContainer.getCurrentPage())) {
                    mAppWidgetContainer.scrollLeft();
                }
            }

            private SlidingChallengeLayout locateSlider() {
+3 −0
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle
            if (!challengeOverlapping) {
                frame.resetSize();
            }
            frame.onChallengeActive(mChallengeLayout.isChallengeShowing());
            frame.hideFrame(this);

            if (challengeOverlapping) {
@@ -174,6 +175,8 @@ public class KeyguardViewStateManager implements SlidingChallengeLayout.OnChalle
            }
            // View is on the move.  Pause the security view until it completes.
            mKeyguardSecurityContainer.onPause();

            frame.onChallengeActive(true);
        }
        mLastScrollState = scrollState;
    }
+9 −0
Original line number Diff line number Diff line
@@ -366,4 +366,13 @@ public class KeyguardWidgetFrame extends FrameLayout {
    public void onActive(boolean isActive) {
        // hook for subclasses
    }

    public boolean onUserInteraction(int action) {
        // hook for subclasses
        return false;
    }

    public void onChallengeActive(boolean challengeActive) {
        // hook for subclasses
    }
}
+9 −0
Original line number Diff line number Diff line
@@ -131,6 +131,15 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        KeyguardWidgetFrame currentWidgetPage = getWidgetPageAt(getCurrentPage());
        if (currentWidgetPage != null && currentWidgetPage.onUserInteraction(ev.getAction())) {
            return true;
        }
        return super.onTouchEvent(ev);
    }

    public void showPagingFeedback() {
        // Nothing yet.
    }