1 /*
2  * Copyright (C) 2011 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.content.Context;
20 import android.content.res.Resources;
21 import android.graphics.Bitmap;
22 import android.graphics.Canvas;
23 import android.graphics.PorterDuff;
24 import android.graphics.drawable.Drawable;
25 import android.graphics.drawable.StateListDrawable;
26 import android.widget.ImageView;
27 
28 public class HolographicViewHelper {
29 
30     private final Canvas mTempCanvas = new Canvas();
31 
32     private boolean mStatesUpdated;
33     private int mHighlightColor;
34 
HolographicViewHelper(Context context)35     public HolographicViewHelper(Context context) {
36         Resources res = context.getResources();
37         mHighlightColor = res.getColor(android.R.color.white);
38     }
39 
40     /**
41      * Generate the pressed/focused states if necessary.
42      */
generatePressedFocusedStates(ImageView v)43     void generatePressedFocusedStates(ImageView v) {
44         if (!mStatesUpdated && v != null) {
45             mStatesUpdated = true;
46             Bitmap original = createOriginalImage(v, mTempCanvas);
47             Bitmap outline = createPressImage(v, mTempCanvas);
48             FastBitmapDrawable originalD = new FastBitmapDrawable(original);
49             FastBitmapDrawable outlineD = new FastBitmapDrawable(outline);
50 
51             StateListDrawable states = new StateListDrawable();
52             states.addState(new int[] {android.R.attr.state_pressed}, outlineD);
53             states.addState(new int[] {android.R.attr.state_focused}, outlineD);
54             states.addState(new int[] {}, originalD);
55             v.setImageDrawable(states);
56         }
57     }
58 
59     /**
60      * Invalidates the pressed/focused states.
61      */
invalidatePressedFocusedStates(ImageView v)62     void invalidatePressedFocusedStates(ImageView v) {
63         mStatesUpdated = false;
64         if (v != null) {
65             v.invalidate();
66         }
67     }
68 
69     /**
70      * Creates a copy of the original image.
71      */
createOriginalImage(ImageView v, Canvas canvas)72     private Bitmap createOriginalImage(ImageView v, Canvas canvas) {
73         final Drawable d = v.getDrawable();
74         final Bitmap b = Bitmap.createBitmap(
75                 d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
76 
77         canvas.setBitmap(b);
78         canvas.save();
79             d.draw(canvas);
80         canvas.restore();
81         canvas.setBitmap(null);
82 
83         return b;
84     }
85 
86     /**
87      * Creates a new press state image which is the old image with a blue overlay.
88      * Responsibility for the bitmap is transferred to the caller.
89      */
createPressImage(ImageView v, Canvas canvas)90     private Bitmap createPressImage(ImageView v, Canvas canvas) {
91         final Drawable d = v.getDrawable();
92         final Bitmap b = Bitmap.createBitmap(
93                 d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
94 
95         canvas.setBitmap(b);
96         canvas.save();
97             d.draw(canvas);
98         canvas.restore();
99         canvas.drawColor(mHighlightColor, PorterDuff.Mode.SRC_IN);
100         canvas.setBitmap(null);
101 
102         return b;
103     }
104 }
105