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; 212002cf5b463737e7f615f1469cb20d324c283544Winson Chungimport android.content.Context; 22d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.Intent; 23d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.res.Configuration; 24d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.content.res.Resources; 25d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.graphics.Bitmap; 269926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.Canvas; 27d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.graphics.Paint; 289926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.drawable.BitmapDrawable; 299926272f32868c858b24b45e048210cf3515741eMichael Jurkaimport android.graphics.drawable.Drawable; 30dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandlerimport android.os.Bundle; 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 47fd08622588d5a90c11216894344e58147ff6359aWinson Chung boolean mUseAlternateRecents = true; 48dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler boolean mBootCompleted = false; 492002cf5b463737e7f615f1469cb20d324c283544Winson Chung static AlternateRecentsComponent sAlternateRecents; 502002cf5b463737e7f615f1469cb20d324c283544Winson Chung 512002cf5b463737e7f615f1469cb20d324c283544Winson Chung /** Returns the Recents component, creating a new one in-process if necessary. */ 522002cf5b463737e7f615f1469cb20d324c283544Winson Chung public static AlternateRecentsComponent getRecentsComponent(Context context, 532002cf5b463737e7f615f1469cb20d324c283544Winson Chung boolean forceInitialize) { 542002cf5b463737e7f615f1469cb20d324c283544Winson Chung if (sAlternateRecents == null) { 552002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents = new AlternateRecentsComponent(context); 562002cf5b463737e7f615f1469cb20d324c283544Winson Chung if (forceInitialize) { 572002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onStart(); 582002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onBootCompleted(); 592002cf5b463737e7f615f1469cb20d324c283544Winson Chung } 602002cf5b463737e7f615f1469cb20d324c283544Winson Chung } 612002cf5b463737e7f615f1469cb20d324c283544Winson Chung return sAlternateRecents; 622002cf5b463737e7f615f1469cb20d324c283544Winson Chung } 63d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 64d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 65d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void start() { 66303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 672002cf5b463737e7f615f1469cb20d324c283544Winson Chung if (sAlternateRecents == null) { 682002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents = getRecentsComponent(mContext, false); 697048fea75c06324a748d49f25bc05be908cda9ffWinson Chung } 702002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onStart(); 71303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 727048fea75c06324a748d49f25bc05be908cda9ffWinson Chung 737048fea75c06324a748d49f25bc05be908cda9ffWinson Chung putComponent(RecentsComponent.class, this); 74d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 75d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 76d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 77dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler protected void onBootCompleted() { 785abdceb64b18460197fc6e8b76daecf259080991Winson Chung if (mUseAlternateRecents) { 792002cf5b463737e7f615f1469cb20d324c283544Winson Chung if (sAlternateRecents != null) { 802002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onBootCompleted(); 815abdceb64b18460197fc6e8b76daecf259080991Winson Chung } 825abdceb64b18460197fc6e8b76daecf259080991Winson Chung } 83dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mBootCompleted = true; 84dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 85dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler 86dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler @Override 871e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung public void showRecents(boolean triggeredFromAltTab, View statusBarView) { 881e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung if (mUseAlternateRecents) { 892002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onShowRecents(triggeredFromAltTab); 901e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 911e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 921e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung 931e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung @Override 94cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung public void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { 951e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung if (mUseAlternateRecents) { 962002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onHideRecents(triggeredFromAltTab, triggeredFromHomeKey); 971e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } else { 981e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung Intent intent = new Intent(RecentsActivity.CLOSE_RECENTS_INTENT); 991e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung intent.setPackage("com.android.systemui"); 1001e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung sendBroadcastSafely(intent); 1011e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung 1021e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask(); 1031e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 1041e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung } 1051e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung 1061e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung @Override 107d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void toggleRecents(Display display, int layoutDirection, View statusBarView) { 108303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 109303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung // Launch the alternate recents if required 1102002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onToggleRecents(); 111303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return; 112303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 113303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 114d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (DEBUG) Log.d(TAG, "toggle recents panel"); 115d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock try { 116d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock TaskDescription firstTask = RecentTasksLoader.getInstance(mContext).getFirstTask(); 117d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 118d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Intent intent = new Intent(RecentsActivity.TOGGLE_RECENTS_INTENT); 119d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setClassName("com.android.systemui", 120d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock "com.android.systemui.recent.RecentsActivity"); 121d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 122d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 123d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 124d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (firstTask == null) { 125d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (RecentsActivity.forceOpaqueBackground(mContext)) { 126d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, 127d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.anim.recents_launch_from_launcher_enter, 128d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.anim.recents_launch_from_launcher_exit); 129d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle( 130d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock UserHandle.USER_CURRENT)); 131d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { 132d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // The correct window animation will be applied via the activity's style 133d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock mContext.startActivityAsUser(intent, new UserHandle( 134d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock UserHandle.USER_CURRENT)); 135d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 136d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 137d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { 1389926272f32868c858b24b45e048210cf3515741eMichael Jurka Bitmap first = null; 1399926272f32868c858b24b45e048210cf3515741eMichael Jurka if (firstTask.getThumbnail() instanceof BitmapDrawable) { 1409926272f32868c858b24b45e048210cf3515741eMichael Jurka first = ((BitmapDrawable) firstTask.getThumbnail()).getBitmap(); 1419926272f32868c858b24b45e048210cf3515741eMichael Jurka } else { 1429926272f32868c858b24b45e048210cf3515741eMichael Jurka first = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 1439926272f32868c858b24b45e048210cf3515741eMichael Jurka Drawable d = RecentTasksLoader.getInstance(mContext).getDefaultThumbnail(); 1449926272f32868c858b24b45e048210cf3515741eMichael Jurka d.draw(new Canvas(first)); 1459926272f32868c858b24b45e048210cf3515741eMichael Jurka } 146d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock final Resources res = mContext.getResources(); 147d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 148d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbWidth = res 149d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width); 150d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbHeight = res 151d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height); 152d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first == null) { 153d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock throw new RuntimeException("Recents thumbnail is null"); 154d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 155d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first.getWidth() != thumbWidth || first.getHeight() != thumbHeight) { 156d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock first = Bitmap.createScaledBitmap(first, (int) thumbWidth, (int) thumbHeight, 157d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock true); 158d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (first == null) { 159d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock throw new RuntimeException("Recents thumbnail is null"); 160d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 161d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 162d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 163d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 164d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock DisplayMetrics dm = new DisplayMetrics(); 165d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock display.getMetrics(dm); 166d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // calculate it here, but consider moving it elsewhere 167d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock // first, determine which orientation you're in. 168d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock final Configuration config = res.getConfiguration(); 169d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock int x, y; 170d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 171d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { 172d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float appLabelLeftMargin = res.getDimensionPixelSize( 173d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_left_margin); 174d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float appLabelWidth = res.getDimensionPixelSize( 175d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_width); 176d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbLeftMargin = res.getDimensionPixelSize( 177d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_left_margin); 178d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbBgPadding = res.getDimensionPixelSize( 179d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_bg_padding); 180d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 181d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float width = appLabelLeftMargin + 182d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock +appLabelWidth 183d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbLeftMargin 184d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbWidth 185d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + 2 * thumbBgPadding; 186d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 187d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = (int) ((dm.widthPixels - width) / 2f + appLabelLeftMargin + appLabelWidth 188d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbBgPadding + thumbLeftMargin); 189d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock y = (int) (dm.heightPixels 190d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - res.getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height) 191d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - thumbBgPadding); 192d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock if (layoutDirection == View.LAYOUT_DIRECTION_RTL) { 193d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = dm.widthPixels - x - res.getDimensionPixelSize( 194d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_width); 195d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 196d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 197d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } else { // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { 198d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbTopMargin = res.getDimensionPixelSize( 199d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_top_margin); 200d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float thumbBgPadding = res.getDimensionPixelSize( 201d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_thumbnail_bg_padding); 202d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float textPadding = res.getDimensionPixelSize( 203d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_text_description_padding); 204d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float labelTextSize = res.getDimensionPixelSize( 205d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_label_text_size); 206d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Paint p = new Paint(); 207d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock p.setTextSize(labelTextSize); 208d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float labelTextHeight = p.getFontMetricsInt().bottom 209d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - p.getFontMetricsInt().top; 210d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float descriptionTextSize = res.getDimensionPixelSize( 211d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock R.dimen.status_bar_recents_app_description_text_size); 212d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock p.setTextSize(descriptionTextSize); 213d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float descriptionTextHeight = p.getFontMetricsInt().bottom 214d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - p.getFontMetricsInt().top; 215d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 216d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float statusBarHeight = res.getDimensionPixelSize( 217d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock com.android.internal.R.dimen.status_bar_height); 218d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsItemTopPadding = statusBarHeight; 219d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 220d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float height = thumbTopMargin 221d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + thumbHeight 222d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + 2 * thumbBgPadding + textPadding + labelTextHeight 223d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + recentsItemTopPadding + textPadding + descriptionTextHeight; 224d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsItemRightPadding = res 225d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_item_padding); 226d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock float recentsScrollViewRightPadding = res 227d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_right_glow_margin); 228d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock x = (int) (dm.widthPixels - res 229d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width) 230d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - thumbBgPadding - recentsItemRightPadding 231d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock - recentsScrollViewRightPadding); 232d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock y = (int) ((dm.heightPixels - statusBarHeight - height) / 2f + thumbTopMargin 233d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock + recentsItemTopPadding + thumbBgPadding + statusBarHeight); 234d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 235d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 236d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation( 237d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock statusBarView, 238d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock first, x, y, 239d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock new ActivityOptions.OnAnimationStartedListener() { 240d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock public void onAnimationStarted() { 241d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Intent intent = 242d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock new Intent(RecentsActivity.WINDOW_ANIMATION_START_INTENT); 243d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.setPackage("com.android.systemui"); 244dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 245d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 246d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock }); 247d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock intent.putExtra(RecentsActivity.WAITING_FOR_WINDOW_ANIMATION_PARAM, true); 248dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler startActivitySafely(intent, opts.toBundle()); 249d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 250d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } catch (ActivityNotFoundException e) { 251d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock Log.e(TAG, "Failed to launch RecentAppsIntent", e); 252d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 253d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 254d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 255303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung @Override 256303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung protected void onConfigurationChanged(Configuration newConfig) { 2577048fea75c06324a748d49f25bc05be908cda9ffWinson Chung if (mUseAlternateRecents) { 2582002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onConfigurationChanged(newConfig); 259303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 260303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 261303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 262d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 2631e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung public void preloadRecents() { 264303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 2652002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onPreloadRecents(); 266303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 267303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Intent intent = new Intent(RecentsActivity.PRELOAD_INTENT); 268303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung intent.setClassName("com.android.systemui", 269303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "com.android.systemui.recent.RecentsPreloadReceiver"); 270dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 271d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 272303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung RecentTasksLoader.getInstance(mContext).preloadFirstTask(); 273303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 274d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 275d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 276d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock @Override 2771e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung public void cancelPreloadingRecents() { 278303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (mUseAlternateRecents) { 2792002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onCancelPreloadingRecents(); 280303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } else { 281303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Intent intent = new Intent(RecentsActivity.CANCEL_PRELOAD_INTENT); 282303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung intent.setClassName("com.android.systemui", 283303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "com.android.systemui.recent.RecentsPreloadReceiver"); 284dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler sendBroadcastSafely(intent); 285d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 286303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask(); 287303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 288d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock } 289d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock 2909214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung @Override 291b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung public void showNextAffiliatedTask() { 292b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung if (mUseAlternateRecents) { 2932002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onShowNextAffiliatedTask(); 294b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 295b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 296b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung 297b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung @Override 298b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung public void showPrevAffiliatedTask() { 299b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung if (mUseAlternateRecents) { 3002002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.onShowPrevAffiliatedTask(); 301b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 302b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung } 303b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung 304b1f749906f5c27114d02ea0c3f8ce0dcea08fd3fWinson Chung @Override 3059214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung public void setCallback(Callbacks cb) { 3069214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung if (mUseAlternateRecents) { 3072002cf5b463737e7f615f1469cb20d324c283544Winson Chung sAlternateRecents.setRecentsComponentCallback(cb); 3089214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung } 3099214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung } 3109214eff52adf56b7c9532e40b784d52f9f94b6d1Winson Chung 311dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler /** 312dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler * Send broadcast only if BOOT_COMPLETED 313dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler */ 314dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler private void sendBroadcastSafely(Intent intent) { 315dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler if (!mBootCompleted) return; 316dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); 317dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 318dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler 319dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler /** 320dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler * Start activity only if BOOT_COMPLETED 321dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler */ 322dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler private void startActivitySafely(Intent intent, Bundle opts) { 323dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler if (!mBootCompleted) return; 324dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler mContext.startActivityAsUser(intent, opts, new UserHandle(UserHandle.USER_CURRENT)); 325dc5f16bf096796d2f822bce8a720fc26e898da5eDan Sandler } 326d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock} 327