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