PagedViewIcon.java revision ae4f155e090bf387b989fb738ee34ab045585711
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.launcher2;
18
19import android.animation.ObjectAnimator;
20import android.content.ComponentName;
21import android.content.Context;
22import android.content.pm.PackageManager;
23import android.content.pm.ResolveInfo;
24import android.content.res.Resources;
25import android.content.res.TypedArray;
26import android.graphics.Bitmap;
27import android.graphics.Canvas;
28import android.graphics.Paint;
29import android.os.Handler;
30import android.os.HandlerThread;
31import android.os.Message;
32import android.util.AttributeSet;
33import android.view.KeyEvent;
34import android.widget.Checkable;
35
36import com.android.launcher.R;
37
38
39/**
40 * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
41 * drawables on the top).
42 */
43public class PagedViewIcon extends CachedTextView implements Checkable {
44    private static final String TAG = "PagedViewIcon";
45
46    // holographic outline
47    private final Paint mPaint = new Paint();
48    private Bitmap mCheckedOutline;
49    private Bitmap mHolographicOutline;
50    private Bitmap mIcon;
51
52    private int mAlpha = 255;
53    private int mHolographicAlpha;
54
55    private boolean mIsChecked;
56    private ObjectAnimator mCheckedAlphaAnimator;
57    private float mCheckedAlpha = 1.0f;
58    private int mCheckedFadeInDuration;
59    private int mCheckedFadeOutDuration;
60
61    HolographicPagedViewIcon mHolographicOutlineView;
62    private HolographicOutlineHelper mHolographicOutlineHelper;
63
64    public PagedViewIcon(Context context) {
65        this(context, null);
66    }
67
68    public PagedViewIcon(Context context, AttributeSet attrs) {
69        this(context, attrs, 0);
70    }
71
72    public PagedViewIcon(Context context, AttributeSet attrs, int defStyle) {
73        super(context, attrs, defStyle);
74
75        // Set up fade in/out constants
76        final Resources r = context.getResources();
77        final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
78        if (alpha > 0) {
79            mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f;
80            mCheckedFadeInDuration =
81                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration);
82            mCheckedFadeOutDuration =
83                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration);
84        }
85
86        mHolographicOutlineView = new HolographicPagedViewIcon(context, this);
87    }
88
89    protected HolographicPagedViewIcon getHolographicOutlineView() {
90        return mHolographicOutlineView;
91    }
92
93    protected Bitmap getHolographicOutline() {
94        return mHolographicOutline;
95    }
96
97    public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp,
98            HolographicOutlineHelper holoOutlineHelper) {
99        mHolographicOutlineHelper = holoOutlineHelper;
100        mIcon = info.iconBitmap;
101        setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
102        setText(info.title);
103        setTag(info);
104    }
105
106    public void setHolographicOutline(Bitmap holoOutline) {
107        mHolographicOutline = holoOutline;
108        getHolographicOutlineView().invalidate();
109    }
110
111    @Override
112    public void setAlpha(float alpha) {
113        final float viewAlpha = HolographicOutlineHelper.viewAlphaInterpolator(alpha);
114        final float holographicAlpha = HolographicOutlineHelper.highlightAlphaInterpolator(alpha);
115        int newViewAlpha = (int) (viewAlpha * 255);
116        int newHolographicAlpha = (int) (holographicAlpha * 255);
117        if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
118            mAlpha = newViewAlpha;
119            mHolographicAlpha = newHolographicAlpha;
120            super.setAlpha(viewAlpha);
121        }
122    }
123
124    public void invalidateCheckedImage() {
125        if (mCheckedOutline != null) {
126            mCheckedOutline.recycle();
127            mCheckedOutline = null;
128        }
129    }
130
131    @Override
132    protected void onDraw(Canvas canvas) {
133        if (mAlpha > 0) {
134            super.onDraw(canvas);
135        }
136
137        Bitmap overlay = null;
138
139        // draw any blended overlays
140        if (mCheckedOutline != null) {
141            mPaint.setAlpha(255);
142            overlay = mCheckedOutline;
143        }
144
145        if (overlay != null) {
146            final int offset = getScrollX();
147            final int compoundPaddingLeft = getCompoundPaddingLeft();
148            final int compoundPaddingRight = getCompoundPaddingRight();
149            int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
150            canvas.drawBitmap(overlay,
151                    offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
152                    mPaddingTop,
153                    mPaint);
154        }
155    }
156
157    @Override
158    public boolean onKeyDown(int keyCode, KeyEvent event) {
159        return FocusHelper.handleAppsCustomizeKeyEvent(this, keyCode, event)
160                || super.onKeyDown(keyCode, event);
161    }
162
163    @Override
164    public boolean onKeyUp(int keyCode, KeyEvent event) {
165        return FocusHelper.handleAppsCustomizeKeyEvent(this, keyCode, event)
166                || super.onKeyUp(keyCode, event);
167    }
168
169    @Override
170    public boolean isChecked() {
171        return mIsChecked;
172    }
173
174    void setChecked(boolean checked, boolean animate) {
175        if (mIsChecked != checked) {
176            mIsChecked = checked;
177
178            float alpha;
179            int duration;
180            if (mIsChecked) {
181                alpha = mCheckedAlpha;
182                duration = mCheckedFadeInDuration;
183            } else {
184                alpha = 1.0f;
185                duration = mCheckedFadeOutDuration;
186            }
187
188            // Initialize the animator
189            if (mCheckedAlphaAnimator != null) {
190                mCheckedAlphaAnimator.cancel();
191            }
192            if (animate) {
193                mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
194                mCheckedAlphaAnimator.setDuration(duration);
195                mCheckedAlphaAnimator.start();
196            } else {
197                setAlpha(alpha);
198            }
199
200            invalidate();
201        }
202    }
203
204    @Override
205    public void setChecked(boolean checked) {
206        setChecked(checked, true);
207    }
208
209    @Override
210    public void toggle() {
211        setChecked(!mIsChecked);
212    }
213}
214