Fields Summary |
---|
private static final String | TAG |
private static final boolean | DEBUG |
private static final int | WIDGET_ANIMATION_DURATION |
private static final int | WIDGET_WAIT_DURATION |
private static final int | RECOVERY_DELAY |
private final android.os.Handler | mHandler |
private final KeyguardActivityLauncher | mActivityLauncher |
private final Callbacks | mCallbacks |
private final com.android.keyguard.KeyguardActivityLauncher.CameraWidgetInfo | mWidgetInfo |
private final android.view.WindowManager | mWindowManager |
private final android.graphics.Point | mRenderedSize |
private final int[] | mTmpLoc |
private long | mLaunchCameraStart |
private boolean | mActive |
private boolean | mTransitioning |
private boolean | mDown |
private final android.graphics.Rect | mInsets |
private FixedSizeFrameLayout | mPreview |
private android.view.View | mFullscreenPreview |
private android.view.View | mFakeNavBar |
private boolean | mUseFastTransition |
private final Runnable | mTransitionToCameraRunnable |
private final Runnable | mTransitionToCameraEndAction |
private final Runnable | mPostTransitionToCameraEndAction |
private final Runnable | mRecoverRunnable |
private final Runnable | mRenderRunnable |
private final Runnable | mSecureCameraActivityStartedRunnable |
private final KeyguardUpdateMonitorCallback | mCallback |
Methods Summary |
---|
private void | cancelTransitionToCamera()
if (DEBUG) Log.d(TAG, "cancelTransitionToCamera at " + SystemClock.uptimeMillis());
mHandler.removeCallbacks(mTransitionToCameraRunnable);
|
public static com.android.keyguard.CameraWidgetFrame | create(android.content.Context context, com.android.keyguard.CameraWidgetFrame$Callbacks callbacks, KeyguardActivityLauncher launcher)
if (context == null || callbacks == null || launcher == null)
return null;
CameraWidgetInfo widgetInfo = launcher.getCameraWidgetInfo();
if (widgetInfo == null)
return null;
View previewWidget = getPreviewWidget(context, widgetInfo);
if (previewWidget == null)
return null;
return new CameraWidgetFrame(context, callbacks, launcher, widgetInfo, previewWidget);
|
private void | enableWindowExitAnimation(boolean isEnabled)
View root = getRootView();
ViewGroup.LayoutParams lp = root.getLayoutParams();
if (!(lp instanceof WindowManager.LayoutParams))
return;
WindowManager.LayoutParams wlp = (WindowManager.LayoutParams) lp;
int newWindowAnimations = isEnabled ? R.style.Animation_LockScreen : 0;
if (newWindowAnimations != wlp.windowAnimations) {
if (DEBUG) Log.d(TAG, "setting windowAnimations to: " + newWindowAnimations
+ " at " + SystemClock.uptimeMillis());
wlp.windowAnimations = newWindowAnimations;
mWindowManager.updateViewLayout(root, wlp);
}
|
private static android.view.View | getPreviewWidget(android.content.Context context, com.android.keyguard.KeyguardActivityLauncher.CameraWidgetInfo widgetInfo)
return widgetInfo.layoutId > 0 ?
inflateWidgetView(context, widgetInfo) :
inflateGenericWidgetView(context);
|
private static android.view.View | inflateGenericWidgetView(android.content.Context context)
if (DEBUG) Log.d(TAG, "inflateGenericWidgetView");
ImageView iv = new ImageView(context);
iv.setImageResource(R.drawable.ic_lockscreen_camera);
iv.setScaleType(ScaleType.CENTER);
iv.setBackgroundColor(Color.argb(127, 0, 0, 0));
return iv;
|
private static android.view.View | inflateWidgetView(android.content.Context context, com.android.keyguard.KeyguardActivityLauncher.CameraWidgetInfo widgetInfo)
if (DEBUG) Log.d(TAG, "inflateWidgetView: " + widgetInfo.contextPackage);
View widgetView = null;
Exception exception = null;
try {
Context cameraContext = context.createPackageContext(
widgetInfo.contextPackage, Context.CONTEXT_RESTRICTED);
LayoutInflater cameraInflater = (LayoutInflater)
cameraContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cameraInflater = cameraInflater.cloneInContext(cameraContext);
widgetView = cameraInflater.inflate(widgetInfo.layoutId, null, false);
} catch (NameNotFoundException e) {
exception = e;
} catch (RuntimeException e) {
exception = e;
}
if (exception != null) {
Log.w(TAG, "Error creating camera widget view", exception);
}
return widgetView;
|
private java.lang.String | instanceId()
return Integer.toHexString(hashCode());
|
public void | onActive(boolean isActive)
mActive = isActive;
if (mActive) {
rescheduleTransitionToCamera();
} else {
reset();
}
|
public void | onBouncerShowing(boolean showing)
if (showing) {
mTransitioning = false;
mHandler.post(mRecoverRunnable);
}
|
private void | onCameraLaunched()
mCallbacks.onCameraLaunchedSuccessfully();
reset();
|
public void | onClick(android.view.View v)
if (DEBUG) Log.d(TAG, "clicked");
if (mTransitioning) return;
if (mActive) {
cancelTransitionToCamera();
transitionToCamera();
}
|
protected void | onDetachedFromWindow()
if (DEBUG) Log.d(TAG, "onDetachedFromWindow: instance " + instanceId()
+ " at " + SystemClock.uptimeMillis());
super.onDetachedFromWindow();
KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback);
cancelTransitionToCamera();
mHandler.removeCallbacks(mRecoverRunnable);
|
protected void | onFocusLost()
if (DEBUG) Log.d(TAG, "onFocusLost at " + SystemClock.uptimeMillis());
cancelTransitionToCamera();
super.onFocusLost();
|
private void | onKeyguardVisibilityChanged(boolean showing)
if (DEBUG) Log.d(TAG, "onKeyguardVisibilityChanged " + showing
+ " at " + SystemClock.uptimeMillis());
if (mTransitioning && !showing) {
mTransitioning = false;
mHandler.removeCallbacks(mRecoverRunnable);
if (mLaunchCameraStart > 0) {
long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart;
if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime));
mLaunchCameraStart = 0;
onCameraLaunched();
}
}
|
public void | onScreenTurnedOff()
if (DEBUG) Log.d(TAG, "onScreenTurnedOff");
reset();
|
private void | onSecureCameraActivityStarted()
if (DEBUG) Log.d(TAG, "onSecureCameraActivityStarted at " + SystemClock.uptimeMillis());
mHandler.postDelayed(mRecoverRunnable, RECOVERY_DELAY);
|
protected void | onSizeChanged(int w, int h, int oldw, int oldh)
if (DEBUG) Log.d(TAG, String.format("onSizeChanged new=%sx%s old=%sx%s at %s",
w, h, oldw, oldh, SystemClock.uptimeMillis()));
if ((w != oldw && oldw > 0) || (h != oldh && oldh > 0)) {
// we can't trust the old geometry anymore; force a re-render
mRenderedSize.x = mRenderedSize.y = -1;
}
mHandler.post(mRenderRunnable);
super.onSizeChanged(w, h, oldw, oldh);
|
public boolean | onUserInteraction(android.view.MotionEvent event)
if (mTransitioning) {
if (DEBUG) Log.d(TAG, "onUserInteraction eaten: mTransitioning");
return true;
}
getLocationOnScreen(mTmpLoc);
int rawBottom = mTmpLoc[1] + getHeight();
if (event.getRawY() > rawBottom) {
if (DEBUG) Log.d(TAG, "onUserInteraction eaten: below widget");
return true;
}
int action = event.getAction();
mDown = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE;
if (mActive) {
rescheduleTransitionToCamera();
}
if (DEBUG) Log.d(TAG, "onUserInteraction observed, not eaten");
return false;
|
private void | recover()
if (DEBUG) Log.d(TAG, "recovering at " + SystemClock.uptimeMillis());
mCallbacks.onCameraLaunchedUnsuccessfully();
reset();
|
private void | render()
final View root = getRootView();
final int width = root.getWidth() - mInsets.right; // leave room
final int height = root.getHeight() - mInsets.bottom; // for bars
if (mRenderedSize.x == width && mRenderedSize.y == height) {
if (DEBUG) Log.d(TAG, String.format("Already rendered at size=%sx%s %d%%",
width, height, (int)(100*mPreview.getScaleX())));
return;
}
if (width == 0 || height == 0) {
return;
}
mPreview.width = width;
mPreview.height = height;
mPreview.requestLayout();
final int thisWidth = getWidth() - getPaddingLeft() - getPaddingRight();
final int thisHeight = getHeight() - getPaddingTop() - getPaddingBottom();
final float pvScaleX = (float) thisWidth / width;
final float pvScaleY = (float) thisHeight / height;
final float pvScale = Math.min(pvScaleX, pvScaleY);
final int pvWidth = (int) (pvScale * width);
final int pvHeight = (int) (pvScale * height);
final float pvTransX = pvWidth < thisWidth ? (thisWidth - pvWidth) / 2 : 0;
final float pvTransY = pvHeight < thisHeight ? (thisHeight - pvHeight) / 2 : 0;
final boolean isRtl = mPreview.getLayoutDirection() == LAYOUT_DIRECTION_RTL;
mPreview.setPivotX(isRtl ? mPreview.width : 0);
mPreview.setPivotY(0);
mPreview.setScaleX(pvScale);
mPreview.setScaleY(pvScale);
mPreview.setTranslationX((isRtl ? -1 : 1) * pvTransX);
mPreview.setTranslationY(pvTransY);
mRenderedSize.set(width, height);
if (DEBUG) Log.d(TAG, String.format("Rendered camera widget size=%sx%s %d%% instance=%s",
width, height, (int)(100*mPreview.getScaleX()), instanceId()));
|
private void | rescheduleTransitionToCamera()
if (DEBUG) Log.d(TAG, "rescheduleTransitionToCamera at " + SystemClock.uptimeMillis());
mHandler.removeCallbacks(mTransitionToCameraRunnable);
final long duration = mUseFastTransition ? 0 : WIDGET_WAIT_DURATION;
mHandler.postDelayed(mTransitionToCameraRunnable, duration);
|
private void | reset()
if (DEBUG) Log.d(TAG, "reset at " + SystemClock.uptimeMillis());
mLaunchCameraStart = 0;
mTransitioning = false;
mDown = false;
cancelTransitionToCamera();
mHandler.removeCallbacks(mRecoverRunnable);
mPreview.setVisibility(View.VISIBLE);
if (mFullscreenPreview != null) {
mFullscreenPreview.animate().cancel();
mFullscreenPreview.setVisibility(View.GONE);
}
if (mFakeNavBar != null) {
mFakeNavBar.animate().cancel();
mFakeNavBar.setVisibility(View.GONE);
}
enableWindowExitAnimation(true);
|
public void | setInsets(android.graphics.Rect insets)
if (DEBUG) Log.d(TAG, "setInsets: " + insets);
mInsets.set(insets);
|
public void | setOnLongClickListener(OnLongClickListener l)
// ignore
|
public void | setUseFastTransition(boolean useFastTransition)
mUseFastTransition = useFastTransition;
|
private void | transitionToCamera()
if (mTransitioning || mDown) return;
mTransitioning = true;
enableWindowExitAnimation(false);
final int navHeight = mInsets.bottom;
final int navWidth = mInsets.right;
mPreview.getLocationInWindow(mTmpLoc);
final float pvHeight = mPreview.getHeight() * mPreview.getScaleY();
final float pvCenter = mTmpLoc[1] + pvHeight / 2f;
final ViewGroup root = (ViewGroup) getRootView();
if (DEBUG) {
Log.d(TAG, "root = " + root.getLeft() + "," + root.getTop() + " "
+ root.getWidth() + "x" + root.getHeight());
}
if (mFullscreenPreview == null) {
mFullscreenPreview = getPreviewWidget(mContext, mWidgetInfo);
mFullscreenPreview.setClickable(false);
root.addView(mFullscreenPreview, new FrameLayout.LayoutParams(
root.getWidth() - navWidth,
root.getHeight() - navHeight));
}
final float fsHeight = root.getHeight() - navHeight;
final float fsCenter = root.getTop() + fsHeight / 2;
final float fsScaleY = mPreview.getScaleY();
final float fsTransY = pvCenter - fsCenter;
final float fsScaleX = fsScaleY;
mPreview.setVisibility(View.GONE);
mFullscreenPreview.setVisibility(View.VISIBLE);
mFullscreenPreview.setTranslationY(fsTransY);
mFullscreenPreview.setScaleX(fsScaleX);
mFullscreenPreview.setScaleY(fsScaleY);
mFullscreenPreview
.animate()
.scaleX(1)
.scaleY(1)
.translationX(0)
.translationY(0)
.setDuration(WIDGET_ANIMATION_DURATION)
.withEndAction(mPostTransitionToCameraEndAction)
.start();
if (navHeight > 0 || navWidth > 0) {
final boolean atBottom = navHeight > 0;
if (mFakeNavBar == null) {
mFakeNavBar = new View(mContext);
mFakeNavBar.setBackgroundColor(Color.BLACK);
root.addView(mFakeNavBar, new FrameLayout.LayoutParams(
atBottom ? FrameLayout.LayoutParams.MATCH_PARENT
: navWidth,
atBottom ? navHeight
: FrameLayout.LayoutParams.MATCH_PARENT,
atBottom ? Gravity.BOTTOM|Gravity.FILL_HORIZONTAL
: Gravity.RIGHT|Gravity.FILL_VERTICAL));
mFakeNavBar.setPivotY(navHeight);
mFakeNavBar.setPivotX(navWidth);
}
mFakeNavBar.setAlpha(0f);
if (atBottom) {
mFakeNavBar.setScaleY(0.5f);
} else {
mFakeNavBar.setScaleX(0.5f);
}
mFakeNavBar.setVisibility(View.VISIBLE);
mFakeNavBar.animate()
.alpha(1f)
.scaleY(1f)
.scaleY(1f)
.setDuration(WIDGET_ANIMATION_DURATION)
.start();
}
mCallbacks.onLaunchingCamera();
|