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