blob: a48a4effb7c686416ff7a0ac336f06930b37d99d [file] [log] [blame]
Winson Chungb3347bb2010-08-19 14:51:28 -07001/*
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
Winson Chungcd4bc492010-12-09 18:52:32 -080019import android.animation.ObjectAnimator;
Winson Chung4dbea792011-05-05 14:21:32 -070020import android.content.ComponentName;
Winson Chungb3347bb2010-08-19 14:51:28 -070021import android.content.Context;
Winson Chung241c3b42010-08-25 16:53:03 -070022import android.content.pm.PackageManager;
23import android.content.pm.ResolveInfo;
Winson Chung59e1f9a2010-12-21 11:31:54 -080024import android.content.res.Resources;
Winson Chung64a3cd42010-09-17 16:47:33 -070025import android.content.res.TypedArray;
Winson Chungb3347bb2010-08-19 14:51:28 -070026import android.graphics.Bitmap;
Winson Chungb3347bb2010-08-19 14:51:28 -070027import android.graphics.Canvas;
Winson Chungb3347bb2010-08-19 14:51:28 -070028import android.graphics.Paint;
Michael Jurka0620bec2010-10-25 17:50:09 -070029import android.os.Handler;
30import android.os.HandlerThread;
31import android.os.Message;
Winson Chungb3347bb2010-08-19 14:51:28 -070032import android.util.AttributeSet;
Winson Chung97d85d22011-04-13 11:27:36 -070033import android.view.KeyEvent;
Winson Chung03c568e2010-08-19 17:16:59 -070034import android.widget.Checkable;
Winson Chungc84001e2010-11-09 12:20:57 -080035
Winson Chung63257c12011-05-05 17:06:13 -070036import com.android.launcher.R;
Winson Chung241c3b42010-08-25 16:53:03 -070037
Winson Chungb3347bb2010-08-19 14:51:28 -070038
39/**
40 * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
41 * drawables on the top).
42 */
Michael Jurkac0759f52011-02-03 16:47:14 -080043public class PagedViewIcon extends CachedTextView implements Checkable {
Winson Chungb3347bb2010-08-19 14:51:28 -070044 private static final String TAG = "PagedViewIcon";
45
46 // holographic outline
47 private final Paint mPaint = new Paint();
Winson Chung5f2aa4e2010-08-20 14:49:25 -070048 private Bitmap mCheckedOutline;
Winson Chungb3347bb2010-08-19 14:51:28 -070049 private Bitmap mHolographicOutline;
Michael Jurka0620bec2010-10-25 17:50:09 -070050 private Bitmap mIcon;
Winson Chungb3347bb2010-08-19 14:51:28 -070051
Winson Chung88127032010-12-13 12:11:33 -080052 private int mAlpha = 255;
Winson Chungb3347bb2010-08-19 14:51:28 -070053 private int mHolographicAlpha;
54
Winson Chung03c568e2010-08-19 17:16:59 -070055 private boolean mIsChecked;
Winson Chungcd4bc492010-12-09 18:52:32 -080056 private ObjectAnimator mCheckedAlphaAnimator;
Winson Chung59e1f9a2010-12-21 11:31:54 -080057 private float mCheckedAlpha = 1.0f;
58 private int mCheckedFadeInDuration;
59 private int mCheckedFadeOutDuration;
Winson Chung03c568e2010-08-19 17:16:59 -070060
Michael Jurka8245a862011-02-01 17:53:59 -080061 HolographicPagedViewIcon mHolographicOutlineView;
Winson Chungb44b5242011-06-13 11:32:14 -070062 private HolographicOutlineHelper mHolographicOutlineHelper;
Winson Chung64a3cd42010-09-17 16:47:33 -070063
Winson Chungb3347bb2010-08-19 14:51:28 -070064 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);
Winson Chung29d6fea2010-12-01 15:47:31 -080074
Winson Chung59e1f9a2010-12-21 11:31:54 -080075 // Set up fade in/out constants
76 final Resources r = context.getResources();
Winson Chung785d2eb2011-04-14 16:08:02 -070077 final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
Winson Chung59e1f9a2010-12-21 11:31:54 -080078 if (alpha > 0) {
Winson Chung785d2eb2011-04-14 16:08:02 -070079 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);
Winson Chung59e1f9a2010-12-21 11:31:54 -080084 }
85
Michael Jurka8245a862011-02-01 17:53:59 -080086 mHolographicOutlineView = new HolographicPagedViewIcon(context, this);
87 }
88
89 protected HolographicPagedViewIcon getHolographicOutlineView() {
90 return mHolographicOutlineView;
91 }
92
93 protected Bitmap getHolographicOutline() {
94 return mHolographicOutline;
Winson Chungb3347bb2010-08-19 14:51:28 -070095 }
96
Winson Chungb44b5242011-06-13 11:32:14 -070097 public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp,
98 HolographicOutlineHelper holoOutlineHelper) {
99 mHolographicOutlineHelper = holoOutlineHelper;
Michael Jurkac9a96192010-11-01 11:52:08 -0700100 mIcon = info.iconBitmap;
Michael Jurka0620bec2010-10-25 17:50:09 -0700101 setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
Winson Chung241c3b42010-08-25 16:53:03 -0700102 setText(info.title);
103 setTag(info);
104 }
105
106 public void applyFromResolveInfo(ResolveInfo info, PackageManager packageManager,
Winson Chungb44b5242011-06-13 11:32:14 -0700107 IconCache modelIconCache, HolographicOutlineHelper holoOutlineHelper) {
108 mHolographicOutlineHelper = holoOutlineHelper;
Winson Chung4dbea792011-05-05 14:21:32 -0700109 ComponentName cn = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
110 mIcon = modelIconCache.getIcon(cn, info);
Michael Jurka0620bec2010-10-25 17:50:09 -0700111 setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
Winson Chung241c3b42010-08-25 16:53:03 -0700112 setText(info.loadLabel(packageManager));
113 setTag(info);
Winson Chungb44b5242011-06-13 11:32:14 -0700114 }
Michael Jurka0620bec2010-10-25 17:50:09 -0700115
Winson Chungb44b5242011-06-13 11:32:14 -0700116 public void setHolographicOutline(Bitmap holoOutline) {
117 mHolographicOutline = holoOutline;
118 getHolographicOutlineView().invalidate();
Winson Chung241c3b42010-08-25 16:53:03 -0700119 }
120
Winson Chungb3347bb2010-08-19 14:51:28 -0700121 @Override
122 public void setAlpha(float alpha) {
Winson Chungb44b5242011-06-13 11:32:14 -0700123 final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha);
124 final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha);
Winson Chunge22a8e92010-11-12 13:40:58 -0800125 int newViewAlpha = (int) (viewAlpha * 255);
126 int newHolographicAlpha = (int) (holographicAlpha * 255);
127 if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
128 mAlpha = newViewAlpha;
129 mHolographicAlpha = newHolographicAlpha;
130 super.setAlpha(viewAlpha);
131 }
Winson Chungb3347bb2010-08-19 14:51:28 -0700132 }
133
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700134 public void invalidateCheckedImage() {
135 if (mCheckedOutline != null) {
136 mCheckedOutline.recycle();
137 mCheckedOutline = null;
138 }
139 }
140
Winson Chungb3347bb2010-08-19 14:51:28 -0700141 @Override
Michael Jurka0620bec2010-10-25 17:50:09 -0700142 protected void onDraw(Canvas canvas) {
143 if (mAlpha > 0) {
144 super.onDraw(canvas);
145 }
Winson Chungb3347bb2010-08-19 14:51:28 -0700146
Michael Jurka0620bec2010-10-25 17:50:09 -0700147 Bitmap overlay = null;
Winson Chungb3347bb2010-08-19 14:51:28 -0700148
Michael Jurka0620bec2010-10-25 17:50:09 -0700149 // draw any blended overlays
Winson Chung6a70e9f2011-05-17 16:24:49 -0700150 if (mCheckedOutline != null) {
Michael Jurka0620bec2010-10-25 17:50:09 -0700151 mPaint.setAlpha(255);
152 overlay = mCheckedOutline;
153 }
154
155 if (overlay != null) {
Winson Chungc84001e2010-11-09 12:20:57 -0800156 final int offset = getScrollX();
Michael Jurka0620bec2010-10-25 17:50:09 -0700157 final int compoundPaddingLeft = getCompoundPaddingLeft();
158 final int compoundPaddingRight = getCompoundPaddingRight();
159 int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
160 canvas.drawBitmap(overlay,
Winson Chungc84001e2010-11-09 12:20:57 -0800161 offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
Michael Jurka0620bec2010-10-25 17:50:09 -0700162 mPaddingTop,
163 mPaint);
Winson Chungb3347bb2010-08-19 14:51:28 -0700164 }
165 }
166
Winson Chungb3347bb2010-08-19 14:51:28 -0700167 @Override
Winson Chung97d85d22011-04-13 11:27:36 -0700168 public boolean onKeyDown(int keyCode, KeyEvent event) {
169 return FocusHelper.handlePagedViewIconKeyEvent(this, keyCode, event)
170 || super.onKeyDown(keyCode, event);
171 }
172
173 @Override
174 public boolean onKeyUp(int keyCode, KeyEvent event) {
175 return FocusHelper.handlePagedViewIconKeyEvent(this, keyCode, event)
176 || super.onKeyUp(keyCode, event);
177 }
178
179 @Override
Winson Chung03c568e2010-08-19 17:16:59 -0700180 public boolean isChecked() {
181 return mIsChecked;
182 }
183
Patrick Dubroy5f445422011-02-18 14:35:21 -0800184 void setChecked(boolean checked, boolean animate) {
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700185 if (mIsChecked != checked) {
186 mIsChecked = checked;
187
Winson Chungcd4bc492010-12-09 18:52:32 -0800188 float alpha;
189 int duration;
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700190 if (mIsChecked) {
Winson Chung59e1f9a2010-12-21 11:31:54 -0800191 alpha = mCheckedAlpha;
192 duration = mCheckedFadeInDuration;
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700193 } else {
Winson Chungcd4bc492010-12-09 18:52:32 -0800194 alpha = 1.0f;
Winson Chung59e1f9a2010-12-21 11:31:54 -0800195 duration = mCheckedFadeOutDuration;
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700196 }
197
Winson Chungcd4bc492010-12-09 18:52:32 -0800198 // Initialize the animator
199 if (mCheckedAlphaAnimator != null) {
200 mCheckedAlphaAnimator.cancel();
201 }
Patrick Dubroy5f445422011-02-18 14:35:21 -0800202 if (animate) {
203 mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
204 mCheckedAlphaAnimator.setDuration(duration);
205 mCheckedAlphaAnimator.start();
206 } else {
207 setAlpha(alpha);
208 }
Winson Chungcd4bc492010-12-09 18:52:32 -0800209
Winson Chung5f2aa4e2010-08-20 14:49:25 -0700210 invalidate();
211 }
Winson Chung03c568e2010-08-19 17:16:59 -0700212 }
213
214 @Override
Patrick Dubroy5f445422011-02-18 14:35:21 -0800215 public void setChecked(boolean checked) {
216 setChecked(checked, true);
217 }
218
219 @Override
Winson Chung03c568e2010-08-19 17:16:59 -0700220 public void toggle() {
221 setChecked(!mIsChecked);
222 }
Winson Chungb3347bb2010-08-19 14:51:28 -0700223}