1303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/*
2303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Copyright (C) 2014 The Android Open Source Project
3303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
4303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * you may not use this file except in compliance with the License.
6303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * You may obtain a copy of the License at
7303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
8303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
10303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Unless required by applicable law or agreed to in writing, software
11303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * See the License for the specific language governing permissions and
14303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * limitations under the License.
15303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
16303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
17303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpackage com.android.systemui.recents;
18303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
19303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.app.Activity;
20d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.app.ActivityOptions;
218eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.app.SearchManager;
22f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetManager;
23f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetProviderInfo;
2447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.BroadcastReceiver;
2547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.Context;
26303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent;
2747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.IntentFilter;
28303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle;
2915a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chungimport android.os.SystemClock;
30d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.os.UserHandle;
311e8d71b605b4872e93200706a80a88a3ff25498cWinson Chungimport android.view.KeyEvent;
32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View;
338e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport android.view.ViewStub;
348eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.widget.Toast;
3582862573bcf246128782b91ea627285c43133a8dAndrew Flynn
365c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chungimport com.android.internal.logging.MetricsLogger;
3782862573bcf246128782b91ea627285c43133a8dAndrew Flynnimport com.android.systemui.Prefs;
3847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R;
39b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chungimport com.android.systemui.recents.misc.Console;
40ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.DebugTrigger;
41ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.ReferenceCountedTrigger;
42ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.SystemServicesProxy;
43a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport com.android.systemui.recents.model.RecentsTaskLoadPlan;
44f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader;
45dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.model.Task;
46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
47dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.views.DebugOverlayView;
48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
49cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chungimport com.android.systemui.recents.views.SystemBarScrimViews;
50d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chungimport com.android.systemui.recents.views.ViewAnimation;
51303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
52083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chungimport java.lang.ref.WeakReference;
53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
5585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung/**
5685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * The main Recents activity that is started from AlternateRecentsComponent.
5785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */
58f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
592915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
602915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        DebugOverlayView.DebugOverlayViewCallbacks {
61d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
6285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    RecentsConfiguration mConfig;
63a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung    long mLastTabKeyEventTime;
6485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
6585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    // Top level views
66cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsView mRecentsView;
67cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    SystemBarScrimViews mScrimViews;
688e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mEmptyViewStub;
692915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    ViewStub mDebugOverlayStub;
70cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    View mEmptyView;
71dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    DebugOverlayView mDebugOverlay;
72cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
73ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne    // Resize task debug
74ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne    RecentsResizeTaskDialog mResizeTaskDebugDialog;
75d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
7685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    // Search AppWidget
77af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung    AppWidgetProviderInfo mSearchWidgetInfo;
78aee097c5802adcd3d52028fbd1ad3ab2cf92e46bWinson Chung    RecentsAppWidgetHost mAppWidgetHost;
79af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung    RecentsAppWidgetHostView mSearchWidgetHostView;
80cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
81cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    // Runnables to finish the Recents activity
82cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishLaunchHomeRunnable;
83cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
846e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    // Runnable to be executed after we paused ourselves
856e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    Runnable mAfterPauseRunnable;
866e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi
87d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**
8885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * A common Runnable to finish Recents either by calling finish() (with a custom animation) or
8985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * launching Home with some ActivityOptions.  Generally we always launch home when we exit
9085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Recents rather than just finishing the activity since we don't know what is behind Recents in
9185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * the task stack.  The only case where we finish() directly is when we are cancelling the full
9285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * screen transition from the app.
93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     */
94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    class FinishRecentsRunnable implements Runnable {
95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent mLaunchIntent;
96d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        ActivityOptions mLaunchOpts;
97d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
98d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        /**
99d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * Creates a finish runnable that starts the specified intent, using the given
100d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * ActivityOptions.
101d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         */
102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) {
103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchIntent = launchIntent;
104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchOpts = opts;
105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        @Override
108d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void run() {
109d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Finish Recents
110d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            if (mLaunchIntent != null) {
111b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                try {
112b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                    if (mLaunchOpts != null) {
113b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                        startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(), UserHandle.CURRENT);
114b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                    } else {
115b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                        startActivityAsUser(mLaunchIntent, UserHandle.CURRENT);
116b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                    }
117b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                } catch (Exception e) {
118b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                    Console.logError(RecentsActivity.this,
119b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung                            getString(R.string.recents_launch_error_message, "Home"));
120d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
121d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            } else {
122d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                finish();
12385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                overridePendingTransition(R.anim.recents_to_launcher_enter,
12485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                        R.anim.recents_to_launcher_exit);
125d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            }
126d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
127d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
128d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
12985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
13085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Broadcast receiver to handle messages from AlternateRecentsComponent.
13185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
1328eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
13347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
13447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
13547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
136d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi            if (action.equals(Recents.ACTION_HIDE_RECENTS_ACTIVITY)) {
137d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi                if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
13885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    // If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app
13985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    dismissRecentsToFocusedTaskOrHome(false);
140d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi                } else if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) {
14185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    // Otherwise, dismiss Recents to Home
142fe855d124b3fb3d59262b0fc6d528d91caf36951Winson Chung                    dismissRecentsToHomeRaw(true);
143cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                } else {
144fe855d124b3fb3d59262b0fc6d528d91caf36951Winson Chung                    // Do nothing
1456cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
146d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi            } else if (action.equals(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
14785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                // If we are toggling Recents, then first unfilter any filtered stacks first
14885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToFocusedTaskOrHome(true);
149d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi            } else if (action.equals(Recents.ACTION_START_ENTER_ANIMATION)) {
150b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // Trigger the enter animation
151b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                onEnterAnimationTriggered();
152b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // Notify the fallback receiver that we have successfully got the broadcast
153b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // See AlternateRecentsComponent.onAnimationStarted()
154b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                setResultCode(Activity.RESULT_OK);
15547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
15647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
15747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
15985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
16085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Broadcast receiver to handle messages from the system
16185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
16231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung    final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() {
1636736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1646736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
16531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            String action = intent.getAction();
16685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
16785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                // When the screen turns off, dismiss Recents to Home
16885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToHome(false);
16931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
170af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                // When the search activity changes, update the search widget view
171af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
172af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                mSearchWidgetInfo = ssp.getOrBindSearchAppWidget(context, mAppWidgetHost);
173af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                refreshSearchWidgetView();
17431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            }
175d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
176d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    };
177d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
17885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
17985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * A custom debug trigger to listen for a debug key chord.
18085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
1818eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
1828eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        @Override
1838eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void run() {
1848eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            onDebugModeTriggered();
1858eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
1868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    });
1878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
188303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
1892cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung    void updateRecentsTasks() {
190a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        // If AlternateRecentsComponent has preloaded a load plan, then use that to prevent
191a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        // reconstructing the task stack
1929cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
193d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        RecentsTaskLoadPlan plan = Recents.consumeInstanceLoadPlan();
194a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (plan == null) {
195a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            plan = loader.createLoadPlan(this);
196a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        }
197a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
198a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        // Start loading tasks according to the load plan
199911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung        if (!plan.hasTasks()) {
20090d5136ebd59c9aff9543ea5750d4c5d57ac99dcWinson Chung            loader.preloadTasks(plan, mConfig.launchedFromHome);
20190d5136ebd59c9aff9543ea5750d4c5d57ac99dcWinson Chung        }
202a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
203a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        loadOpts.runningTaskId = mConfig.launchedToTaskId;
204860e2d86d8c05b03e985e438664069794825ef0fWinson Chung        loadOpts.numVisibleTasks = mConfig.launchedNumVisibleTasks;
205860e2d86d8c05b03e985e438664069794825ef0fWinson Chung        loadOpts.numVisibleTaskThumbnails = mConfig.launchedNumVisibleThumbnails;
206a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        loader.loadTasks(this, plan, loadOpts);
207a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
208911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung        ArrayList<TaskStack> stacks = plan.getAllTaskStacks();
209911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung        mConfig.launchedWithNoRecentTasks = !plan.hasTasks();
210911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung        if (!mConfig.launchedWithNoRecentTasks) {
211a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung            mRecentsView.setTaskStacks(stacks);
2129cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        }
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
214bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        // Create the home intent runnable
215bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
216bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        homeIntent.addCategory(Intent.CATEGORY_HOME);
217bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
218bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
219bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
220bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung            ActivityOptions.makeCustomAnimation(this,
221860e2d86d8c05b03e985e438664069794825ef0fWinson Chung                mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_enter :
222bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                        R.anim.recents_to_launcher_enter,
223860e2d86d8c05b03e985e438664069794825ef0fWinson Chung                    mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_exit :
224bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                        R.anim.recents_to_launcher_exit));
225bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung
226dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        // Mark the task that is the launch target
227dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        int taskStackCount = stacks.size();
2285c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        int launchTaskIndexInStack = 0;
229dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mConfig.launchedToTaskId != -1) {
230dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            for (int i = 0; i < taskStackCount; i++) {
231dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                TaskStack stack = stacks.get(i);
232dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                ArrayList<Task> tasks = stack.getTasks();
233dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                int taskCount = tasks.size();
234dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                for (int j = 0; j < taskCount; j++) {
235dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    Task t = tasks.get(j);
236dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    if (t.key.id == mConfig.launchedToTaskId) {
237dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                        t.isLaunchTarget = true;
2385c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung                        launchTaskIndexInStack = tasks.size() - j - 1;
239dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                        break;
240dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    }
241dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                }
242dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            }
243dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
244dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
24585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Update the top level view's visibilities
246969f586533096999f10f5587f901949791154fa2Winson Chung        if (mConfig.launchedWithNoRecentTasks) {
24785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mEmptyView == null) {
24885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mEmptyView = mEmptyViewStub.inflate();
24985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            }
250303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
251772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            mRecentsView.setSearchBarVisibility(View.GONE);
252303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
25385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mEmptyView != null) {
25485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mEmptyView.setVisibility(View.GONE);
25585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            }
256aee097c5802adcd3d52028fbd1ad3ab2cf92e46bWinson Chung            if (mRecentsView.hasValidSearchBar()) {
257772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                mRecentsView.setSearchBarVisibility(View.VISIBLE);
258772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            } else {
259af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                refreshSearchWidgetView();
260772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            }
261303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
2627aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
26385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Animate the SystemUI scrims into view
2647aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        mScrimViews.prepareEnterRecentsAnimation();
2655c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung
2665c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        // Keep track of whether we launched from the nav bar button or via alt-tab
2675c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        if (mConfig.launchedWithAltTab) {
2685c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            MetricsLogger.count(this, "overview_trigger_alttab", 1);
2695c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        } else {
2705c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            MetricsLogger.count(this, "overview_trigger_nav_btn", 1);
2715c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        }
2725c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        // Keep track of whether we launched from an app or from home
2735c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        if (mConfig.launchedFromAppWithThumbnail) {
2745c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            MetricsLogger.count(this, "overview_source_app", 1);
2755c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            // If from an app, track the stack index of the app in the stack (for affiliated tasks)
2765c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            MetricsLogger.histogram(this, "overview_source_app_index", launchTaskIndexInStack);
2775c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        } else {
2785c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            MetricsLogger.count(this, "overview_source_home", 1);
2795c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        }
2805c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        // Keep track of the total stack task count
2815c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        int taskCount = 0;
2825c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        for (int i = 0; i < stacks.size(); i++) {
2835c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            TaskStack stack = stacks.get(i);
2845c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung            taskCount += stack.getTaskCount();
2855c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        }
2865c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        MetricsLogger.histogram(this, "overview_task_count", taskCount);
287303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
288303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
289303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
29085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean dismissRecentsToFocusedTaskOrHome(boolean checkFilteredStackState) {
2912cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
2922cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) {
29385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we currently have filtered stacks, then unfilter those first
29485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (checkFilteredStackState &&
29585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mRecentsView.unfilterFilteredStacks()) return true;
29685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we have a focused Task, launch that Task now
29785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mRecentsView.launchFocusedTask()) return true;
29885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we launched from Home, then return to Home
29985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mConfig.launchedFromHome) {
30085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToHomeRaw(true);
30185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                return true;
302303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
303dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            // Otherwise, try and return to the Task that Recents was launched from
304dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            if (mRecentsView.launchPreviousTask()) return true;
30585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If none of the other cases apply, then just go Home
30685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            dismissRecentsToHomeRaw(true);
30785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            return true;
30885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        }
30985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        return false;
31085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    }
31185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
31285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /** Dismisses Recents directly to Home. */
31385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    void dismissRecentsToHomeRaw(boolean animated) {
31485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        if (animated) {
31585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
31685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    null, mFinishLaunchHomeRunnable, null);
31785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            mRecentsView.startExitToHomeAnimation(
31885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    new ViewAnimation.TaskViewExitContext(exitTrigger));
31985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        } else {
32085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            mFinishLaunchHomeRunnable.run();
32185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        }
32285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    }
32385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
324d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale    /** Dismisses Recents directly to Home without transition animation. */
325d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale    void dismissRecentsToHomeWithoutTransitionAnimation() {
326d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale        finish();
327d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale        overridePendingTransition(0, 0);
328d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale    }
329d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale
33085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /** Dismisses Recents directly to Home if we currently aren't transitioning. */
33185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean dismissRecentsToHome(boolean animated) {
3322cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
3332cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) {
33485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // Return to Home
33585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            dismissRecentsToHomeRaw(animated);
33647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
337303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
338303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
339303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
340303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
341303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
342303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
343303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
344303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
3452cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        // For the non-primary user, ensure that the SystemServicesProxy and configuration is
3462cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        // initialized
34715155519ba9ce8302d5ca1771f7816cd683a2051Winson Chung        RecentsTaskLoader.initialize(this);
3482cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
3492cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        mConfig = RecentsConfiguration.reinitialize(this, ssp);
350303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
351f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
352d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
353f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
3548e548f7025ce930810479a8e628c325d09557fa3Winson Chung        // Set the Recents layout
3558e548f7025ce930810479a8e628c325d09557fa3Winson Chung        setContentView(R.layout.recents);
3568e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mRecentsView = (RecentsView) findViewById(R.id.recents_view);
35747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
358653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
359653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
360653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3618e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
3622915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        mDebugOverlayStub = (ViewStub) findViewById(R.id.debug_overlay_stub);
3638e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mScrimViews = new SystemBarScrimViews(this, mConfig);
364dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        inflateDebugOverlay();
365303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
366f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
367af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung        mSearchWidgetInfo = ssp.getOrBindSearchAppWidget(this, mAppWidgetHost);
368521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
36931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
37031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
37131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
37231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
37331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mSystemBroadcastReceiver, filter);
374521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
375521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
376dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    /** Inflates the debug overlay if debug mode is enabled. */
377dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    void inflateDebugOverlay() {
378a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung        if (!Constants.DebugFlags.App.EnableDebugMode) return;
379a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung
380dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mConfig.debugModeEnabled && mDebugOverlay == null) {
3812915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            // Inflate the overlay and seek bars
3822915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            mDebugOverlay = (DebugOverlayView) mDebugOverlayStub.inflate();
3832915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            mDebugOverlay.setCallbacks(this);
384dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mRecentsView.setDebugOverlay(mDebugOverlay);
385dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
386dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
387dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
388303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
389303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
390303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
3916057c91563402f900dfc7714a46e952d86172e2fWinson Chung        setIntent(intent);
39247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
393dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        // Clear any debug rects
394dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mDebugOverlay != null) {
395dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mDebugOverlay.clear();
396dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
397303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
398303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
399303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
400303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
401303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
4025c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        MetricsLogger.visible(this, MetricsLogger.OVERVIEW_ACTIVITY);
4032002cf5b463737e7f615f1469cb20d324c283544Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
4042002cf5b463737e7f615f1469cb20d324c283544Winson Chung        SystemServicesProxy ssp = loader.getSystemServicesProxy();
405d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        Recents.notifyVisibilityChanged(this, ssp, true);
40647a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
40731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages from our service
40831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
409d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        filter.addAction(Recents.ACTION_HIDE_RECENTS_ACTIVITY);
410d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        filter.addAction(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY);
411d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        filter.addAction(Recents.ACTION_START_ENTER_ANIMATION);
41231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
41319fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung
41419fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        // Register any broadcast receivers for the task loader
4152002cf5b463737e7f615f1469cb20d324c283544Winson Chung        loader.registerReceivers(this, mRecentsView);
416083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung
417860e2d86d8c05b03e985e438664069794825ef0fWinson Chung        // Update the recent tasks
4182cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        updateRecentsTasks();
4192cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung
4202cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        // If this is a new instance from a configuration change, then we have to manually trigger
42176ffdafc3cc59ad1749736de58285978e6c73622Winson        // the enter animation state, or if recents was relaunched by AM, without going through
42276ffdafc3cc59ad1749736de58285978e6c73622Winson        // the normal mechanisms
42376ffdafc3cc59ad1749736de58285978e6c73622Winson        boolean wasLaunchedByAm = !mConfig.launchedFromHome && !mConfig.launchedFromAppWithThumbnail;
42476ffdafc3cc59ad1749736de58285978e6c73622Winson        if (mConfig.launchedHasConfigurationChanged || wasLaunchedByAm) {
4252cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung            onEnterAnimationTriggered();
4262cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung        }
427900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi
428900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi        if (!mConfig.launchedHasConfigurationChanged) {
429900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi            mRecentsView.disableLayersForOneFrame();
430900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi        }
4316736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4326736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4336736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4346e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    protected void onPause() {
4356e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi        super.onPause();
4366e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi        if (mAfterPauseRunnable != null) {
4376e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi            mRecentsView.post(mAfterPauseRunnable);
4386e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi            mAfterPauseRunnable = null;
4396e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi        }
4406e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    }
4416e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi
4426e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    @Override
443303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
444303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
4455c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        MetricsLogger.hidden(this, MetricsLogger.OVERVIEW_ACTIVITY);
4462002cf5b463737e7f615f1469cb20d324c283544Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
4472002cf5b463737e7f615f1469cb20d324c283544Winson Chung        SystemServicesProxy ssp = loader.getSystemServicesProxy();
448d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi        Recents.notifyVisibilityChanged(this, ssp, false);
44947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
450b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        // Notify the views that we are no longer visible
451b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        mRecentsView.onRecentsHidden();
45219fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung
45331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the RecentsService receiver
45431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mServiceBroadcastReceiver);
45531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
45619fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        // Unregister any broadcast receivers for the task loader
4572002cf5b463737e7f615f1469cb20d324c283544Winson Chung        loader.unregisterReceivers();
45876ffdafc3cc59ad1749736de58285978e6c73622Winson
45976ffdafc3cc59ad1749736de58285978e6c73622Winson        // Workaround for b/22542869, if the RecentsActivity is started again, but without going
46076ffdafc3cc59ad1749736de58285978e6c73622Winson        // through SystemUI, we need to reset the config launch flags to ensure that we do not
46176ffdafc3cc59ad1749736de58285978e6c73622Winson        // wait on the system to send a signal that was never queued.
46276ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedFromHome = false;
46376ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedFromSearchHome = false;
46476ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedFromAppWithThumbnail = false;
46576ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedToTaskId = -1;
46676ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedWithAltTab = false;
46776ffdafc3cc59ad1749736de58285978e6c73622Winson        mConfig.launchedHasConfigurationChanged = false;
46847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
46947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
47047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
47147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
47247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
47331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
47485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Unregister the system broadcast receivers
47531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mSystemBroadcastReceiver);
476905950abd017b5a135e26179b5ba29378732cf5aWinson Chung
477905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        // Stop listening for widget package changes if there was one bound
478740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        mAppWidgetHost.stopListening();
479303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
480303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
481b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung    public void onEnterAnimationTriggered() {
482353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        // Try and start the enter animation (or restart it on configuration changed)
483353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
484740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        ViewAnimation.TaskViewEnterContext ctx = new ViewAnimation.TaskViewEnterContext(t);
485740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        mRecentsView.startEnterRecentsAnimation(ctx);
486af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung
487af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung        if (mSearchWidgetInfo != null) {
488740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> cbRef =
489740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                    new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(
490740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                            RecentsActivity.this);
491740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            ctx.postAnimationTrigger.addLastDecrementRunnable(new Runnable() {
492740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                @Override
493740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                public void run() {
494740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                    // Start listening for widget package changes if there is one bound
495740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                    RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = cbRef.get();
496740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                    if (cb != null) {
497740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                        mAppWidgetHost.startListening(cb);
498740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                    }
499740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung                }
500740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung            });
501740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        }
502353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung
503353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        // Animate the SystemUI scrim views
504353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        mScrimViews.startEnterRecentsAnimation();
505353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung    }
506353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung
507353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung    @Override
5084d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
5094d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
5104d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
5114d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
5124d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
5134d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
5144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
5154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
5161e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
517a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung        switch (keyCode) {
518a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_TAB: {
51915a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chung                boolean hasRepKeyTimeElapsed = (SystemClock.elapsedRealtime() -
520a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                        mLastTabKeyEventTime) > mConfig.altTabKeyDelay;
521a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                if (event.getRepeatCount() <= 0 || hasRepKeyTimeElapsed) {
522a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    // Focus the next task in the stack
523a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    final boolean backward = event.isShiftPressed();
524a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    mRecentsView.focusNextTask(!backward);
52515a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chung                    mLastTabKeyEventTime = SystemClock.elapsedRealtime();
526a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                }
527a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
528a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
529a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DPAD_UP: {
530a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.focusNextTask(true);
531a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
532a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
533a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DPAD_DOWN: {
534a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.focusNextTask(false);
535a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
536a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
537a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DEL:
538a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_FORWARD_DEL: {
539a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.dismissFocusedTask();
5405c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung                // Keep track of deletions by keyboard
5415c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung                MetricsLogger.histogram(this, "overview_task_dismissed_source",
5425c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung                        Constants.Metrics.DismissSourceKeyboard);
543a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
544a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
545a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            default:
546a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                break;
5471e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
5488eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        // Pass through the debug trigger
5498eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        mDebugTrigger.onKeyEvent(keyCode);
5501e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
5511e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
5521e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
5531e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
554a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    public void onUserInteraction() {
555a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung        mRecentsView.onUserInteraction();
556a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    }
557a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung
558a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    @Override
559303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
56004d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        // Test mode where back does not do anything
56104d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        if (mConfig.debugModeEnabled) return;
56204d0f756782e697a171aebbb35ae86c86b839a27Winson Chung
56385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Dismiss Recents to the focused Task or Home
56485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        dismissRecentsToFocusedTaskOrHome(true);
565303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
56647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
5678eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when debug mode is triggered */
5688eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void onDebugModeTriggered() {
5698eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        if (mConfig.developerOptionsEnabled) {
57082862573bcf246128782b91ea627285c43133a8dAndrew Flynn            if (Prefs.getBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, false /* boolean */)) {
5718eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Disable the debug mode
57282862573bcf246128782b91ea627285c43133a8dAndrew Flynn                Prefs.remove(this, Prefs.Key.DEBUG_MODE_ENABLED);
573dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mConfig.debugModeEnabled = false;
574dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                inflateDebugOverlay();
575a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                if (mDebugOverlay != null) {
576a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    mDebugOverlay.disable();
577a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                }
5788eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            } else {
5798eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Enable the debug mode
58082862573bcf246128782b91ea627285c43133a8dAndrew Flynn                Prefs.putBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, true);
581dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mConfig.debugModeEnabled = true;
582dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                inflateDebugOverlay();
583a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                if (mDebugOverlay != null) {
584a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                    mDebugOverlay.enable();
585a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung                }
5868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            }
587dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion + ") " +
588dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                (mConfig.debugModeEnabled ? "Enabled" : "Disabled") + ", please restart Recents now",
589dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                Toast.LENGTH_SHORT).show();
5908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
5918eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    }
5928eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
593d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
594ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne    /**** RecentsResizeTaskDialog ****/
595d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
596ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne    private RecentsResizeTaskDialog getResizeTaskDebugDialog() {
597ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne        if (mResizeTaskDebugDialog == null) {
5988aa7d161a11965cd75eace74e1bcf15421bbea18Skuhne            mResizeTaskDebugDialog = new RecentsResizeTaskDialog(getFragmentManager(), this);
599d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung        }
600ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne        return mResizeTaskDebugDialog;
601d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    }
602d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
603d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    @Override
604ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne    public void onTaskResize(Task t) {
6058aa7d161a11965cd75eace74e1bcf15421bbea18Skuhne        getResizeTaskDebugDialog().showResizeTaskDialog(t, mRecentsView);
606d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung    }
607d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung
608d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsView.RecentsViewCallbacks Implementation ****/
609d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
610d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
611cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    public void onExitToHomeAnimationTriggered() {
61285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Animate the SystemUI scrim views out
613cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startExitRecentsAnimation();
614d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
615d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
616d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    @Override
6177aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onTaskViewClicked() {
61847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
619f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
620d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    @Override
6214e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    public void onTaskLaunchFailed() {
6224e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung        // Return to Home
6234e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung        dismissRecentsToHomeRaw(true);
6244e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    }
6254e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung
6264e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    @Override
6277aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onAllTaskViewsDismissed() {
628d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        mFinishLaunchHomeRunnable.run();
629d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    }
630d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung
63118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    @Override
63218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    public void onScreenPinningRequest() {
633d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
634d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung        SystemServicesProxy ssp = loader.getSystemServicesProxy();
635d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung        Recents.startScreenPinning(this, ssp);
6365c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung
6375c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung        MetricsLogger.count(this, "overview_screen_pinned", 1);
63818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk    }
63918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk
6406e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    @Override
6416e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    public void runAfterPause(Runnable r) {
6426e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi        mAfterPauseRunnable = r;
6436e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi    }
6446e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi
645d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
646d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
647f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
648af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung    public void refreshSearchWidgetView() {
649af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung        if (mSearchWidgetInfo != null) {
650af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
651af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            int searchWidgetId = ssp.getSearchAppWidgetId(this);
652af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            mSearchWidgetHostView = (RecentsAppWidgetHostView) mAppWidgetHost.createView(
653af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                    this, searchWidgetId, mSearchWidgetInfo);
654af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            Bundle opts = new Bundle();
655af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
656af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung                    AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
657af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            mSearchWidgetHostView.updateAppWidgetOptions(opts);
658af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            // Set the padding to 0 for this search widget
659af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            mSearchWidgetHostView.setPadding(0, 0, 0, 0);
660af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            mRecentsView.setSearchBar(mSearchWidgetHostView);
661af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung        } else {
662af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            mRecentsView.setSearchBar(null);
663af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung        }
664f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
6652915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6662915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    /**** DebugOverlayView.DebugOverlayViewCallbacks ****/
6672915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6682915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    @Override
6692915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    public void onPrimarySeekBarChanged(float progress) {
6702915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        // Do nothing
6712915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    }
6722915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6732915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    @Override
6742915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    public void onSecondarySeekBarChanged(float progress) {
6752915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        // Do nothing
6762915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    }
677303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
678