17d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung/*
27d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * Copyright (C) 2011 The Android Open Source Project
37d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung *
47d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
57d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * you may not use this file except in compliance with the License.
67d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * You may obtain a copy of the License at
77d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung *
87d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
97d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung *
107d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * Unless required by applicable law or agreed to in writing, software
117d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
127d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * See the License for the specific language governing permissions and
147d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung * limitations under the License.
157d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung */
167d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
187d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
197d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungimport android.content.Context;
207d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungimport android.content.res.Resources;
217d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungimport android.graphics.Bitmap;
227d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungimport android.graphics.Canvas;
23620542254c9b63cd17d2deefb07ffd39d8a54623Winson Chungimport android.graphics.PorterDuff;
24daec1e8b0522e4b044d0a305a4bdef6f613779f7Michael Jurkaimport android.graphics.drawable.Drawable;
257d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungimport android.graphics.drawable.StateListDrawable;
26620542254c9b63cd17d2deefb07ffd39d8a54623Winson Chungimport android.widget.ImageView;
277d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
287d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chungpublic class HolographicViewHelper {
297d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
307d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    private final Canvas mTempCanvas = new Canvas();
317d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
327d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    private boolean mStatesUpdated;
33d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu    private int mHighlightColor, mHotwordColor;
347d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
357d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    public HolographicViewHelper(Context context) {
367d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        Resources res = context.getResources();
377d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        mHighlightColor = res.getColor(android.R.color.holo_blue_light);
38d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu        mHotwordColor = res.getColor(android.R.color.holo_green_light);
397d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    }
407d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
417d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    /**
427d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung     * Generate the pressed/focused states if necessary.
437d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung     */
44620542254c9b63cd17d2deefb07ffd39d8a54623Winson Chung    void generatePressedFocusedStates(ImageView v) {
45620542254c9b63cd17d2deefb07ffd39d8a54623Winson Chung        if (!mStatesUpdated && v != null) {
467d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung            mStatesUpdated = true;
474cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            Bitmap original = createOriginalImage(v, mTempCanvas);
48d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu            Bitmap outline = createImageWithOverlay(v, mTempCanvas, mHighlightColor);
49d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu            Bitmap hotword = createImageWithOverlay(v, mTempCanvas, mHotwordColor);
504cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            FastBitmapDrawable originalD = new FastBitmapDrawable(original);
514cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            FastBitmapDrawable outlineD = new FastBitmapDrawable(outline);
52d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu            FastBitmapDrawable hotwordD = new FastBitmapDrawable(hotword);
537d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
547d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung            StateListDrawable states = new StateListDrawable();
55d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu
564cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            states.addState(new int[] {android.R.attr.state_pressed}, outlineD);
574cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            states.addState(new int[] {android.R.attr.state_focused}, outlineD);
58d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu            states.addState(new int[] {R.attr.stateHotwordOn}, hotwordD);
594cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung            states.addState(new int[] {}, originalD);
60620542254c9b63cd17d2deefb07ffd39d8a54623Winson Chung            v.setImageDrawable(states);
617d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        }
627d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    }
637d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
647d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    /**
65bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung     * Invalidates the pressed/focused states.
66bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung     */
67bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung    void invalidatePressedFocusedStates(ImageView v) {
68bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung        mStatesUpdated = false;
69bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung        if (v != null) {
70bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung            v.invalidate();
71bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung        }
72bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung    }
73bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung
74bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung    /**
754cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung     * Creates a copy of the original image.
764cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung     */
774cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung    private Bitmap createOriginalImage(ImageView v, Canvas canvas) {
78daec1e8b0522e4b044d0a305a4bdef6f613779f7Michael Jurka        final Drawable d = v.getDrawable();
794cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        final Bitmap b = Bitmap.createBitmap(
80daec1e8b0522e4b044d0a305a4bdef6f613779f7Michael Jurka                d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
814cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung
824cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        canvas.setBitmap(b);
834cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        canvas.save();
84d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu        d.draw(canvas);
854cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        canvas.restore();
864cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        canvas.setBitmap(null);
874cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung
884cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung        return b;
894cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung    }
904cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung
914cc332ac43dda54fb1b9fef35412313aa1ef9ad9Winson Chung    /**
92bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung     * Creates a new press state image which is the old image with a blue overlay.
937d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung     * Responsibility for the bitmap is transferred to the caller.
947d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung     */
95d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu    private Bitmap createImageWithOverlay(ImageView v, Canvas canvas, int color) {
96daec1e8b0522e4b044d0a305a4bdef6f613779f7Michael Jurka        final Drawable d = v.getDrawable();
977d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        final Bitmap b = Bitmap.createBitmap(
98daec1e8b0522e4b044d0a305a4bdef6f613779f7Michael Jurka                d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
997d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
1007d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        canvas.setBitmap(b);
1017d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        canvas.save();
102d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu        d.draw(canvas);
1037d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        canvas.restore();
104d791998dd8643048ae40adaad2311fed0543bbb1Cristina Stancu        canvas.drawColor(color, PorterDuff.Mode.SRC_IN);
1057d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        canvas.setBitmap(null);
1067d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung
1077d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung        return b;
1087d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung    }
1097d3810d8337e4f030796b566a2d562fcf79b0a22Winson Chung}
110