summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/attrs.xml1
-rw-r--r--src/com/android/launcher3/HolographicImageView.java69
-rw-r--r--src/com/android/launcher3/HolographicLinearLayout.java57
-rw-r--r--src/com/android/launcher3/HolographicViewHelper.java17
4 files changed, 135 insertions, 9 deletions
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 09b880420..3e14985c9 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -89,6 +89,7 @@
<declare-styleable name="HolographicLinearLayout">
<!-- The source view to generate and apply the drawable states to/from -->
<attr name="sourceImageViewId" format="integer" />
+ <attr name="stateHotwordOn" format="boolean" />
</declare-styleable>
<!-- PagedView specific attributes. These attributes are used to customize
diff --git a/src/com/android/launcher3/HolographicImageView.java b/src/com/android/launcher3/HolographicImageView.java
index 0ad82a70c..ce50db104 100644
--- a/src/com/android/launcher3/HolographicImageView.java
+++ b/src/com/android/launcher3/HolographicImageView.java
@@ -17,13 +17,23 @@
package com.android.launcher3;
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class HolographicImageView extends ImageView {
private final HolographicViewHelper mHolographicHelper;
+ private boolean mHotwordOn;
+ private boolean mIsPressed;
+ private boolean mIsFocused;
public HolographicImageView(Context context) {
this(context, null);
@@ -37,6 +47,31 @@ public class HolographicImageView extends ImageView {
super(context, attrs, defStyle);
mHolographicHelper = new HolographicViewHelper(context);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HolographicLinearLayout,
+ defStyle, 0);
+ mHotwordOn = a.getBoolean(R.styleable.HolographicLinearLayout_stateHotwordOn, false);
+ a.recycle();
+
+ setOnTouchListener(new OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (isPressed() != mIsPressed) {
+ mIsPressed = isPressed();
+ refreshDrawableState();
+ }
+ return false;
+ }
+ });
+
+ setOnFocusChangeListener(new OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (isFocused() != mIsFocused) {
+ mIsFocused = isFocused();
+ refreshDrawableState();
+ }
+ }
+ });
}
void invalidatePressedFocusedStates() {
@@ -44,6 +79,19 @@ public class HolographicImageView extends ImageView {
}
@Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+
+ mHolographicHelper.generatePressedFocusedStates(this);
+ Drawable d = getDrawable();
+ if (d instanceof StateListDrawable) {
+ StateListDrawable sld = (StateListDrawable) d;
+ sld.setState(getDrawableState());
+ sld.invalidateSelf();
+ }
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
@@ -51,4 +99,25 @@ public class HolographicImageView extends ImageView {
// measure/layout
mHolographicHelper.generatePressedFocusedStates(this);
}
+
+ private boolean isHotwordOn() {
+ return mHotwordOn;
+ }
+
+ public void setHotwordState(boolean on) {
+ if (on == mHotwordOn) {
+ return;
+ }
+ mHotwordOn = on;
+ refreshDrawableState();
+ }
+
+ @Override
+ public int[] onCreateDrawableState(int extraSpace) {
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+ if (isHotwordOn()) {
+ mergeDrawableStates(drawableState, new int[] {R.attr.stateHotwordOn});
+ }
+ return drawableState;
+ }
}
diff --git a/src/com/android/launcher3/HolographicLinearLayout.java b/src/com/android/launcher3/HolographicLinearLayout.java
index 73d4c3a01..cdf43812a 100644
--- a/src/com/android/launcher3/HolographicLinearLayout.java
+++ b/src/com/android/launcher3/HolographicLinearLayout.java
@@ -22,17 +22,22 @@ import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
-import com.android.launcher3.R;
-
public class HolographicLinearLayout extends LinearLayout {
-
private final HolographicViewHelper mHolographicHelper;
private ImageView mImageView;
private int mImageViewId;
+ private boolean mHotwordOn;
+ private boolean mIsPressed;
+ private boolean mIsFocused;
+
public HolographicLinearLayout(Context context) {
this(context, null);
}
@@ -47,10 +52,33 @@ public class HolographicLinearLayout extends LinearLayout {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HolographicLinearLayout,
defStyle, 0);
mImageViewId = a.getResourceId(R.styleable.HolographicLinearLayout_sourceImageViewId, -1);
+ mHotwordOn = a.getBoolean(R.styleable.HolographicLinearLayout_stateHotwordOn, false);
a.recycle();
+
setWillNotDraw(false);
mHolographicHelper = new HolographicViewHelper(context);
+
+ setOnTouchListener(new OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (isPressed() != mIsPressed) {
+ mIsPressed = isPressed();
+ refreshDrawableState();
+ }
+ return false;
+ }
+ });
+
+ setOnFocusChangeListener(new OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (isFocused() != mIsFocused) {
+ mIsFocused = isFocused();
+ refreshDrawableState();
+ }
+ }
+ });
}
@Override
@@ -58,10 +86,12 @@ public class HolographicLinearLayout extends LinearLayout {
super.drawableStateChanged();
if (mImageView != null) {
+ mHolographicHelper.generatePressedFocusedStates(mImageView);
Drawable d = mImageView.getDrawable();
if (d instanceof StateListDrawable) {
StateListDrawable sld = (StateListDrawable) d;
sld.setState(getDrawableState());
+ sld.invalidateSelf();
}
}
}
@@ -82,4 +112,25 @@ public class HolographicLinearLayout extends LinearLayout {
}
mHolographicHelper.generatePressedFocusedStates(mImageView);
}
+
+ private boolean isHotwordOn() {
+ return mHotwordOn;
+ }
+
+ public void setHotwordState(boolean on) {
+ if (on == mHotwordOn) {
+ return;
+ }
+ mHotwordOn = on;
+ refreshDrawableState();
+ }
+
+ @Override
+ public int[] onCreateDrawableState(int extraSpace) {
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+ if (isHotwordOn()) {
+ mergeDrawableStates(drawableState, new int[] {R.attr.stateHotwordOn});
+ }
+ return drawableState;
+ }
}
diff --git a/src/com/android/launcher3/HolographicViewHelper.java b/src/com/android/launcher3/HolographicViewHelper.java
index 9d3ad70a8..7ef035555 100644
--- a/src/com/android/launcher3/HolographicViewHelper.java
+++ b/src/com/android/launcher3/HolographicViewHelper.java
@@ -30,11 +30,12 @@ public class HolographicViewHelper {
private final Canvas mTempCanvas = new Canvas();
private boolean mStatesUpdated;
- private int mHighlightColor;
+ private int mHighlightColor, mHotwordColor;
public HolographicViewHelper(Context context) {
Resources res = context.getResources();
mHighlightColor = res.getColor(android.R.color.holo_blue_light);
+ mHotwordColor = res.getColor(android.R.color.holo_green_light);
}
/**
@@ -44,13 +45,17 @@ public class HolographicViewHelper {
if (!mStatesUpdated && v != null) {
mStatesUpdated = true;
Bitmap original = createOriginalImage(v, mTempCanvas);
- Bitmap outline = createPressImage(v, mTempCanvas);
+ Bitmap outline = createImageWithOverlay(v, mTempCanvas, mHighlightColor);
+ Bitmap hotword = createImageWithOverlay(v, mTempCanvas, mHotwordColor);
FastBitmapDrawable originalD = new FastBitmapDrawable(original);
FastBitmapDrawable outlineD = new FastBitmapDrawable(outline);
+ FastBitmapDrawable hotwordD = new FastBitmapDrawable(hotword);
StateListDrawable states = new StateListDrawable();
+
states.addState(new int[] {android.R.attr.state_pressed}, outlineD);
states.addState(new int[] {android.R.attr.state_focused}, outlineD);
+ states.addState(new int[] {R.attr.stateHotwordOn}, hotwordD);
states.addState(new int[] {}, originalD);
v.setImageDrawable(states);
}
@@ -76,7 +81,7 @@ public class HolographicViewHelper {
canvas.setBitmap(b);
canvas.save();
- d.draw(canvas);
+ d.draw(canvas);
canvas.restore();
canvas.setBitmap(null);
@@ -87,16 +92,16 @@ public class HolographicViewHelper {
* Creates a new press state image which is the old image with a blue overlay.
* Responsibility for the bitmap is transferred to the caller.
*/
- private Bitmap createPressImage(ImageView v, Canvas canvas) {
+ private Bitmap createImageWithOverlay(ImageView v, Canvas canvas, int color) {
final Drawable d = v.getDrawable();
final Bitmap b = Bitmap.createBitmap(
d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(b);
canvas.save();
- d.draw(canvas);
+ d.draw(canvas);
canvas.restore();
- canvas.drawColor(mHighlightColor, PorterDuff.Mode.SRC_IN);
+ canvas.drawColor(color, PorterDuff.Mode.SRC_IN);
canvas.setBitmap(null);
return b;