• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.launcher2;
18 
19 import android.animation.ObjectAnimator;
20 import android.content.ComponentName;
21 import android.content.Context;
22 import android.content.pm.PackageManager;
23 import android.content.pm.ResolveInfo;
24 import android.content.res.Resources;
25 import android.content.res.TypedArray;
26 import android.graphics.Bitmap;
27 import android.graphics.Canvas;
28 import android.graphics.Paint;
29 import android.os.Handler;
30 import android.os.HandlerThread;
31 import android.os.Message;
32 import android.util.AttributeSet;
33 import android.view.KeyEvent;
34 import android.widget.Checkable;
35 
36 import 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  */
43 public 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 
PagedViewIcon(Context context)64     public PagedViewIcon(Context context) {
65         this(context, null);
66     }
67 
PagedViewIcon(Context context, AttributeSet attrs)68     public PagedViewIcon(Context context, AttributeSet attrs) {
69         this(context, attrs, 0);
70     }
71 
PagedViewIcon(Context context, AttributeSet attrs, int defStyle)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 
getHolographicOutlineView()89     protected HolographicPagedViewIcon getHolographicOutlineView() {
90         return mHolographicOutlineView;
91     }
92 
getHolographicOutline()93     protected Bitmap getHolographicOutline() {
94         return mHolographicOutline;
95     }
96 
applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp, HolographicOutlineHelper holoOutlineHelper)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 
setHolographicOutline(Bitmap holoOutline)106     public void setHolographicOutline(Bitmap holoOutline) {
107         mHolographicOutline = holoOutline;
108         getHolographicOutlineView().invalidate();
109     }
110 
111     @Override
setAlpha(float alpha)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 
invalidateCheckedImage()124     public void invalidateCheckedImage() {
125         if (mCheckedOutline != null) {
126             mCheckedOutline.recycle();
127             mCheckedOutline = null;
128         }
129     }
130 
131     @Override
onDraw(Canvas canvas)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
onKeyDown(int keyCode, KeyEvent event)158     public boolean onKeyDown(int keyCode, KeyEvent event) {
159         return FocusHelper.handleAppsCustomizeKeyEvent(this, keyCode, event)
160                 || super.onKeyDown(keyCode, event);
161     }
162 
163     @Override
onKeyUp(int keyCode, KeyEvent event)164     public boolean onKeyUp(int keyCode, KeyEvent event) {
165         return FocusHelper.handleAppsCustomizeKeyEvent(this, keyCode, event)
166                 || super.onKeyUp(keyCode, event);
167     }
168 
169     @Override
isChecked()170     public boolean isChecked() {
171         return mIsChecked;
172     }
173 
setChecked(boolean checked, boolean animate)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
setChecked(boolean checked)205     public void setChecked(boolean checked) {
206         setChecked(checked, true);
207     }
208 
209     @Override
toggle()210     public void toggle() {
211         setChecked(!mIsChecked);
212     }
213 }
214