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;
29d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.os.UserHandle;
30d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.DisplayMetrics;
31d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.util.Log;
32d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.Display;
33d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport android.view.View;
34d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
35d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.R;
36d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.RecentsComponent;
37d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockimport com.android.systemui.SystemUI;
38d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
39d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlockpublic class Recents extends SystemUI implements RecentsComponent {
40d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    private static final String TAG = "Recents";
41d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    private static final boolean DEBUG = false;
42d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
43d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
44d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void start() {
45d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        putComponent(RecentsComponent.class, this);
46d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
47d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
48d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
49d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void toggleRecents(Display display, int layoutDirection, View statusBarView) {
50d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        if (DEBUG) Log.d(TAG, "toggle recents panel");
51d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        try {
52d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            TaskDescription firstTask = RecentTasksLoader.getInstance(mContext).getFirstTask();
53d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
54d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            Intent intent = new Intent(RecentsActivity.TOGGLE_RECENTS_INTENT);
55d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            intent.setClassName("com.android.systemui",
56d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    "com.android.systemui.recent.RecentsActivity");
57d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
58d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
59d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
60d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            if (firstTask == null) {
61d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (RecentsActivity.forceOpaqueBackground(mContext)) {
62d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
63d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.anim.recents_launch_from_launcher_enter,
64d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.anim.recents_launch_from_launcher_exit);
65d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
66d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            UserHandle.USER_CURRENT));
67d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                } else {
68d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    // The correct window animation will be applied via the activity's style
69d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    mContext.startActivityAsUser(intent, new UserHandle(
70d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            UserHandle.USER_CURRENT));
71d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
72d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
73d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            } else {
749926272f32868c858b24b45e048210cf3515741eMichael Jurka                Bitmap first = null;
759926272f32868c858b24b45e048210cf3515741eMichael Jurka                if (firstTask.getThumbnail() instanceof BitmapDrawable) {
769926272f32868c858b24b45e048210cf3515741eMichael Jurka                    first = ((BitmapDrawable) firstTask.getThumbnail()).getBitmap();
779926272f32868c858b24b45e048210cf3515741eMichael Jurka                } else {
789926272f32868c858b24b45e048210cf3515741eMichael Jurka                    first = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
799926272f32868c858b24b45e048210cf3515741eMichael Jurka                    Drawable d = RecentTasksLoader.getInstance(mContext).getDefaultThumbnail();
809926272f32868c858b24b45e048210cf3515741eMichael Jurka                    d.draw(new Canvas(first));
819926272f32868c858b24b45e048210cf3515741eMichael Jurka                }
82d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                final Resources res = mContext.getResources();
83d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
84d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                float thumbWidth = res
85d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width);
86d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                float thumbHeight = res
87d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height);
88d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (first == null) {
89d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    throw new RuntimeException("Recents thumbnail is null");
90d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
91d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (first.getWidth() != thumbWidth || first.getHeight() != thumbHeight) {
92d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    first = Bitmap.createScaledBitmap(first, (int) thumbWidth, (int) thumbHeight,
93d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            true);
94d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    if (first == null) {
95d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        throw new RuntimeException("Recents thumbnail is null");
96d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    }
97d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
98d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
99d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
100d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                DisplayMetrics dm = new DisplayMetrics();
101d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                display.getMetrics(dm);
102d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                // calculate it here, but consider moving it elsewhere
103d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                // first, determine which orientation you're in.
104d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                final Configuration config = res.getConfiguration();
105d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                int x, y;
106d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
107d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
108d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float appLabelLeftMargin = res.getDimensionPixelSize(
109d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_left_margin);
110d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float appLabelWidth = res.getDimensionPixelSize(
111d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_width);
112d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbLeftMargin = res.getDimensionPixelSize(
113d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_left_margin);
114d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbBgPadding = res.getDimensionPixelSize(
115d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_bg_padding);
116d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
117d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float width = appLabelLeftMargin +
118d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            +appLabelWidth
119d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbLeftMargin
120d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbWidth
121d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + 2 * thumbBgPadding;
122d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
123d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    x = (int) ((dm.widthPixels - width) / 2f + appLabelLeftMargin + appLabelWidth
124d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbBgPadding + thumbLeftMargin);
125d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    y = (int) (dm.heightPixels
126d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - res.getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height)
127d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - thumbBgPadding);
128d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
129d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        x = dm.widthPixels - x - res.getDimensionPixelSize(
130d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                R.dimen.status_bar_recents_thumbnail_width);
131d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    }
132d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
133d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                } else { // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
134d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbTopMargin = res.getDimensionPixelSize(
135d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_top_margin);
136d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float thumbBgPadding = res.getDimensionPixelSize(
137d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_thumbnail_bg_padding);
138d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float textPadding = res.getDimensionPixelSize(
139d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_text_description_padding);
140d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float labelTextSize = res.getDimensionPixelSize(
141d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_label_text_size);
142d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    Paint p = new Paint();
143d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    p.setTextSize(labelTextSize);
144d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float labelTextHeight = p.getFontMetricsInt().bottom
145d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - p.getFontMetricsInt().top;
146d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float descriptionTextSize = res.getDimensionPixelSize(
147d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            R.dimen.status_bar_recents_app_description_text_size);
148d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    p.setTextSize(descriptionTextSize);
149d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float descriptionTextHeight = p.getFontMetricsInt().bottom
150d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - p.getFontMetricsInt().top;
151d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
152d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float statusBarHeight = res.getDimensionPixelSize(
153d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            com.android.internal.R.dimen.status_bar_height);
154d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsItemTopPadding = statusBarHeight;
155d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
156d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float height = thumbTopMargin
157d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + thumbHeight
158d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + 2 * thumbBgPadding + textPadding + labelTextHeight
159d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + recentsItemTopPadding + textPadding + descriptionTextHeight;
160d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsItemRightPadding = res
161d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_item_padding);
162d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    float recentsScrollViewRightPadding = res
163d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_right_glow_margin);
164d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    x = (int) (dm.widthPixels - res
165d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width)
166d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - thumbBgPadding - recentsItemRightPadding
167d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            - recentsScrollViewRightPadding);
168d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                    y = (int) ((dm.heightPixels - statusBarHeight - height) / 2f + thumbTopMargin
169d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            + recentsItemTopPadding + thumbBgPadding + statusBarHeight);
170d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                }
171d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
172d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
173d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        statusBarView,
174d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        first, x, y,
175d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        new ActivityOptions.OnAnimationStartedListener() {
176d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            public void onAnimationStarted() {
177d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                Intent intent =
178d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                        new Intent(RecentsActivity.WINDOW_ANIMATION_START_INTENT);
179d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                intent.setPackage("com.android.systemui");
180d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                mContext.sendBroadcastAsUser(intent,
181d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                                        new UserHandle(UserHandle.USER_CURRENT));
182d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                            }
183d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        });
184d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                intent.putExtra(RecentsActivity.WAITING_FOR_WINDOW_ANIMATION_PARAM, true);
185d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
186d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                        UserHandle.USER_CURRENT));
187d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            }
188d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        } catch (ActivityNotFoundException e) {
189d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock            Log.e(TAG, "Failed to launch RecentAppsIntent", e);
190d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        }
191d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
192d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
193d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
194d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void preloadRecentTasksList() {
195d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        if (DEBUG) Log.d(TAG, "preloading recents");
196d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        Intent intent = new Intent(RecentsActivity.PRELOAD_INTENT);
197d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        intent.setClassName("com.android.systemui",
198d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                "com.android.systemui.recent.RecentsPreloadReceiver");
199d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
200d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
201d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        RecentTasksLoader.getInstance(mContext).preloadFirstTask();
202d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
203d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
204d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
205d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void cancelPreloadingRecentTasksList() {
206d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        if (DEBUG) Log.d(TAG, "cancel preloading recents");
207d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        Intent intent = new Intent(RecentsActivity.CANCEL_PRELOAD_INTENT);
208d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        intent.setClassName("com.android.systemui",
209d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock                "com.android.systemui.recent.RecentsPreloadReceiver");
210d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
211d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
212d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask();
213d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
214d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock
215d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    @Override
216d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    public void closeRecents() {
217d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        if (DEBUG) Log.d(TAG, "closing recents panel");
218d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        Intent intent = new Intent(RecentsActivity.CLOSE_RECENTS_INTENT);
219d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        intent.setPackage("com.android.systemui");
220d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock        mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
221d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock    }
222d08de37a2223d5183620098737eb93907a4ba92cJohn Spurlock}
223