From 47cde77bc7ac5c3a1e486691596a7534ad855ff2 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Fri, 26 Oct 2012 08:25:51 -0400 Subject: [PATCH] Fix camera bugs found overnight. - Fix crash in CameraWidgetFrame after rotating to landscape - Fix pages drift to the left bug - Address Jim's comments on c/245706 - Disable camera widget if landscape Bug: 7419070 Bug: 7417798 Bug: 7418781 Change-Id: I5c730c7c1baf3c1872367b6392e6786578765298 --- core/res/res/values-land/bools.xml | 1 + .../impl/keyguard/CameraWidgetFrame.java | 45 +++++++++++++------ .../keyguard/KeyguardActivityLauncher.java | 1 - .../impl/keyguard/KeyguardHostView.java | 5 ++- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/core/res/res/values-land/bools.xml b/core/res/res/values-land/bools.xml index b0630ad30391f..85c64d939afee 100644 --- a/core/res/res/values-land/bools.xml +++ b/core/res/res/values-land/bools.xml @@ -15,6 +15,7 @@ --> + false false false diff --git a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java index c87093a7086d5..db7e231b19f2f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java @@ -31,7 +31,6 @@ import android.widget.ImageView; import android.widget.ImageView.ScaleType; import com.android.internal.policy.impl.keyguard.KeyguardActivityLauncher.CameraWidgetInfo; -import com.android.internal.R; public class CameraWidgetFrame extends KeyguardWidgetFrame { private static final String TAG = CameraWidgetFrame.class.getSimpleName(); @@ -49,10 +48,12 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { private View mWidgetView; private long mLaunchCameraStart; + private boolean mRendered; private final Runnable mLaunchCameraRunnable = new Runnable() { @Override public void run() { + mLaunchCameraStart = SystemClock.uptimeMillis(); mActivityLauncher.launchCamera(); }}; @@ -85,7 +86,9 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { return null; ImageView preview = new ImageView(context); - preview.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); + preview.setLayoutParams(new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT)); preview.setScaleType(ScaleType.FIT_CENTER); CameraWidgetFrame cameraWidgetFrame = new CameraWidgetFrame(context, callbacks, launcher); cameraWidgetFrame.addView(preview); @@ -123,15 +126,31 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { } public void render() { - int width = getRootView().getWidth(); - int height = getRootView().getHeight(); - if (DEBUG) Log.d(TAG, String.format("render [%sx%s]", width, height)); - Bitmap offscreen = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas c = new Canvas(offscreen); - mWidgetView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - mWidgetView.layout(0, 0, width, height); - mWidgetView.draw(c); - ((ImageView)getChildAt(0)).setImageBitmap(offscreen); + if (mRendered) return; + + try { + int width = getRootView().getWidth(); + int height = getRootView().getHeight(); + if (DEBUG) Log.d(TAG, String.format("render [%sx%s] %s", + width, height, Integer.toHexString(hashCode()))); + if (width == 0 || height == 0) { + return; + } + Bitmap offscreen = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(offscreen); + mWidgetView.measure( + MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + mWidgetView.layout(0, 0, width, height); + mWidgetView.draw(c); + ((ImageView)getChildAt(0)).setImageBitmap(offscreen); + mRendered = true; + } catch (Throwable t) { + Log.w(TAG, "Error rendering camera widget", t); + removeAllViews(); + View genericView = inflateGenericWidgetView(mContext); + addView(genericView); + } } private void transitionToCamera() { @@ -161,10 +180,10 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { if (!hasWindowFocus) { if (mLaunchCameraStart > 0) { long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart; - if (DEBUG) Log.d(TAG, String.format("Camera took %s to launch", launchTime)); + if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime)); mLaunchCameraStart = 0; + onCameraLaunched(); } - onCameraLaunched(); } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java index d1033066500e4..a224a4219bbca 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java @@ -102,7 +102,6 @@ public abstract class KeyguardActivityLauncher { launchActivity(SECURE_CAMERA_INTENT, true); } } else { -// wouldLaunchResolverActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)); // Launch the normal camera launchActivity(INSECURE_CAMERA_INTENT, false); } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java index 70c4bbc959a26..66205ef6e1ae9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -850,7 +850,10 @@ public class KeyguardHostView extends KeyguardViewBase { if (slider != null) { slider.showHandle(true); } - mAppWidgetContainer.scrollLeft(); + View v = mAppWidgetContainer.getChildAt(mAppWidgetContainer.getCurrentPage()); + if (v instanceof CameraWidgetFrame) { + mAppWidgetContainer.scrollLeft(); + } } private SlidingChallengeLayout locateSlider() {