RecentsActivity.java revision 24cf152483c03dc446875c8d6440348174317bc5
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;
20f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetHost;
21f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetHostView;
22f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetManager;
23f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetProviderInfo;
2447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.BroadcastReceiver;
259f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chungimport android.content.ComponentName;
2647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.Context;
27303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent;
2847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.IntentFilter;
29303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle;
30f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.util.Pair;
311e8d71b605b4872e93200706a80a88a3ff25498cWinson Chungimport android.view.KeyEvent;
32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.LayoutInflater;
33303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View;
34303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.WindowManager;
35303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.widget.FrameLayout;
3647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R;
37303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.SpaceNode;
38303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
39303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
40303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
41303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
429f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chungimport java.util.Set;
43303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
44f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung/** Our special app widget host */
45f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungclass RecentsAppWidgetHost extends AppWidgetHost {
46f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /* Callbacks to notify when an app package changes */
47f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    interface RecentsAppWidgetHostCallbacks {
48f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        public void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo);
49f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
50f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
51f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    RecentsAppWidgetHostCallbacks mCb;
52f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
53f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    public RecentsAppWidgetHost(Context context, int hostId, RecentsAppWidgetHostCallbacks cb) {
54f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        super(context, hostId);
55f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        mCb = cb;
56f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
57f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
58f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
59f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidget) {
60f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        mCb.onProviderChanged(appWidgetId, appWidget);
61f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
62f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung}
63303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
64303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* Activity */
65f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks,
669f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chung        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks {
67303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    FrameLayout mContainerView;
68303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    RecentsView mRecentsView;
69303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    View mEmptyView;
7047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
71f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    AppWidgetHost mAppWidgetHost;
72f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    AppWidgetProviderInfo mSearchAppWidgetInfo;
73f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    AppWidgetHostView mSearchAppWidgetHostView;
74f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
75303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    boolean mVisible;
7647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean mTaskLaunched;
7747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
786736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from our RecentsService
7947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
8047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
8147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
8247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
8310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            if (Console.Enabled) {
8410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                Console.log(Constants.Log.App.SystemUIHandshake,
8510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        "[RecentsActivity|serviceBroadcast]", action, Console.AnsiRed);
8610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            }
871e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            if (action.equals(RecentsService.ACTION_HIDE_RECENTS_ACTIVITY)) {
886cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                if (intent.getBooleanExtra(RecentsService.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
896cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    // Dismiss recents, launching the focused task
906cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    dismissRecentsIfVisible();
916cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                } else {
926cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    // Otherwise, just finish the activity without launching any other activities
936cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                    finish();
946cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung                }
951e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            } else if (action.equals(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
96c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                // Try and unfilter and filtered stacks
97c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                if (!mRecentsView.unfilterFilteredStacks()) {
98c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    // If there are no filtered stacks, dismiss recents and launch the first task
99c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    dismissRecentsIfVisible();
100c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                }
10124cf152483c03dc446875c8d6440348174317bc5Winson Chung            } else if (action.equals(RecentsService.ACTION_START_ENTER_ANIMATION)) {
10224cf152483c03dc446875c8d6440348174317bc5Winson Chung                // Try and start the enter animation
10324cf152483c03dc446875c8d6440348174317bc5Winson Chung                mRecentsView.startOnEnterAnimation();
10447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
10547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
10647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
107303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
1086736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    // Broadcast receiver to handle messages from the system
1096736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
1106736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        @Override
1116736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        public void onReceive(Context context, Intent intent) {
1126736905dc0e10689f7c63f6da43b31325caf966aWinson Chung            finish();
1136736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        }
1146736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    };
1156736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
116303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
117b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung    void updateRecentsTasks(Intent launchIntent) {
118b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        // Update the configuration based on the launch intent
119b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        RecentsConfiguration config = RecentsConfiguration.getInstance();
120b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        config.launchedWithThumbnailAnimation = launchIntent.getBooleanExtra(
121b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung                AlternateRecentsComponent.EXTRA_ANIMATING_WITH_THUMBNAIL, false);
1221e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        config.launchedFromAltTab = launchIntent.getBooleanExtra(
1231e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                AlternateRecentsComponent.EXTRA_FROM_ALT_TAB, false);
124b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung
125303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
126303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
127303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
128303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (!stacks.isEmpty()) {
129303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mRecentsView.setBSP(root);
130303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
131303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
132303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Add the default no-recents layout
133303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (stacks.size() == 1 && stacks.get(0).getTaskCount() == 0) {
134303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
135303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
136303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            // Dim the background even more
137303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            WindowManager.LayoutParams wlp = getWindow().getAttributes();
138303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            wlp.dimAmount = Constants.Values.Window.DarkBackgroundDim;
139303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            getWindow().setAttributes(wlp);
140303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
141303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
142303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.GONE);
1431492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung
1441492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung            // Un-dim the background
1451492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung            WindowManager.LayoutParams wlp = getWindow().getAttributes();
1461492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung            wlp.dimAmount = 0f;
1471492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung            getWindow().setAttributes(wlp);
1481492646b792360945fba6bdcacc6aa7c19c6618eWinson Chung            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
149303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
150303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
151303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
152f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Attempts to allocate and bind the search bar app widget */
153f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void bindSearchBarAppWidget() {
154814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
155f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            RecentsConfiguration config = RecentsConfiguration.getInstance();
156f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
157f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
158f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Reset the host view and widget info
159f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetHostView = null;
160f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            mSearchAppWidgetInfo = null;
161f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
162f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Try and load the app widget id from the settings
163f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            int appWidgetId = config.searchBarAppWidgetId;
164f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
165f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetInfo = ssp.getAppWidgetInfo(appWidgetId);
166f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (mSearchAppWidgetInfo == null) {
167f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // If there is no actual widget associated with that id, then delete it and
168f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // prepare to bind another app widget in its place
169f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
170f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    appWidgetId = -1;
171f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
17210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
17310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
17410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|settings|appWidgetId]",
17510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
17610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
17710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
178f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
179f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
180f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // If there is no id, then bind a new search app widget
181f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId < 0) {
182f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Pair<Integer, AppWidgetProviderInfo> widgetInfo =
183f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        ssp.bindSearchAppWidget(mAppWidgetHost);
184f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                if (widgetInfo != null) {
18510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    if (Console.Enabled) {
18610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                        Console.log(Constants.Log.App.SystemUIHandshake,
18710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "[RecentsActivity|onCreate|searchWidget]",
18810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                "Id: " + widgetInfo.first + " Info: " + widgetInfo.second,
18910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                                Console.AnsiBlue);
19010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    }
191f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
192f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    // Save the app widget id into the settings
193f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    config.updateSearchBarAppWidgetId(this, widgetInfo.first);
194f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                    mSearchAppWidgetInfo = widgetInfo.second;
195f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                }
196f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
197f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
198f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
199f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
200f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /** Creates the search bar app widget view */
201f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    void addSearchBarAppWidgetView() {
202814086db674d8eb298541b7e601e29c5c68e2074Winson Chung        if (Constants.DebugFlags.App.EnableSearchLayout) {
203f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            RecentsConfiguration config = RecentsConfiguration.getInstance();
204f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            int appWidgetId = config.searchBarAppWidgetId;
205f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            if (appWidgetId >= 0) {
20610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                if (Console.Enabled) {
20710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.log(Constants.Log.App.SystemUIHandshake,
20810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "[RecentsActivity|onCreate|addSearchAppWidgetView]",
20910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            "Id: " + appWidgetId,
21010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                            Console.AnsiBlue);
21110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                }
212f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId,
213f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        mSearchAppWidgetInfo);
214f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                Bundle opts = new Bundle();
215f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
216f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                        AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS);
217f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.updateAppWidgetOptions(opts);
218f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                // Set the padding to 0 for this search widget
219f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mSearchAppWidgetHostView.setPadding(0, 0, 0, 0);
220f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(mSearchAppWidgetHostView);
221f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            } else {
222f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung                mRecentsView.setSearchBar(null);
223f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            }
224f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
225f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
226f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
227303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
22847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean dismissRecentsIfVisible() {
22947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
2301e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            if (!mRecentsView.launchFocusedTask()) {
2311e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                if (!mRecentsView.launchFirstTask()) {
2321e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                    finish();
2331e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                }
234303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
23547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
236303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
237303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
238303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
239303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
240303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
241303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
242303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
243303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
24410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
24510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
24610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onCreate]",
24710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    getIntent().getAction() + " visible: " + mVisible, Console.AnsiRed);
24810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
24910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onCreate");
25010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
251303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
252303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
253303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
254303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsConfiguration.reinitialize(this);
255303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
256f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Initialize the widget host (the host id is static and does not change)
257f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId, this);
258f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
259303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Create the view hierarchy
260303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mRecentsView = new RecentsView(this);
26147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
262303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mRecentsView.setLayoutParams(new FrameLayout.LayoutParams(
263303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                FrameLayout.LayoutParams.MATCH_PARENT,
264303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                FrameLayout.LayoutParams.MATCH_PARENT));
265653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung        mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
266653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
267653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
268303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
269303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Create the empty view
270303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        LayoutInflater inflater = LayoutInflater.from(this);
271303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mEmptyView = inflater.inflate(R.layout.recents_empty, mContainerView, false);
272303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
273303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView = new FrameLayout(this);
274303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView.addView(mRecentsView);
275303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView.addView(mEmptyView);
276303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        setContentView(mContainerView);
277303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
278303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
279b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(getIntent());
280f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
281f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Bind the search app widget when we first start up
282f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        bindSearchBarAppWidget();
283f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Add the search bar layout
284f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        addSearchBarAppWidgetView();
285303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
286303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
287303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
288303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
289303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
29047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Reset the task launched flag if we encounter an onNewIntent() before onStop()
29147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
29247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
29310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
29410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logDivider(Constants.Log.App.SystemUIHandshake);
29510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onNewIntent]",
29610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    intent.getAction() + " visible: " + mVisible, Console.AnsiRed);
29710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.logTraceTime(Constants.Log.App.TimeRecentsStartup,
29810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Constants.Log.App.TimeRecentsStartupKey, "onNewIntent");
29910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
300303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
301303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
302303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
303303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsConfiguration.reinitialize(this);
304303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
305303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
306b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung        updateRecentsTasks(intent);
307f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
308f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        // Don't attempt to rebind the search bar widget, but just add the search bar layout
309f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        addSearchBarAppWidgetView();
310303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
311303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
312303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
313303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
31410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
31510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStart]", "",
31610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
31710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
318303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
31947a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
32047a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        // Start listening for widget package changes if there is one bound
32147a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        RecentsConfiguration config = RecentsConfiguration.getInstance();
32247a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        if (config.searchBarAppWidgetId >= 0) {
32347a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung            mAppWidgetHost.startListening();
32447a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        }
32547a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
326303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = true;
327303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
328303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
329303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
330303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
33110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
33210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onResume]", "",
33310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
33410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
335303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
3366736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
3376736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
3386736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
3396736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onAttachedToWindow() {
34010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
34110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
34210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onAttachedToWindow]", "",
34310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
34410f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
3456736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onAttachedToWindow();
34647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
34747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Register the broadcast receiver to handle messages from our service
34847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        IntentFilter filter = new IntentFilter();
3491e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        filter.addAction(RecentsService.ACTION_HIDE_RECENTS_ACTIVITY);
35047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        filter.addAction(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY);
35124cf152483c03dc446875c8d6440348174317bc5Winson Chung        filter.addAction(RecentsService.ACTION_START_ENTER_ANIMATION);
35247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
3536736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
3546736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        // Register the broadcast receiver to handle messages when the screen is turned off
3556736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        filter = new IntentFilter();
3566736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        filter.addAction(Intent.ACTION_SCREEN_OFF);
3576736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        registerReceiver(mScreenOffReceiver, filter);
3589f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chung
3599f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chung        // Register any broadcast receivers for the task loader
3609f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chung        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
361303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
362303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
363303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
3646736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    public void onDetachedFromWindow() {
36510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
36610f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake,
36710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    "[RecentsActivity|onDetachedFromWindow]", "",
36810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
36910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
3706736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onDetachedFromWindow();
371303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
37247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Unregister any broadcast receivers we have registered
37347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        unregisterReceiver(mServiceBroadcastReceiver);
3746736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        unregisterReceiver(mScreenOffReceiver);
3759f49df933f01a32d04bdf92d53c943065aa8ddf7Winson Chung        RecentsTaskLoader.getInstance().unregisterReceivers();
3766736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    }
3776736905dc0e10689f7c63f6da43b31325caf966aWinson Chung
3786736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    @Override
3796736905dc0e10689f7c63f6da43b31325caf966aWinson Chung    protected void onPause() {
38010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
38110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onPause]", "",
38210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
38310f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
3846736905dc0e10689f7c63f6da43b31325caf966aWinson Chung        super.onPause();
385303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
386303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
387303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
388303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
38910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
39010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onStop]", "",
39110f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
39210f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
393303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
39447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
39547a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        // Stop listening for widget package changes if there was one bound
39647a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        RecentsConfiguration config = RecentsConfiguration.getInstance();
39747a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        if (config.searchBarAppWidgetId >= 0) {
39847a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung            mAppWidgetHost.stopListening();
39947a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung        }
40047a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung
401303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = false;
40247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
40347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
40447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
40547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
40647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
40710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        if (Console.Enabled) {
40810f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung            Console.log(Constants.Log.App.SystemUIHandshake, "[RecentsActivity|onDestroy]", "",
40910f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung                    Console.AnsiRed);
41010f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung        }
41147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
412303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
413303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
414303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
4154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
4164d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
4174d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
4184d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
4194d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
4204d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
4214d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
4224d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
4231e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    public boolean onKeyDown(int keyCode, KeyEvent event) {
4241e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        if (keyCode == KeyEvent.KEYCODE_TAB) {
4251e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            // Focus the next task in the stack
4261e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            final boolean backward = event.isShiftPressed();
4271e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mRecentsView.focusNextTask(!backward);
4281e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            return true;
4291e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
4301e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
4311e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        return super.onKeyDown(keyCode, event);
4321e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
4331e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
4341e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    @Override
435303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
4369f9679d91ee5f067cd5dcbf4d780a1f5b522e4baWinson Chung        boolean interceptedByInfoPanelClose = false;
4379f9679d91ee5f067cd5dcbf4d780a1f5b522e4baWinson Chung
438863db8a4e7906826bc105f49a4596dc7b336088aWinson Chung        // Unfilter any stacks
439863db8a4e7906826bc105f49a4596dc7b336088aWinson Chung        if (!mRecentsView.unfilterFilteredStacks()) {
440863db8a4e7906826bc105f49a4596dc7b336088aWinson Chung            super.onBackPressed();
441303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
442303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
44347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
44447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
44547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    public void onTaskLaunching() {
44647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = true;
44747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
448f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
449f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    @Override
450f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    public void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo) {
451f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        RecentsConfiguration config = RecentsConfiguration.getInstance();
452f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy();
453f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        if (appWidgetId > -1 && appWidgetId == config.searchBarAppWidgetId) {
454f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // The search provider may have changed, so just delete the old widget and bind it again
455f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            ssp.unbindSearchAppWidget(mAppWidgetHost, appWidgetId);
456f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            config.updateSearchBarAppWidgetId(this, -1);
457f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // Load the widget again
458f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            bindSearchBarAppWidget();
459f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            addSearchBarAppWidgetView();
460f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
461f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
462303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
463