RecentsActivity.java revision b0a28ea5d381cd3a8477cf7fd82797199c80ca67
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.AppWidgetHostView;
23f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetManager;
24f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetProviderInfo;
2547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.BroadcastReceiver;
2647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.Context;
27303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent;
2847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.IntentFilter;
298eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.content.SharedPreferences;
30b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chungimport android.content.res.Configuration;
31303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle;
32bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chungimport android.os.Handler;
33bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chungimport android.os.Looper;
34d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.os.UserHandle;
35f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.util.Pair;
361e8d71b605b4872e93200706a80a88a3ff25498cWinson Chungimport android.view.KeyEvent;
37303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View;
388e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport android.view.ViewStub;
398eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.widget.Toast;
4047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R;
41ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.DebugTrigger;
42ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.ReferenceCountedTrigger;
43ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.SystemServicesProxy;
44ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Utilities;
45f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader;
46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.SpaceNode;
47dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.model.Task;
48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
49dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.views.DebugOverlayView;
50303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
51cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chungimport com.android.systemui.recents.views.SystemBarScrimViews;
52d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chungimport com.android.systemui.recents.views.ViewAnimation;
53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
54083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chungimport java.lang.ref.WeakReference;
55b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chungimport java.lang.reflect.InvocationTargetException;
56303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
57303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
5885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung/**
5985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * The main Recents activity that is started from AlternateRecentsComponent.
6085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */
61f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
622915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
632915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        DebugOverlayView.DebugOverlayViewCallbacks {
64d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
6585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    RecentsConfiguration mConfig;
6685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean mVisible;
67a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung    long mLastTabKeyEventTime;
6885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
6985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    // Top level views
70cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsView mRecentsView;
71cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    SystemBarScrimViews mScrimViews;
728e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mEmptyViewStub;
732915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    ViewStub mDebugOverlayStub;
74cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    View mEmptyView;
75dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    DebugOverlayView mDebugOverlay;
76cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
7785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    // Search AppWidget
78cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsAppWidgetHost mAppWidgetHost;
79cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetProviderInfo mSearchAppWidgetInfo;
80cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetHostView mSearchAppWidgetHostView;
81cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
82cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    // Runnables to finish the Recents activity
83cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishLaunchHomeRunnable;
84cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
85d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**
8685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * A common Runnable to finish Recents either by calling finish() (with a custom animation) or
8785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * launching Home with some ActivityOptions.  Generally we always launch home when we exit
8885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Recents rather than just finishing the activity since we don't know what is behind Recents in
8985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * the task stack.  The only case where we finish() directly is when we are cancelling the full
9085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * screen transition from the app.
91d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     */
92d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    class FinishRecentsRunnable implements Runnable {
93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent mLaunchIntent;
94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        ActivityOptions mLaunchOpts;
95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
96d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        /**
97d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * Creates a finish runnable that starts the specified intent, using the given
98d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * ActivityOptions.
99d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         */
100d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) {
101d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchIntent = launchIntent;
102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchOpts = opts;
103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        @Override
106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void run() {
107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Mark Recents as no longer visible
108bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung            onRecentsActivityVisibilityChanged(false);
109d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Finish Recents
110d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            if (mLaunchIntent != null) {
111d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mLaunchOpts != null) {
11285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(), UserHandle.CURRENT);
113bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                } else {
114bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                    startActivityAsUser(mLaunchIntent, UserHandle.CURRENT);
115d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
116d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            } else {
117d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                finish();
11885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                overridePendingTransition(R.anim.recents_to_launcher_enter,
11985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                        R.anim.recents_to_launcher_exit);
120d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            }
121d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
122d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
123d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
12485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
12585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Broadcast receiver to handle messages from AlternateRecentsComponent.
12685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
1278eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
12847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
12947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
13047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
131cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung            if (action.equals(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY)) {
132cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                // Mark Recents as no longer visible
133cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                AlternateRecentsComponent.notifyVisibilityChanged(false);
134cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                if (intent.getBooleanExtra(AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
13585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    // If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app
13685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    dismissRecentsToFocusedTaskOrHome(false);
137cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                } else if (intent.getBooleanExtra(AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) {
13885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    // Otherwise, dismiss Recents to Home
13985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    dismissRecentsToHome(true);
140cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                } else {
141cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                    // Do nothing, another activity is being launched on top of Recents
1426cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
143cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung            } else if (action.equals(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
14485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                // If we are toggling Recents, then first unfilter any filtered stacks first
14585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToFocusedTaskOrHome(true);
146b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung            } else if (action.equals(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION)) {
147b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // Trigger the enter animation
148b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                onEnterAnimationTriggered();
149b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // Notify the fallback receiver that we have successfully got the broadcast
150b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                // See AlternateRecentsComponent.onAnimationStarted()
151b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                setResultCode(Activity.RESULT_OK);
15247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
15347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
15447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
155303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
15685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
15785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * Broadcast receiver to handle messages from the system
15885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
15931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung    final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() {
1606736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1616736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
16231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            String action = intent.getAction();
16385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
16485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                // When the screen turns off, dismiss Recents to Home
16585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToHome(false);
166bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung                // Start preloading some tasks in the background
167b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                RecentsTaskLoader.getInstance().preload(RecentsActivity.this,
168b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                        Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
16931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
17085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                // When the search activity changes, update the Search widget
17131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                refreshSearchWidget();
17231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            }
173d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
174d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    };
175d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
17685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /**
17785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     * A custom debug trigger to listen for a debug key chord.
17885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung     */
1798eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
1808eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        @Override
1818eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void run() {
1828eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            onDebugModeTriggered();
1838eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
1848eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    });
1858eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
186303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
187b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung    void updateRecentsTasks(Intent launchIntent) {
188b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        // Update the configuration based on the launch intent
189bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        boolean fromSearchHome = launchIntent.getBooleanExtra(
190bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                AlternateRecentsComponent.EXTRA_FROM_SEARCH_HOME, false);
191bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        mConfig.launchedFromHome = fromSearchHome || launchIntent.getBooleanExtra(
192d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_HOME, false);
193d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithThumbnail = launchIntent.getBooleanExtra(
194d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_THUMBNAIL, false);
195cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung        mConfig.launchedToTaskId = launchIntent.getIntExtra(
196cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                AlternateRecentsComponent.EXTRA_FROM_TASK_ID, -1);
197d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
198d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
199b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        mConfig.launchedReuseTaskStackViews = launchIntent.getBooleanExtra(
200b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                AlternateRecentsComponent.EXTRA_REUSE_TASK_STACK_VIEWS, false);
2019cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung
2029cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        // Load all the tasks
2039cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
2049cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        SpaceNode root = loader.reload(this,
2059cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung                Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount,
2069cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung                mConfig.launchedFromHome);
2079cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
2089cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        if (!stacks.isEmpty()) {
2099cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung            mRecentsView.setTaskStacks(root.getStacks());
2109cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung        }
211969f586533096999f10f5587f901949791154fa2Winson Chung        mConfig.launchedWithNoRecentTasks = !root.hasTasks();
212303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
213bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        // Create the home intent runnable
214bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
215bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        homeIntent.addCategory(Intent.CATEGORY_HOME);
216bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
217bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
218bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung        mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
219bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung            ActivityOptions.makeCustomAnimation(this,
220bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                fromSearchHome ? R.anim.recents_to_search_launcher_enter :
221bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                        R.anim.recents_to_launcher_enter,
222bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                fromSearchHome ? R.anim.recents_to_search_launcher_exit :
223bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung                        R.anim.recents_to_launcher_exit));
224bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung
225dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        // Mark the task that is the launch target
226dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        int taskStackCount = stacks.size();
227dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mConfig.launchedToTaskId != -1) {
228dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            for (int i = 0; i < taskStackCount; i++) {
229dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                TaskStack stack = stacks.get(i);
230dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                ArrayList<Task> tasks = stack.getTasks();
231dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                int taskCount = tasks.size();
232dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                for (int j = 0; j < taskCount; j++) {
233dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    Task t = tasks.get(j);
234dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    if (t.key.id == mConfig.launchedToTaskId) {
235dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                        t.isLaunchTarget = true;
236dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                        break;
237dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                    }
238dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                }
239dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            }
240dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
241dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
24285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Update the top level view's visibilities
243969f586533096999f10f5587f901949791154fa2Winson Chung        if (mConfig.launchedWithNoRecentTasks) {
24485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mEmptyView == null) {
24585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mEmptyView = mEmptyViewStub.inflate();
24685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            }
247303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
248772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            mRecentsView.setSearchBarVisibility(View.GONE);
249303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
25085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mEmptyView != null) {
25185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mEmptyView.setVisibility(View.GONE);
25285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            }
253772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            if (mRecentsView.hasSearchBar()) {
254772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                mRecentsView.setSearchBarVisibility(View.VISIBLE);
255772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            } else {
256772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                addSearchBarAppWidgetView();
257772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            }
258303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
2597aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
26085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Animate the SystemUI scrims into view
2617aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        mScrimViews.prepareEnterRecentsAnimation();
262303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
263303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
264f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Attempts to allocate and bind the search bar app widget */
265f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void bindSearchBarAppWidget() {
266814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
267f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
268f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
269f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Reset the host view and widget info
270f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetHostView = null;
271f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetInfo = null;
272f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
273f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Try and load the app widget id from the settings
274d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
275f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
276f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
277f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (mSearchAppWidgetInfo == null) {
278f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // If there is no actual widget associated with that id, then delete it and
279f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // prepare to bind another app widget in its place
280f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
281f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    appWidgetId = -1;
282f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
283f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
284f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
285f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // If there is no id, then bind a new search app widget
286f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId < 0) {
287f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Pair<Integer, AppWidgetProviderInfo> widgetInfo =
288f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        ssp.bindSearchAppWidget(mAppWidgetHost);
289f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (widgetInfo != null) {
290f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // Save the app widget id into the settings
291d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    mConfig.updateSearchBarAppWidgetId(this, widgetInfo.first);
292f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    mSearchAppWidgetInfo = widgetInfo.second;
293f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
294f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
295f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
296f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
297f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
298f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Creates the search bar app widget view */
299f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void addSearchBarAppWidgetView() {
300814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
301d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
302f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
303f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
304f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        mSearchAppWidgetInfo);
305f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Bundle opts = new Bundle();
306f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
307ee0b12161ab8563378e33e9d694d15ed1a757a26Winson Chung                        AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
308f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
309f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                // Set the padding to 0 for this search widget
310f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
311f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(mSearchAppWidgetHostView);
312f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            } else {
313f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(null);
314f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
315f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
316f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
317f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
318303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
31985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean dismissRecentsToFocusedTaskOrHome(boolean checkFilteredStackState) {
32047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
32185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we currently have filtered stacks, then unfilter those first
32285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (checkFilteredStackState &&
32385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                mRecentsView.unfilterFilteredStacks()) return true;
32485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we have a focused Task, launch that Task now
32585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mRecentsView.launchFocusedTask()) return true;
32685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If we launched from Home, then return to Home
32785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            if (mConfig.launchedFromHome) {
32885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                dismissRecentsToHomeRaw(true);
32985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                return true;
330303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
331dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            // Otherwise, try and return to the Task that Recents was launched from
332dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            if (mRecentsView.launchPreviousTask()) return true;
33385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // If none of the other cases apply, then just go Home
33485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            dismissRecentsToHomeRaw(true);
33585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            return true;
33685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        }
33785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        return false;
33885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    }
33985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
34085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /** Dismisses Recents directly to Home. */
34185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    void dismissRecentsToHomeRaw(boolean animated) {
34285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        if (animated) {
34385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
34485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    null, mFinishLaunchHomeRunnable, null);
34585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            mRecentsView.startExitToHomeAnimation(
34685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung                    new ViewAnimation.TaskViewExitContext(exitTrigger));
34785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        } else {
34885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            mFinishLaunchHomeRunnable.run();
34985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        }
35085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    }
35185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung
35285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    /** Dismisses Recents directly to Home if we currently aren't transitioning. */
35385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung    boolean dismissRecentsToHome(boolean animated) {
35485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        if (mVisible) {
35585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            // Return to Home
35685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung            dismissRecentsToHomeRaw(animated);
35747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
358303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
359303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
360303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
361303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
362303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
363303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
364303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
365303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
36615155519ba9ce8302d5ca1771f7816cd683a2051Winson Chung        // For the non-primary user, ensure that the SystemSericesProxy is initialized
36715155519ba9ce8302d5ca1771f7816cd683a2051Winson Chung        RecentsTaskLoader.initialize(this);
368303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
369303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
37056e09b42a0f1670970872bef611a8036904ad6bfJason Monk        mConfig = RecentsConfiguration.reinitialize(this,
37156e09b42a0f1670970872bef611a8036904ad6bfJason Monk                RecentsTaskLoader.getInstance().getSystemServicesProxy());
372303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
373f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
374d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
375f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
3768e548f7025ce930810479a8e628c325d09557fa3Winson Chung        // Set the Recents layout
3778e548f7025ce930810479a8e628c325d09557fa3Winson Chung        setContentView(R.layout.recents);
3788e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mRecentsView = (RecentsView) findViewById(R.id.recents_view);
37947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
380653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
381653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
382653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3838e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
3842915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        mDebugOverlayStub = (ViewStub) findViewById(R.id.debug_overlay_stub);
3858e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mScrimViews = new SystemBarScrimViews(this, mConfig);
386dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        inflateDebugOverlay();
387303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
388f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
389f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        bindSearchBarAppWidget();
390772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        // Update the recent tasks
391772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        updateRecentsTasks(getIntent());
392521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
39331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
39431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
39531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
39631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
39731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mSystemBroadcastReceiver, filter);
39831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
399cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Private API calls to make the shadows look better
400b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        try {
40160a729c8e93461c9446d0c8cd519b40dec01e8d8Winson Chung            Utilities.setShadowProperty("ambientRatio", String.valueOf(1.5f));
402b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (IllegalAccessException e) {
403b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
404b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (InvocationTargetException e) {
405b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
406b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        }
4077aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
4086057c91563402f900dfc7714a46e952d86172e2fWinson Chung        // Update if we are getting a configuration change
4096057c91563402f900dfc7714a46e952d86172e2fWinson Chung        if (savedInstanceState != null) {
410b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung            // Update RecentsConfiguration
411b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung            mConfig = RecentsConfiguration.reinitialize(this,
412b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung                    RecentsTaskLoader.getInstance().getSystemServicesProxy());
4136057c91563402f900dfc7714a46e952d86172e2fWinson Chung            mConfig.updateOnConfigurationChange();
414b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung            // Trigger the enter animation
415b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung            onEnterAnimationTriggered();
4166057c91563402f900dfc7714a46e952d86172e2fWinson Chung        }
417905950abd017b5a135e26179b5ba29378732cf5aWinson Chung
418905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        // Start listening for widget package changes if there is one bound, post it since we don't
419905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        // want it stalling the startup
420905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
421905950abd017b5a135e26179b5ba29378732cf5aWinson Chung            final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> callback =
422905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                    new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(this);
423905950abd017b5a135e26179b5ba29378732cf5aWinson Chung            mRecentsView.post(new Runnable() {
424905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                @Override
425905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                public void run() {
426905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                    RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = callback.get();
427905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                    if (cb != null) {
428905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                        mAppWidgetHost.startListening(cb);
429905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                    }
430905950abd017b5a135e26179b5ba29378732cf5aWinson Chung                }
431905950abd017b5a135e26179b5ba29378732cf5aWinson Chung            });
432905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        }
433521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
434521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
435dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    /** Inflates the debug overlay if debug mode is enabled. */
436dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    void inflateDebugOverlay() {
437dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mConfig.debugModeEnabled && mDebugOverlay == null) {
4382915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            // Inflate the overlay and seek bars
4392915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            mDebugOverlay = (DebugOverlayView) mDebugOverlayStub.inflate();
4402915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung            mDebugOverlay.setCallbacks(this);
441dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mRecentsView.setDebugOverlay(mDebugOverlay);
442dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
443dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung    }
444dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
445bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung    /** Handles changes to the activity visibility. */
446bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung    void onRecentsActivityVisibilityChanged(boolean visible) {
447bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung        if (!visible) {
448bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung            AlternateRecentsComponent.notifyVisibilityChanged(visible);
449bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung        }
450bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung        mVisible = visible;
451bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung    }
452bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung
453303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
454303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
455303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
4566057c91563402f900dfc7714a46e952d86172e2fWinson Chung        setIntent(intent);
45747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
458480dd72daf927283997bdb4060091299add66832Winson Chung        // Reinitialize the configuration
459480dd72daf927283997bdb4060091299add66832Winson Chung        RecentsConfiguration.reinitialize(this, RecentsTaskLoader.getInstance().getSystemServicesProxy());
460480dd72daf927283997bdb4060091299add66832Winson Chung
461dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        // Clear any debug rects
462dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        if (mDebugOverlay != null) {
463dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            mDebugOverlay.clear();
464dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        }
465dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung
466303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
467b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(intent);
468303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
469303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
470303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
471303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
472303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
47347a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
47431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages from our service
47531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
476cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung        filter.addAction(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY);
477cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung        filter.addAction(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY);
478b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        filter.addAction(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION);
47931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
48019fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung
48119fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        // Register any broadcast receivers for the task loader
48219fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
483303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
484303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
485303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
486303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
487303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
488083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung
48985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Mark Recents as visible
490bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung        onRecentsActivityVisibilityChanged(true);
4916736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4926736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4936736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
494303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
495303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
49647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
497b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        // Notify the views that we are no longer visible
498b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung        mRecentsView.onRecentsHidden();
49919fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung
50031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the RecentsService receiver
50131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mServiceBroadcastReceiver);
50231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
50319fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        // Unregister any broadcast receivers for the task loader
50419fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung        RecentsTaskLoader.getInstance().unregisterReceivers();
50547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
50647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
50747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
50847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
50947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
51031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
51185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Unregister the system broadcast receivers
51231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mSystemBroadcastReceiver);
513905950abd017b5a135e26179b5ba29378732cf5aWinson Chung
514905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        // Stop listening for widget package changes if there was one bound
515905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        if (mAppWidgetHost.isListening()) {
516905950abd017b5a135e26179b5ba29378732cf5aWinson Chung            mAppWidgetHost.stopListening();
517905950abd017b5a135e26179b5ba29378732cf5aWinson Chung        }
518303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
519303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
520b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung    public void onEnterAnimationTriggered() {
521353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        // Try and start the enter animation (or restart it on configuration changed)
522353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
523353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
524353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung
525353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        // Animate the SystemUI scrim views
526353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung        mScrimViews.startEnterRecentsAnimation();
527353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung    }
528353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung
529353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung    @Override
5304d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
5314d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
5324d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
5334d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
5344d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
5354d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
5364d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
5374d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
5381e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
539a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung        switch (keyCode) {
540a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_TAB: {
541a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                boolean hasRepKeyTimeElapsed = (System.currentTimeMillis() -
542a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                        mLastTabKeyEventTime) > mConfig.altTabKeyDelay;
543a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                if (event.getRepeatCount() <= 0 || hasRepKeyTimeElapsed) {
544a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    // Focus the next task in the stack
545a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    final boolean backward = event.isShiftPressed();
546a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    mRecentsView.focusNextTask(!backward);
547a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                    mLastTabKeyEventTime = System.currentTimeMillis();
548a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                }
549a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
550a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
551a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DPAD_UP: {
552a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.focusNextTask(true);
553a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
554a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
555a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DPAD_DOWN: {
556a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.focusNextTask(false);
557a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
558a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
559a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_DEL:
560a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            case KeyEvent.KEYCODE_FORWARD_DEL: {
561a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                mRecentsView.dismissFocusedTask();
562a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                return true;
563a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            }
564a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung            default:
565a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung                break;
5661e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
5678eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        // Pass through the debug trigger
5688eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        mDebugTrigger.onKeyEvent(keyCode);
5691e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
5701e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
5711e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
5721e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
573a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    public void onUserInteraction() {
574a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung        mRecentsView.onUserInteraction();
575a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    }
576a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung
577a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    @Override
578303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
57904d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        // Test mode where back does not do anything
58004d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        if (mConfig.debugModeEnabled) return;
58104d0f756782e697a171aebbb35ae86c86b839a27Winson Chung
58285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Dismiss Recents to the focused Task or Home
58385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        dismissRecentsToFocusedTaskOrHome(true);
584303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
58547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
5868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when debug mode is triggered */
5878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void onDebugModeTriggered() {
5888eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        if (mConfig.developerOptionsEnabled) {
5898eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
5908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
5918eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Disable the debug mode
5928eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
593dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mConfig.debugModeEnabled = false;
594dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                inflateDebugOverlay();
595dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mDebugOverlay.disable();
5968eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            } else {
5978eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Enable the debug mode
5988eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
599dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mConfig.debugModeEnabled = true;
600dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                inflateDebugOverlay();
601dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                mDebugOverlay.enable();
6028eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            }
603dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion + ") " +
604dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                (mConfig.debugModeEnabled ? "Enabled" : "Disabled") + ", please restart Recents now",
605dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung                Toast.LENGTH_SHORT).show();
6068eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
6078eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    }
6088eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
609d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsView.RecentsViewCallbacks Implementation ****/
610d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
611d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
612cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    public void onExitToHomeAnimationTriggered() {
61385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung        // Animate the SystemUI scrim views out
614cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startExitRecentsAnimation();
615d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
616d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
617d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    @Override
6187aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onTaskViewClicked() {
6199214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        // Mark recents as no longer visible
620bac679b0d47aee0c9f3228ce2957ab4fe5b3609eWinson Chung        onRecentsActivityVisibilityChanged(false);
62147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
622f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
623d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    @Override
6244e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    public void onTaskLaunchFailed() {
6254e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung        // Return to Home
6264e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung        dismissRecentsToHomeRaw(true);
6274e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    }
6284e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung
6294e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung    @Override
6307aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onAllTaskViewsDismissed() {
631d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        mFinishLaunchHomeRunnable.run();
632d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    }
633d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung
634d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
635d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
636f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
637d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void refreshSearchWidget() {
638d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        bindSearchBarAppWidget();
639d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        addSearchBarAppWidgetView();
640f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
6412915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6422915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    /**** DebugOverlayView.DebugOverlayViewCallbacks ****/
6432915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6442915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    @Override
6452915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    public void onPrimarySeekBarChanged(float progress) {
6462915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        // Do nothing
6472915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    }
6482915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung
6492915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    @Override
6502915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    public void onSecondarySeekBarChanged(float progress) {
6512915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung        // Do nothing
6522915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung    }
653303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
654