1e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato/*
2e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * Copyright (C) 2008 The Android Open Source Project
3e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato *
4e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * you may not use this file except in compliance with the License.
6e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * You may obtain a copy of the License at
7e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato *
8e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato *
10e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * Unless required by applicable law or agreed to in writing, software
11e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * See the License for the specific language governing permissions and
14e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * limitations under the License.
15e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato */
16e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
17e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratopackage com.android.internal.policy.impl;
18e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
19e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.drawable.BitmapDrawable;
20e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.drawable.Drawable;
21e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.drawable.PaintDrawable;
22e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.drawable.StateListDrawable;
23e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.Bitmap;
24e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.BlurMaskFilter;
25e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.Canvas;
26e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.ColorMatrix;
27e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.ColorMatrixColorFilter;
28e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.Paint;
29e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.PaintFlagsDrawFilter;
30e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.PixelFormat;
31e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.PorterDuff;
32e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.Rect;
33e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.RectF;
34e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.TableMaskFilter;
35e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.graphics.Typeface;
36e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.text.Layout.Alignment;
37e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.text.StaticLayout;
38e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.text.TextPaint;
39e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.util.DisplayMetrics;
40e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.util.Log;
4168b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brownimport android.util.TypedValue;
4268b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brownimport android.view.ContextThemeWrapper;
43e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.content.res.Resources;
44e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratoimport android.content.Context;
45e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
46e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato/**
47e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato * Various utilities shared amongst the Launcher's classes.
48e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato */
49e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onoratofinal class IconUtilities {
50e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private static final String TAG = "IconUtilities";
51e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
52e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private static final int sColors[] = { 0xffff0000, 0xff00ff00, 0xff0000ff };
53e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
54e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private int mIconWidth = -1;
55e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private int mIconHeight = -1;
56e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private int mIconTextureWidth = -1;
57e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private int mIconTextureHeight = -1;
58e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
59e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Paint mPaint = new Paint();
60e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Paint mBlurPaint = new Paint();
61e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Paint mGlowColorPressedPaint = new Paint();
62e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Paint mGlowColorFocusedPaint = new Paint();
63e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Rect mOldBounds = new Rect();
64e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final Canvas mCanvas = new Canvas();
65e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private final DisplayMetrics mDisplayMetrics;
66e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
67e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private int mColorIndex = 0;
68e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
69e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    public IconUtilities(Context context) {
70e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final Resources resources = context.getResources();
71e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        DisplayMetrics metrics = mDisplayMetrics = resources.getDisplayMetrics();
72e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final float density = metrics.density;
73e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final float blurPx = 5 * density;
74e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
75e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mIconWidth = mIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
76e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mIconTextureWidth = mIconTextureHeight = mIconWidth + (int)(blurPx*2);
77e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
78e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mBlurPaint.setMaskFilter(new BlurMaskFilter(blurPx, BlurMaskFilter.Blur.NORMAL));
7968b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown
8068b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        TypedValue value = new TypedValue();
8168b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        mGlowColorPressedPaint.setColor(context.getTheme().resolveAttribute(
8268b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown                android.R.attr.colorPressedHighlight, value, true) ? value.data : 0xffffc300);
83e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mGlowColorPressedPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30));
8468b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        mGlowColorFocusedPaint.setColor(context.getTheme().resolveAttribute(
8568b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown                android.R.attr.colorFocusedHighlight, value, true) ? value.data : 0xffff8e00);
86e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mGlowColorFocusedPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30));
87e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
88e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        ColorMatrix cm = new ColorMatrix();
89e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        cm.setSaturation(0.2f);
90e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
91e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
92e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                Paint.FILTER_BITMAP_FLAG));
93e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    }
94e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
95e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    public Drawable createIconDrawable(Drawable src) {
96e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        Bitmap scaled = createIconBitmap(src);
97e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
98e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        StateListDrawable result = new StateListDrawable();
99e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
100e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        result.addState(new int[] { android.R.attr.state_focused },
101e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                new BitmapDrawable(createSelectedBitmap(scaled, false)));
102e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        result.addState(new int[] { android.R.attr.state_pressed },
103e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                new BitmapDrawable(createSelectedBitmap(scaled, true)));
104e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        result.addState(new int[0], new BitmapDrawable(scaled));
105e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
106e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        result.setBounds(0, 0, mIconTextureWidth, mIconTextureHeight);
107e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        return result;
108e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    }
109e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
110e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    /**
111e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato     * Returns a bitmap suitable for the all apps view.  The bitmap will be a power
112e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato     * of two sized ARGB_8888 bitmap that can be used as a gl texture.
113e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato     */
114e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private Bitmap createIconBitmap(Drawable icon) {
115e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int width = mIconWidth;
116e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int height = mIconHeight;
117e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
118e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        if (icon instanceof PaintDrawable) {
119e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            PaintDrawable painter = (PaintDrawable) icon;
120e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            painter.setIntrinsicWidth(width);
121e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            painter.setIntrinsicHeight(height);
122e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        } else if (icon instanceof BitmapDrawable) {
123e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            // Ensure the bitmap has a density.
124e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
125e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            Bitmap bitmap = bitmapDrawable.getBitmap();
126e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            if (bitmap.getDensity() == Bitmap.DENSITY_NONE) {
127e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                bitmapDrawable.setTargetDensity(mDisplayMetrics);
128e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            }
129e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        }
130e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int sourceWidth = icon.getIntrinsicWidth();
131e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int sourceHeight = icon.getIntrinsicHeight();
132e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
1338108e9f8cd03b97a81dbae83ec7164dcb93b515aSeongJae Park        if (sourceWidth > 0 && sourceHeight > 0) {
134e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            // There are intrinsic sizes.
135e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            if (width < sourceWidth || height < sourceHeight) {
136e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                // It's too big, scale it down.
137e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                final float ratio = (float) sourceWidth / sourceHeight;
138e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                if (sourceWidth > sourceHeight) {
139e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                    height = (int) (width / ratio);
140e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                } else if (sourceHeight > sourceWidth) {
141e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                    width = (int) (height * ratio);
142e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                }
143e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            } else if (sourceWidth < width && sourceHeight < height) {
144e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                // It's small, use the size they gave us.
145e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                width = sourceWidth;
146e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                height = sourceHeight;
147e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            }
148e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        }
149e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
150e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        // no intrinsic size --> use default size
151e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int textureWidth = mIconTextureWidth;
152e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int textureHeight = mIconTextureHeight;
153e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
154e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight,
155e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                Bitmap.Config.ARGB_8888);
156e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final Canvas canvas = mCanvas;
157e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        canvas.setBitmap(bitmap);
158e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
159e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final int left = (textureWidth-width) / 2;
160e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final int top = (textureHeight-height) / 2;
161e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
162e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        if (false) {
163e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            // draw a big box for the icon for debugging
164e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            canvas.drawColor(sColors[mColorIndex]);
165e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            if (++mColorIndex >= sColors.length) mColorIndex = 0;
166e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            Paint debugPaint = new Paint();
167e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            debugPaint.setColor(0xffcccc00);
168e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato            canvas.drawRect(left, top, left+width, top+height, debugPaint);
169e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        }
170e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
171e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mOldBounds.set(icon.getBounds());
172e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        icon.setBounds(left, top, left+width, top+height);
173e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        icon.draw(canvas);
174e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        icon.setBounds(mOldBounds);
175e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
176e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        return bitmap;
177e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    }
178e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
179e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    private Bitmap createSelectedBitmap(Bitmap src, boolean pressed) {
180e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final Bitmap result = Bitmap.createBitmap(mIconTextureWidth, mIconTextureHeight,
181e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                Bitmap.Config.ARGB_8888);
182e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        final Canvas dest = new Canvas(result);
183e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
184e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        dest.drawColor(0, PorterDuff.Mode.CLEAR);
185e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
186e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        int[] xy = new int[2];
187e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        Bitmap mask = src.extractAlpha(mBlurPaint, xy);
188e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
189e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        dest.drawBitmap(mask, xy[0], xy[1],
190e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato                pressed ? mGlowColorPressedPaint : mGlowColorFocusedPaint);
191e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
192e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        mask.recycle();
193e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
194e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        dest.drawBitmap(src, 0, 0, mPaint);
1956311d0a079702b29984c0d31937345be105e1a5eDianne Hackborn        dest.setBitmap(null);
196e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato
197e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato        return result;
198e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato    }
199e58d1c4e4a03a41c9b8eee6b79304fbf85998d7dJoe Onorato}
200