From e70d6535237d2e6f03adcd0bdc11e45ea714dc97 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 24 Apr 2015 16:46:13 -0700 Subject: The voice assist may now be launched above the lockscreen A possibility was introduced to launch voice assist over the lockscreen using the left keyguard affordance. Change-Id: Ic4618d24256b65441a50d77d0ef59b0ec99b6ead --- packages/SystemUI/res/drawable/ic_mic_26dp.xml | 24 ++ .../SystemUI/res/layout/keyguard_bottom_area.xml | 2 +- packages/SystemUI/res/values/strings.xml | 15 +- .../systemui/assist/AssistGestureManager.java | 292 ------------------- .../com/android/systemui/assist/AssistManager.java | 309 +++++++++++++++++++++ .../systemui/statusbar/phone/ActivityStarter.java | 1 + .../statusbar/phone/KeyguardAffordanceHelper.java | 4 + .../statusbar/phone/KeyguardBottomAreaView.java | 144 +++++++--- .../statusbar/phone/NotificationPanelView.java | 28 +- .../systemui/statusbar/phone/PhoneStatusBar.java | 57 +++- .../systemui/statusbar/policy/PreviewInflater.java | 52 +++- 11 files changed, 559 insertions(+), 369 deletions(-) create mode 100644 packages/SystemUI/res/drawable/ic_mic_26dp.xml delete mode 100644 packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java create mode 100644 packages/SystemUI/src/com/android/systemui/assist/AssistManager.java (limited to 'packages') diff --git a/packages/SystemUI/res/drawable/ic_mic_26dp.xml b/packages/SystemUI/res/drawable/ic_mic_26dp.xml new file mode 100644 index 0000000..83e4ba8 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_mic_26dp.xml @@ -0,0 +1,24 @@ + + + + diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 1057464..5d0367e 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -52,7 +52,7 @@ android:contentDescription="@string/accessibility_camera_button" /> Camera Phone + + Voice Assist Unlock @@ -212,6 +214,8 @@ open phone + open voice assist + open camera Select new task layout @@ -753,11 +757,14 @@ Swipe up to unlock - - Swipe right for phone + + Swipe from icon for phone + + + Swipe from icon for voice assist - - Swipe left for camera + + Swipe from icon for camera Total silence diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java deleted file mode 100644 index d9f2324..0000000 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java +++ /dev/null @@ -1,292 +0,0 @@ -package com.android.systemui.assist; - -import android.app.ActivityManager; -import android.app.ActivityOptions; -import android.app.SearchManager; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.graphics.PixelFormat; -import android.media.AudioAttributes; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.UserHandle; -import android.os.Vibrator; -import android.provider.Settings; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.ImageView; - -import com.android.internal.app.IVoiceInteractionManagerService; -import com.android.internal.app.IVoiceInteractionSessionShowCallback; -import com.android.systemui.R; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.phone.PhoneStatusBar; - -/** - * Class to manage everything around the assist gesture. - */ -public class AssistGestureManager { - - private static final String TAG = "AssistGestureManager"; - private static final String ASSIST_ICON_METADATA_NAME = - "com.android.systemui.action_assist_icon"; - - private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .build(); - - private static final long TIMEOUT_SERVICE = 2500; - private static final long TIMEOUT_ACTIVITY = 1000; - - private final Context mContext; - private final WindowManager mWindowManager; - private AssistOrbContainer mView; - private final PhoneStatusBar mBar; - private final IVoiceInteractionManagerService mVoiceInteractionManagerService; - - private IVoiceInteractionSessionShowCallback mShowCallback = - new IVoiceInteractionSessionShowCallback.Stub() { - - @Override - public void onFailed() throws RemoteException { - mView.post(mHideRunnable); - } - - @Override - public void onShown() throws RemoteException { - mView.post(mHideRunnable); - } - }; - - private Runnable mHideRunnable = new Runnable() { - @Override - public void run() { - mView.removeCallbacks(this); - mView.show(false /* show */, true /* animate */); - } - }; - - public AssistGestureManager(PhoneStatusBar bar, Context context) { - mContext = context; - mBar = bar; - mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); - mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface( - ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); - } - - public void onConfigurationChanged() { - boolean visible = false; - if (mView != null) { - visible = mView.isShowing(); - mWindowManager.removeView(mView); - } - - mView = (AssistOrbContainer) LayoutInflater.from(mContext).inflate( - R.layout.assist_orb, null); - mView.setVisibility(View.GONE); - mView.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); - WindowManager.LayoutParams lp = getLayoutParams(); - mWindowManager.addView(mView, lp); - mBar.getNavigationBarView().setDelegateView(mView); - if (visible) { - mView.show(true /* show */, false /* animate */); - } - } - - public void onGestureInvoked(boolean vibrate) { - boolean isVoiceInteractorActive = getVoiceInteractorSupportsAssistGesture(); - if (!isVoiceInteractorActive && !isAssistantIntentAvailable()) { - return; - } - if (vibrate) { - vibrate(); - } - if (!isVoiceInteractorActive || !isVoiceSessionRunning()) { - showOrb(); - mView.postDelayed(mHideRunnable, isVoiceInteractorActive - ? TIMEOUT_SERVICE - : TIMEOUT_ACTIVITY); - } - startAssist(); - } - - private WindowManager.LayoutParams getLayoutParams() { - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - mContext.getResources().getDimensionPixelSize(R.dimen.assist_orb_scrim_height), - WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE - | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - if (ActivityManager.isHighEndGfx()) { - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - } - lp.gravity = Gravity.BOTTOM | Gravity.START; - lp.setTitle("AssistPreviewPanel"); - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - return lp; - } - - private void showOrb() { - maybeSwapSearchIcon(); - mView.show(true /* show */, true /* animate */); - } - - private void startAssist() { - if (getVoiceInteractorSupportsAssistGesture()) { - startVoiceInteractor(); - } else { - startAssistActivity(); - } - } - - private void startAssistActivity() { - if (!mBar.isDeviceProvisioned()) { - return; - } - - // Close Recent Apps if needed - mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | - CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL); - - final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); - if (intent == null) { - return; - } - - try { - final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, - R.anim.search_launch_enter, R.anim.search_launch_exit); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - AsyncTask.execute(new Runnable() { - @Override - public void run() { - mContext.startActivityAsUser(intent, opts.toBundle(), - new UserHandle(UserHandle.USER_CURRENT)); - } - }); - } catch (ActivityNotFoundException e) { - Log.w(TAG, "Activity not found for " + intent.getAction()); - } - } - - private void startVoiceInteractor() { - try { - mVoiceInteractionManagerService.showSessionForActiveService(mShowCallback); - } catch (RemoteException e) { - Log.w(TAG, "Failed to call showSessionForActiveService", e); - } - } - - private boolean getVoiceInteractorSupportsAssistGesture() { - try { - return mVoiceInteractionManagerService.activeServiceSupportsAssist(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to call activeServiceSupportsAssistGesture", e); - return false; - } - } - - private ComponentName getVoiceInteractorComponentName() { - try { - return mVoiceInteractionManagerService.getActiveServiceComponentName(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to call getActiveServiceComponentName", e); - return null; - } - } - - private boolean isVoiceSessionRunning() { - try { - return mVoiceInteractionManagerService.isSessionRunning(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to call isSessionRunning", e); - return false; - } - } - - public void destroy() { - mWindowManager.removeViewImmediate(mView); - } - - private void maybeSwapSearchIcon() { - Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); - ComponentName component = null; - boolean isService = false; - if (getVoiceInteractorSupportsAssistGesture()) { - component = getVoiceInteractorComponentName(); - isService = true; - } else if (intent != null) { - component = intent.getComponent(); - } - if (component != null) { - replaceDrawable(mView.getOrb().getLogo(), component, ASSIST_ICON_METADATA_NAME, - isService); - } else { - mView.getOrb().getLogo().setImageDrawable(null); - } - } - - public void replaceDrawable(ImageView v, ComponentName component, String name, - boolean isService) { - if (component != null) { - try { - PackageManager packageManager = mContext.getPackageManager(); - // Look for the search icon specified in the activity meta-data - Bundle metaData = isService - ? packageManager.getServiceInfo( - component, PackageManager.GET_META_DATA).metaData - : packageManager.getActivityInfo( - component, PackageManager.GET_META_DATA).metaData; - if (metaData != null) { - int iconResId = metaData.getInt(name); - if (iconResId != 0) { - Resources res = packageManager.getResourcesForApplication( - component.getPackageName()); - v.setImageDrawable(res.getDrawable(iconResId)); - return; - } - } - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "Failed to swap drawable; " - + component.flattenToShortString() + " not found", e); - } catch (Resources.NotFoundException nfe) { - Log.w(TAG, "Failed to swap drawable from " - + component.flattenToShortString(), nfe); - } - } - v.setImageDrawable(null); - } - - private void vibrate() { - if (Settings.System.getIntForUser(mContext.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 1, UserHandle.USER_CURRENT) != 0) { - Resources res = mContext.getResources(); - Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); - vibrator.vibrate(res.getInteger(R.integer.config_search_panel_view_vibration_duration), - VIBRATION_ATTRIBUTES); - } - } - - public boolean isAssistantIntentAvailable() { - return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java new file mode 100644 index 0000000..d1f8963 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -0,0 +1,309 @@ +package com.android.systemui.assist; + +import android.app.ActivityManager; +import android.app.ActivityOptions; +import android.app.SearchManager; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.media.AudioAttributes; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.os.Vibrator; +import android.provider.Settings; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageView; + +import com.android.internal.app.IVoiceInteractionManagerService; +import com.android.internal.app.IVoiceInteractionSessionShowCallback; +import com.android.systemui.R; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.PhoneStatusBar; + +/** + * Class to manage everything related to assist in SystemUI. + */ +public class AssistManager { + + private static final String TAG = "AssistManager"; + private static final String ASSIST_ICON_METADATA_NAME = + "com.android.systemui.action_assist_icon"; + + private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .build(); + + private static final long TIMEOUT_SERVICE = 2500; + private static final long TIMEOUT_ACTIVITY = 1000; + + private final Context mContext; + private final WindowManager mWindowManager; + private AssistOrbContainer mView; + private final PhoneStatusBar mBar; + private final IVoiceInteractionManagerService mVoiceInteractionManagerService; + + private IVoiceInteractionSessionShowCallback mShowCallback = + new IVoiceInteractionSessionShowCallback.Stub() { + + @Override + public void onFailed() throws RemoteException { + mView.post(mHideRunnable); + } + + @Override + public void onShown() throws RemoteException { + mView.post(mHideRunnable); + } + }; + + private Runnable mHideRunnable = new Runnable() { + @Override + public void run() { + mView.removeCallbacks(this); + mView.show(false /* show */, true /* animate */); + } + }; + + public AssistManager(PhoneStatusBar bar, Context context) { + mContext = context; + mBar = bar; + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface( + ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); + } + + public void onConfigurationChanged() { + boolean visible = false; + if (mView != null) { + visible = mView.isShowing(); + mWindowManager.removeView(mView); + } + + mView = (AssistOrbContainer) LayoutInflater.from(mContext).inflate( + R.layout.assist_orb, null); + mView.setVisibility(View.GONE); + mView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + WindowManager.LayoutParams lp = getLayoutParams(); + mWindowManager.addView(mView, lp); + mBar.getNavigationBarView().setDelegateView(mView); + if (visible) { + mView.show(true /* show */, false /* animate */); + } + } + + public void onGestureInvoked(boolean vibrate) { + boolean isVoiceInteractorActive = getVoiceInteractorSupportsAssistGesture(); + if (!isVoiceInteractorActive && !isAssistantIntentAvailable()) { + return; + } + if (vibrate) { + vibrate(); + } + if (!isVoiceInteractorActive || !isVoiceSessionRunning()) { + showOrb(); + mView.postDelayed(mHideRunnable, isVoiceInteractorActive + ? TIMEOUT_SERVICE + : TIMEOUT_ACTIVITY); + } + startAssist(); + } + + private WindowManager.LayoutParams getLayoutParams() { + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + mContext.getResources().getDimensionPixelSize(R.dimen.assist_orb_scrim_height), + WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + if (ActivityManager.isHighEndGfx()) { + lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; + } + lp.gravity = Gravity.BOTTOM | Gravity.START; + lp.setTitle("AssistPreviewPanel"); + lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; + return lp; + } + + private void showOrb() { + maybeSwapSearchIcon(); + mView.show(true /* show */, true /* animate */); + } + + private void startAssist() { + if (getVoiceInteractorSupportsAssistGesture()) { + startVoiceInteractor(); + } else { + startAssistActivity(); + } + } + + private void startAssistActivity() { + if (!mBar.isDeviceProvisioned()) { + return; + } + + // Close Recent Apps if needed + mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | + CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL); + + final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); + if (intent == null) { + return; + } + + try { + final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, + R.anim.search_launch_enter, R.anim.search_launch_exit); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + AsyncTask.execute(new Runnable() { + @Override + public void run() { + mContext.startActivityAsUser(intent, opts.toBundle(), + new UserHandle(UserHandle.USER_CURRENT)); + } + }); + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Activity not found for " + intent.getAction()); + } + } + + private void startVoiceInteractor() { + try { + mVoiceInteractionManagerService.showSessionForActiveService(mShowCallback); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call showSessionForActiveService", e); + } + } + + public void launchVoiceAssistFromKeyguard() { + try { + mVoiceInteractionManagerService.launchVoiceAssistFromKeyguard(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call launchVoiceAssistFromKeyguard", e); + } + } + + private boolean getVoiceInteractorSupportsAssistGesture() { + try { + return mVoiceInteractionManagerService.activeServiceSupportsAssist(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call activeServiceSupportsAssistGesture", e); + return false; + } + } + + public boolean canVoiceAssistBeLaunchedFromKeyguard() { + try { + return mVoiceInteractionManagerService.activeServiceSupportsLaunchFromKeyguard(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call activeServiceSupportsLaunchFromKeyguard", e); + return false; + } + } + + public ComponentName getVoiceInteractorComponentName() { + try { + return mVoiceInteractionManagerService.getActiveServiceComponentName(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call getActiveServiceComponentName", e); + return null; + } + } + + private boolean isVoiceSessionRunning() { + try { + return mVoiceInteractionManagerService.isSessionRunning(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call isSessionRunning", e); + return false; + } + } + + public void destroy() { + mWindowManager.removeViewImmediate(mView); + } + + private void maybeSwapSearchIcon() { + Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); + ComponentName component = null; + boolean isService = false; + if (getVoiceInteractorSupportsAssistGesture()) { + component = getVoiceInteractorComponentName(); + isService = true; + } else if (intent != null) { + component = intent.getComponent(); + } + if (component != null) { + replaceDrawable(mView.getOrb().getLogo(), component, ASSIST_ICON_METADATA_NAME, + isService); + } else { + mView.getOrb().getLogo().setImageDrawable(null); + } + } + + public void replaceDrawable(ImageView v, ComponentName component, String name, + boolean isService) { + if (component != null) { + try { + PackageManager packageManager = mContext.getPackageManager(); + // Look for the search icon specified in the activity meta-data + Bundle metaData = isService + ? packageManager.getServiceInfo( + component, PackageManager.GET_META_DATA).metaData + : packageManager.getActivityInfo( + component, PackageManager.GET_META_DATA).metaData; + if (metaData != null) { + int iconResId = metaData.getInt(name); + if (iconResId != 0) { + Resources res = packageManager.getResourcesForApplication( + component.getPackageName()); + v.setImageDrawable(res.getDrawable(iconResId)); + return; + } + } + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Failed to swap drawable; " + + component.flattenToShortString() + " not found", e); + } catch (Resources.NotFoundException nfe) { + Log.w(TAG, "Failed to swap drawable from " + + component.flattenToShortString(), nfe); + } + } + v.setImageDrawable(null); + } + + private void vibrate() { + if (Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1, UserHandle.USER_CURRENT) != 0) { + Resources res = mContext.getResources(); + Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(res.getInteger(R.integer.config_search_panel_view_vibration_duration), + VIBRATION_ATTRIBUTES); + } + } + + public boolean isAssistantIntentAvailable() { + return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java index 23810f9..ee5eb38 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java @@ -25,4 +25,5 @@ import android.content.Intent; */ public interface ActivityStarter { public void startActivity(Intent intent, boolean dismissShade); + void preventNextAnimation(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java index 8343497..8bffdc9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java @@ -131,6 +131,10 @@ public class KeyguardAffordanceHelper { mCenterIcon = mCallback.getCenterIcon(); mRightIcon = mCallback.getRightIcon(); mRightIcon.setIsLeft(false); + updatePreviews(); + } + + public void updatePreviews() { mLeftIcon.setPreviewView(mCallback.getLeftPreview()); mRightIcon.setPreviewView(mCallback.getRightPreview()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index fabc1a6..efc3ea0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -25,17 +25,13 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; -import android.hardware.fingerprint.FingerprintManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; -import android.os.Vibrator; import android.provider.MediaStore; -import android.provider.Settings; import android.telecom.TelecomManager; import android.util.AttributeSet; import android.util.Log; @@ -54,6 +50,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.R; +import com.android.systemui.assist.AssistManager; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.KeyguardAffordanceView; import com.android.systemui.statusbar.KeyguardIndicationController; @@ -85,12 +82,12 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private static final long TRANSIENT_FP_ERROR_TIMEOUT = 1300; private KeyguardAffordanceView mCameraImageView; - private KeyguardAffordanceView mPhoneImageView; + private KeyguardAffordanceView mLeftAffordanceView; private LockIcon mLockIcon; private TextView mIndicationText; private ViewGroup mPreviewContainer; - private View mPhonePreview; + private View mLeftPreview; private View mCameraPreview; private ActivityStarter mActivityStarter; @@ -104,6 +101,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private final Interpolator mLinearOutSlowInInterpolator; private boolean mPrewarmSent; + private boolean mLeftIsVoiceAssist; + private AssistManager mAssistManager; public KeyguardBottomAreaView(Context context) { this(context, null); @@ -133,8 +132,12 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL label = getResources().getString(R.string.unlock_label); } else if (host == mCameraImageView) { label = getResources().getString(R.string.camera_label); - } else if (host == mPhoneImageView) { - label = getResources().getString(R.string.phone_label); + } else if (host == mLeftAffordanceView) { + if (mLeftIsVoiceAssist) { + label = getResources().getString(R.string.voice_assist_label); + } else { + label = getResources().getString(R.string.phone_label); + } } info.addAction(new AccessibilityAction(ACTION_CLICK, label)); } @@ -149,8 +152,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } else if (host == mCameraImageView) { launchCamera(); return true; - } else if (host == mPhoneImageView) { - launchPhone(); + } else if (host == mLeftAffordanceView) { + launchLeftAffordance(); return true; } } @@ -164,29 +167,28 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mLockPatternUtils = new LockPatternUtils(mContext); mPreviewContainer = (ViewGroup) findViewById(R.id.preview_container); mCameraImageView = (KeyguardAffordanceView) findViewById(R.id.camera_button); - mPhoneImageView = (KeyguardAffordanceView) findViewById(R.id.phone_button); + mLeftAffordanceView = (KeyguardAffordanceView) findViewById(R.id.left_button); mLockIcon = (LockIcon) findViewById(R.id.lock_icon); mIndicationText = (TextView) findViewById(R.id.keyguard_indication_text); watchForCameraPolicyChanges(); updateCameraVisibility(); - updatePhoneVisibility(); mUnlockMethodCache = UnlockMethodCache.getInstance(getContext()); mUnlockMethodCache.addListener(this); mLockIcon.update(); setClipChildren(false); setClipToPadding(false); mPreviewInflater = new PreviewInflater(mContext, new LockPatternUtils(mContext)); - inflatePreviews(); + inflateCameraPreview(); mLockIcon.setOnClickListener(this); mLockIcon.setOnLongClickListener(this); mCameraImageView.setOnClickListener(this); - mPhoneImageView.setOnClickListener(this); + mLeftAffordanceView.setOnClickListener(this); initAccessibility(); } private void initAccessibility() { mLockIcon.setAccessibilityDelegate(mAccessibilityDelegate); - mPhoneImageView.setAccessibilityDelegate(mAccessibilityDelegate); + mLeftAffordanceView.setAccessibilityDelegate(mAccessibilityDelegate); mCameraImageView.setAccessibilityDelegate(mAccessibilityDelegate); } @@ -247,9 +249,26 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mCameraImageView.setVisibility(visible ? View.VISIBLE : View.GONE); } - private void updatePhoneVisibility() { - boolean visible = isPhoneVisible(); - mPhoneImageView.setVisibility(visible ? View.VISIBLE : View.GONE); + private void updateLeftAffordanceIcon() { + mLeftIsVoiceAssist = canLaunchVoiceAssist(); + int drawableId; + int contentDescription; + if (mLeftIsVoiceAssist) { + mLeftAffordanceView.setVisibility(View.VISIBLE); + drawableId = R.drawable.ic_mic_26dp; + contentDescription = R.string.accessibility_voice_assist_button; + } else { + boolean visible = isPhoneVisible(); + mLeftAffordanceView.setVisibility(visible ? View.VISIBLE : View.GONE); + drawableId = R.drawable.ic_phone_24dp; + contentDescription = R.string.accessibility_phone_button; + } + mLeftAffordanceView.setImageDrawable(mContext.getDrawable(drawableId)); + mLeftAffordanceView.setContentDescription(mContext.getString(contentDescription)); + } + + public boolean isLeftVoiceAssist() { + return mLeftIsVoiceAssist; } private boolean isPhoneVisible() { @@ -287,9 +306,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL @Override public void onStateChanged(boolean accessibilityEnabled, boolean touchExplorationEnabled) { mCameraImageView.setClickable(touchExplorationEnabled); - mPhoneImageView.setClickable(touchExplorationEnabled); + mLeftAffordanceView.setClickable(touchExplorationEnabled); mCameraImageView.setFocusable(accessibilityEnabled); - mPhoneImageView.setFocusable(accessibilityEnabled); + mLeftAffordanceView.setFocusable(accessibilityEnabled); mLockIcon.update(); } @@ -297,8 +316,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL public void onClick(View v) { if (v == mCameraImageView) { launchCamera(); - } else if (v == mPhoneImageView) { - launchPhone(); + } else if (v == mLeftAffordanceView) { + launchLeftAffordance(); } if (v == mLockIcon) { if (!mAccessibilityController.isAccessibilityEnabled()) { handleTrustCircleClick(); @@ -363,6 +382,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL @Override public void run() { mContext.startActivityAsUser(intent, UserHandle.CURRENT); + mActivityStarter.preventNextAnimation(); } }); } else { @@ -373,7 +393,35 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } } - public void launchPhone() { + public void launchLeftAffordance() { + if (mLeftIsVoiceAssist) { + launchVoiceAssist(); + } else { + launchPhone(); + } + } + + private void launchVoiceAssist() { + Runnable runnable = new Runnable() { + @Override + public void run() { + mAssistManager.launchVoiceAssistFromKeyguard(); + mActivityStarter.preventNextAnimation(); + } + }; + if (mPhoneStatusBar.isKeyguardCurrentlySecure()) { + AsyncTask.execute(runnable); + } else { + mPhoneStatusBar.executeRunnableDismissingKeyguard(runnable, false /* dismissShade */, + false /* afterKeyguardGone */); + } + } + + private boolean canLaunchVoiceAssist() { + return mAssistManager.canVoiceAssistBeLaunchedFromKeyguard(); + } + + private void launchPhone() { final TelecomManager tm = TelecomManager.from(mContext); if (tm.isInCall()) { AsyncTask.execute(new Runnable() { @@ -397,19 +445,19 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } } - public KeyguardAffordanceView getPhoneView() { - return mPhoneImageView; + public KeyguardAffordanceView getLeftView() { + return mLeftAffordanceView; } - public KeyguardAffordanceView getCameraView() { + public KeyguardAffordanceView getRightView() { return mCameraImageView; } - public View getPhonePreview() { - return mPhonePreview; + public View getLeftPreview() { + return mLeftPreview; } - public View getCameraPreview() { + public View getRightPreview() { return mCameraPreview; } @@ -432,23 +480,35 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL updateCameraVisibility(); } - private void inflatePreviews() { - mPhonePreview = mPreviewInflater.inflatePreview(PHONE_INTENT); + private void inflateCameraPreview() { mCameraPreview = mPreviewInflater.inflatePreview(getCameraIntent()); - if (mPhonePreview != null) { - mPreviewContainer.addView(mPhonePreview); - mPhonePreview.setVisibility(View.INVISIBLE); - } if (mCameraPreview != null) { mPreviewContainer.addView(mCameraPreview); mCameraPreview.setVisibility(View.INVISIBLE); } } + private void updateLeftPreview() { + View previewBefore = mLeftPreview; + if (previewBefore != null) { + mPreviewContainer.removeView(previewBefore); + } + if (mLeftIsVoiceAssist) { + mLeftPreview = mPreviewInflater.inflatePreviewFromService( + mAssistManager.getVoiceInteractorComponentName()); + } else { + mLeftPreview = mPreviewInflater.inflatePreview(PHONE_INTENT); + } + if (mLeftPreview != null) { + mPreviewContainer.addView(mLeftPreview); + mLeftPreview.setVisibility(View.INVISIBLE); + } + } + public void startFinishDozeAnimation() { long delay = 0; - if (mPhoneImageView.getVisibility() == View.VISIBLE) { - startFinishDozeAnimationElement(mPhoneImageView, delay); + if (mLeftAffordanceView.getVisibility() == View.VISIBLE) { + startFinishDozeAnimationElement(mLeftAffordanceView, delay); delay += DOZE_ANIMATION_STAGGER_DELAY; } startFinishDozeAnimationElement(mLockIcon, delay); @@ -543,4 +603,14 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL KeyguardIndicationController keyguardIndicationController) { mIndicationController = keyguardIndicationController; } + + public void setAssistManager(AssistManager assistManager) { + mAssistManager = assistManager; + updateLeftAffordance(); + } + + public void updateLeftAffordance() { + updateLeftAffordanceIcon(); + updateLeftPreview(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index a8ecc42..c3ede75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -952,6 +952,10 @@ public class NotificationPanelView extends PanelView implements } else { mKeyguardStatusBar.setAlpha(1f); mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE); + if (keyguardShowing && oldState != mStatusBarState) { + mKeyguardBottomArea.updateLeftAffordance(); + mAfforanceHelper.updatePreviews(); + } } resetVerticalPanelPosition(); updateQsState(); @@ -1831,7 +1835,7 @@ public class NotificationPanelView extends PanelView implements if (start) { EventLogTags.writeSysuiLockscreenGesture( EventLogConstants.SYSUI_LOCKSCREEN_GESTURE_SWIPE_DIALER, lengthDp, velocityDp); - mKeyguardBottomArea.launchPhone(); + mKeyguardBottomArea.launchLeftAffordance(); } else { EventLogTags.writeSysuiLockscreenGesture( EventLogConstants.SYSUI_LOCKSCREEN_GESTURE_SWIPE_CAMERA, lengthDp, velocityDp); @@ -1912,15 +1916,19 @@ public class NotificationPanelView extends PanelView implements if (rightIcon) { mStatusBar.onCameraHintStarted(); } else { - mStatusBar.onPhoneHintStarted(); + if (mKeyguardBottomArea.isLeftVoiceAssist()) { + mStatusBar.onVoiceAssistHintStarted(); + } else { + mStatusBar.onPhoneHintStarted(); + } } } @Override public KeyguardAffordanceView getLeftIcon() { return getLayoutDirection() == LAYOUT_DIRECTION_RTL - ? mKeyguardBottomArea.getCameraView() - : mKeyguardBottomArea.getPhoneView(); + ? mKeyguardBottomArea.getRightView() + : mKeyguardBottomArea.getLeftView(); } @Override @@ -1931,22 +1939,22 @@ public class NotificationPanelView extends PanelView implements @Override public KeyguardAffordanceView getRightIcon() { return getLayoutDirection() == LAYOUT_DIRECTION_RTL - ? mKeyguardBottomArea.getPhoneView() - : mKeyguardBottomArea.getCameraView(); + ? mKeyguardBottomArea.getLeftView() + : mKeyguardBottomArea.getRightView(); } @Override public View getLeftPreview() { return getLayoutDirection() == LAYOUT_DIRECTION_RTL - ? mKeyguardBottomArea.getCameraPreview() - : mKeyguardBottomArea.getPhonePreview(); + ? mKeyguardBottomArea.getRightPreview() + : mKeyguardBottomArea.getLeftPreview(); } @Override public View getRightPreview() { return getLayoutDirection() == LAYOUT_DIRECTION_RTL - ? mKeyguardBottomArea.getPhonePreview() - : mKeyguardBottomArea.getCameraPreview(); + ? mKeyguardBottomArea.getLeftPreview() + : mKeyguardBottomArea.getRightPreview(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 1c46d42..f3335af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -101,7 +101,7 @@ import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.Prefs; import com.android.systemui.R; -import com.android.systemui.assist.AssistGestureManager; +import com.android.systemui.assist.AssistManager; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -323,7 +323,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private int mNavigationIconHints = 0; private HandlerThread mHandlerThread; - private AssistGestureManager mAssistGestureManager; + private AssistManager mAssistManager; // ensure quick settings is disabled until the current user makes it through the setup wizard private boolean mUserSetup = false; @@ -645,8 +645,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, new NavigationBarView.OnVerticalChangedListener() { @Override public void onVerticalChanged(boolean isVertical) { - if (mAssistGestureManager != null) { - mAssistGestureManager.onConfigurationChanged(); + if (mAssistManager != null) { + mAssistManager.onConfigurationChanged(); } mNotificationPanel.setQsScrimEnabled(!isVertical); } @@ -662,6 +662,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // no window manager? good luck with that } + mAssistManager = new AssistManager(this, context); + // figure out which pixel-format to use for the status bar. mPixelFormat = PixelFormat.OPAQUE; @@ -720,6 +722,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mKeyguardBottomArea = (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); mKeyguardBottomArea.setActivityStarter(this); + mKeyguardBottomArea.setAssistManager(mAssistManager); mKeyguardIndicationController = new KeyguardIndicationController(mContext, (KeyguardIndicationTextView) mStatusBarWindow.findViewById( R.id.keyguard_indication_text)); @@ -841,7 +844,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mBroadcastReceiver.onReceive(mContext, new Intent(pm.isScreenOn() ? Intent.ACTION_SCREEN_ON : Intent.ACTION_SCREEN_OFF)); - mAssistGestureManager = new AssistGestureManager(this, context); // receive broadcasts IntentFilter filter = new IntentFilter(); @@ -964,7 +966,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void invokeAssistGesture(boolean vibrate) { mHandler.removeCallbacks(mInvokeAssist); - mAssistGestureManager.onGestureInvoked(vibrate); + mAssistManager.onGestureInvoked(vibrate); } public int getStatusBarHeight() { @@ -1044,7 +1046,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNavigationBarView.getBackButton().setLongClickable(true); mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener); mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener); - mAssistGestureManager.onConfigurationChanged(); + mAssistManager.onConfigurationChanged(); } // For small-screen devices (read: phones) that lack hardware navigation buttons @@ -1805,6 +1807,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, startActivityDismissingKeyguard(intent, false, dismissShade); } + @Override + public void preventNextAnimation() { + overrideActivityPendingAppTransition(true /* keyguardShowing */); + } + public void setQsExpanded(boolean expanded) { mStatusBarWindowManager.setQsExpanded(expanded); } @@ -1924,6 +1931,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return mHeadsUpManager.isSnoozed(sbn.getPackageName()); } + public boolean isKeyguardCurrentlySecure() { + return !mUnlockMethodCache.isCurrentlyInsecure(); + } + /** * All changes to the status bar and notifications funnel through here and are batched. */ @@ -2650,6 +2661,23 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, final boolean afterKeyguardGone = PreviewInflater.wouldLaunchResolverActivity( mContext, intent, mCurrentUserId); final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing(); + Runnable runnable = new Runnable() { + public void run() { + intent.setFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + mContext.startActivityAsUser( + intent, new UserHandle(UserHandle.USER_CURRENT)); + overrideActivityPendingAppTransition( + keyguardShowing && !afterKeyguardGone); + } + }; + executeRunnableDismissingKeyguard(runnable, dismissShade, afterKeyguardGone); + } + + public void executeRunnableDismissingKeyguard(final Runnable runnable, + final boolean dismissShade, + final boolean afterKeyguardGone) { + final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing(); dismissKeyguardThenExecute(new OnDismissAction() { @Override public boolean onDismiss() { @@ -2660,12 +2688,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, ActivityManagerNative.getDefault() .keyguardWaitingForActivityDrawn(); } - intent.setFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - mContext.startActivityAsUser( - intent, new UserHandle(UserHandle.USER_CURRENT)); - overrideActivityPendingAppTransition( - keyguardShowing && !afterKeyguardGone); + if (runnable != null) { + runnable.run(); + } } catch (RemoteException e) { } } @@ -3019,7 +3044,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHandlerThread = null; } mContext.unregisterReceiver(mBroadcastReceiver); - mAssistGestureManager.destroy(); + mAssistManager.destroy(); } private boolean mDemoModeAllowed; @@ -3467,6 +3492,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mKeyguardIndicationController.showTransientIndication(R.string.camera_hint); } + public void onVoiceAssistHintStarted() { + mKeyguardIndicationController.showTransientIndication(R.string.voice_hint); + } + public void onPhoneHintStarted() { mKeyguardIndicationController.showTransientIndication(R.string.phone_hint); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java index 5d89e2f..4269c19 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -50,6 +51,15 @@ public class PreviewInflater { public View inflatePreview(Intent intent) { WidgetInfo info = getWidgetInfo(intent); + return inflatePreview(info); + } + + public View inflatePreviewFromService(ComponentName componentName) { + WidgetInfo info = getWidgetInfoFromService(componentName); + return inflatePreview(info); + } + + private KeyguardPreviewContainer inflatePreview(WidgetInfo info) { if (info == null) { return null; } @@ -77,8 +87,36 @@ public class PreviewInflater { return widgetView; } - private WidgetInfo getWidgetInfo(Intent intent) { + private WidgetInfo getWidgetInfoFromService(ComponentName componentName) { + PackageManager packageManager = mContext.getPackageManager(); + // Look for the preview specified in the service meta-data + try { + Bundle metaData = packageManager.getServiceInfo( + componentName, PackageManager.GET_META_DATA).metaData; + return getWidgetInfoFromMetaData(componentName.getPackageName(), metaData); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Failed to load preview; " + componentName.flattenToShortString() + + " not found", e); + } + return null; + } + + private WidgetInfo getWidgetInfoFromMetaData(String contextPackage, + Bundle metaData) { + if (metaData == null) { + return null; + } + int layoutId = metaData.getInt(META_DATA_KEYGUARD_LAYOUT); + if (layoutId == 0) { + return null; + } WidgetInfo info = new WidgetInfo(); + info.contextPackage = contextPackage; + info.layoutId = layoutId; + return info; + } + + private WidgetInfo getWidgetInfo(Intent intent) { PackageManager packageManager = mContext.getPackageManager(); final List appList = packageManager.queryIntentActivitiesAsUser( intent, PackageManager.MATCH_DEFAULT_ONLY, KeyguardUpdateMonitor.getCurrentUser()); @@ -94,16 +132,8 @@ public class PreviewInflater { if (resolved == null || resolved.activityInfo == null) { return null; } - if (resolved.activityInfo.metaData == null || resolved.activityInfo.metaData.isEmpty()) { - return null; - } - int layoutId = resolved.activityInfo.metaData.getInt(META_DATA_KEYGUARD_LAYOUT); - if (layoutId == 0) { - return null; - } - info.contextPackage = resolved.activityInfo.packageName; - info.layoutId = layoutId; - return info; + return getWidgetInfoFromMetaData(resolved.activityInfo.packageName, + resolved.activityInfo.metaData); } public static boolean wouldLaunchResolverActivity(Context ctx, Intent intent, -- cgit v1.1