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.AppWidgetManager; 23f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungimport android.appwidget.AppWidgetProviderInfo; 2447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.BroadcastReceiver; 2547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.Context; 26303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent; 2747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.IntentFilter; 28303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle; 2915a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chungimport android.os.SystemClock; 30d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chungimport android.os.UserHandle; 311e8d71b605b4872e93200706a80a88a3ff25498cWinson Chungimport android.view.KeyEvent; 32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View; 338e548f7025ce930810479a8e628c325d09557fa3Winson Chungimport android.view.ViewStub; 348eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chungimport android.widget.Toast; 3582862573bcf246128782b91ea627285c43133a8dAndrew Flynn 365c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chungimport com.android.internal.logging.MetricsLogger; 3782862573bcf246128782b91ea627285c43133a8dAndrew Flynnimport com.android.systemui.Prefs; 3847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R; 39b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chungimport com.android.systemui.recents.misc.Console; 40ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.DebugTrigger; 41ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.ReferenceCountedTrigger; 42ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungimport com.android.systemui.recents.misc.SystemServicesProxy; 43a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chungimport com.android.systemui.recents.model.RecentsTaskLoadPlan; 44f1fbd77cf057e43926f9a0347692611386d09f40Winson Chungimport com.android.systemui.recents.model.RecentsTaskLoader; 45dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.model.Task; 46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack; 47dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chungimport com.android.systemui.recents.views.DebugOverlayView; 48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView; 49cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chungimport com.android.systemui.recents.views.SystemBarScrimViews; 50d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chungimport com.android.systemui.recents.views.ViewAnimation; 51303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 52083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chungimport java.lang.ref.WeakReference; 53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList; 54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 5585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung/** 5685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * The main Recents activity that is started from AlternateRecentsComponent. 5785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */ 58f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks, 592915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks, 602915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung DebugOverlayView.DebugOverlayViewCallbacks { 61d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung 6285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung RecentsConfiguration mConfig; 63a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung long mLastTabKeyEventTime; 6485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung 6585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Top level views 66cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung RecentsView mRecentsView; 67cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung SystemBarScrimViews mScrimViews; 688e548f7025ce930810479a8e628c325d09557fa3Winson Chung ViewStub mEmptyViewStub; 692915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung ViewStub mDebugOverlayStub; 70cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung View mEmptyView; 71dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung DebugOverlayView mDebugOverlay; 72cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung 73ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne // Resize task debug 74ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne RecentsResizeTaskDialog mResizeTaskDebugDialog; 75d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung 7685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Search AppWidget 77af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung AppWidgetProviderInfo mSearchWidgetInfo; 78aee097c5802adcd3d52028fbd1ad3ab2cf92e46bWinson Chung RecentsAppWidgetHost mAppWidgetHost; 79af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung RecentsAppWidgetHostView mSearchWidgetHostView; 80cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung 81cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung // Runnables to finish the Recents activity 82cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung FinishRecentsRunnable mFinishLaunchHomeRunnable; 83cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung 846e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi // Runnable to be executed after we paused ourselves 856e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi Runnable mAfterPauseRunnable; 866e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi 87d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung /** 8885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * A common Runnable to finish Recents either by calling finish() (with a custom animation) or 8985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * launching Home with some ActivityOptions. Generally we always launch home when we exit 9085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * Recents rather than just finishing the activity since we don't know what is behind Recents in 9185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * the task stack. The only case where we finish() directly is when we are cancelling the full 9285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * screen transition from the app. 93d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung */ 94d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung class FinishRecentsRunnable implements Runnable { 95d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung Intent mLaunchIntent; 96d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung ActivityOptions mLaunchOpts; 97d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 98d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung /** 99d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung * Creates a finish runnable that starts the specified intent, using the given 100d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung * ActivityOptions. 101d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung */ 102d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung public FinishRecentsRunnable(Intent launchIntent, ActivityOptions opts) { 103d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung mLaunchIntent = launchIntent; 104d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung mLaunchOpts = opts; 105d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 106d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 107d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung @Override 108d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung public void run() { 109d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung // Finish Recents 110d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung if (mLaunchIntent != null) { 111b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung try { 112b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung if (mLaunchOpts != null) { 113b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung startActivityAsUser(mLaunchIntent, mLaunchOpts.toBundle(), UserHandle.CURRENT); 114b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung } else { 115b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung startActivityAsUser(mLaunchIntent, UserHandle.CURRENT); 116b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung } 117b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung } catch (Exception e) { 118b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung Console.logError(RecentsActivity.this, 119b8f03072d46b0d535415c07655b9fe5a8c41fb8fWinson Chung getString(R.string.recents_launch_error_message, "Home")); 120d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 121d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } else { 122d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung finish(); 12385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung overridePendingTransition(R.anim.recents_to_launcher_enter, 12485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung R.anim.recents_to_launcher_exit); 125d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 126d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 127d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 128d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 12985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung /** 13085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * Broadcast receiver to handle messages from AlternateRecentsComponent. 13185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */ 1328eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() { 13347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung @Override 13447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung public void onReceive(Context context, Intent intent) { 13547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung String action = intent.getAction(); 136d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi if (action.equals(Recents.ACTION_HIDE_RECENTS_ACTIVITY)) { 137d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) { 13885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app 13985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToFocusedTaskOrHome(false); 140d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi } else if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) { 14185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Otherwise, dismiss Recents to Home 142fe855d124b3fb3d59262b0fc6d528d91caf36951Winson Chung dismissRecentsToHomeRaw(true); 143cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung } else { 144fe855d124b3fb3d59262b0fc6d528d91caf36951Winson Chung // Do nothing 1456cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung } 146d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi } else if (action.equals(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY)) { 14785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If we are toggling Recents, then first unfilter any filtered stacks first 14885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToFocusedTaskOrHome(true); 149d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi } else if (action.equals(Recents.ACTION_START_ENTER_ANIMATION)) { 150b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung // Trigger the enter animation 151b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung onEnterAnimationTriggered(); 152b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung // Notify the fallback receiver that we have successfully got the broadcast 153b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung // See AlternateRecentsComponent.onAnimationStarted() 154b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung setResultCode(Activity.RESULT_OK); 15547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung } 15647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung } 15747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung }; 158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 15985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung /** 16085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * Broadcast receiver to handle messages from the system 16185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */ 16231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung final BroadcastReceiver mSystemBroadcastReceiver = new BroadcastReceiver() { 1636736905dc0e10689f7c63f6da43b31325caf966aWinson Chung @Override 1646736905dc0e10689f7c63f6da43b31325caf966aWinson Chung public void onReceive(Context context, Intent intent) { 16531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung String action = intent.getAction(); 16685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (action.equals(Intent.ACTION_SCREEN_OFF)) { 16785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // When the screen turns off, dismiss Recents to Home 16885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToHome(false); 16931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) { 170af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung // When the search activity changes, update the search widget view 171af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); 172af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mSearchWidgetInfo = ssp.getOrBindSearchAppWidget(context, mAppWidgetHost); 173af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung refreshSearchWidgetView(); 17431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung } 175d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung } 176d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung }; 177d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung 17885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung /** 17985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung * A custom debug trigger to listen for a debug key chord. 18085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung */ 1818eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() { 1828eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung @Override 1838eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung public void run() { 1848eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung onDebugModeTriggered(); 1858eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung } 1868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung }); 1878eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung 188303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Updates the set of recent tasks */ 1892cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung void updateRecentsTasks() { 190a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung // If AlternateRecentsComponent has preloaded a load plan, then use that to prevent 191a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung // reconstructing the task stack 1929cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); 193d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi RecentsTaskLoadPlan plan = Recents.consumeInstanceLoadPlan(); 194a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung if (plan == null) { 195a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung plan = loader.createLoadPlan(this); 196a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung } 197a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung 198a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung // Start loading tasks according to the load plan 199911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung if (!plan.hasTasks()) { 20090d5136ebd59c9aff9543ea5750d4c5d57ac99dcWinson Chung loader.preloadTasks(plan, mConfig.launchedFromHome); 20190d5136ebd59c9aff9543ea5750d4c5d57ac99dcWinson Chung } 202a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); 203a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung loadOpts.runningTaskId = mConfig.launchedToTaskId; 204860e2d86d8c05b03e985e438664069794825ef0fWinson Chung loadOpts.numVisibleTasks = mConfig.launchedNumVisibleTasks; 205860e2d86d8c05b03e985e438664069794825ef0fWinson Chung loadOpts.numVisibleTaskThumbnails = mConfig.launchedNumVisibleThumbnails; 206a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung loader.loadTasks(this, plan, loadOpts); 207a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung 208911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung ArrayList<TaskStack> stacks = plan.getAllTaskStacks(); 209911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung mConfig.launchedWithNoRecentTasks = !plan.hasTasks(); 210911f400c2eab4eb15e0491a2affd918901867d2eWinson Chung if (!mConfig.launchedWithNoRecentTasks) { 211a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung mRecentsView.setTaskStacks(stacks); 2129cb5c4e3854aa7f2ddab707920b688c3108cbc85Winson Chung } 213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 214bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung // Create the home intent runnable 215bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung Intent homeIntent = new Intent(Intent.ACTION_MAIN, null); 216bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung homeIntent.addCategory(Intent.CATEGORY_HOME); 217bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 218bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 219bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent, 220bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung ActivityOptions.makeCustomAnimation(this, 221860e2d86d8c05b03e985e438664069794825ef0fWinson Chung mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_enter : 222bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung R.anim.recents_to_launcher_enter, 223860e2d86d8c05b03e985e438664069794825ef0fWinson Chung mConfig.launchedFromSearchHome ? R.anim.recents_to_search_launcher_exit : 224bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung R.anim.recents_to_launcher_exit)); 225bf8871db617d76ee66c5cf803f0bafa5e93998e9Winson Chung 226dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung // Mark the task that is the launch target 227dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung int taskStackCount = stacks.size(); 2285c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung int launchTaskIndexInStack = 0; 229dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung if (mConfig.launchedToTaskId != -1) { 230dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung for (int i = 0; i < taskStackCount; i++) { 231dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung TaskStack stack = stacks.get(i); 232dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung ArrayList<Task> tasks = stack.getTasks(); 233dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung int taskCount = tasks.size(); 234dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung for (int j = 0; j < taskCount; j++) { 235dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung Task t = tasks.get(j); 236dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung if (t.key.id == mConfig.launchedToTaskId) { 237dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung t.isLaunchTarget = true; 2385c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung launchTaskIndexInStack = tasks.size() - j - 1; 239dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung break; 240dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 241dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 242dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 243dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 244dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung 24585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Update the top level view's visibilities 246969f586533096999f10f5587f901949791154fa2Winson Chung if (mConfig.launchedWithNoRecentTasks) { 24785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (mEmptyView == null) { 24885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung mEmptyView = mEmptyViewStub.inflate(); 24985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 250303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung mEmptyView.setVisibility(View.VISIBLE); 251772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung mRecentsView.setSearchBarVisibility(View.GONE); 252303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 25385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (mEmptyView != null) { 25485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung mEmptyView.setVisibility(View.GONE); 25585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 256aee097c5802adcd3d52028fbd1ad3ab2cf92e46bWinson Chung if (mRecentsView.hasValidSearchBar()) { 257772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung mRecentsView.setSearchBarVisibility(View.VISIBLE); 258772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung } else { 259af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung refreshSearchWidgetView(); 260772b6b12a323b7999d8d3f335c199e6eb4e621e2Winson Chung } 261303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 2627aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung 26385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Animate the SystemUI scrims into view 2647aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung mScrimViews.prepareEnterRecentsAnimation(); 2655c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung 2665c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung // Keep track of whether we launched from the nav bar button or via alt-tab 2675c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung if (mConfig.launchedWithAltTab) { 2685c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.count(this, "overview_trigger_alttab", 1); 2695c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung } else { 2705c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.count(this, "overview_trigger_nav_btn", 1); 2715c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung } 2725c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung // Keep track of whether we launched from an app or from home 2735c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung if (mConfig.launchedFromAppWithThumbnail) { 2745c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.count(this, "overview_source_app", 1); 2755c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung // If from an app, track the stack index of the app in the stack (for affiliated tasks) 2765c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.histogram(this, "overview_source_app_index", launchTaskIndexInStack); 2775c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung } else { 2785c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.count(this, "overview_source_home", 1); 2795c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung } 2805c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung // Keep track of the total stack task count 2815c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung int taskCount = 0; 2825c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung for (int i = 0; i < stacks.size(); i++) { 2835c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung TaskStack stack = stacks.get(i); 2845c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung taskCount += stack.getTaskCount(); 2855c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung } 2865c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.histogram(this, "overview_task_count", taskCount); 287303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 288303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 289303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Dismisses recents if we are already visible and the intent is to toggle the recents view */ 29085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung boolean dismissRecentsToFocusedTaskOrHome(boolean checkFilteredStackState) { 2912cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); 2922cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) { 29385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If we currently have filtered stacks, then unfilter those first 29485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (checkFilteredStackState && 29585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung mRecentsView.unfilterFilteredStacks()) return true; 29685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If we have a focused Task, launch that Task now 29785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (mRecentsView.launchFocusedTask()) return true; 29885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If we launched from Home, then return to Home 29985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (mConfig.launchedFromHome) { 30085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToHomeRaw(true); 30185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung return true; 302303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 303dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung // Otherwise, try and return to the Task that Recents was launched from 304dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung if (mRecentsView.launchPreviousTask()) return true; 30585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // If none of the other cases apply, then just go Home 30685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToHomeRaw(true); 30785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung return true; 30885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 30985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung return false; 31085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 31185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung 31285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung /** Dismisses Recents directly to Home. */ 31385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung void dismissRecentsToHomeRaw(boolean animated) { 31485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung if (animated) { 31585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this, 31685cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung null, mFinishLaunchHomeRunnable, null); 31785cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung mRecentsView.startExitToHomeAnimation( 31885cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung new ViewAnimation.TaskViewExitContext(exitTrigger)); 31985cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } else { 32085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung mFinishLaunchHomeRunnable.run(); 32185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 32285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung } 32385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung 324d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale /** Dismisses Recents directly to Home without transition animation. */ 325d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale void dismissRecentsToHomeWithoutTransitionAnimation() { 326d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale finish(); 327d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale overridePendingTransition(0, 0); 328d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale } 329d351ada8f93415b09f7536c64e303d55c7b97680Wale Ogunwale 33085cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung /** Dismisses Recents directly to Home if we currently aren't transitioning. */ 33185cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung boolean dismissRecentsToHome(boolean animated) { 3322cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); 3332cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) { 33485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Return to Home 33585cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToHomeRaw(animated); 33647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung return true; 337303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 338303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return false; 339303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 340303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 341303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Called with the activity is first created. */ 342303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 343303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public void onCreate(Bundle savedInstanceState) { 344303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung super.onCreate(savedInstanceState); 3452cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung // For the non-primary user, ensure that the SystemServicesProxy and configuration is 3462cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung // initialized 34715155519ba9ce8302d5ca1771f7816cd683a2051Winson Chung RecentsTaskLoader.initialize(this); 3482cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); 3492cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung mConfig = RecentsConfiguration.reinitialize(this, ssp); 350303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 351f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung // Initialize the widget host (the host id is static and does not change) 352d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung mAppWidgetHost = new RecentsAppWidgetHost(this, Constants.Values.App.AppWidgetHostId); 353f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung 3548e548f7025ce930810479a8e628c325d09557fa3Winson Chung // Set the Recents layout 3558e548f7025ce930810479a8e628c325d09557fa3Winson Chung setContentView(R.layout.recents); 3568e548f7025ce930810479a8e628c325d09557fa3Winson Chung mRecentsView = (RecentsView) findViewById(R.id.recents_view); 35747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung mRecentsView.setCallbacks(this); 358653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 359653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 360653f70c223f8742e2a3696641fe1d4b82bc2ca36Winson Chung View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 3618e548f7025ce930810479a8e628c325d09557fa3Winson Chung mEmptyViewStub = (ViewStub) findViewById(R.id.empty_view_stub); 3622915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung mDebugOverlayStub = (ViewStub) findViewById(R.id.debug_overlay_stub); 3638e548f7025ce930810479a8e628c325d09557fa3Winson Chung mScrimViews = new SystemBarScrimViews(this, mConfig); 364dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung inflateDebugOverlay(); 365303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 366f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung // Bind the search app widget when we first start up 367af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mSearchWidgetInfo = ssp.getOrBindSearchAppWidget(this, mAppWidgetHost); 368521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung 36931d66c60d8f518ce3a70972db348d797db92f42cWinson Chung // Register the broadcast receiver to handle messages when the screen is turned off 37031d66c60d8f518ce3a70972db348d797db92f42cWinson Chung IntentFilter filter = new IntentFilter(); 37131d66c60d8f518ce3a70972db348d797db92f42cWinson Chung filter.addAction(Intent.ACTION_SCREEN_OFF); 37231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); 37331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung registerReceiver(mSystemBroadcastReceiver, filter); 374521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung } 375521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung 376dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung /** Inflates the debug overlay if debug mode is enabled. */ 377dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung void inflateDebugOverlay() { 378a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung if (!Constants.DebugFlags.App.EnableDebugMode) return; 379a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung 380dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung if (mConfig.debugModeEnabled && mDebugOverlay == null) { 3812915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung // Inflate the overlay and seek bars 3822915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung mDebugOverlay = (DebugOverlayView) mDebugOverlayStub.inflate(); 3832915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung mDebugOverlay.setCallbacks(this); 384dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung mRecentsView.setDebugOverlay(mDebugOverlay); 385dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 386dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 387dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung 388303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 389303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung protected void onNewIntent(Intent intent) { 390303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung super.onNewIntent(intent); 3916057c91563402f900dfc7714a46e952d86172e2fWinson Chung setIntent(intent); 39247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung 393dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung // Clear any debug rects 394dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung if (mDebugOverlay != null) { 395dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung mDebugOverlay.clear(); 396dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung } 397303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 398303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 399303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 400303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung protected void onStart() { 401303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung super.onStart(); 4025c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.visible(this, MetricsLogger.OVERVIEW_ACTIVITY); 4032002cf5b463737e7f615f1469cb20d324c283544Winson Chung RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); 4042002cf5b463737e7f615f1469cb20d324c283544Winson Chung SystemServicesProxy ssp = loader.getSystemServicesProxy(); 405d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi Recents.notifyVisibilityChanged(this, ssp, true); 40647a3e65acc35cd3061bf3867e8b20753870fd892Winson Chung 40731d66c60d8f518ce3a70972db348d797db92f42cWinson Chung // Register the broadcast receiver to handle messages from our service 40831d66c60d8f518ce3a70972db348d797db92f42cWinson Chung IntentFilter filter = new IntentFilter(); 409d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi filter.addAction(Recents.ACTION_HIDE_RECENTS_ACTIVITY); 410d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi filter.addAction(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY); 411d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi filter.addAction(Recents.ACTION_START_ENTER_ANIMATION); 41231d66c60d8f518ce3a70972db348d797db92f42cWinson Chung registerReceiver(mServiceBroadcastReceiver, filter); 41319fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung 41419fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung // Register any broadcast receivers for the task loader 4152002cf5b463737e7f615f1469cb20d324c283544Winson Chung loader.registerReceivers(this, mRecentsView); 416083baf99ff1228e96ede96aac88c8200c4fdc2b2Winson Chung 417860e2d86d8c05b03e985e438664069794825ef0fWinson Chung // Update the recent tasks 4182cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung updateRecentsTasks(); 4192cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung 4202cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung // If this is a new instance from a configuration change, then we have to manually trigger 42176ffdafc3cc59ad1749736de58285978e6c73622Winson // the enter animation state, or if recents was relaunched by AM, without going through 42276ffdafc3cc59ad1749736de58285978e6c73622Winson // the normal mechanisms 42376ffdafc3cc59ad1749736de58285978e6c73622Winson boolean wasLaunchedByAm = !mConfig.launchedFromHome && !mConfig.launchedFromAppWithThumbnail; 42476ffdafc3cc59ad1749736de58285978e6c73622Winson if (mConfig.launchedHasConfigurationChanged || wasLaunchedByAm) { 4252cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung onEnterAnimationTriggered(); 4262cf8b221fca18dbee3703388ae7970491c86ec7fWinson Chung } 427900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi 428900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi if (!mConfig.launchedHasConfigurationChanged) { 429900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi mRecentsView.disableLayersForOneFrame(); 430900fb48d269e2fbf3baea995c6324e4c08ad7c22Jorim Jaggi } 4316736905dc0e10689f7c63f6da43b31325caf966aWinson Chung } 4326736905dc0e10689f7c63f6da43b31325caf966aWinson Chung 4336736905dc0e10689f7c63f6da43b31325caf966aWinson Chung @Override 4346e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi protected void onPause() { 4356e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi super.onPause(); 4366e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi if (mAfterPauseRunnable != null) { 4376e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi mRecentsView.post(mAfterPauseRunnable); 4386e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi mAfterPauseRunnable = null; 4396e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi } 4406e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi } 4416e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi 4426e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi @Override 443303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung protected void onStop() { 444303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung super.onStop(); 4455c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.hidden(this, MetricsLogger.OVERVIEW_ACTIVITY); 4462002cf5b463737e7f615f1469cb20d324c283544Winson Chung RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); 4472002cf5b463737e7f615f1469cb20d324c283544Winson Chung SystemServicesProxy ssp = loader.getSystemServicesProxy(); 448d61f2271c40cd7b3b10f39d8ffdaf8c527cb78beJorim Jaggi Recents.notifyVisibilityChanged(this, ssp, false); 44947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung 450b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung // Notify the views that we are no longer visible 451b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung mRecentsView.onRecentsHidden(); 45219fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung 45331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung // Unregister the RecentsService receiver 45431d66c60d8f518ce3a70972db348d797db92f42cWinson Chung unregisterReceiver(mServiceBroadcastReceiver); 45531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung 45619fc117c2f8f0719aa40a1ff0efe27e2bd6d1efcWinson Chung // Unregister any broadcast receivers for the task loader 4572002cf5b463737e7f615f1469cb20d324c283544Winson Chung loader.unregisterReceivers(); 45876ffdafc3cc59ad1749736de58285978e6c73622Winson 45976ffdafc3cc59ad1749736de58285978e6c73622Winson // Workaround for b/22542869, if the RecentsActivity is started again, but without going 46076ffdafc3cc59ad1749736de58285978e6c73622Winson // through SystemUI, we need to reset the config launch flags to ensure that we do not 46176ffdafc3cc59ad1749736de58285978e6c73622Winson // wait on the system to send a signal that was never queued. 46276ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedFromHome = false; 46376ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedFromSearchHome = false; 46476ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedFromAppWithThumbnail = false; 46576ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedToTaskId = -1; 46676ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedWithAltTab = false; 46776ffdafc3cc59ad1749736de58285978e6c73622Winson mConfig.launchedHasConfigurationChanged = false; 46847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung } 46947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung 47047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung @Override 47147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung protected void onDestroy() { 47247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung super.onDestroy(); 47331d66c60d8f518ce3a70972db348d797db92f42cWinson Chung 47485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Unregister the system broadcast receivers 47531d66c60d8f518ce3a70972db348d797db92f42cWinson Chung unregisterReceiver(mSystemBroadcastReceiver); 476905950abd017b5a135e26179b5ba29378732cf5aWinson Chung 477905950abd017b5a135e26179b5ba29378732cf5aWinson Chung // Stop listening for widget package changes if there was one bound 478740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung mAppWidgetHost.stopListening(); 479303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 480303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 481b0a28ea5d381cd3a8477cf7fd82797199c80ca67Winson Chung public void onEnterAnimationTriggered() { 482353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung // Try and start the enter animation (or restart it on configuration changed) 483353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null); 484740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung ViewAnimation.TaskViewEnterContext ctx = new ViewAnimation.TaskViewEnterContext(t); 485740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung mRecentsView.startEnterRecentsAnimation(ctx); 486af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung 487af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung if (mSearchWidgetInfo != null) { 488740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> cbRef = 489740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>( 490740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung RecentsActivity.this); 491740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung ctx.postAnimationTrigger.addLastDecrementRunnable(new Runnable() { 492740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung @Override 493740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung public void run() { 494740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung // Start listening for widget package changes if there is one bound 495740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = cbRef.get(); 496740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung if (cb != null) { 497740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung mAppWidgetHost.startListening(cb); 498740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung } 499740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung } 500740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung }); 501740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung } 502353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung 503353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung // Animate the SystemUI scrim views 504353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung mScrimViews.startEnterRecentsAnimation(); 505353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung } 506353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung 507353c0b91daa97fa87f077be0f403fe7db8dedb40Winson Chung @Override 5084d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public void onTrimMemory(int level) { 5094d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); 5104d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (loader != null) { 5114d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung loader.onTrimMemory(level); 5124d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 5134d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 5144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 5154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung @Override 5161e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung public boolean onKeyDown(int keyCode, KeyEvent event) { 517a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung switch (keyCode) { 518a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung case KeyEvent.KEYCODE_TAB: { 51915a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chung boolean hasRepKeyTimeElapsed = (SystemClock.elapsedRealtime() - 520a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung mLastTabKeyEventTime) > mConfig.altTabKeyDelay; 521a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung if (event.getRepeatCount() <= 0 || hasRepKeyTimeElapsed) { 522a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung // Focus the next task in the stack 523a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung final boolean backward = event.isShiftPressed(); 524a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung mRecentsView.focusNextTask(!backward); 52515a2ba813a3c16ebc52f943ff80d4b67c05af310Winson Chung mLastTabKeyEventTime = SystemClock.elapsedRealtime(); 526a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung } 527a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung return true; 528a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung } 529a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung case KeyEvent.KEYCODE_DPAD_UP: { 530a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung mRecentsView.focusNextTask(true); 531a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung return true; 532a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung } 533a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung case KeyEvent.KEYCODE_DPAD_DOWN: { 534a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung mRecentsView.focusNextTask(false); 535a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung return true; 536a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung } 537a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung case KeyEvent.KEYCODE_DEL: 538a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung case KeyEvent.KEYCODE_FORWARD_DEL: { 539a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung mRecentsView.dismissFocusedTask(); 5405c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung // Keep track of deletions by keyboard 5415c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.histogram(this, "overview_task_dismissed_source", 5425c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung Constants.Metrics.DismissSourceKeyboard); 543a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung return true; 544a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung } 545a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung default: 546a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung break; 5471e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 5488eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung // Pass through the debug trigger 5498eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung mDebugTrigger.onKeyEvent(keyCode); 5501e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung return super.onKeyDown(keyCode, event); 5511e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 5521e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung 5531e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung @Override 554a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung public void onUserInteraction() { 555a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung mRecentsView.onUserInteraction(); 556a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung } 557a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung 558a26fb7822ddf3511796279b847cc216bee9e7f70Winson Chung @Override 559303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public void onBackPressed() { 56004d0f756782e697a171aebbb35ae86c86b839a27Winson Chung // Test mode where back does not do anything 56104d0f756782e697a171aebbb35ae86c86b839a27Winson Chung if (mConfig.debugModeEnabled) return; 56204d0f756782e697a171aebbb35ae86c86b839a27Winson Chung 56385cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Dismiss Recents to the focused Task or Home 56485cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung dismissRecentsToFocusedTaskOrHome(true); 565303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 56647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung 5678eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung /** Called when debug mode is triggered */ 5688eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung public void onDebugModeTriggered() { 5698eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung if (mConfig.developerOptionsEnabled) { 57082862573bcf246128782b91ea627285c43133a8dAndrew Flynn if (Prefs.getBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, false /* boolean */)) { 5718eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung // Disable the debug mode 57282862573bcf246128782b91ea627285c43133a8dAndrew Flynn Prefs.remove(this, Prefs.Key.DEBUG_MODE_ENABLED); 573dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung mConfig.debugModeEnabled = false; 574dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung inflateDebugOverlay(); 575a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung if (mDebugOverlay != null) { 576a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung mDebugOverlay.disable(); 577a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung } 5788eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung } else { 5798eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung // Enable the debug mode 58082862573bcf246128782b91ea627285c43133a8dAndrew Flynn Prefs.putBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, true); 581dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung mConfig.debugModeEnabled = true; 582dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung inflateDebugOverlay(); 583a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung if (mDebugOverlay != null) { 584a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung mDebugOverlay.enable(); 585a91c293be26b2deb5434eb827a800fa0c80dc92cWinson Chung } 5868eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung } 587dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion + ") " + 588dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung (mConfig.debugModeEnabled ? "Enabled" : "Disabled") + ", please restart Recents now", 589dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung Toast.LENGTH_SHORT).show(); 5908eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung } 5918eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung } 5928eaeb7dc93ed71b768a2ea8d45021cca010e8263Winson Chung 593d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung 594ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne /**** RecentsResizeTaskDialog ****/ 595d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung 596ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne private RecentsResizeTaskDialog getResizeTaskDebugDialog() { 597ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne if (mResizeTaskDebugDialog == null) { 5988aa7d161a11965cd75eace74e1bcf15421bbea18Skuhne mResizeTaskDebugDialog = new RecentsResizeTaskDialog(getFragmentManager(), this); 599d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung } 600ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne return mResizeTaskDebugDialog; 601d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung } 602d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung 603d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung @Override 604ece738b5bc532d90bbdc42d0b5b63701c773a6f9Skuhne public void onTaskResize(Task t) { 6058aa7d161a11965cd75eace74e1bcf15421bbea18Skuhne getResizeTaskDebugDialog().showResizeTaskDialog(t, mRecentsView); 606d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung } 607d16c565a607de754379fe699a4def21bd0e3de2fWinson Chung 608d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung /**** RecentsView.RecentsViewCallbacks Implementation ****/ 609d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 610d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung @Override 611cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung public void onExitToHomeAnimationTriggered() { 61285cfec811e35025dbde54f4dc09fe0e1337c36b8Winson Chung // Animate the SystemUI scrim views out 613cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1Winson Chung mScrimViews.startExitRecentsAnimation(); 614d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung } 615d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 616d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung @Override 6177aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung public void onTaskViewClicked() { 61847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung } 619f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung 620d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung @Override 6214e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung public void onTaskLaunchFailed() { 6224e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung // Return to Home 6234e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung dismissRecentsToHomeRaw(true); 6244e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung } 6254e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung 6264e96eb709d2f1b6b1cd233c8a99f6706fde70bb1Winson Chung @Override 6277aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung public void onAllTaskViewsDismissed() { 628d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung mFinishLaunchHomeRunnable.run(); 629d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung } 630d7b2cb12ac90956843413c212769639044a0b6f2Winson Chung 63118f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk @Override 63218f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk public void onScreenPinningRequest() { 633d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); 634d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung SystemServicesProxy ssp = loader.getSystemServicesProxy(); 635d0aa8a374f4de4b02d99d2eef6580ef0f5762912Winson Chung Recents.startScreenPinning(this, ssp); 6365c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung 6375c9f4b90bf56b242467f0b5b4d2c7c5b71e6a777Winson Chung MetricsLogger.count(this, "overview_screen_pinned", 1); 63818f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk } 63918f99d91349a4f5ce55e22ed33f1f57eb1b0297bJason Monk 6406e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi @Override 6416e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi public void runAfterPause(Runnable r) { 6426e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi mAfterPauseRunnable = r; 6436e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi } 6446e18e00a249e4cc27cb590901a3cdd4718218b04Jorim Jaggi 645d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung /**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/ 646d543c1bea4d227470f5b6d6535b70e5090064c9aWinson Chung 647f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung @Override 648af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung public void refreshSearchWidgetView() { 649af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung if (mSearchWidgetInfo != null) { 650af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); 651af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung int searchWidgetId = ssp.getSearchAppWidgetId(this); 652af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mSearchWidgetHostView = (RecentsAppWidgetHostView) mAppWidgetHost.createView( 653af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung this, searchWidgetId, mSearchWidgetInfo); 654af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung Bundle opts = new Bundle(); 655af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, 656af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX); 657af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mSearchWidgetHostView.updateAppWidgetOptions(opts); 658af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung // Set the padding to 0 for this search widget 659af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mSearchWidgetHostView.setPadding(0, 0, 0, 0); 660af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mRecentsView.setSearchBar(mSearchWidgetHostView); 661af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung } else { 662af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung mRecentsView.setSearchBar(null); 663af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung } 664f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung } 6652915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung 6662915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung /**** DebugOverlayView.DebugOverlayViewCallbacks ****/ 6672915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung 6682915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung @Override 6692915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung public void onPrimarySeekBarChanged(float progress) { 6702915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung // Do nothing 6712915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung } 6722915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung 6732915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung @Override 6742915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung public void onSecondarySeekBarChanged(float progress) { 6752915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung // Do nothing 6762915b9d14876c8e63ca82415807bcfb602ebad43Winson Chung } 677303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung} 678