Modify qsb bar elements to handle hotword state.

They currently handle a pressed mode (showing a blue overlay), we'd like
them to also handle a hotword state that would modify their appearance
when hotword is available and active.

Meant to work with: ag/344334

Change-Id: I07e261ce64307fdad8a4c16fc02eb009ca826ece
diff --git a/src/com/android/launcher3/HolographicImageView.java b/src/com/android/launcher3/HolographicImageView.java
index 0ad82a7..ce50db1 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 @@
         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 @@
     }
 
     @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 @@
         // 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;
+    }
 }