| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.launcher2; |
| |
| import android.animation.ObjectAnimator; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.pm.PackageManager; |
| import android.content.pm.ResolveInfo; |
| import android.content.res.Resources; |
| import android.content.res.TypedArray; |
| import android.graphics.Bitmap; |
| import android.graphics.Canvas; |
| import android.graphics.Paint; |
| import android.os.Handler; |
| import android.os.HandlerThread; |
| import android.os.Message; |
| import android.util.AttributeSet; |
| import android.view.KeyEvent; |
| import android.widget.Checkable; |
| |
| import com.android.launcher.R; |
| |
| |
| /** |
| * An icon on a PagedView, specifically for items in the launcher's paged view (with compound |
| * drawables on the top). |
| */ |
| public class PagedViewIcon extends CachedTextView implements Checkable { |
| private static final String TAG = "PagedViewIcon"; |
| |
| // holographic outline |
| private final Paint mPaint = new Paint(); |
| private Bitmap mCheckedOutline; |
| private Bitmap mHolographicOutline; |
| private Bitmap mIcon; |
| |
| private int mAlpha = 255; |
| private int mHolographicAlpha; |
| |
| private boolean mIsChecked; |
| private ObjectAnimator mCheckedAlphaAnimator; |
| private float mCheckedAlpha = 1.0f; |
| private int mCheckedFadeInDuration; |
| private int mCheckedFadeOutDuration; |
| |
| HolographicPagedViewIcon mHolographicOutlineView; |
| private HolographicOutlineHelper mHolographicOutlineHelper; |
| |
| public PagedViewIcon(Context context) { |
| this(context, null); |
| } |
| |
| public PagedViewIcon(Context context, AttributeSet attrs) { |
| this(context, attrs, 0); |
| } |
| |
| public PagedViewIcon(Context context, AttributeSet attrs, int defStyle) { |
| super(context, attrs, defStyle); |
| |
| // Set up fade in/out constants |
| final Resources r = context.getResources(); |
| final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha); |
| if (alpha > 0) { |
| mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f; |
| mCheckedFadeInDuration = |
| r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration); |
| mCheckedFadeOutDuration = |
| r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration); |
| } |
| |
| mHolographicOutlineView = new HolographicPagedViewIcon(context, this); |
| } |
| |
| protected HolographicPagedViewIcon getHolographicOutlineView() { |
| return mHolographicOutlineView; |
| } |
| |
| protected Bitmap getHolographicOutline() { |
| return mHolographicOutline; |
| } |
| |
| public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp, |
| HolographicOutlineHelper holoOutlineHelper) { |
| mHolographicOutlineHelper = holoOutlineHelper; |
| mIcon = info.iconBitmap; |
| setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null); |
| setText(info.title); |
| setTag(info); |
| } |
| |
| public void applyFromResolveInfo(ResolveInfo info, PackageManager packageManager, |
| IconCache modelIconCache, HolographicOutlineHelper holoOutlineHelper) { |
| mHolographicOutlineHelper = holoOutlineHelper; |
| ComponentName cn = new ComponentName(info.activityInfo.packageName, info.activityInfo.name); |
| mIcon = modelIconCache.getIcon(cn, info); |
| setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null); |
| setText(info.loadLabel(packageManager)); |
| setTag(info); |
| } |
| |
| public void setHolographicOutline(Bitmap holoOutline) { |
| mHolographicOutline = holoOutline; |
| getHolographicOutlineView().invalidate(); |
| } |
| |
| @Override |
| public void setAlpha(float alpha) { |
| final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha); |
| final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha); |
| int newViewAlpha = (int) (viewAlpha * 255); |
| int newHolographicAlpha = (int) (holographicAlpha * 255); |
| if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) { |
| mAlpha = newViewAlpha; |
| mHolographicAlpha = newHolographicAlpha; |
| super.setAlpha(viewAlpha); |
| } |
| } |
| |
| public void invalidateCheckedImage() { |
| if (mCheckedOutline != null) { |
| mCheckedOutline.recycle(); |
| mCheckedOutline = null; |
| } |
| } |
| |
| @Override |
| protected void onDraw(Canvas canvas) { |
| if (mAlpha > 0) { |
| super.onDraw(canvas); |
| } |
| |
| Bitmap overlay = null; |
| |
| // draw any blended overlays |
| if (mCheckedOutline != null) { |
| mPaint.setAlpha(255); |
| overlay = mCheckedOutline; |
| } |
| |
| if (overlay != null) { |
| final int offset = getScrollX(); |
| final int compoundPaddingLeft = getCompoundPaddingLeft(); |
| final int compoundPaddingRight = getCompoundPaddingRight(); |
| int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft; |
| canvas.drawBitmap(overlay, |
| offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2, |
| mPaddingTop, |
| mPaint); |
| } |
| } |
| |
| @Override |
| public boolean onKeyDown(int keyCode, KeyEvent event) { |
| return FocusHelper.handlePagedViewIconKeyEvent(this, keyCode, event) |
| || super.onKeyDown(keyCode, event); |
| } |
| |
| @Override |
| public boolean onKeyUp(int keyCode, KeyEvent event) { |
| return FocusHelper.handlePagedViewIconKeyEvent(this, keyCode, event) |
| || super.onKeyUp(keyCode, event); |
| } |
| |
| @Override |
| public boolean isChecked() { |
| return mIsChecked; |
| } |
| |
| void setChecked(boolean checked, boolean animate) { |
| if (mIsChecked != checked) { |
| mIsChecked = checked; |
| |
| float alpha; |
| int duration; |
| if (mIsChecked) { |
| alpha = mCheckedAlpha; |
| duration = mCheckedFadeInDuration; |
| } else { |
| alpha = 1.0f; |
| duration = mCheckedFadeOutDuration; |
| } |
| |
| // Initialize the animator |
| if (mCheckedAlphaAnimator != null) { |
| mCheckedAlphaAnimator.cancel(); |
| } |
| if (animate) { |
| mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha); |
| mCheckedAlphaAnimator.setDuration(duration); |
| mCheckedAlphaAnimator.start(); |
| } else { |
| setAlpha(alpha); |
| } |
| |
| invalidate(); |
| } |
| } |
| |
| @Override |
| public void setChecked(boolean checked) { |
| setChecked(checked, true); |
| } |
| |
| @Override |
| public void toggle() { |
| setChecked(!mIsChecked); |
| } |
| } |