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