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