RecentsActivity.java revision 1e44934f0213caf5c434f63a69c9f05fa76e891d
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
51b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chungimport java.lang.reflect.InvocationTargetException;
52303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* Activity */
55f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
56d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
578e548f7025ce930810479a8e628c325d09557fa3Winson Chung        FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks {
58d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
59ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String EXTRA_TRIGGERED_FROM_ALT_TAB = "extra_triggered_from_alt_tab";
60ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
61ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
62ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung    final static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
63ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung
64cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsView mRecentsView;
65cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    SystemBarScrimViews mScrimViews;
668e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mEmptyViewStub;
67cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    View mEmptyView;
688e548f7025ce930810479a8e628c325d09557fa3Winson Chung    ViewStub mFullscreenOverlayStub;
698e548f7025ce930810479a8e628c325d09557fa3Winson Chung    FullscreenTransitionOverlayView mFullScreenOverlayView;
70cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
71cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsConfiguration mConfig;
72cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
73cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    RecentsAppWidgetHost mAppWidgetHost;
74cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetProviderInfo mSearchAppWidgetInfo;
75cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    AppWidgetHostView mSearchAppWidgetHostView;
76cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
77cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    boolean mVisible;
78cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
79cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    // Runnables to finish the Recents activity
80cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true);
81cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    FinishRecentsRunnable mFinishLaunchHomeRunnable;
82cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung
83d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**
84d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * A Runnable to finish Recents either with/without a transition, and either by calling finish()
85d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     * or just launching the specified intent.
86d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung     */
87d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    class FinishRecentsRunnable implements Runnable {
88d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        boolean mUseCustomFinishTransition;
89d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent mLaunchIntent;
90d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        ActivityOptions mLaunchOpts;
91d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
92d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(boolean withTransition) {
93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mUseCustomFinishTransition = withTransition;
94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
96d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        /**
97d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * Creates a finish runnable that starts the specified intent, using the given
98d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         * ActivityOptions.
99d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung         */
100d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) {
101d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchIntent = launchIntent;
102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            mLaunchOpts = opts;
103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        @Override
106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        public void run() {
107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Mark Recents as no longer visible
108d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            AlternateRecentsComponent.notifyVisibilityChanged(false);
1091e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung            mVisible = false;
110d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            // Finish Recents
111d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            if (mLaunchIntent != null) {
112d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mLaunchOpts != null) {
113d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, new UserHandle(UserHandle.USER_CURRENT));
114d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                } else {
115d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(),
116d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            new UserHandle(UserHandle.USER_CURRENT));
117d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
118d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            } else {
119d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                finish();
120d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                if (mUseCustomFinishTransition) {
121d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                    overridePendingTransition(R.anim.recents_to_launcher_enter,
122d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            R.anim.recents_to_launcher_exit);
123d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                }
124d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung            }
125d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        }
126d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
127d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
1286736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from our RecentsService
1298eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
13047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
13147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
13247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
13310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            if (Console.Enabled) {
13410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                Console.log(Constants.Log.App.SystemUIHandshake,
13510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        "[RecentsActivity|serviceBroadcast]", action, Console.AnsiRed);
13610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            }
137ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            if (action.equals(ACTION_HIDE_RECENTS_ACTIVITY)) {
138ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung                if (intent.getBooleanExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
1396cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    // Dismiss recents, launching the focused task
1406cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    dismissRecentsIfVisible();
1416cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                } else {
142d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // If we are mid-animation into Recents, then reverse it and finish
1438e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    if (mFullScreenOverlayView == null ||
1448e548f7025ce930810479a8e628c325d09557fa3Winson Chung                            !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
145d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        // Otherwise, either finish Recents, or launch Home directly
146d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(context,
147d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
148969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
149d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
150d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
1516cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
152ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            } else if (action.equals(ACTION_TOGGLE_RECENTS_ACTIVITY)) {
153c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                // Try and unfilter and filtered stacks
154c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                if (!mRecentsView.unfilterFilteredStacks()) {
155c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    // If there are no filtered stacks, dismiss recents and launch the first task
156c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    dismissRecentsIfVisible();
157c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                }
158ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung            } else if (action.equals(ACTION_START_ENTER_ANIMATION)) {
159521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung                // Try and start the enter animation (or restart it on configuration changed)
160c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                ReferenceCountedTrigger t = new ReferenceCountedTrigger(context, null, null, null);
161c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
162c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                        mFullScreenOverlayView, t));
163d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // Call our callback
164d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                onEnterAnimationTriggered();
16547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
16647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
16747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
168303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1696736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from the system
17031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung    final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() {
1716736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1726736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
17331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            String action = intent.getAction();
1741e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung            if (action.equals(Intent.ACTION_SCREEN_OFF) && mVisible) {
17531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                mFinishLaunchHomeRunnable.run();
17631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
17731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                // Refresh the search widget
17831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung                refreshSearchWidget();
17931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            }
180d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
181d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    };
182d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
1838eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    // Debug trigger
1848eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
1858eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        @Override
1868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        public void run() {
1878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            onDebugModeTriggered();
1888eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
1898eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    });
1908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
191303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
192b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung    void updateRecentsTasks(Intent launchIntent) {
193969f586533096999f10f5587f901949791154fa2Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
194969f586533096999f10f5587f901949791154fa2Winson Chung        SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
195969f586533096999f10f5587f901949791154fa2Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
196969f586533096999f10f5587f901949791154fa2Winson Chung        if (!stacks.isEmpty()) {
197969f586533096999f10f5587f901949791154fa2Winson Chung            mRecentsView.setBSP(root);
198969f586533096999f10f5587f901949791154fa2Winson Chung        }
199969f586533096999f10f5587f901949791154fa2Winson Chung
200b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        // Update the configuration based on the launch intent
201d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromHome = launchIntent.getBooleanExtra(
202d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_HOME, false);
203d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithThumbnail = launchIntent.getBooleanExtra(
204d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_THUMBNAIL, false);
205d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedFromAppWithScreenshot = launchIntent.getBooleanExtra(
206d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_APP_FULL_SCREENSHOT, false);
207d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
208d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
209969f586533096999f10f5587f901949791154fa2Winson Chung        mConfig.launchedWithNoRecentTasks = !root.hasTasks();
2106057c91563402f900dfc7714a46e952d86172e2fWinson Chung        mConfig.launchedToTaskId = launchIntent.getIntExtra(
2116057c91563402f900dfc7714a46e952d86172e2fWinson Chung                AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_TASK_ID, -1);
212303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Add the default no-recents layout
2148e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mEmptyView == null) {
2158e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mEmptyView = mEmptyViewStub.inflate();
2168e548f7025ce930810479a8e628c325d09557fa3Winson Chung        }
217969f586533096999f10f5587f901949791154fa2Winson Chung        if (mConfig.launchedWithNoRecentTasks) {
218303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
219772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            mRecentsView.setSearchBarVisibility(View.GONE);
220303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
221303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.GONE);
222772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            if (mRecentsView.hasSearchBar()) {
223772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                mRecentsView.setSearchBarVisibility(View.VISIBLE);
224772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            } else {
225772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung                addSearchBarAppWidgetView();
226772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung            }
227303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
2287aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
2297aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        // Show the scrim if we animate into Recents without window transitions
2307aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        mScrimViews.prepareEnterRecentsAnimation();
231303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
232303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
233f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Attempts to allocate and bind the search bar app widget */
234f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void bindSearchBarAppWidget() {
235814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
236f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
237f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
238f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Reset the host view and widget info
239f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetHostView = null;
240f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetInfo = null;
241f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
242f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Try and load the app widget id from the settings
243d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
244f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
245f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
246f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (mSearchAppWidgetInfo == null) {
247f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // If there is no actual widget associated with that id, then delete it and
248f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // prepare to bind another app widget in its place
249f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
250f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    appWidgetId = -1;
251f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
25210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
25310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
25410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|settings|appWidgetId]",
25510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
25610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
25710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
258f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
259f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
260f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // If there is no id, then bind a new search app widget
261f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId < 0) {
262f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Pair<Integer, AppWidgetProviderInfo> widgetInfo =
263f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        ssp.bindSearchAppWidget(mAppWidgetHost);
264f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (widgetInfo != null) {
26510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    if (Console.Enabled) {
26610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        Console.log(Constants.Log.App.SystemUIHandshake,
26710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "[RecentsActivity|onCreate|searchWidget]",
26810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "Id: " + widgetInfo.first + " Info: " + widgetInfo.second,
26910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                Console.AnsiBlue);
27010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    }
271f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
272f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // Save the app widget id into the settings
273d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    mConfig.updateSearchBarAppWidgetId(this, widgetInfo.first);
274f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    mSearchAppWidgetInfo = widgetInfo.second;
275f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
276f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
277f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
278f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
279f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
280f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Creates the search bar app widget view */
281f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void addSearchBarAppWidgetView() {
282814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
283d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            int appWidgetId = mConfig.searchBarAppWidgetId;
284f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
28510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
28610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
28710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|addSearchAppWidgetView]",
28810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
28910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
29010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
291f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
292f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        mSearchAppWidgetInfo);
293f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Bundle opts = new Bundle();
294f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
295f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
296f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
297f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                // Set the padding to 0 for this search widget
298f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
299f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(mSearchAppWidgetHostView);
300f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            } else {
301f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(null);
302f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
303f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
304f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
305f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
306303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
30747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean dismissRecentsIfVisible() {
30847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
309d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are mid-animation into Recents, then reverse it and finish
3108e548f7025ce930810479a8e628c325d09557fa3Winson Chung            if (mFullScreenOverlayView == null ||
3118e548f7025ce930810479a8e628c325d09557fa3Winson Chung                    !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
312d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                // If we have a focused task, then launch that task
313d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (!mRecentsView.launchFocusedTask()) {
3141f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    if (mConfig.launchedFromHome) {
3151f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Just start the animation out of recents
316d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
317d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                                null, mFinishLaunchHomeRunnable, null);
318969f586533096999f10f5587f901949791154fa2Winson Chung                        mRecentsView.startExitToHomeAnimation(
319d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                                new ViewAnimation.TaskViewExitContext(exitTrigger));
3201f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                    } else {
3211f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        // Otherwise, try and launch the first task
3221f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        if (!mRecentsView.launchFirstTask()) {
3231f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                            // If there are no tasks, then just finish recents
324d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            mFinishLaunchHomeRunnable.run();
3251f76132d4dc0d96bf34d8580064b8dadf24eb9f4Winson Chung                        }
326d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
3271e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                }
328303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
32947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
330303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
331303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
332303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
333303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
334303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
335303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
336303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
337303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
33810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
33910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
34010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onCreate]",
34110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    getIntent().getAction() + " visible: " + mVisible, Console.AnsiRed);
34210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
34310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onCreate");
34410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
345303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
346303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
347303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
348d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
349303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
350d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Create the home intent runnable
351d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
352d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addCategory(Intent.CATEGORY_HOME);
353d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
354d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
355d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent,
356d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                ActivityOptions.makeCustomAnimation(this, R.anim.recents_to_launcher_enter,
357d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        R.anim.recents_to_launcher_exit));
358d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
359f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
360d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId);
361f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
3628e548f7025ce930810479a8e628c325d09557fa3Winson Chung        // Set the Recents layout
3638e548f7025ce930810479a8e628c325d09557fa3Winson Chung        setContentView(R.layout.recents);
3648e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mRecentsView = (RecentsView) findViewById(R.id.recents_view);
36547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
366653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
367653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
368653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3698e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub);
3708e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mFullscreenOverlayStub = (ViewStub) findViewById(R.id.fullscreen_overlay_stub);
3718e548f7025ce930810479a8e628c325d09557fa3Winson Chung        mScrimViews = new SystemBarScrimViews(this, mConfig);
372303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
373f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
374f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        bindSearchBarAppWidget();
375772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        // Update the recent tasks
376772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung        updateRecentsTasks(getIntent());
377521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
37831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
37931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
38031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
38131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
38231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mSystemBroadcastReceiver, filter);
38331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
38431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register any broadcast receivers for the task loader
38531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
38631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
387cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Private API calls to make the shadows look better
388b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        try {
389cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
390cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung            Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f));
391b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (IllegalAccessException e) {
392b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
393b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        } catch (InvocationTargetException e) {
394b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung            e.printStackTrace();
395b13c46e8b78272c4398068eed41f49ee4d403bccWinson Chung        }
3967aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung
3977aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        // Prepare the screenshot transition if necessary
3987aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
3997aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView = (FullscreenTransitionOverlayView) mFullscreenOverlayStub.inflate();
4007aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView.setCallbacks(this);
4017aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
4027aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung        }
4036057c91563402f900dfc7714a46e952d86172e2fWinson Chung
4046057c91563402f900dfc7714a46e952d86172e2fWinson Chung        // Update if we are getting a configuration change
4056057c91563402f900dfc7714a46e952d86172e2fWinson Chung        if (savedInstanceState != null) {
4066057c91563402f900dfc7714a46e952d86172e2fWinson Chung            mConfig.updateOnConfigurationChange();
4076057c91563402f900dfc7714a46e952d86172e2fWinson Chung            onConfigurationChange();
4086057c91563402f900dfc7714a46e952d86172e2fWinson Chung        }
409521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
410521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
411521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    void onConfigurationChange() {
412521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung        // Try and start the enter animation (or restart it on configuration changed)
413c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
414c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(
415c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung                mFullScreenOverlayView, t));
416d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Call our callback
417d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        onEnterAnimationTriggered();
418303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
419303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
420303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
421303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
422303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
4236057c91563402f900dfc7714a46e952d86172e2fWinson Chung        setIntent(intent);
42447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
42510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
42610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
42710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onNewIntent]",
42810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    intent.getAction() + " visible: " + mVisible, Console.AnsiRed);
42910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
43010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onNewIntent");
43110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
432303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
433303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
434303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
435d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        mConfig = RecentsConfiguration.reinitialize(this);
436303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
437303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
438b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(intent);
439f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
440d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // Prepare the screenshot transition if necessary
441d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
4428e548f7025ce930810479a8e628c325d09557fa3Winson Chung            mFullScreenOverlayView.prepareAnimateOnEnterRecents(AlternateRecentsComponent.getLastScreenshot());
443d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
444303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
445303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
446303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
447303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
44810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
44910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStart]", "",
45010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
45110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
452303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
45347a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
45431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Register the broadcast receiver to handle messages from our service
45531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        IntentFilter filter = new IntentFilter();
456ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_HIDE_RECENTS_ACTIVITY);
457ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_TOGGLE_RECENTS_ACTIVITY);
458ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chung        filter.addAction(ACTION_START_ENTER_ANIMATION);
45931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
46031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
46131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Start listening for widget package changes if there is one bound
46231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
46331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            mAppWidgetHost.startListening(this);
46431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        }
46531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
466303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = true;
467303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
468303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
469303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
470303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
47110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
47210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onResume]", "",
47310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
47410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
475303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
4766736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4776736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4786736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4796736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onAttachedToWindow() {
48010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
48110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
48210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onAttachedToWindow]", "",
48310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
48410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4856736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onAttachedToWindow();
486303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
487303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
488303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
4896736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onDetachedFromWindow() {
49010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
49110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
49210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onDetachedFromWindow]", "",
49310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
49410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
4956736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onDetachedFromWindow();
4966736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
4976736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
4986736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
4996736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    protected void onPause() {
50010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
50110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onPause]", "",
50210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
50310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
5046736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onPause();
505303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
506303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
507303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
508303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
50910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
51010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStop]", "",
51110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
51210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
513303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
51447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
51531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the RecentsService receiver
51631d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mServiceBroadcastReceiver);
51731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
51831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Stop listening for widget package changes if there was one bound
51931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        if (mConfig.searchBarAppWidgetId >= 0) {
52031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung            mAppWidgetHost.stopListening();
52131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        }
52247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
52347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
52447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
52547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
52610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
52710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onDestroy]", "",
52810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
52910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
53047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
53131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung
53231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        // Unregister the screen off receiver
53331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        unregisterReceiver(mSystemBroadcastReceiver);
53431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung        RecentsTaskLoader.getInstance().unregisterReceivers();
535303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
536303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
537303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
5384d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
5394d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
5404d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
5414d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
5424d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
5434d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
5444d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
5454d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
5461e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
5471e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        if (keyCode == KeyEvent.KEYCODE_TAB) {
5481e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            // Focus the next task in the stack
5491e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            final boolean backward = event.isShiftPressed();
5501e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mRecentsView.focusNextTask(!backward);
5511e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            return true;
552c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
553c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(true);
554c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
555c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung        } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
556c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            mRecentsView.focusNextTask(false);
557c6011deffc80eaee6dfb1c7975e050bc71e5ea96Winson Chung            return true;
5581e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
5598eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        // Pass through the debug trigger
5608eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        mDebugTrigger.onKeyEvent(keyCode);
5611e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
5621e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
5631e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
5641e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
565a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    public void onUserInteraction() {
566a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung        mRecentsView.onUserInteraction();
567a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    }
568a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung
569a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung    @Override
570303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
57104d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        // Test mode where back does not do anything
57204d0f756782e697a171aebbb35ae86c86b839a27Winson Chung        if (mConfig.debugModeEnabled) return;
57304d0f756782e697a171aebbb35ae86c86b839a27Winson Chung
574d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        // If we are mid-animation into Recents, then reverse it and finish
5758e548f7025ce930810479a8e628c325d09557fa3Winson Chung        if (mFullScreenOverlayView == null ||
5768e548f7025ce930810479a8e628c325d09557fa3Winson Chung                !mFullScreenOverlayView.cancelAnimateOnEnterRecents(mFinishRunnable)) {
577d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            // If we are currently filtering in any stacks, unfilter them first
578d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung            if (!mRecentsView.unfilterFilteredStacks()) {
579d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                if (mConfig.launchedFromHome) {
580d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Just start the animation out of recents
581d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
582d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                            null, mFinishLaunchHomeRunnable, null);
583969f586533096999f10f5587f901949791154fa2Winson Chung                    mRecentsView.startExitToHomeAnimation(
584d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                            new ViewAnimation.TaskViewExitContext(exitTrigger));
585d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                } else {
586d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    // Otherwise, try and launch the first task
587d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    if (!mRecentsView.launchFirstTask()) {
588d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                        // If there are no tasks, then just finish recents
589d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung                        mFinishLaunchHomeRunnable.run();
590d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                    }
591d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung                }
59256f4692a89a1afb2fe40aec8a9b6f26936b8e9a4Winson Chung            }
593303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
594303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
59547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
5968eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when debug mode is triggered */
5978eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    public void onDebugModeTriggered() {
5988eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        if (mConfig.developerOptionsEnabled) {
5998eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
6008eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
6018eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Disable the debug mode
6028eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
6038eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            } else {
6048eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                // Enable the debug mode
6058eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
6068eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            }
6078eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung            Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion +
6088eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung                    ") toggled, please restart Recents now", Toast.LENGTH_SHORT).show();
6098eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung        }
6108eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    }
6118eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung
6128eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung    /** Called when the enter recents animation is triggered. */
613521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    public void onEnterAnimationTriggered() {
614cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims in
615cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startEnterRecentsAnimation();
616969f586533096999f10f5587f901949791154fa2Winson Chung    }
617969f586533096999f10f5587f901949791154fa2Winson Chung
6188e548f7025ce930810479a8e628c325d09557fa3Winson Chung    /**** FullscreenTransitionOverlayView.FullScreenTransitionViewCallbacks Implementation ****/
619521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
620521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    @Override
6216057c91563402f900dfc7714a46e952d86172e2fWinson Chung    public void onEnterAnimationComplete() {
6226057c91563402f900dfc7714a46e952d86172e2fWinson Chung        // Reset the full screenshot transition view
6236057c91563402f900dfc7714a46e952d86172e2fWinson Chung        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
6246057c91563402f900dfc7714a46e952d86172e2fWinson Chung            mFullScreenOverlayView.reset();
625d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
6266057c91563402f900dfc7714a46e952d86172e2fWinson Chung            // Recycle the full screen screenshot
6276057c91563402f900dfc7714a46e952d86172e2fWinson Chung            AlternateRecentsComponent.consumeLastScreenshot();
628d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung        }
629d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    }
630d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung
631d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsView.RecentsViewCallbacks Implementation ****/
632d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
633d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    @Override
634cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung    public void onExitToHomeAnimationTriggered() {
635cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        // Animate the scrims out
636cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung        mScrimViews.startExitRecentsAnimation();
637d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    }
638d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
639d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    @Override
6407aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onTaskViewClicked() {
6419214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        // Mark recents as no longer visible
6429214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung        AlternateRecentsComponent.notifyVisibilityChanged(false);
6431e44934f0213caf5c434f63a69c9f05fa76e891dWinson Chung        mVisible = false;
64447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
645f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
646d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    @Override
6477aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung    public void onAllTaskViewsDismissed() {
648d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung        mFinishLaunchHomeRunnable.run();
649d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung    }
650d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung
651d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
652d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung
653f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
654d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung    public void refreshSearchWidget() {
655d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        // Load the Search widget again
656d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        bindSearchBarAppWidget();
657d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung        addSearchBarAppWidgetView();
658f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
659303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
660