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