15ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller/*
25ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Copyright (C) 2010 The Android Open Source Project
35ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
45ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Licensed under the Apache License, Version 2.0 (the "License");
55ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * you may not use this file except in compliance with the License.
65ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * You may obtain a copy of the License at
75ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
85ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *      http://www.apache.org/licenses/LICENSE-2.0
95ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Unless required by applicable law or agreed to in writing, software
115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * distributed under the License is distributed on an "AS IS" BASIS,
125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * See the License for the specific language governing permissions and
145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * limitations under the License.
155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */
165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpackage com.android.carouseltest;
195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport java.util.ArrayList;
215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport java.util.List;
225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport com.android.carouseltest.R;
235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
247cc5787b49708f63aeb818bdd06efed3d4229925Jim Shumaimport com.android.ex.carousel.CarouselController;
25a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport com.android.ex.carousel.CarouselViewHelper;
265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.app.Activity;
285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.app.ActivityManager;
295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.app.IThumbnailReceiver;
305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.app.ActivityManager.RunningTaskInfo;
315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.ActivityNotFoundException;
325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.Context;
335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.Intent;
345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.pm.ActivityInfo;
355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.pm.PackageManager;
365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.pm.ResolveInfo;
375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Configuration;
385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Resources;
395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap;
405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.BitmapFactory;
41a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.Canvas;
425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Matrix;
43a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.Paint;
445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap.Config;
455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.drawable.Drawable;
465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.os.Bundle;
475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.os.RemoteException;
485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log;
495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.view.View;
505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic class TaskSwitcherActivity extends Activity {
525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final String TAG = "TaskSwitcherActivity";
535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int CARD_SLOTS = 56;
545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int MAX_TASKS = 20;
555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int VISIBLE_SLOTS = 7;
567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    protected static final boolean DBG = false;
575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ActivityManager mActivityManager;
585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private List<RunningTaskInfo> mRunningTaskList;
595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private boolean mPortraitMode = true;
605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ArrayList<ActivityDescription> mActivityDescriptions
615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            = new ArrayList<ActivityDescription>();
627cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma    private CarouselController mController;
635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private MyCarouselView mView;
645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Bitmap mBlankBitmap = Bitmap.createBitmap(128, 128, Config.RGB_565);
65a3cb716626b477c98ba912698c765eab20f27286Jim Miller    private LocalCarouselViewHelper mHelper;
665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    static class ActivityDescription {
685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        int id;
695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Bitmap thumbnail;
705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Drawable icon;
71a3cb716626b477c98ba912698c765eab20f27286Jim Miller        CharSequence label;
72a3cb716626b477c98ba912698c765eab20f27286Jim Miller        CharSequence description;
735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Intent intent;
745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Matrix matrix;
755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public ActivityDescription(Bitmap _thumbnail,
775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                Drawable _icon, String _label, String _desc, int _id)
785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        {
795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            thumbnail = _thumbnail;
805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            icon = _icon;
815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            label = _label;
825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            description = _desc;
835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            id = _id;
845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void clear() {
875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            icon = null;
885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            thumbnail = null;
895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            label = null;
905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            description = null;
915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            intent = null;
925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            matrix = null;
935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            id = -1;
945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ActivityDescription findActivityDescription(int id) {
985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        for (int i = 0; i < mActivityDescriptions.size(); i++) {
995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            ActivityDescription item = mActivityDescriptions.get(i);
1005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (item != null && item.id == id) {
1015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                return item;
1025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
1035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        return null;
1055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
1065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
107a3cb716626b477c98ba912698c765eab20f27286Jim Miller    class LocalCarouselViewHelper extends CarouselViewHelper {
108a3cb716626b477c98ba912698c765eab20f27286Jim Miller        private static final int DETAIL_TEXTURE_WIDTH = 256;
109a3cb716626b477c98ba912698c765eab20f27286Jim Miller        private static final int DETAIL_TEXTURE_HEIGHT = 80;
110a3cb716626b477c98ba912698c765eab20f27286Jim Miller        private Paint mPaint = new Paint();
111a3cb716626b477c98ba912698c765eab20f27286Jim Miller        private DetailTextureParameters mDetailTextureParameters
112a3cb716626b477c98ba912698c765eab20f27286Jim Miller                = new DetailTextureParameters(5.0f, 5.0f);
1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
114a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public LocalCarouselViewHelper(Context context) {
115a3cb716626b477c98ba912698c765eab20f27286Jim Miller            super(context);
1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
118a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
119a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public DetailTextureParameters getDetailTextureParameters(int id) {
120a3cb716626b477c98ba912698c765eab20f27286Jim Miller            return mDetailTextureParameters;
1215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
123a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
1245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void onCardSelected(int n) {
1255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (n < mActivityDescriptions.size()) {
1265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                ActivityDescription item = mActivityDescriptions.get(n);
1275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                // prepare a launch intent and send it
1285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                if (item.intent != null) {
1295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    item.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
1305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    try {
1315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        Log.v(TAG, "Starting intent " + item.intent);
1325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        startActivity(item.intent);
1335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
1345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    } catch (ActivityNotFoundException e) {
1355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        Log.w("Recent", "Unable to launch recent task", e);
1365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    }
1375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    finish();
1385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                }
1395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
1405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
142a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
143a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public Bitmap getTexture(int n) {
144a3cb716626b477c98ba912698c765eab20f27286Jim Miller            ActivityDescription desc = mActivityDescriptions.get(n);
145a3cb716626b477c98ba912698c765eab20f27286Jim Miller            Bitmap bitmap = desc.thumbnail == null ? mBlankBitmap : desc.thumbnail;
146a3cb716626b477c98ba912698c765eab20f27286Jim Miller            return bitmap;
1475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
149a3cb716626b477c98ba912698c765eab20f27286Jim Miller        @Override
150a3cb716626b477c98ba912698c765eab20f27286Jim Miller        public Bitmap getDetailTexture(int n) {
151a3cb716626b477c98ba912698c765eab20f27286Jim Miller            Bitmap bitmap = null;
1525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (n < mActivityDescriptions.size()) {
153a3cb716626b477c98ba912698c765eab20f27286Jim Miller                ActivityDescription item = mActivityDescriptions.get(n);
154a3cb716626b477c98ba912698c765eab20f27286Jim Miller                bitmap = Bitmap.createBitmap(DETAIL_TEXTURE_WIDTH, DETAIL_TEXTURE_HEIGHT,
155a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    Bitmap.Config.ARGB_8888);
156a3cb716626b477c98ba912698c765eab20f27286Jim Miller                Canvas canvas = new Canvas(bitmap);
157a3cb716626b477c98ba912698c765eab20f27286Jim Miller                canvas.drawARGB(128,128,128,255);
158a3cb716626b477c98ba912698c765eab20f27286Jim Miller                mPaint.setTextSize(15.0f);
159a3cb716626b477c98ba912698c765eab20f27286Jim Miller                mPaint.setColor(0xffffffff);
160a3cb716626b477c98ba912698c765eab20f27286Jim Miller                mPaint.setAntiAlias(true);
161a3cb716626b477c98ba912698c765eab20f27286Jim Miller                canvas.drawText(item.label.toString(),0, DETAIL_TEXTURE_HEIGHT/2, mPaint);
1625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
163a3cb716626b477c98ba912698c765eab20f27286Jim Miller            return bitmap;
164198a060d650bc849ef0f25b597888fac9546803bJack Palevich        }
1655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
1665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private final IThumbnailReceiver mThumbnailReceiver = new IThumbnailReceiver.Stub() {
1685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void finished() throws RemoteException {
1705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void newThumbnail(final int id, final Bitmap bitmap, CharSequence description)
1745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                throws RemoteException {
1755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            int w = bitmap.getWidth();
1765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            int h = bitmap.getHeight();
1775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            Log.v(TAG, "New thumbnail for id=" + id + ", dimensions=" + w + "x" + h
1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    + " description '" + description + "'");
1795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            ActivityDescription info = findActivityDescription(id);
1805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (info != null) {
1815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                info.thumbnail = bitmap;
1825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                final int thumbWidth = bitmap.getWidth();
1835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                final int thumbHeight = bitmap.getHeight();
1845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                if ((mPortraitMode && thumbWidth > thumbHeight)
1855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        || (!mPortraitMode && thumbWidth < thumbHeight)) {
1865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Matrix matrix = new Matrix();
1875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
1885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    info.matrix = matrix;
1895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                } else {
1905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    info.matrix = null;
1915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                }
1925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            } else {
1935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                Log.v(TAG, "Can't find view for id " + id);
1945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
1975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
1995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    protected void onCreate(Bundle savedInstanceState) {
2005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.onCreate(savedInstanceState);
2015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final Resources res = getResources();
2035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final View decorView = getWindow().getDecorView();
2045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2057cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma        mController = new CarouselController();
2067cc5787b49708f63aeb818bdd06efed3d4229925Jim Shuma        mView = new MyCarouselView(this, mController);
207a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHelper = new LocalCarouselViewHelper(this);
208a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHelper.setCarouselView(mView);
2095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.setSlotCount(CARD_SLOTS);
2105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.setVisibleSlots(VISIBLE_SLOTS);
2115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.createCards(1);
2125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.setStartAngle((float) -(2.0f*Math.PI * 5 / CARD_SLOTS));
2135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.setDefaultBitmap(BitmapFactory.decodeResource(res, R.drawable.wait));
2145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.setLoadingBitmap(BitmapFactory.decodeResource(res, R.drawable.wait));
215a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mView.setBackgroundColor(0.1f, 0.1f, 0.1f, 1.0f);
2165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
2185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mPortraitMode = decorView.getHeight() > decorView.getWidth();
2195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        refresh();
2215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setContentView(mView);
2225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
2255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    protected void onResume() {
2265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.onResume();
227a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHelper.onResume();
2285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        refresh();
2295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    @Override
232a3cb716626b477c98ba912698c765eab20f27286Jim Miller    protected void onPause() {
233a3cb716626b477c98ba912698c765eab20f27286Jim Miller        super.onPause();
234a3cb716626b477c98ba912698c765eab20f27286Jim Miller        mHelper.onPause();
235a3cb716626b477c98ba912698c765eab20f27286Jim Miller    }
236a3cb716626b477c98ba912698c765eab20f27286Jim Miller
237a3cb716626b477c98ba912698c765eab20f27286Jim Miller    @Override
2385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void onConfigurationChanged(Configuration newConfig) {
2395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        super.onConfigurationChanged(newConfig);
2405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mPortraitMode = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
2415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Log.v(TAG, "CONFIG CHANGE, mPortraitMode = " + mPortraitMode);
2425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        refresh();
2435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    void updateRunningTasks() {
2465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRunningTaskList = mActivityManager.getRunningTasks(MAX_TASKS + 2, 0, mThumbnailReceiver);
2475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Log.v(TAG, "Portrait: " + mPortraitMode);
2485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        for (RunningTaskInfo r : mRunningTaskList) {
2495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (r.thumbnail != null) {
2505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                int thumbWidth = r.thumbnail.getWidth();
2515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                int thumbHeight = r.thumbnail.getHeight();
2525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                Log.v(TAG, "Got thumbnail " + thumbWidth + "x" + thumbHeight);
2535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                ActivityDescription desc = findActivityDescription(r.id);
2545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                if (desc != null) {
2555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    desc.thumbnail = r.thumbnail;
256a3cb716626b477c98ba912698c765eab20f27286Jim Miller                    desc.description = r.description;
2575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    if ((mPortraitMode && thumbWidth > thumbHeight)
2585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                            || (!mPortraitMode && thumbWidth < thumbHeight)) {
2595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        Matrix matrix = new Matrix();
2605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
2615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                        desc.matrix = matrix;
2625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    }
2635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                } else {
2645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Log.v(TAG, "Couldn't find ActivityDesc for id=" + r.id);
2655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                }
2665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            } else {
2675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                Log.v(TAG, "*** RUNNING THUMBNAIL WAS NULL ***");
2685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
2695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // HACK refresh carousel
2715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.createCards(mActivityDescriptions.size());
2725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void updateRecentTasks() {
2755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final PackageManager pm = getPackageManager();
2765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
2775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        final List<ActivityManager.RecentTaskInfo> recentTasks =
2795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                am.getRecentTasks(MAX_TASKS + 2, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
2805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
2825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    .resolveActivityInfo(pm, 0);
2835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        //IconUtilities iconUtilities = new IconUtilities(this);
2855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        int numTasks = recentTasks.size();
2875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mActivityDescriptions.clear();
2885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        for (int i = 1, index = 0; i < numTasks && (index < MAX_TASKS + 2); ++i) {
2895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
2905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            Intent intent = new Intent(recentInfo.baseIntent);
2925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (recentInfo.origActivity != null) {
2935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                intent.setComponent(recentInfo.origActivity);
2945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
2955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            // Skip the current home activity.
2975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (homeInfo != null
2985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    && homeInfo.packageName.equals(intent.getComponent().getPackageName())
2995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    && homeInfo.name.equals(intent.getComponent().getClassName())) {
3005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                continue;
3015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
3025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
3045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    | Intent.FLAG_ACTIVITY_NEW_TASK);
3055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
3065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (resolveInfo != null) {
3075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                final ActivityInfo info = resolveInfo.activityInfo;
3085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                final String title = info.loadLabel(pm).toString();
3095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                Drawable icon = info.loadIcon(pm);
3105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
311a3cb716626b477c98ba912698c765eab20f27286Jim Miller                int id = recentInfo.id;
3125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                if (id != -1 && title != null && title.length() > 0 && icon != null) {
3135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    //icon = iconUtilities.createIconDrawable(icon);
3145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    ActivityDescription item = new ActivityDescription(null, icon, title, null, id);
3155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    item.intent = intent;
3165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mActivityDescriptions.add(item);
3175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Log.v(TAG, "Added item[" + index + "], id=" + item.id);
3185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    ++index;
3195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                } else {
3205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Log.v(TAG, "SKIPPING item " + id);
3215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                }
3225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
3235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
3245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void refresh() {
3275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        updateRecentTasks();
3285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        updateRunningTasks();
3295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mView.createCards(mActivityDescriptions.size());
3305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller}
332