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