RecentsActivity.java revision c6011deffc80eaee6dfb1c7975e050bc71e5ea96
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;
30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle;
31d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.os.UserHandle;
32f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.util.Pair;
331e8d71b605b4872e93200706a80a88a3ff25498cWinson Chungimport android.view.KeyEvent;
34303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View;
358e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport android.view.ViewStub;
368eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.widget.Toast;
3747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R;
38f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader;
39303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.SpaceNode;
40303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
418e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport com.android.systemui.recents.views.FullscreenTransitionOverlayView;
42303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
43cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chungimport com.android.systemui.recents.views.SystemBarScrimViews;
44d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chungimport com.android.systemui.recents.views.ViewAnimation;
45303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
46b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chungimport java.lang.reflect.InvocationTargetException;
47303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
49303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* Activity */
50f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
51d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
528e548f7025ce930810479a8e628c325d09557fa3Winson Chung        FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks {
53d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
54cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsView mRecentsView;
55cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    SystemBarScrimViews mScrimViews;
568e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mEmptyViewStub;
57cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    View mEmptyView;
588e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mFullscreenOverlayStub;
598e548f7025ce930810479a8e628c325d09557fa3Winson Chung    FullscreenTransitionOverlayView mFullScreenOverlayView;
60cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
61cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsConfiguration mConfig;
62cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
63cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsAppWidgetHost mAppWidgetHost;
64cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetProviderInfo mSearchAppWidgetInfo;
65cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetHostView mSearchAppWidgetHostView;
66cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
67cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    boolean mVisible;
68cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    boolean mTaskLaunched;
69cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
70cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    // Runnables to finish the Recents activity
71cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true);
72cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishLaunchHomeRunnable;
73cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
74d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**
75d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * A Runnable to finish Recents either with/without a transition, and either by calling finish()
76d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * or just launching the specified intent.
77d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     */
78d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    class FinishRecentsRunnable implements Runnable {
79d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        boolean mUseCustomFinishTransition;
80d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent mLaunchIntent;
81d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        ActivityOptions mLaunchOpts;
82d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
83d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(boolean withTransition) {
84d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mUseCustomFinishTransition = withTransition;
85d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
86d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
87d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        /**
88d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * Creates a finish runnable that starts the specified intent, using the given
89d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * ActivityOptions.
90d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         */
91d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) {
92d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchIntent = launchIntent;
93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchOpts = opts;
94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
96d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        @Override
97d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void run() {
98d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Mark Recents as no longer visible
99d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            AlternateRecentsComponent.notifyVisibilityChanged(false);
100d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Finish Recents
101d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            if (mLaunchIntent != null) {
102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mLaunchOpts != null) {
103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, new UserHandle(UserHandle.USER_CURRENT));
104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                } else {
105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(),
106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            new UserHandle(UserHandle.USER_CURRENT));
107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
108d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            } else {
109d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                finish();
110d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mUseCustomFinishTransition) {
111d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    overridePendingTransition(R.anim.recents_to_launcher_enter,
112d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            R.anim.recents_to_launcher_exit);
113d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
114d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            }
115d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
116d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
117d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
1186736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from our RecentsService
1198eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
12047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
12147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
12247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
12310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            if (Console.Enabled) {
12410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                Console.log(Constants.Log.App.SystemUIHandshake,
12510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        "[RecentsActivity|serviceBroadcast]", action, Console.AnsiRed);
12610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            }
1271e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            if (action.equals(RecentsService.ACTION_HIDE_RECENTS_ACTIVITY)) {
1286cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                if (intent.getBooleanExtra(RecentsService.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
1296cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    // Dismiss recents, launching the focused task
1306cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    dismissRecentsIfVisible();
1316cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                } else {
132d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // If we are mid-animation into Recents, then reverse it and finish
1338e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    if (mFullScreenOverlayView == null ||
1348e548f7025ce930810479a8e628c325d09557fa3Winson Chung                            !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
135d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        // Otherwise, either finish Recents, or launch Home directly
136d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(context,
137d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
138969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
139d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
140d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
1416cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
1421e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            } else if (action.equals(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
143c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                // Try and unfilter and filtered stacks
144c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                if (!mRecentsView.unfilterFilteredStacks()) {
145c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    // If there are no filtered stacks, dismiss recents and launch the first task
146c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    dismissRecentsIfVisible();
147c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                }
14824cf152483c03dc446875c8d6440348174317bc5Winson Chung            } else if (action.equals(RecentsService.ACTION_START_ENTER_ANIMATION)) {
149521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung                // Try and start the enter animation (or restart it on configuration changed)
150c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                ReferenceCountedTrigger t = new ReferenceCountedTrigger(context, null, null, null);
151c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
152c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                        mFullScreenOverlayView, t));
153d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // Call our callback
154d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                onEnterAnimationTriggered();
15547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
15647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
15747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1596736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from the system
16031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung    final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() {
1616736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1626736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
16331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            String action = intent.getAction();
16431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
16531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                mFinishLaunchHomeRunnable.run();
16631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
16731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                // Refresh the search widget
16831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                refreshSearchWidget();
16931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            }
170d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
171d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    };
172d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
1738eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    // Debug trigger
1748eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
1758eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        @Override
1768eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void run() {
1778eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            onDebugModeTriggered();
1788eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
1798eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    });
1808eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
181303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
182b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung    void updateRecentsTasks(Intent launchIntent) {
183969f586533096999f10f5587f901949791154fa2Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
184969f586533096999f10f5587f901949791154fa2Winson Chung        SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
185969f586533096999f10f5587f901949791154fa2Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
186969f586533096999f10f5587f901949791154fa2Winson Chung        if (!stacks.isEmpty()) {
187969f586533096999f10f5587f901949791154fa2Winson Chung            mRecentsView.setBSP(root);
188969f586533096999f10f5587f901949791154fa2Winson Chung        }
189969f586533096999f10f5587f901949791154fa2Winson Chung
190b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        // Update the configuration based on the launch intent
191d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromHome = launchIntent.getBooleanExtra(
192d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_HOME, false);
193d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithThumbnail = launchIntent.getBooleanExtra(
194d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_THUMBNAIL, false);
195d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithScreenshot = launchIntent.getBooleanExtra(
196d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_FULL_SCREENSHOT, false);
197d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
198d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
199969f586533096999f10f5587f901949791154fa2Winson Chung        mConfig.launchedWithNoRecentTasks = !root.hasTasks();
200303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
20106795630f62e1e7ad89825db23d7656f8dcd6c5aWinson Chung        // Show the scrim if we animate into Recents without window transitions
202cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.prepareEnterRecentsAnimation();
203521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
204303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Add the default no-recents layout
2058e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mEmptyView == null) {
2068e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mEmptyView = mEmptyViewStub.inflate();
2078e548f7025ce930810479a8e628c325d09557fa3Winson Chung        }
208969f586533096999f10f5587f901949791154fa2Winson Chung        if (mConfig.launchedWithNoRecentTasks) {
209303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
210303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
211303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.GONE);
212303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
214303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
215f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Attempts to allocate and bind the search bar app widget */
216f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void bindSearchBarAppWidget() {
217814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
218f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
219f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
220f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Reset the host view and widget info
221f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetHostView = null;
222f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetInfo = null;
223f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
224f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Try and load the app widget id from the settings
225d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
226f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
227f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
228f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (mSearchAppWidgetInfo == null) {
229f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // If there is no actual widget associated with that id, then delete it and
230f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // prepare to bind another app widget in its place
231f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
232f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    appWidgetId = -1;
233f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
23410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
23510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
23610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|settings|appWidgetId]",
23710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
23810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
23910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
240f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
241f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
242f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // If there is no id, then bind a new search app widget
243f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId < 0) {
244f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Pair<Integer, AppWidgetProviderInfo> widgetInfo =
245f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        ssp.bindSearchAppWidget(mAppWidgetHost);
246f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (widgetInfo != null) {
24710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    if (Console.Enabled) {
24810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        Console.log(Constants.Log.App.SystemUIHandshake,
24910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "[RecentsActivity|onCreate|searchWidget]",
25010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "Id: " + widgetInfo.first + " Info: " + widgetInfo.second,
25110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                Console.AnsiBlue);
25210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    }
253f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
254f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // Save the app widget id into the settings
255d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    mConfig.updateSearchBarAppWidgetId(this, widgetInfo.first);
256f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    mSearchAppWidgetInfo = widgetInfo.second;
257f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
258f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
259f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
260f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
261f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
262f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Creates the search bar app widget view */
263f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void addSearchBarAppWidgetView() {
264814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
265d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
266f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
26710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
26810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
26910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|addSearchAppWidgetView]",
27010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
27110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
27210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
273f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
274f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        mSearchAppWidgetInfo);
275f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Bundle opts = new Bundle();
276f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
277f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
278f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
279f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                // Set the padding to 0 for this search widget
280f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
281f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(mSearchAppWidgetHostView);
282f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            } else {
283f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(null);
284f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
285f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
286f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
287f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
288303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
28947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean dismissRecentsIfVisible() {
29047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
291d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are mid-animation into Recents, then reverse it and finish
2928e548f7025ce930810479a8e628c325d09557fa3Winson Chung            if (mFullScreenOverlayView == null ||
2938e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
294d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // If we have a focused task, then launch that task
295d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (!mRecentsView.launchFocusedTask()) {
2961f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    if (mConfig.launchedFromHome) {
2971f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Just start the animation out of recents
298d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
299d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
300969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
301d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
3021f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    } else {
3031f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Otherwise, try and launch the first task
3041f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        if (!mRecentsView.launchFirstTask()) {
3051f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                            // If there are no tasks, then just finish recents
306d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            mFinishLaunchHomeRunnable.run();
3071f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        }
308d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
3091e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                }
310303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
31147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
312303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
313303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
314303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
315303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
316303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
317303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
318303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
319303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
32010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
32110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
32210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onCreate]",
32310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    getIntent().getAction() + " visible: " + mVisible, Console.AnsiRed);
32410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
32510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onCreate");
32610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
327303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
328303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
329303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
330d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
331303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
332d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Create the home intent runnable
333d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
334d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addCategory(Intent.CATEGORY_HOME);
335d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
336d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
337d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
338d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                ActivityOptions.makeCustomAnimation(this, R.anim.recents_to_launcher_enter,
339d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        R.anim.recents_to_launcher_exit));
340d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
341f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
342d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
343f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
3448e548f7025ce930810479a8e628c325d09557fa3Winson Chung        // Set the Recents layout
3458e548f7025ce930810479a8e628c325d09557fa3Winson Chung        setContentView(R.layout.recents);
3468e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mRecentsView = (RecentsView) findViewById(R.id.recents_view);
34747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
348653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
349653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
350653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3518e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
3528e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mFullscreenOverlayStub = (ViewStub) findViewById(R.id.fullscreen_overlay_stub);
3538e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mScrimViews = new SystemBarScrimViews(this, mConfig);
354303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
355303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
356b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(getIntent());
357f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
358d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Prepare the screenshot transition if necessary
359d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
3608e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView = (FullscreenTransitionOverlayView) mFullscreenOverlayStub.inflate();
3618e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView.setCallbacks(this);
3628e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
363d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
364d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
365f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
366f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        bindSearchBarAppWidget();
367f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Add the search bar layout
368f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        addSearchBarAppWidgetView();
369521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
370521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        // Update if we are getting a configuration change
371521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        if (savedInstanceState != null) {
372521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung            onConfigurationChange();
373521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        }
374b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung
37531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
37631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
37731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
37831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
37931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mSystemBroadcastReceiver, filter);
38031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
38131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register any broadcast receivers for the task loader
38231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
38331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
384cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Private API calls to make the shadows look better
385b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        try {
386cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
387cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f));
388b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (IllegalAccessException e) {
389b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
390b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (InvocationTargetException e) {
391b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
392b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        }
393521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
394521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
395521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    void onConfigurationChange() {
396521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        // Try and start the enter animation (or restart it on configuration changed)
397c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
398c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
399c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mFullScreenOverlayView, t));
400d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Call our callback
401d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        onEnterAnimationTriggered();
402303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
403303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
404303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
405303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
406303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
40747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Reset the task launched flag if we encounter an onNewIntent() before onStop()
40847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
40947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
41010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
41110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
41210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onNewIntent]",
41310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    intent.getAction() + " visible: " + mVisible, Console.AnsiRed);
41410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
41510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onNewIntent");
41610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
417303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
418303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
419303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
420d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
421303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
422303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
423b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(intent);
424f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
425d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Prepare the screenshot transition if necessary
426d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
4278e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
428d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
429d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
430f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Don't attempt to rebind the search bar widget, but just add the search bar layout
431f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        addSearchBarAppWidgetView();
432303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
433303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
434303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
435303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
43610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
43710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStart]", "",
43810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
43910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
440303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
44147a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
44231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages from our service
44331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
44431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(RecentsService.ACTION_HIDE_RECENTS_ACTIVITY);
44531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY);
44631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(RecentsService.ACTION_START_ENTER_ANIMATION);
44731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
44831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
44931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Start listening for widget package changes if there is one bound
45031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
45131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            mAppWidgetHost.startListening(this);
45231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        }
45331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
454303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = true;
455303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
456303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
457303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
458303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
45910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
46010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onResume]", "",
46110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
46210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
463303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
4646736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4656736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4666736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4676736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onAttachedToWindow() {
46810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
46910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
47010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onAttachedToWindow]", "",
47110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
47210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4736736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onAttachedToWindow();
474303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
475303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
476303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
4776736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onDetachedFromWindow() {
47810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
47910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
48010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onDetachedFromWindow]", "",
48110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
48210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4836736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onDetachedFromWindow();
4846736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4856736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4866736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4876736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    protected void onPause() {
48810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
48910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onPause]", "",
49010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
49110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4926736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onPause();
493303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
494303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
495303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
496303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
49710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
49810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStop]", "",
49910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
50010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
501303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
50247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
50331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the RecentsService receiver
50431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mServiceBroadcastReceiver);
50531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
50631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Stop listening for widget package changes if there was one bound
50731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
50831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            mAppWidgetHost.stopListening();
50931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        }
51031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
511303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = false;
51247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
51347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
51447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
51547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
51647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
51710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
51810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onDestroy]", "",
51910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
52010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
52147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
52231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
52331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the screen off receiver
52431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mSystemBroadcastReceiver);
52531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().unregisterReceivers();
526303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
527303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
528303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
5294d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
5304d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
5314d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
5324d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
5334d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
5344d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
5354d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
5364d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
5371e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
5381e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        if (keyCode == KeyEvent.KEYCODE_TAB) {
5391e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            // Focus the next task in the stack
5401e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            final boolean backward = event.isShiftPressed();
5411e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mRecentsView.focusNextTask(!backward);
5421e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            return true;
543c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
544c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(true);
545c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
546c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
547c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(false);
548c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
5491e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
5508eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        // Pass through the debug trigger
5518eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        mDebugTrigger.onKeyEvent(keyCode);
5521e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
5531e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
5541e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
5551e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
556a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    public void onUserInteraction() {
557a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung        mRecentsView.onUserInteraction();
558a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    }
559a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung
560a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    @Override
561303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
56204d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        // Test mode where back does not do anything
56304d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        if (mConfig.debugModeEnabled) return;
56404d0f756782e697a171aebbb35ae86c86b839a27Winson Chung
565d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // If we are mid-animation into Recents, then reverse it and finish
5668e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mFullScreenOverlayView == null ||
5678e548f7025ce930810479a8e628c325d09557fa3Winson Chung                !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
568d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are currently filtering in any stacks, unfilter them first
569d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            if (!mRecentsView.unfilterFilteredStacks()) {
570d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (mConfig.launchedFromHome) {
571d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Just start the animation out of recents
572d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
573d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            null, mFinishLaunchHomeRunnable, null);
574969f586533096999f10f5587f901949791154fa2Winson Chung                    mRecentsView.startExitToHomeAnimation(
575d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                            new ViewAnimation.TaskViewExitContext(exitTrigger));
576d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                } else {
577d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Otherwise, try and launch the first task
578d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    if (!mRecentsView.launchFirstTask()) {
579d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        // If there are no tasks, then just finish recents
580d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        mFinishLaunchHomeRunnable.run();
581d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
582d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                }
58356f4692a89a1afb2fe40aec8a9b6f26936b8e9a4Winson Chung            }
584303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
585303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
58647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
5878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when debug mode is triggered */
5888eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void onDebugModeTriggered() {
5898eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        if (mConfig.developerOptionsEnabled) {
5908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
5918eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
5928eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Disable the debug mode
5938eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
5948eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            } else {
5958eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Enable the debug mode
5968eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
5978eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            }
5988eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion +
5998eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                    ") toggled, please restart Recents now", Toast.LENGTH_SHORT).show();
6008eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
6018eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    }
6028eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
6038eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when the enter recents animation is triggered. */
604521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    public void onEnterAnimationTriggered() {
605cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims in
606cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startEnterRecentsAnimation();
607969f586533096999f10f5587f901949791154fa2Winson Chung    }
608969f586533096999f10f5587f901949791154fa2Winson Chung
6098e548f7025ce930810479a8e628c325d09557fa3Winson Chung    /**** FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks Implementation ****/
610521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
611521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    @Override
612d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    public void onEnterAnimationComplete(boolean canceled) {
613d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        if (!canceled) {
614d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // Reset the full screenshot transition view
615d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
6168e548f7025ce930810479a8e628c325d09557fa3Winson Chung                mFullScreenOverlayView.reset();
617d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            }
618d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
619d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // XXX: We should clean up the screenshot in this case as well, but it needs to happen
620d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            //      after to animate up
621d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
622d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Recycle the full screen screenshot
623d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        AlternateRecentsComponent.consumeLastScreenshot();
624d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    }
625d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
626d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsView.RecentsViewCallbacks Implementation ****/
627d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
628d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
629cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    public void onExitToHomeAnimationTriggered() {
630cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims out
631cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startExitRecentsAnimation();
632d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
633d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
634d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    @Override
635c9567c07dd4953f5c5e3821d30525e50ed8b9b29Winson Chung    public void onTaskLaunching() {
63647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = true;
637521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
6389214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        // Mark recents as no longer visible
6399214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        AlternateRecentsComponent.notifyVisibilityChanged(false);
64047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
641f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
642d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    @Override
643d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    public void onLastTaskRemoved() {
644d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        mFinishLaunchHomeRunnable.run();
645d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    }
646d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung
647d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
648d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
649f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
650d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void refreshSearchWidget() {
651d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Load the Search widget again
652d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        bindSearchBarAppWidget();
653d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        addSearchBarAppWidgetView();
654f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
655303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
656