diff --git a/core/res/res/drawable-hdpi/camera_widget.png b/core/res/res/drawable-hdpi/camera_widget.png deleted file mode 100644 index 02743885c52be..0000000000000 Binary files a/core/res/res/drawable-hdpi/camera_widget.png and /dev/null differ diff --git a/core/res/res/drawable-mdpi/camera_widget.png b/core/res/res/drawable-mdpi/camera_widget.png deleted file mode 100644 index 02743885c52be..0000000000000 Binary files a/core/res/res/drawable-mdpi/camera_widget.png and /dev/null differ diff --git a/core/res/res/drawable-xhdpi/camera_widget.png b/core/res/res/drawable-xhdpi/camera_widget.png deleted file mode 100644 index 02743885c52be..0000000000000 Binary files a/core/res/res/drawable-xhdpi/camera_widget.png and /dev/null differ diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 881e847bb4f11..f8dbd84da82c8 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3935,14 +3935,6 @@ you will be asked to unlock your phone using an email account.\n\n Try again in %d seconds. - - Camera widget not found - - com.google.android.gallery3d - - com.android.gallery3d - - keyguard_widget diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 3c95c9461f2f9..24cfa648e0f98 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1383,10 +1383,6 @@ - - - - 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 09e832cd4ca75..c87093a7086d5 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java @@ -16,34 +16,27 @@ package com.android.internal.policy.impl.keyguard; -import java.util.List; - -import android.app.ActivityManagerNative; -import android.content.ActivityNotFoundException; import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Color; import android.os.Handler; -import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserHandle; -import android.provider.MediaStore; import android.util.Log; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; -import android.view.WindowManager; -import android.widget.TextView; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ImageView.ScaleType; +import com.android.internal.policy.impl.keyguard.KeyguardActivityLauncher.CameraWidgetInfo; import com.android.internal.R; -import com.android.internal.widget.LockPatternUtils; public class CameraWidgetFrame extends KeyguardWidgetFrame { private static final String TAG = CameraWidgetFrame.class.getSimpleName(); private static final boolean DEBUG = KeyguardHostView.DEBUG; + private static final int WIDGET_ANIMATION_DURATION = 250; interface Callbacks { void onLaunchingCamera(); @@ -51,45 +44,65 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { } private final Handler mHandler = new Handler(); - private final LockPatternUtils mLockPatternUtils; + private final KeyguardActivityLauncher mActivityLauncher; private final Callbacks mCallbacks; - private boolean mCameraWidgetFound; + private View mWidgetView; private long mLaunchCameraStart; private final Runnable mLaunchCameraRunnable = new Runnable() { @Override public void run() { - launchCamera(); + mActivityLauncher.launchCamera(); }}; - public CameraWidgetFrame(Context context, Callbacks callbacks) { + private final Runnable mRenderRunnable = new Runnable() { + @Override + public void run() { + render(); + }}; + + private CameraWidgetFrame(Context context, Callbacks callbacks, + KeyguardActivityLauncher activityLauncher) { super(context); - mLockPatternUtils = new LockPatternUtils(context); mCallbacks = callbacks; - - View cameraView = createCameraView(); - addView(cameraView); + mActivityLauncher = activityLauncher; } - private View createCameraView() { - View cameraView = null; + public static CameraWidgetFrame create(Context context, Callbacks callbacks, + KeyguardActivityLauncher launcher) { + if (context == null || callbacks == null || launcher == null) + return null; + + CameraWidgetInfo widgetInfo = launcher.getCameraWidgetInfo(); + if (widgetInfo == null) + return null; + View widgetView = widgetInfo.layoutId > 0 ? + inflateWidgetView(context, widgetInfo) : + inflateGenericWidgetView(context); + if (widgetView == null) + return null; + + ImageView preview = new ImageView(context); + 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); + cameraWidgetFrame.mWidgetView = widgetView; + return cameraWidgetFrame; + } + + private static View inflateWidgetView(Context context, CameraWidgetInfo widgetInfo) { + View widgetView = null; Exception exception = null; try { - String contextPackage = mContext.getString(R.string.kg_camera_widget_context_package); - String layoutPackage = mContext.getString(R.string.kg_camera_widget_layout_package); - String layoutName = mContext.getString(R.string.kg_camera_widget_layout_name); - - Context cameraContext = mContext.createPackageContext( - contextPackage, Context.CONTEXT_RESTRICTED); + Context cameraContext = context.createPackageContext( + widgetInfo.contextPackage, Context.CONTEXT_RESTRICTED); LayoutInflater cameraInflater = (LayoutInflater) cameraContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); cameraInflater = cameraInflater.cloneInContext(cameraContext); - - int layoutId = cameraContext.getResources() - .getIdentifier(layoutName, "layout", layoutPackage); - cameraView = cameraInflater.inflate(layoutId, null, false); + widgetView = cameraInflater.inflate(widgetInfo.layoutId, null, false); } catch (NameNotFoundException e) { exception = e; } catch (RuntimeException e) { @@ -98,27 +111,44 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { if (exception != null) { Log.w(TAG, "Error creating camera widget view", exception); } - if (cameraView == null) { - cameraView = createCameraErrorView(); - } else { - mCameraWidgetFound = true; - } - return cameraView; + return widgetView; } - private View createCameraErrorView() { - TextView errorView = new TextView(mContext); - errorView.setGravity(Gravity.CENTER); - errorView.setText(R.string.kg_camera_widget_not_found); - errorView.setBackgroundColor(Color.argb(127, 0, 0, 0)); - return errorView; + private static View inflateGenericWidgetView(Context context) { + ImageView iv = new ImageView(context); + iv.setImageResource(com.android.internal.R.drawable.ic_lockscreen_camera); + iv.setScaleType(ScaleType.CENTER); + iv.setBackgroundColor(Color.argb(127, 0, 0, 0)); + return iv; + } + + 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); } private void transitionToCamera() { + int startWidth = getChildAt(0).getWidth(); + int startHeight = getChildAt(0).getHeight(); + + int finishWidth = getRootView().getWidth(); + int finishHeight = getRootView().getHeight(); + + float scaleX = (float) finishWidth / startWidth; + float scaleY = (float) finishHeight / startHeight; + + float scale = Math.max(scaleX, scaleY); animate() - .scaleX(1.22f) // TODO compute this at runtime - .scaleY(1.22f) - .setDuration(250) + .scaleX(scale) + .scaleY(scale) + .setDuration(WIDGET_ANIMATION_DURATION) .withEndAction(mLaunchCameraRunnable) .start(); mCallbacks.onLaunchingCamera(); @@ -127,7 +157,6 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); - if (!mCameraWidgetFound) return; if (!hasWindowFocus) { if (mLaunchCameraStart > 0) { @@ -141,8 +170,6 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { @Override public void onActive(boolean isActive) { - if (!mCameraWidgetFound) return; - if (isActive) { mHandler.post(new Runnable(){ @Override @@ -165,85 +192,9 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame { setScaleY(1); } - // =========== from KeyguardSelectorView =========== - protected void launchCamera() { - mLaunchCameraStart = SystemClock.uptimeMillis(); - boolean isSecure = mLockPatternUtils.isSecure(); - if (DEBUG) Log.d(TAG, "launchCamera " + (isSecure?"(secure)":"(insecure)")); - if (isSecure) { - // Launch the secure version of the camera - final Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE); - intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - - if (wouldLaunchResolverActivity(intent)) { - // TODO: Show disambiguation dialog instead. - // For now, we'll treat this like launching any other app from secure keyguard. - // When they do, user sees the system's ResolverActivity which lets them choose - // which secure camera to use. - launchActivity(intent, false); - } else { - launchActivity(intent, true); - } - } else { - // Launch the normal camera - launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false); - } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + mHandler.post(mRenderRunnable); } - - /** - * Launches the said intent for the current foreground user. - * @param intent - * @param showsWhileLocked true if the activity can be run on top of keyguard. - * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} - */ - private void launchActivity(final Intent intent, boolean showsWhileLocked) { - intent.addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_SINGLE_TOP - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - boolean isSecure = mLockPatternUtils.isSecure(); - if (!isSecure || showsWhileLocked) { - if (!isSecure) try { - ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); - } catch (RemoteException e) { - Log.w(TAG, "can't dismiss keyguard on launch"); - } - try { - mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); - } catch (ActivityNotFoundException e) { - Log.w(TAG, "Activity not found for intent + " + intent.getAction()); - } - } else { - Log.w(TAG, "TODO: handle this case"); - onCameraLaunched(); -// // Create a runnable to start the activity and ask the user to enter their -// // credentials. -// mCallback.setOnDismissRunnable(new Runnable() { -// @Override -// public void run() { -// mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); -// } -// }); -// mCallback.dismiss(false); - } - } - - private boolean wouldLaunchResolverActivity(Intent intent) { - PackageManager packageManager = mContext.getPackageManager(); - ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, - PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); - final List appList = packageManager.queryIntentActivitiesAsUser( - intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); - // If the list contains the above resolved activity, then it can't be - // ResolverActivity itself. - for (int i = 0; i < appList.size(); i++) { - ResolveInfo tmp = appList.get(i); - if (tmp.activityInfo.name.equals(resolved.activityInfo.name) - && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) { - return false; - } - } - return true; - } - } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java new file mode 100644 index 0000000000000..d1033066500e4 --- /dev/null +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.policy.impl.keyguard; + +import android.app.ActivityManagerNative; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.RemoteException; +import android.os.UserHandle; +import android.provider.MediaStore; +import android.util.Log; +import android.view.WindowManager; + +import com.android.internal.widget.LockPatternUtils; + +import java.util.List; + +public abstract class KeyguardActivityLauncher { + private static final String TAG = KeyguardActivityLauncher.class.getSimpleName(); + private static final boolean DEBUG = KeyguardHostView.DEBUG; + private static final String META_DATA_KEYGUARD_LAYOUT = "com.android.keyguard.layout"; + 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 = + new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); + + abstract Context getContext(); + + abstract KeyguardSecurityCallback getCallback(); + + abstract LockPatternUtils getLockPatternUtils(); + + public static class CameraWidgetInfo { + public String contextPackage; + public int layoutId; + } + + public CameraWidgetInfo getCameraWidgetInfo() { + CameraWidgetInfo info = new CameraWidgetInfo(); + Intent intent = getCameraIntent(); + PackageManager packageManager = getContext().getPackageManager(); + final List appList = packageManager.queryIntentActivitiesAsUser( + intent, PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser()); + if (appList.size() == 0) { + if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): Nothing found"); + return null; + } + ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, + PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA, + getLockPatternUtils().getCurrentUser()); + if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): resolved: " + resolved); + if (wouldLaunchResolverActivity(resolved, appList)) { + if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): Would launch resolver"); + return info; + } + if (resolved == null || resolved.activityInfo == null) { + return null; + } + if (resolved.activityInfo.metaData == null || resolved.activityInfo.metaData.isEmpty()) { + if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): no metadata found"); + return info; + } + int layoutId = resolved.activityInfo.metaData.getInt(META_DATA_KEYGUARD_LAYOUT); + if (layoutId == 0) { + if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): no layout specified"); + return info; + } + info.contextPackage = resolved.activityInfo.packageName; + info.layoutId = layoutId; + return info; + } + + public void launchCamera() { + LockPatternUtils lockPatternUtils = getLockPatternUtils(); + if (lockPatternUtils.isSecure()) { + // Launch the secure version of the camera + if (wouldLaunchResolverActivity(SECURE_CAMERA_INTENT)) { + // TODO: Show disambiguation dialog instead. + // For now, we'll treat this like launching any other app from secure keyguard. + // When they do, user sees the system's ResolverActivity which lets them choose + // which secure camera to use. + launchActivity(SECURE_CAMERA_INTENT, false); + } else { + launchActivity(SECURE_CAMERA_INTENT, true); + } + } else { +// wouldLaunchResolverActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)); + // Launch the normal camera + launchActivity(INSECURE_CAMERA_INTENT, false); + } + } + + /** + * Launches the said intent for the current foreground user. + * @param intent + * @param showsWhileLocked true if the activity can be run on top of keyguard. + * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} + */ + public void launchActivity(final Intent intent, boolean showsWhileLocked) { + final Context context = getContext(); + LockPatternUtils lockPatternUtils = getLockPatternUtils(); + intent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_SINGLE_TOP + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + boolean isSecure = lockPatternUtils.isSecure(); + if (!isSecure || showsWhileLocked) { + if (!isSecure) try { + ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); + } catch (RemoteException e) { + Log.w(TAG, "can't dismiss keyguard on launch"); + } + try { + context.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Activity not found for intent + " + intent.getAction()); + } + } else { + // Create a runnable to start the activity and ask the user to enter their + // credentials. + KeyguardSecurityCallback callback = getCallback(); + callback.setOnDismissRunnable(new Runnable() { + @Override + public void run() { + context.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); + } + }); + callback.dismiss(false); + } + } + + private Intent getCameraIntent() { + return getLockPatternUtils().isSecure() ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT; + } + + private boolean wouldLaunchResolverActivity(Intent intent) { + PackageManager packageManager = getContext().getPackageManager(); + ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, + PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser()); + List appList = packageManager.queryIntentActivitiesAsUser( + intent, PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser()); + return wouldLaunchResolverActivity(resolved, appList); + } + + private boolean wouldLaunchResolverActivity(ResolveInfo resolved, List appList) { + // If the list contains the above resolved activity, then it can't be + // ResolverActivity itself. + for (int i = 0; i < appList.size(); i++) { + ResolveInfo tmp = appList.get(i); + if (tmp.activityInfo.name.equals(resolved.activityInfo.name) + && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) { + return false; + } + } + return true; + } +} 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 65721dfe5a41d..d8d9ab99ca785 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -49,7 +49,6 @@ import android.view.WindowManager; import android.view.animation.AnimationUtils; import android.widget.RemoteViews.OnClickHandler; import android.widget.TextView; -import android.widget.ViewFlipper; import com.android.internal.R; import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode; @@ -831,6 +830,46 @@ public class KeyguardHostView extends KeyguardViewBase { } } + private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks = + new CameraWidgetFrame.Callbacks() { + @Override + public void onLaunchingCamera() { + SlidingChallengeLayout slider = locateSlider(); + if (slider != null) { + slider.showHandle(false); + } + } + + @Override + public void onCameraLaunched() { + SlidingChallengeLayout slider = locateSlider(); + if (slider != null) { + slider.showHandle(true); + } + mAppWidgetContainer.scrollLeft(); + } + + private SlidingChallengeLayout locateSlider() { + return (SlidingChallengeLayout) findViewById(R.id.sliding_layout); + } + }; + + private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { + @Override + Context getContext() { + return mContext; + } + + @Override + KeyguardSecurityCallback getCallback() { + return mCallback; + } + + @Override + LockPatternUtils getLockPatternUtils() { + return mLockPatternUtils; + }}; + private void addDefaultWidgets() { LayoutInflater inflater = LayoutInflater.from(mContext); inflater.inflate(R.layout.keyguard_transport_control_view, this, true); @@ -840,30 +879,11 @@ public class KeyguardHostView extends KeyguardViewBase { View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true); mAppWidgetContainer.addWidget(statusWidget); if (mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) { - View cameraWidget = new CameraWidgetFrame(mContext, new CameraWidgetFrame.Callbacks() { - - private SlidingChallengeLayout locateSlider() { - return (SlidingChallengeLayout) findViewById(R.id.sliding_layout); - } - - @Override - public void onLaunchingCamera() { - SlidingChallengeLayout slider = locateSlider(); - if (slider != null) { - slider.showHandle(false); - } - } - - @Override - public void onCameraLaunched() { - SlidingChallengeLayout slider = locateSlider(); - if (slider != null) { - slider.showHandle(true); - } - mAppWidgetContainer.scrollLeft(); - } - }); - mAppWidgetContainer.addWidget(cameraWidget); + View cameraWidget = + CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks, mActivityLauncher); + if (cameraWidget != null) { + mAppWidgetContainer.addWidget(cameraWidget); + } } View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java index 53f4de8137dc2..eba9a76d0309b 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -16,18 +16,12 @@ package com.android.internal.policy.impl.keyguard; import android.animation.ObjectAnimator; -import android.app.ActivityManagerNative; import android.app.SearchManager; import android.app.admin.DevicePolicyManager; -import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.RemoteException; import android.os.UserHandle; -import android.provider.MediaStore; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; @@ -41,8 +35,6 @@ import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; import com.android.internal.R; -import java.util.List; - public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView { private static final boolean DEBUG = KeyguardHostView.DEBUG; private static final String TAG = "SecuritySelectorView"; @@ -67,7 +59,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (assistIntent != null) { - launchActivity(assistIntent, false); + mActivityLauncher.launchActivity(assistIntent, false); } else { Log.w(TAG, "Failed to get intent for assist activity"); } @@ -75,7 +67,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri break; case com.android.internal.R.drawable.ic_lockscreen_camera: - launchCamera(); + mActivityLauncher.launchCamera(); mCallback.userActivity(0); break; @@ -119,49 +111,27 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri } }; + private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { + + @Override + KeyguardSecurityCallback getCallback() { + return mCallback; + } + + @Override + LockPatternUtils getLockPatternUtils() { + return mLockPatternUtils; + } + + @Override + Context getContext() { + return mContext; + }}; + public KeyguardSelectorView(Context context) { this(context, null); } - private boolean wouldLaunchResolverActivity(Intent intent) { - PackageManager packageManager = mContext.getPackageManager(); - ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, - PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); - final List appList = packageManager.queryIntentActivitiesAsUser( - intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); - // If the list contains the above resolved activity, then it can't be - // ResolverActivity itself. - for (int i = 0; i < appList.size(); i++) { - ResolveInfo tmp = appList.get(i); - if (tmp.activityInfo.name.equals(resolved.activityInfo.name) - && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) { - return false; - } - } - return true; - } - - protected void launchCamera() { - if (mLockPatternUtils.isSecure()) { - // Launch the secure version of the camera - final Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE); - intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - - if (wouldLaunchResolverActivity(intent)) { - // TODO: Show disambiguation dialog instead. - // For now, we'll treat this like launching any other app from secure keyguard. - // When they do, user sees the system's ResolverActivity which lets them choose - // which secure camera to use. - launchActivity(intent, false); - } else { - launchActivity(intent, true); - } - } else { - // Launch the normal camera - launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false); - } - } - public KeyguardSelectorView(Context context, AttributeSet attrs) { super(context, attrs); mLockPatternUtils = new LockPatternUtils(getContext()); @@ -267,42 +237,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri mLockPatternUtils = utils; } - /** - * Launches the said intent for the current foreground user. - * @param intent - * @param showsWhileLocked true if the activity can be run on top of keyguard. - * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} - */ - private void launchActivity(final Intent intent, boolean showsWhileLocked) { - intent.addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_SINGLE_TOP - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - boolean isSecure = mLockPatternUtils.isSecure(); - if (!isSecure || showsWhileLocked) { - if (!isSecure) try { - ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); - } catch (RemoteException e) { - Log.w(TAG, "can't dismiss keyguard on launch"); - } - try { - mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); - } catch (ActivityNotFoundException e) { - Log.w(TAG, "Activity not found for intent + " + intent.getAction()); - } - } else { - // Create a runnable to start the activity and ask the user to enter their - // credentials. - mCallback.setOnDismissRunnable(new Runnable() { - @Override - public void run() { - mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); - } - }); - mCallback.dismiss(false); - } - } - @Override public void reset() { mGlowPadView.reset(false); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/SecureCamera.java b/policy/src/com/android/internal/policy/impl/keyguard/SecureCamera.java deleted file mode 100644 index 505917eac234d..0000000000000 --- a/policy/src/com/android/internal/policy/impl/keyguard/SecureCamera.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.policy.impl.keyguard; - -import android.app.Activity; -import android.os.Bundle; -import android.widget.FrameLayout; - -public class SecureCamera extends Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(new FrameLayout(this)); - } - -}