Recents.java revision 7048fea75c06324a748d49f25bc05be908cda9ff
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;
29303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.SystemProperties;
30d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.os.UserHandle;
31d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.DisplayMetrics;
32d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.Log;
33d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.Display;
34d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.View;
35d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.R;
36d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.RecentsComponent;
37d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.SystemUI;
387048fea75c06324a748d49f25bc05be908cda9ffWinson Chungimport com.android.systemui.recents.AlternateRecentsComponent;
39303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
40303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
41d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockpublic class Recents extends SystemUI implements RecentsComponent {
42d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    private static final String TAG = "Recents";
43303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    private static final boolean DEBUG = true;
44303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
45303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    // Which recents to use
46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    boolean mUseAlternateRecents;
477048fea75c06324a748d49f25bc05be908cda9ffWinson Chung    AlternateRecentsComponent mAlternateRecents;
48d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
49d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
50d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void start() {
517048fea75c06324a748d49f25bc05be908cda9ffWinson Chung        mUseAlternateRecents = SystemProperties.getBoolean("persist.recents.use_alternate", false);
52303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (mUseAlternateRecents) {
537048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            if (mAlternateRecents == null) {
547048fea75c06324a748d49f25bc05be908cda9ffWinson Chung                mAlternateRecents = new AlternateRecentsComponent(mContext);
557048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            }
567048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onStart();
57303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
587048fea75c06324a748d49f25bc05be908cda9ffWinson Chung
597048fea75c06324a748d49f25bc05be908cda9ffWinson Chung        putComponent(RecentsComponent.class, this);
60d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
61d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
62d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
63d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void toggleRecents(Display display, int layoutDirection, View statusBarView) {
64303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (mUseAlternateRecents) {
65303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            // Launch the alternate recents if required
667048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onToggleRecents(display, layoutDirection, statusBarView);
67303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            return;
68303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
69303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
70d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        if (DEBUG) Log.d(TAG, "toggle recents panel");
71d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        try {
72d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            TaskDescription firstTask = RecentTasksLoader.getInstance(mContext).getFirstTask();
73d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
74d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            Intent intent = new Intent(RecentsActivity.TOGGLE_RECENTS_INTENT);
75d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            intent.setClassName("com.android.systemui",
76d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    "com.android.systemui.recent.RecentsActivity");
77d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
78d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
79d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
80d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            if (firstTask == null) {
81d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (RecentsActivity.forceOpaqueBackground(mContext)) {
82d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
83d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.anim.recents_launch_from_launcher_enter,
84d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.anim.recents_launch_from_launcher_exit);
85d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
86d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            UserHandle.USER_CURRENT));
87d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                } else {
88d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    // The correct window animation will be applied via the activity's style
89d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    mContext.startActivityAsUser(intent, new UserHandle(
90d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            UserHandle.USER_CURRENT));
91d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
92d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
93d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            } else {
949926272f32868c858b24b45e048210cf3515741eMichael Jurka                Bitmap first = null;
959926272f32868c858b24b45e048210cf3515741eMichael Jurka                if (firstTask.getThumbnail() instanceof BitmapDrawable) {
969926272f32868c858b24b45e048210cf3515741eMichael Jurka                    first = ((BitmapDrawable) firstTask.getThumbnail()).getBitmap();
979926272f32868c858b24b45e048210cf3515741eMichael Jurka                } else {
989926272f32868c858b24b45e048210cf3515741eMichael Jurka                    first = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
999926272f32868c858b24b45e048210cf3515741eMichael Jurka                    Drawable d = RecentTasksLoader.getInstance(mContext).getDefaultThumbnail();
1009926272f32868c858b24b45e048210cf3515741eMichael Jurka                    d.draw(new Canvas(first));
1019926272f32868c858b24b45e048210cf3515741eMichael Jurka                }
102d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                final Resources res = mContext.getResources();
103d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
104d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                float thumbWidth = res
105d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width);
106d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                float thumbHeight = res
107d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height);
108d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (first == null) {
109d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    throw new RuntimeException("Recents thumbnail is null");
110d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
111d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (first.getWidth() != thumbWidth || first.getHeight() != thumbHeight) {
112d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    first = Bitmap.createScaledBitmap(first, (int) thumbWidth, (int) thumbHeight,
113d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            true);
114d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    if (first == null) {
115d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        throw new RuntimeException("Recents thumbnail is null");
116d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    }
117d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
118d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
119d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
120d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                DisplayMetrics dm = new DisplayMetrics();
121d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                display.getMetrics(dm);
122d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                // calculate it here, but consider moving it elsewhere
123d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                // first, determine which orientation you're in.
124d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                final Configuration config = res.getConfiguration();
125d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                int x, y;
126d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
127d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
128d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float appLabelLeftMargin = res.getDimensionPixelSize(
129d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_left_margin);
130d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float appLabelWidth = res.getDimensionPixelSize(
131d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_width);
132d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbLeftMargin = res.getDimensionPixelSize(
133d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_left_margin);
134d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbBgPadding = res.getDimensionPixelSize(
135d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_bg_padding);
136d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
137d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float width = appLabelLeftMargin +
138d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            +appLabelWidth
139d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbLeftMargin
140d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbWidth
141d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + 2 * thumbBgPadding;
142d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
143d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    x = (int) ((dm.widthPixels - width) / 2f + appLabelLeftMargin + appLabelWidth
144d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbBgPadding + thumbLeftMargin);
145d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    y = (int) (dm.heightPixels
146d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - res.getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height)
147d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - thumbBgPadding);
148d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
149d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        x = dm.widthPixels - x - res.getDimensionPixelSize(
150d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                R.dimen.status_bar_recents_thumbnail_width);
151d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    }
152d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
153d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                } else { // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
154d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbTopMargin = res.getDimensionPixelSize(
155d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_top_margin);
156d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbBgPadding = res.getDimensionPixelSize(
157d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_bg_padding);
158d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float textPadding = res.getDimensionPixelSize(
159d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_text_description_padding);
160d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float labelTextSize = res.getDimensionPixelSize(
161d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_text_size);
162d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    Paint p = new Paint();
163d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    p.setTextSize(labelTextSize);
164d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float labelTextHeight = p.getFontMetricsInt().bottom
165d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - p.getFontMetricsInt().top;
166d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float descriptionTextSize = res.getDimensionPixelSize(
167d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_description_text_size);
168d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    p.setTextSize(descriptionTextSize);
169d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float descriptionTextHeight = p.getFontMetricsInt().bottom
170d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - p.getFontMetricsInt().top;
171d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
172d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float statusBarHeight = res.getDimensionPixelSize(
173d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            com.android.internal.R.dimen.status_bar_height);
174d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsItemTopPadding = statusBarHeight;
175d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
176d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float height = thumbTopMargin
177d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbHeight
178d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + 2 * thumbBgPadding + textPadding + labelTextHeight
179d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + recentsItemTopPadding + textPadding + descriptionTextHeight;
180d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsItemRightPadding = res
181d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_item_padding);
182d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsScrollViewRightPadding = res
183d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_right_glow_margin);
184d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    x = (int) (dm.widthPixels - res
185d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width)
186d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - thumbBgPadding - recentsItemRightPadding
187d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - recentsScrollViewRightPadding);
188d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    y = (int) ((dm.heightPixels - statusBarHeight - height) / 2f + thumbTopMargin
189d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + recentsItemTopPadding + thumbBgPadding + statusBarHeight);
190d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
191d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
192d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
193d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        statusBarView,
194d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        first, x, y,
195d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        new ActivityOptions.OnAnimationStartedListener() {
196d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            public void onAnimationStarted() {
197d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                Intent intent =
198d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                        new Intent(RecentsActivity.WINDOW_ANIMATION_START_INTENT);
199d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                intent.setPackage("com.android.systemui");
200d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                mContext.sendBroadcastAsUser(intent,
201d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                        new UserHandle(UserHandle.USER_CURRENT));
202d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            }
203d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        });
204d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                intent.putExtra(RecentsActivity.WAITING_FOR_WINDOW_ANIMATION_PARAM, true);
205d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
206d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        UserHandle.USER_CURRENT));
207d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            }
208d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        } catch (ActivityNotFoundException e) {
209d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            Log.e(TAG, "Failed to launch RecentAppsIntent", e);
210d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        }
211d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
212d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
214303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onConfigurationChanged(Configuration newConfig) {
2157048fea75c06324a748d49f25bc05be908cda9ffWinson Chung        if (mUseAlternateRecents) {
2167048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onConfigurationChanged(newConfig);
217303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
218303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
219303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
220d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
221d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void preloadRecentTasksList() {
222303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (mUseAlternateRecents) {
2237048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onPreloadRecents();
224303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
225303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            Intent intent = new Intent(RecentsActivity.PRELOAD_INTENT);
226303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            intent.setClassName("com.android.systemui",
227303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                    "com.android.systemui.recent.RecentsPreloadReceiver");
228303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
229d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
230303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            RecentTasksLoader.getInstance(mContext).preloadFirstTask();
231303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
232d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
233d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
234d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
235d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void cancelPreloadingRecentTasksList() {
236303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (mUseAlternateRecents) {
2377048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onCancelPreloadingRecents();
238303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
239303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            Intent intent = new Intent(RecentsActivity.CANCEL_PRELOAD_INTENT);
240303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            intent.setClassName("com.android.systemui",
241303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                    "com.android.systemui.recent.RecentsPreloadReceiver");
242303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
243d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
244303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask();
245303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
246d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
247d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
248d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
249d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void closeRecents() {
250303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (mUseAlternateRecents) {
2517048fea75c06324a748d49f25bc05be908cda9ffWinson Chung            mAlternateRecents.onCloseRecents();
252303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
253303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            Intent intent = new Intent(RecentsActivity.CLOSE_RECENTS_INTENT);
254303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            intent.setPackage("com.android.systemui");
255303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
256303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
257303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask();
258303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
259d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
260d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock}
261