RecentsActivity.java revision 93748a11cba1b44edbc2e888c997533461355594
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;
38ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Console;
39ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.DebugTrigger;
40ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.ReferenceCountedTrigger;
41ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.SystemServicesProxy;
42ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.Utilities;
43f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader;
44303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.SpaceNode;
45303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
468e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport com.android.systemui.recents.views.FullscreenTransitionOverlayView;
47303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
48cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chungimport com.android.systemui.recents.views.SystemBarScrimViews;
49d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chungimport com.android.systemui.recents.views.ViewAnimation;
50303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
51083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chungimport java.lang.ref.WeakReference;
52b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chungimport java.lang.reflect.InvocationTargetException;
53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
55303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* Activity */
56f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
57d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
588e548f7025ce930810479a8e628c325d09557fa3Winson Chung        FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks {
59d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
60ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String EXTRA_TRIGGERED_FROM_ALT_TAB = "extra_triggered_from_alt_tab";
61ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
62ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
63ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
64ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
65cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsView mRecentsView;
66cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    SystemBarScrimViews mScrimViews;
678e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mEmptyViewStub;
68cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    View mEmptyView;
698e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mFullscreenOverlayStub;
708e548f7025ce930810479a8e628c325d09557fa3Winson Chung    FullscreenTransitionOverlayView mFullScreenOverlayView;
71cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
72cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsConfiguration mConfig;
73cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
74cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsAppWidgetHost mAppWidgetHost;
75cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetProviderInfo mSearchAppWidgetInfo;
76cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetHostView mSearchAppWidgetHostView;
77cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
78cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    boolean mVisible;
79cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
80cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    // Runnables to finish the Recents activity
81cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true);
82cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishLaunchHomeRunnable;
83cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
84d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**
85d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * A Runnable to finish Recents either with/without a transition, and either by calling finish()
86d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * or just launching the specified intent.
87d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     */
88d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    class FinishRecentsRunnable implements Runnable {
89d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        boolean mUseCustomFinishTransition;
90d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent mLaunchIntent;
91d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        ActivityOptions mLaunchOpts;
92d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(boolean withTransition) {
94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mUseCustomFinishTransition = withTransition;
95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
96d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
97d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        /**
98d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * Creates a finish runnable that starts the specified intent, using the given
99d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * ActivityOptions.
100d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         */
101d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) {
102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchIntent = launchIntent;
103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchOpts = opts;
104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        @Override
107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void run() {
108d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Mark Recents as no longer visible
109d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            AlternateRecentsComponent.notifyVisibilityChanged(false);
1101e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung            mVisible = false;
111d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Finish Recents
112d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            if (mLaunchIntent != null) {
113d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mLaunchOpts != null) {
114d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, new UserHandle(UserHandle.USER_CURRENT));
115d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                } else {
116d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(),
117d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            new UserHandle(UserHandle.USER_CURRENT));
118d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
119d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            } else {
120d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                finish();
121d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mUseCustomFinishTransition) {
122d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    overridePendingTransition(R.anim.recents_to_launcher_enter,
123d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            R.anim.recents_to_launcher_exit);
124d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
125d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            }
126d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
127d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
128d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
129083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung    // Broadcast receiver to handle messages from AlternateRecentsComponent
1308eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
13147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
13247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
13347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
13410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            if (Console.Enabled) {
13510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                Console.log(Constants.Log.App.SystemUIHandshake,
13610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        "[RecentsActivity|serviceBroadcast]", action, Console.AnsiRed);
13710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            }
138ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            if (action.equals(ACTION_HIDE_RECENTS_ACTIVITY)) {
139ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung                if (intent.getBooleanExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
1406cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    // Dismiss recents, launching the focused task
1416cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    dismissRecentsIfVisible();
1426cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                } else {
143d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // If we are mid-animation into Recents, then reverse it and finish
1448e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    if (mFullScreenOverlayView == null ||
1458e548f7025ce930810479a8e628c325d09557fa3Winson Chung                            !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
146d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        // Otherwise, either finish Recents, or launch Home directly
147d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(context,
148d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
149969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
150d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
151d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
1526cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
153ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            } else if (action.equals(ACTION_TOGGLE_RECENTS_ACTIVITY)) {
154c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                // Try and unfilter and filtered stacks
155c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                if (!mRecentsView.unfilterFilteredStacks()) {
156c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    // If there are no filtered stacks, dismiss recents and launch the first task
157c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    dismissRecentsIfVisible();
158c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                }
159ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            } else if (action.equals(ACTION_START_ENTER_ANIMATION)) {
160521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung                // Try and start the enter animation (or restart it on configuration changed)
161c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                ReferenceCountedTrigger t = new ReferenceCountedTrigger(context, null, null, null);
162c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
163c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                        mFullScreenOverlayView, t));
164d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // Call our callback
165d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                onEnterAnimationTriggered();
16647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
16747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
16847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
169303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1706736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from the system
17131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung    final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() {
1726736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1736736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
17431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            String action = intent.getAction();
1751e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung            if (action.equals(Intent.ACTION_SCREEN_OFF) && mVisible) {
17631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                mFinishLaunchHomeRunnable.run();
17731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
17831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                // Refresh the search widget
17931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                refreshSearchWidget();
18031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            }
181d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
182d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    };
183d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
1848eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    // Debug trigger
1858eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
1868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        @Override
1878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void run() {
1888eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            onDebugModeTriggered();
1898eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
1908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    });
1918eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
192303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
193b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung    void updateRecentsTasks(Intent launchIntent) {
194969f586533096999f10f5587f901949791154fa2Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
195969f586533096999f10f5587f901949791154fa2Winson Chung        SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
196969f586533096999f10f5587f901949791154fa2Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
197969f586533096999f10f5587f901949791154fa2Winson Chung        if (!stacks.isEmpty()) {
198969f586533096999f10f5587f901949791154fa2Winson Chung            mRecentsView.setBSP(root);
199969f586533096999f10f5587f901949791154fa2Winson Chung        }
200969f586533096999f10f5587f901949791154fa2Winson Chung
201b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        // Update the configuration based on the launch intent
202d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromHome = launchIntent.getBooleanExtra(
203d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_HOME, false);
204d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithThumbnail = launchIntent.getBooleanExtra(
205d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_THUMBNAIL, false);
206d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithScreenshot = launchIntent.getBooleanExtra(
207d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_FULL_SCREENSHOT, false);
208d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
209d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
210969f586533096999f10f5587f901949791154fa2Winson Chung        mConfig.launchedWithNoRecentTasks = !root.hasTasks();
2116057c91563402f900dfc7714a46e952d86172e2fWinson Chung        mConfig.launchedToTaskId = launchIntent.getIntExtra(
2126057c91563402f900dfc7714a46e952d86172e2fWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_TASK_ID, -1);
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
214303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Add the default no-recents layout
2158e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mEmptyView == null) {
2168e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mEmptyView = mEmptyViewStub.inflate();
2178e548f7025ce930810479a8e628c325d09557fa3Winson Chung        }
218969f586533096999f10f5587f901949791154fa2Winson Chung        if (mConfig.launchedWithNoRecentTasks) {
219303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
220772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            mRecentsView.setSearchBarVisibility(View.GONE);
221303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
222303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.GONE);
223772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            if (mRecentsView.hasSearchBar()) {
224772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                mRecentsView.setSearchBarVisibility(View.VISIBLE);
225772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            } else {
226772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                addSearchBarAppWidgetView();
227772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            }
228303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
2297aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
2307aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        // Show the scrim if we animate into Recents without window transitions
2317aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        mScrimViews.prepareEnterRecentsAnimation();
232303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
233303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
234f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Attempts to allocate and bind the search bar app widget */
235f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void bindSearchBarAppWidget() {
236814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
237f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
238f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
239f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Reset the host view and widget info
240f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetHostView = null;
241f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetInfo = null;
242f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
243f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Try and load the app widget id from the settings
244d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
245f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
246f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
247f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (mSearchAppWidgetInfo == null) {
248f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // If there is no actual widget associated with that id, then delete it and
249f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // prepare to bind another app widget in its place
250f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
251f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    appWidgetId = -1;
252f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
25310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
25410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
25510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|settings|appWidgetId]",
25610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
25710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
25810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
259f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
260f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
261f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // If there is no id, then bind a new search app widget
262f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId < 0) {
263f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Pair<Integer, AppWidgetProviderInfo> widgetInfo =
264f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        ssp.bindSearchAppWidget(mAppWidgetHost);
265f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (widgetInfo != null) {
26610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    if (Console.Enabled) {
26710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        Console.log(Constants.Log.App.SystemUIHandshake,
26810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "[RecentsActivity|onCreate|searchWidget]",
26910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "Id: " + widgetInfo.first + " Info: " + widgetInfo.second,
27010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                Console.AnsiBlue);
27110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    }
272f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
273f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // Save the app widget id into the settings
274d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    mConfig.updateSearchBarAppWidgetId(this, widgetInfo.first);
275f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    mSearchAppWidgetInfo = widgetInfo.second;
276f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
277f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
278f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
279f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
280f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
281f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Creates the search bar app widget view */
282f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void addSearchBarAppWidgetView() {
283814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
284d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
285f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
28610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
28710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
28810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|addSearchAppWidgetView]",
28910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
29010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
29110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
292f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
293f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        mSearchAppWidgetInfo);
294f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Bundle opts = new Bundle();
295f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
296f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
297f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
298f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                // Set the padding to 0 for this search widget
299f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
300f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(mSearchAppWidgetHostView);
301f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            } else {
302f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(null);
303f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
304f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
305f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
306f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
307303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
30847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean dismissRecentsIfVisible() {
30947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
310d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are mid-animation into Recents, then reverse it and finish
3118e548f7025ce930810479a8e628c325d09557fa3Winson Chung            if (mFullScreenOverlayView == null ||
3128e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
313d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // If we have a focused task, then launch that task
314d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (!mRecentsView.launchFocusedTask()) {
3151f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    if (mConfig.launchedFromHome) {
3161f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Just start the animation out of recents
317d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
318d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
319969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
320d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
3211f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    } else {
3221f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Otherwise, try and launch the first task
3231f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        if (!mRecentsView.launchFirstTask()) {
3241f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                            // If there are no tasks, then just finish recents
325d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            mFinishLaunchHomeRunnable.run();
3261f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        }
327d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
3281e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                }
329303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
33047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
331303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
332303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
333303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
334303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
335303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
336303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
337303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
338303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
33910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
34010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
34110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onCreate]",
34210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    getIntent().getAction() + " visible: " + mVisible, Console.AnsiRed);
34310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
34410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onCreate");
34510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
346303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
347303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
348303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
349d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
350303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
351d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Create the home intent runnable
352d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
353d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addCategory(Intent.CATEGORY_HOME);
354d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
355d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
356d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
357d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                ActivityOptions.makeCustomAnimation(this, R.anim.recents_to_launcher_enter,
358d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        R.anim.recents_to_launcher_exit));
359d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
360f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
361d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
362f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
3638e548f7025ce930810479a8e628c325d09557fa3Winson Chung        // Set the Recents layout
3648e548f7025ce930810479a8e628c325d09557fa3Winson Chung        setContentView(R.layout.recents);
3658e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mRecentsView = (RecentsView) findViewById(R.id.recents_view);
36647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
367653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
368653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
369653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3708e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
3718e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mFullscreenOverlayStub = (ViewStub) findViewById(R.id.fullscreen_overlay_stub);
3728e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mScrimViews = new SystemBarScrimViews(this, mConfig);
373303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
374f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
375f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        bindSearchBarAppWidget();
376772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        // Update the recent tasks
377772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        updateRecentsTasks(getIntent());
378521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
37931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
38031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
38131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
38231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
38331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mSystemBroadcastReceiver, filter);
38431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
38531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register any broadcast receivers for the task loader
38631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
38731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
388cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Private API calls to make the shadows look better
389b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        try {
390cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
391cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f));
392b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (IllegalAccessException e) {
393b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
394b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (InvocationTargetException e) {
395b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
396b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        }
3977aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
3987aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        // Prepare the screenshot transition if necessary
3997aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
4007aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView = (FullscreenTransitionOverlayView) mFullscreenOverlayStub.inflate();
4017aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView.setCallbacks(this);
4027aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
4037aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        }
4046057c91563402f900dfc7714a46e952d86172e2fWinson Chung
4056057c91563402f900dfc7714a46e952d86172e2fWinson Chung        // Update if we are getting a configuration change
4066057c91563402f900dfc7714a46e952d86172e2fWinson Chung        if (savedInstanceState != null) {
4076057c91563402f900dfc7714a46e952d86172e2fWinson Chung            mConfig.updateOnConfigurationChange();
4086057c91563402f900dfc7714a46e952d86172e2fWinson Chung            onConfigurationChange();
4096057c91563402f900dfc7714a46e952d86172e2fWinson Chung        }
410521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
411521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
412521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    void onConfigurationChange() {
413521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        // Try and start the enter animation (or restart it on configuration changed)
414c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
415c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
416c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mFullScreenOverlayView, t));
417d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Call our callback
418d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        onEnterAnimationTriggered();
419303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
420303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
421303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
422303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
423303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
4246057c91563402f900dfc7714a46e952d86172e2fWinson Chung        setIntent(intent);
42547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
42610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
42710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
42810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onNewIntent]",
42910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    intent.getAction() + " visible: " + mVisible, Console.AnsiRed);
43010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
43110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onNewIntent");
43210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
433303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
434303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
435303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
436d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
437303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
438303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
439b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(intent);
440f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
441d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Prepare the screenshot transition if necessary
442d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
4438e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
444d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
445303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
446303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
447303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
448303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
44910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
45010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStart]", "",
45110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
45210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
453303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
45447a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
45531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages from our service
45631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
457ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_HIDE_RECENTS_ACTIVITY);
458ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_TOGGLE_RECENTS_ACTIVITY);
459ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_START_ENTER_ANIMATION);
46031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
461303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
462303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
463303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
464303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
46510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
46610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onResume]", "",
46710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
46810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
469303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
470083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung
471083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        // Start listening for widget package changes if there is one bound, post it since we don't
472083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        // want it stalling the startup
473083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
474083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> callback =
475083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                    new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(this);
476083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            mRecentsView.postDelayed(new Runnable() {
477083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                @Override
478083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                public void run() {
479083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                    RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = callback.get();
480083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                    if (cb != null) {
481083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                        mAppWidgetHost.startListening(cb);
482083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                    }
483083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung                }
484083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung            }, 1);
485083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung        }
48693748a11cba1b44edbc2e888c997533461355594Winson Chung
48793748a11cba1b44edbc2e888c997533461355594Winson Chung        mVisible = true;
4886736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4896736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4906736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4916736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onAttachedToWindow() {
49210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
49310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
49410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onAttachedToWindow]", "",
49510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
49610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4976736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onAttachedToWindow();
498303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
499303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
500303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
5016736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onDetachedFromWindow() {
50210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
50310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
50410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onDetachedFromWindow]", "",
50510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
50610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
5076736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onDetachedFromWindow();
5086736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
5096736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
5106736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
5116736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    protected void onPause() {
51210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
51310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onPause]", "",
51410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
51510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
5166736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onPause();
517303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
518303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
519303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
520303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
52110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
52210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStop]", "",
52310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
52410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
525303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
52647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
52731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the RecentsService receiver
52831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mServiceBroadcastReceiver);
52931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
53031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Stop listening for widget package changes if there was one bound
53131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
53231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            mAppWidgetHost.stopListening();
53331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        }
53447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
53547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
53647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
53747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
53810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
53910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onDestroy]", "",
54010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
54110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
54247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
54331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
54431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the screen off receiver
54531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mSystemBroadcastReceiver);
54631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().unregisterReceivers();
547303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
548303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
549303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
5504d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
5514d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
5524d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
5534d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
5544d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
5554d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
5564d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
5574d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
5581e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
5591e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        if (keyCode == KeyEvent.KEYCODE_TAB) {
5601e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            // Focus the next task in the stack
5611e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            final boolean backward = event.isShiftPressed();
5621e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mRecentsView.focusNextTask(!backward);
5631e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            return true;
564c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
565c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(true);
566c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
567c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
568c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(false);
569c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
5701e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
5718eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        // Pass through the debug trigger
5728eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        mDebugTrigger.onKeyEvent(keyCode);
5731e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
5741e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
5751e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
5761e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
577a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    public void onUserInteraction() {
578a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung        mRecentsView.onUserInteraction();
579a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    }
580a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung
581a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    @Override
582303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
58304d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        // Test mode where back does not do anything
58404d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        if (mConfig.debugModeEnabled) return;
58504d0f756782e697a171aebbb35ae86c86b839a27Winson Chung
586d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // If we are mid-animation into Recents, then reverse it and finish
5878e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mFullScreenOverlayView == null ||
5888e548f7025ce930810479a8e628c325d09557fa3Winson Chung                !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
589d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are currently filtering in any stacks, unfilter them first
590d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            if (!mRecentsView.unfilterFilteredStacks()) {
591d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (mConfig.launchedFromHome) {
592d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Just start the animation out of recents
593d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
594d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            null, mFinishLaunchHomeRunnable, null);
595969f586533096999f10f5587f901949791154fa2Winson Chung                    mRecentsView.startExitToHomeAnimation(
596d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                            new ViewAnimation.TaskViewExitContext(exitTrigger));
597d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                } else {
598d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Otherwise, try and launch the first task
599d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    if (!mRecentsView.launchFirstTask()) {
600d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        // If there are no tasks, then just finish recents
601d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        mFinishLaunchHomeRunnable.run();
602d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
603d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                }
60456f4692a89a1afb2fe40aec8a9b6f26936b8e9a4Winson Chung            }
605303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
606303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
60747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
6088eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when debug mode is triggered */
6098eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void onDebugModeTriggered() {
6108eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        if (mConfig.developerOptionsEnabled) {
6118eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
6128eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
6138eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Disable the debug mode
6148eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
6158eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            } else {
6168eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Enable the debug mode
6178eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
6188eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            }
6198eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion +
6208eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                    ") toggled, please restart Recents now", Toast.LENGTH_SHORT).show();
6218eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
6228eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    }
6238eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
6248eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when the enter recents animation is triggered. */
625521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    public void onEnterAnimationTriggered() {
626cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims in
627cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startEnterRecentsAnimation();
628969f586533096999f10f5587f901949791154fa2Winson Chung    }
629969f586533096999f10f5587f901949791154fa2Winson Chung
6308e548f7025ce930810479a8e628c325d09557fa3Winson Chung    /**** FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks Implementation ****/
631521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
632521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    @Override
6336057c91563402f900dfc7714a46e952d86172e2fWinson Chung    public void onEnterAnimationComplete() {
6346057c91563402f900dfc7714a46e952d86172e2fWinson Chung        // Reset the full screenshot transition view
6356057c91563402f900dfc7714a46e952d86172e2fWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
6366057c91563402f900dfc7714a46e952d86172e2fWinson Chung            mFullScreenOverlayView.reset();
637d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
6386057c91563402f900dfc7714a46e952d86172e2fWinson Chung            // Recycle the full screen screenshot
6396057c91563402f900dfc7714a46e952d86172e2fWinson Chung            AlternateRecentsComponent.consumeLastScreenshot();
640d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
641d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    }
642d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
643d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsView.RecentsViewCallbacks Implementation ****/
644d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
645d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
646cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    public void onExitToHomeAnimationTriggered() {
647cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims out
648cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startExitRecentsAnimation();
649d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
650d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
651d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    @Override
6527aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onTaskViewClicked() {
6539214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        // Mark recents as no longer visible
6549214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        AlternateRecentsComponent.notifyVisibilityChanged(false);
6551e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung        mVisible = false;
65647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
657f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
658d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    @Override
6597aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onAllTaskViewsDismissed() {
660d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        mFinishLaunchHomeRunnable.run();
661d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    }
662d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung
663d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
664d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
665f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
666d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void refreshSearchWidget() {
667d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Load the Search widget again
668d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        bindSearchBarAppWidget();
669d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        addSearchBarAppWidgetView();
670f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
671303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
672