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