Recents.java revision dc5f16bf096796d2f822bce8a720fc26e898da5e
1d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock/* 2d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * Copyright (C) 2013 The Android Open Source Project 3d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * 4d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * you may not use this file except in compliance with the License. 6d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * You may obtain a copy of the License at 7d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * 8d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * 10d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * Unless required by applicable law or agreed to in writing, software 11d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * See the License for the specific language governing permissions and 14d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock * limitations under the License. 15d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock */ 16d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 17d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockpackage com.android.systemui.recent; 18d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 19d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.app.ActivityOptions; 20d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.ActivityNotFoundException; 21d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.Intent; 22d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.res.Configuration; 23d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.res.Resources; 24d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.graphics.Bitmap; 259926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.Canvas; 26d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.graphics.Paint; 279926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.drawable.BitmapDrawable; 289926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.drawable.Drawable; 29dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandlerimport android.os.Bundle; 30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.SystemProperties; 31d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.os.UserHandle; 32d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.DisplayMetrics; 33d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.Log; 34d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.Display; 35d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.View; 36d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.R; 37d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.RecentsComponent; 38d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.SystemUI; 397048fea75c06324a748d49f25bc05be908cda9ffWinson Chungimport com.android.systemui.recents.AlternateRecentsComponent; 40303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 41303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 42d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockpublic class Recents extends SystemUI implements RecentsComponent { 43d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock private static final String TAG = "Recents"; 44303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung private static final boolean DEBUG = true; 45303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung // Which recents to use 47303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung boolean mUseAlternateRecents; 487048fea75c06324a748d49f25bc05be908cda9ffWinson Chung AlternateRecentsComponent mAlternateRecents; 49dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler boolean mBootCompleted = false; 50d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 51d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 52d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void start() { 537048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mUseAlternateRecents = SystemProperties.getBoolean("persist.recents.use_alternate", false); 54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 557048fea75c06324a748d49f25bc05be908cda9ffWinson Chung if (mAlternateRecents == null) { 567048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents = new AlternateRecentsComponent(mContext); 577048fea75c06324a748d49f25bc05be908cda9ffWinson Chung } 587048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onStart(); 59303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 607048fea75c06324a748d49f25bc05be908cda9ffWinson Chung 617048fea75c06324a748d49f25bc05be908cda9ffWinson Chung putComponent(RecentsComponent.class, this); 62d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 63d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 64d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 65dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler protected void onBootCompleted() { 66dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mBootCompleted = true; 67dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 68dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler 69dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler @Override 70d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void toggleRecents(Display display, int layoutDirection, View statusBarView) { 71303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 72303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung // Launch the alternate recents if required 737048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onToggleRecents(display, layoutDirection, statusBarView); 74303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return; 75303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 76303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 77d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (DEBUG) Log.d(TAG, "toggle recents panel"); 78d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock try { 79d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock TaskDescription firstTask = RecentTasksLoader.getInstance(mContext).getFirstTask(); 80d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 81d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Intent intent = new Intent(RecentsActivity.TOGGLE_RECENTS_INTENT); 82d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setClassName("com.android.systemui", 83d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock "com.android.systemui.recent.RecentsActivity"); 84d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 85d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 86d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 87d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (firstTask == null) { 88d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (RecentsActivity.forceOpaqueBackground(mContext)) { 89d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, 90d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.anim.recents_launch_from_launcher_enter, 91d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.anim.recents_launch_from_launcher_exit); 92d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle( 93d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock UserHandle.USER_CURRENT)); 94d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { 95d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // The correct window animation will be applied via the activity's style 96d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock mContext.startActivityAsUser(intent, new UserHandle( 97d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock UserHandle.USER_CURRENT)); 98d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 99d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 100d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { 1019926272f32868c858b24b45e048210cf3515741eMichael Jurka Bitmap first = null; 1029926272f32868c858b24b45e048210cf3515741eMichael Jurka if (firstTask.getThumbnail() instanceof BitmapDrawable) { 1039926272f32868c858b24b45e048210cf3515741eMichael Jurka first = ((BitmapDrawable) firstTask.getThumbnail()).getBitmap(); 1049926272f32868c858b24b45e048210cf3515741eMichael Jurka } else { 1059926272f32868c858b24b45e048210cf3515741eMichael Jurka first = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 1069926272f32868c858b24b45e048210cf3515741eMichael Jurka Drawable d = RecentTasksLoader.getInstance(mContext).getDefaultThumbnail(); 1079926272f32868c858b24b45e048210cf3515741eMichael Jurka d.draw(new Canvas(first)); 1089926272f32868c858b24b45e048210cf3515741eMichael Jurka } 109d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock final Resources res = mContext.getResources(); 110d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 111d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbWidth = res 112d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width); 113d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbHeight = res 114d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height); 115d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first == null) { 116d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock throw new RuntimeException("Recents thumbnail is null"); 117d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 118d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first.getWidth() != thumbWidth || first.getHeight() != thumbHeight) { 119d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock first = Bitmap.createScaledBitmap(first, (int) thumbWidth, (int) thumbHeight, 120d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock true); 121d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first == null) { 122d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock throw new RuntimeException("Recents thumbnail is null"); 123d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 124d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 125d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 126d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 127d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock DisplayMetrics dm = new DisplayMetrics(); 128d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock display.getMetrics(dm); 129d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // calculate it here, but consider moving it elsewhere 130d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // first, determine which orientation you're in. 131d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock final Configuration config = res.getConfiguration(); 132d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock int x, y; 133d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 134d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { 135d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float appLabelLeftMargin = res.getDimensionPixelSize( 136d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_left_margin); 137d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float appLabelWidth = res.getDimensionPixelSize( 138d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_width); 139d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbLeftMargin = res.getDimensionPixelSize( 140d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_left_margin); 141d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbBgPadding = res.getDimensionPixelSize( 142d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_bg_padding); 143d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 144d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float width = appLabelLeftMargin + 145d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock +appLabelWidth 146d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbLeftMargin 147d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbWidth 148d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + 2 * thumbBgPadding; 149d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 150d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = (int) ((dm.widthPixels - width) / 2f + appLabelLeftMargin + appLabelWidth 151d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbBgPadding + thumbLeftMargin); 152d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock y = (int) (dm.heightPixels 153d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - res.getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height) 154d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - thumbBgPadding); 155d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (layoutDirection == View.LAYOUT_DIRECTION_RTL) { 156d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = dm.widthPixels - x - res.getDimensionPixelSize( 157d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_width); 158d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 159d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 160d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { 161d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbTopMargin = res.getDimensionPixelSize( 162d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_top_margin); 163d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbBgPadding = res.getDimensionPixelSize( 164d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_bg_padding); 165d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float textPadding = res.getDimensionPixelSize( 166d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_text_description_padding); 167d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float labelTextSize = res.getDimensionPixelSize( 168d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_text_size); 169d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Paint p = new Paint(); 170d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock p.setTextSize(labelTextSize); 171d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float labelTextHeight = p.getFontMetricsInt().bottom 172d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - p.getFontMetricsInt().top; 173d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float descriptionTextSize = res.getDimensionPixelSize( 174d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_description_text_size); 175d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock p.setTextSize(descriptionTextSize); 176d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float descriptionTextHeight = p.getFontMetricsInt().bottom 177d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - p.getFontMetricsInt().top; 178d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 179d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float statusBarHeight = res.getDimensionPixelSize( 180d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock com.android.internal.R.dimen.status_bar_height); 181d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsItemTopPadding = statusBarHeight; 182d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 183d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float height = thumbTopMargin 184d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbHeight 185d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + 2 * thumbBgPadding + textPadding + labelTextHeight 186d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + recentsItemTopPadding + textPadding + descriptionTextHeight; 187d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsItemRightPadding = res 188d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_item_padding); 189d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsScrollViewRightPadding = res 190d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_right_glow_margin); 191d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = (int) (dm.widthPixels - res 192d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width) 193d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - thumbBgPadding - recentsItemRightPadding 194d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - recentsScrollViewRightPadding); 195d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock y = (int) ((dm.heightPixels - statusBarHeight - height) / 2f + thumbTopMargin 196d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + recentsItemTopPadding + thumbBgPadding + statusBarHeight); 197d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 198d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 199d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation( 200d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock statusBarView, 201d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock first, x, y, 202d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock new ActivityOptions.OnAnimationStartedListener() { 203d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void onAnimationStarted() { 204d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Intent intent = 205d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock new Intent(RecentsActivity.WINDOW_ANIMATION_START_INTENT); 206d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setPackage("com.android.systemui"); 207dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 208d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 209d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock }); 210d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.putExtra(RecentsActivity.WAITING_FOR_WINDOW_ANIMATION_PARAM, true); 211dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler startActivitySafely(intent, opts.toBundle()); 212d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 213d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } catch (ActivityNotFoundException e) { 214d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Log.e(TAG, "Failed to launch RecentAppsIntent", e); 215d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 216d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 217d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 218303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 219303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung protected void onConfigurationChanged(Configuration newConfig) { 2207048fea75c06324a748d49f25bc05be908cda9ffWinson Chung if (mUseAlternateRecents) { 2217048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onConfigurationChanged(newConfig); 222303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 223303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 224303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 225d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 226d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void preloadRecentTasksList() { 227303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 2287048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onPreloadRecents(); 229303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 230303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Intent intent = new Intent(RecentsActivity.PRELOAD_INTENT); 231303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung intent.setClassName("com.android.systemui", 232303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "com.android.systemui.recent.RecentsPreloadReceiver"); 233dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 234d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 235303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung RecentTasksLoader.getInstance(mContext).preloadFirstTask(); 236303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 237d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 238d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 239d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 240d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void cancelPreloadingRecentTasksList() { 241303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 2427048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onCancelPreloadingRecents(); 243303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 244303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Intent intent = new Intent(RecentsActivity.CANCEL_PRELOAD_INTENT); 245303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung intent.setClassName("com.android.systemui", 246303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "com.android.systemui.recent.RecentsPreloadReceiver"); 247dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 248d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 249303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask(); 250303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 251d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 252d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 253d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 254d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void closeRecents() { 255303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 2567048fea75c06324a748d49f25bc05be908cda9ffWinson Chung mAlternateRecents.onCloseRecents(); 257303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 258303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Intent intent = new Intent(RecentsActivity.CLOSE_RECENTS_INTENT); 259303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung intent.setPackage("com.android.systemui"); 260dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 261303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 262303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask(); 263303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 264d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 265dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler 266dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler /** 267dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler * Send broadcast only if BOOT_COMPLETED 268dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler */ 269dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler private void sendBroadcastSafely(Intent intent) { 270dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler if (!mBootCompleted) return; 271dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); 272dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 273dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler 274dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler /** 275dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler * Start activity only if BOOT_COMPLETED 276dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler */ 277dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler private void startActivitySafely(Intent intent, Bundle opts) { 278dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler if (!mBootCompleted) return; 279dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mContext.startActivityAsUser(intent, opts, new UserHandle(UserHandle.USER_CURRENT)); 280dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 281d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock} 282