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