12fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggipackage com.android.systemui.assist; 22fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 3528e4684920077f3864648fa33c712abf23a333fYohei Yukawaimport android.annotation.NonNull; 4528e4684920077f3864648fa33c712abf23a333fYohei Yukawaimport android.annotation.Nullable; 52fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.app.ActivityManager; 62fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.app.ActivityOptions; 72fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.app.SearchManager; 82fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.ActivityNotFoundException; 92fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.ComponentName; 102fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.Context; 112fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.Intent; 122fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.pm.PackageManager; 132fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.res.Resources; 142fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.graphics.PixelFormat; 152fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.os.AsyncTask; 162fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.os.Bundle; 17e6de8b9ad4e646fc741b4907b86f1b5a5532257dXiyuan Xiaimport android.os.Handler; 18ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chinimport android.os.IBinder; 192fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.os.RemoteException; 202fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.os.UserHandle; 212fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.provider.Settings; 2217f693520da8977c4a60f5b4be3be035cba7146cDianne Hackbornimport android.service.voice.VoiceInteractionSession; 232fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.util.Log; 242fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.Gravity; 252fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.LayoutInflater; 262fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.View; 272fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.ViewGroup; 282fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.WindowManager; 292fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.widget.ImageView; 302fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 31e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roosimport com.android.internal.app.AssistUtils; 32ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chinimport com.android.internal.app.IVoiceInteractionSessionListener; 332fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport com.android.internal.app.IVoiceInteractionSessionShowCallback; 34ed7bf5eecc2c0821341cdc566e0014e5d8cc82feKaori Katouimport com.android.keyguard.KeyguardUpdateMonitor; 352fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport com.android.systemui.R; 36165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggiimport com.android.systemui.statusbar.BaseStatusBar; 372fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport com.android.systemui.statusbar.CommandQueue; 38e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos 392fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi/** 40e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek * Class to manage everything related to assist in SystemUI. 412fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi */ 42e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinekpublic class AssistManager { 432fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 44e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek private static final String TAG = "AssistManager"; 452fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private static final String ASSIST_ICON_METADATA_NAME = 462fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi "com.android.systemui.action_assist_icon"; 472fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 482fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private static final long TIMEOUT_SERVICE = 2500; 492fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private static final long TIMEOUT_ACTIVITY = 1000; 502fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 514c249ff7a07e6de0cf26b7416a5b0c321ad5ad9aAnnie Chin protected final Context mContext; 522fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private final WindowManager mWindowManager; 534f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos private final AssistDisclosure mAssistDisclosure; 544f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos 552fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private AssistOrbContainer mView; 56165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi private final BaseStatusBar mBar; 57ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin protected final AssistUtils mAssistUtils; 582fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 592fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private IVoiceInteractionSessionShowCallback mShowCallback = 602fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi new IVoiceInteractionSessionShowCallback.Stub() { 612fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 622fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi @Override 632fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void onFailed() throws RemoteException { 642fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.post(mHideRunnable); 652fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 662fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 672fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi @Override 682fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void onShown() throws RemoteException { 692fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.post(mHideRunnable); 702fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 712fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi }; 722fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 732fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private Runnable mHideRunnable = new Runnable() { 742fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi @Override 752fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void run() { 762fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.removeCallbacks(this); 772fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.show(false /* show */, true /* animate */); 782fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 792fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi }; 802fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 81165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi public AssistManager(BaseStatusBar bar, Context context) { 822fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mContext = context; 832fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mBar = bar; 842fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 85e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos mAssistUtils = new AssistUtils(context); 864f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos mAssistDisclosure = new AssistDisclosure(context, new Handler()); 87ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin 88ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin registerVoiceInteractionSessionListener(); 89ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin } 90ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin 91ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin protected void registerVoiceInteractionSessionListener() { 92ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin mAssistUtils.registerVoiceInteractionSessionListener( 93ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin new IVoiceInteractionSessionListener.Stub() { 94ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin @Override 95ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin public void onVoiceSessionShown() throws RemoteException { 96ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin Log.v(TAG, "Voice open"); 97ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin } 98ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin 99ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin @Override 100ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin public void onVoiceSessionHidden() throws RemoteException { 101ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin Log.v(TAG, "Voice closed"); 102ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin } 103ecb9f3e9b810c6d59d31e8bdeff6cc174d170792Annie Chin }); 1042fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1052fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 1062fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void onConfigurationChanged() { 1072fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi boolean visible = false; 1082fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (mView != null) { 1092fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi visible = mView.isShowing(); 1102fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mWindowManager.removeView(mView); 1112fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1122fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 1132fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView = (AssistOrbContainer) LayoutInflater.from(mContext).inflate( 1142fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi R.layout.assist_orb, null); 1152fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.setVisibility(View.GONE); 1162fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.setSystemUiVisibility( 1172fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 1182fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 1192fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi WindowManager.LayoutParams lp = getLayoutParams(); 1202fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mWindowManager.addView(mView, lp); 1212fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (visible) { 1222fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.show(true /* show */, false /* animate */); 1232fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1242fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1252fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 126937a991be46c355f57dcb5cebf9ff645fe87633fAnnie Chin protected boolean shouldShowOrb() { 127937a991be46c355f57dcb5cebf9ff645fe87633fAnnie Chin return true; 128937a991be46c355f57dcb5cebf9ff645fe87633fAnnie Chin } 129937a991be46c355f57dcb5cebf9ff645fe87633fAnnie Chin 130165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi public void startAssist(Bundle args) { 131528e4684920077f3864648fa33c712abf23a333fYohei Yukawa final ComponentName assistComponent = getAssistInfo(); 132528e4684920077f3864648fa33c712abf23a333fYohei Yukawa if (assistComponent == null) { 1332fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi return; 1342fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 135e6de8b9ad4e646fc741b4907b86f1b5a5532257dXiyuan Xia 136528e4684920077f3864648fa33c712abf23a333fYohei Yukawa final boolean isService = assistComponent.equals(getVoiceInteractorComponentName()); 137937a991be46c355f57dcb5cebf9ff645fe87633fAnnie Chin if (!isService || (!isVoiceSessionRunning() && shouldShowOrb())) { 138528e4684920077f3864648fa33c712abf23a333fYohei Yukawa showOrb(assistComponent, isService); 139e6de8b9ad4e646fc741b4907b86f1b5a5532257dXiyuan Xia mView.postDelayed(mHideRunnable, isService 1402fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi ? TIMEOUT_SERVICE 1412fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi : TIMEOUT_ACTIVITY); 1422fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 143528e4684920077f3864648fa33c712abf23a333fYohei Yukawa startAssistInternal(args, assistComponent, isService); 1442fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1452fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 146b835dd7641c60cd5d2b372331ffc19f7165244bdJorim Jaggi public void hideAssist() { 147e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos mAssistUtils.hideCurrentSession(); 148b835dd7641c60cd5d2b372331ffc19f7165244bdJorim Jaggi } 149b835dd7641c60cd5d2b372331ffc19f7165244bdJorim Jaggi 1502fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private WindowManager.LayoutParams getLayoutParams() { 1512fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 1522fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi ViewGroup.LayoutParams.MATCH_PARENT, 1532fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mContext.getResources().getDimensionPixelSize(R.dimen.assist_orb_scrim_height), 1542fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING, 1552fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 1562fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 1572fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 1582fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi PixelFormat.TRANSLUCENT); 1592fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (ActivityManager.isHighEndGfx()) { 1602fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; 1612fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1622fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi lp.gravity = Gravity.BOTTOM | Gravity.START; 1632fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi lp.setTitle("AssistPreviewPanel"); 1642fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED 1652fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; 1662fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi return lp; 1672fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1682fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 169528e4684920077f3864648fa33c712abf23a333fYohei Yukawa private void showOrb(@NonNull ComponentName assistComponent, boolean isService) { 170528e4684920077f3864648fa33c712abf23a333fYohei Yukawa maybeSwapSearchIcon(assistComponent, isService); 1712fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mView.show(true /* show */, true /* animate */); 1722fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1732fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 174528e4684920077f3864648fa33c712abf23a333fYohei Yukawa private void startAssistInternal(Bundle args, @NonNull ComponentName assistComponent, 175528e4684920077f3864648fa33c712abf23a333fYohei Yukawa boolean isService) { 176528e4684920077f3864648fa33c712abf23a333fYohei Yukawa if (isService) { 177528e4684920077f3864648fa33c712abf23a333fYohei Yukawa startVoiceInteractor(args); 178528e4684920077f3864648fa33c712abf23a333fYohei Yukawa } else { 179528e4684920077f3864648fa33c712abf23a333fYohei Yukawa startAssistActivity(args, assistComponent); 1802fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1812fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1822fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 183528e4684920077f3864648fa33c712abf23a333fYohei Yukawa private void startAssistActivity(Bundle args, @NonNull ComponentName assistComponent) { 1842fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (!mBar.isDeviceProvisioned()) { 1852fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi return; 1862fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 1872fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 1882fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi // Close Recent Apps if needed 1892fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | 1902fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL); 1912fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 1924f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos boolean structureEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(), 1934f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, UserHandle.USER_CURRENT) != 0; 1944f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos 1952fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 196165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi .getAssistIntent(structureEnabled); 1972fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (intent == null) { 1982fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi return; 1992fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 200528e4684920077f3864648fa33c712abf23a333fYohei Yukawa intent.setComponent(assistComponent); 201165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi intent.putExtras(args); 2022fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 2034f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos if (structureEnabled) { 2044f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos showDisclosure(); 2054f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } 2064f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos 2072fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi try { 2082fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, 2092fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi R.anim.search_launch_enter, R.anim.search_launch_exit); 2102fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2112fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi AsyncTask.execute(new Runnable() { 2122fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi @Override 2132fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void run() { 2142fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mContext.startActivityAsUser(intent, opts.toBundle(), 2152fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi new UserHandle(UserHandle.USER_CURRENT)); 2162fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2172fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi }); 2182fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } catch (ActivityNotFoundException e) { 2192fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi Log.w(TAG, "Activity not found for " + intent.getAction()); 2202fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2212fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2222fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 223165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi private void startVoiceInteractor(Bundle args) { 22417f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn mAssistUtils.showSessionForActiveService(args, 22517f693520da8977c4a60f5b4be3be035cba7146cDianne Hackborn VoiceInteractionSession.SHOW_SOURCE_ASSIST_GESTURE, mShowCallback, null); 2262fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2272fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 228e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek public void launchVoiceAssistFromKeyguard() { 229e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos mAssistUtils.launchVoiceAssistFromKeyguard(); 230e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek } 231e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek 232e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek public boolean canVoiceAssistBeLaunchedFromKeyguard() { 233e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos return mAssistUtils.activeServiceSupportsLaunchFromKeyguard(); 234e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek } 235e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek 236e70d6535237d2e6f03adcd0bdc11e45ea714dc97Selim Cinek public ComponentName getVoiceInteractorComponentName() { 237e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos return mAssistUtils.getActiveServiceComponentName(); 2382fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2392fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 2402fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi private boolean isVoiceSessionRunning() { 241e91750804a5fb4e7beb4f34f2ba40825e4a28e93Adrian Roos return mAssistUtils.isSessionRunning(); 2422fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2432fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 2442fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void destroy() { 2452fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi mWindowManager.removeViewImmediate(mView); 2462fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2472fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 248528e4684920077f3864648fa33c712abf23a333fYohei Yukawa private void maybeSwapSearchIcon(@NonNull ComponentName assistComponent, boolean isService) { 249528e4684920077f3864648fa33c712abf23a333fYohei Yukawa replaceDrawable(mView.getOrb().getLogo(), assistComponent, ASSIST_ICON_METADATA_NAME, 250528e4684920077f3864648fa33c712abf23a333fYohei Yukawa isService); 2512fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2522fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 2532fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi public void replaceDrawable(ImageView v, ComponentName component, String name, 2542fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi boolean isService) { 2552fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (component != null) { 2562fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi try { 2572fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi PackageManager packageManager = mContext.getPackageManager(); 2582fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi // Look for the search icon specified in the activity meta-data 2592fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi Bundle metaData = isService 2602fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi ? packageManager.getServiceInfo( 2612fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi component, PackageManager.GET_META_DATA).metaData 2622fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi : packageManager.getActivityInfo( 2632fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi component, PackageManager.GET_META_DATA).metaData; 2642fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (metaData != null) { 2652fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi int iconResId = metaData.getInt(name); 2662fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi if (iconResId != 0) { 2672fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi Resources res = packageManager.getResourcesForApplication( 2682fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi component.getPackageName()); 2692fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi v.setImageDrawable(res.getDrawable(iconResId)); 2702fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi return; 2712fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2722fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2732fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } catch (PackageManager.NameNotFoundException e) { 2745ccae1fb7591178ee144836ceec5025c35dd0b04Dan Sandler Log.v(TAG, "Assistant component " 2755ccae1fb7591178ee144836ceec5025c35dd0b04Dan Sandler + component.flattenToShortString() + " not found"); 2762fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } catch (Resources.NotFoundException nfe) { 2772fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi Log.w(TAG, "Failed to swap drawable from " 2782fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi + component.flattenToShortString(), nfe); 2792fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2802fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2812fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi v.setImageDrawable(null); 2822fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2832fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi 284528e4684920077f3864648fa33c712abf23a333fYohei Yukawa @Nullable 285528e4684920077f3864648fa33c712abf23a333fYohei Yukawa private ComponentName getAssistInfo() { 286ed7bf5eecc2c0821341cdc566e0014e5d8cc82feKaori Katou return mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser()); 2872fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi } 2884f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos 2894f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos public void showDisclosure() { 2904f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos mAssistDisclosure.postShow(); 2914f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } 2929a634991cf5fe5c8c44b643554330c87d7672e4aSelim Cinek 29319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi public void onLockscreenShown() { 29419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi mAssistUtils.onLockscreenShown(); 29519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi } 2962fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi} 297