Merge "Updating the search hint to contain the icon as a span object." into ub-launcher3-calgary
diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml
index 822c8b6..5c2c4b8 100644
--- a/res/layout/all_apps.xml
+++ b/res/layout/all_apps.xml
@@ -65,18 +65,6 @@
             android:orientation="horizontal"
             android:saveEnabled="false">
 
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:gravity="center_vertical"
-                android:id="@+id/search_hint"
-                android:layout_gravity="center_horizontal"
-                android:drawablePadding="@dimen/all_apps_search_bar_icon_margin_right"
-                android:drawableStart="@drawable/ic_allapps_search"
-                android:text="@string/all_apps_search_bar_hint"
-                android:textColor="@drawable/all_apps_search_hint"
-                android:textSize="16sp" />
-
             <com.android.launcher3.ExtendedEditText
                 android:id="@+id/search_box_input"
                 android:layout_width="match_parent"
@@ -90,7 +78,7 @@
                 android:scrollHorizontally="true"
                 android:singleLine="true"
                 android:textColor="#4c4c4c"
-                android:contentDescription="@string/all_apps_search_bar_hint"
+                android:hint="@string/all_apps_search_bar_hint"
                 android:textColorHint="@drawable/all_apps_search_hint"
                 android:textSize="16sp" />
         </FrameLayout>
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 3ef510c..8b1f950 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -22,6 +22,8 @@
 import android.graphics.Rect;
 import android.support.v7.widget.RecyclerView;
 import android.text.Selection;
+import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
 import android.text.method.TextKeyListener;
 import android.util.AttributeSet;
@@ -47,6 +49,7 @@
 import com.android.launcher3.Workspace;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.folder.Folder;
+import com.android.launcher3.graphics.TintedDrawableSpan;
 import com.android.launcher3.keyboard.FocusedItemDecorator;
 import com.android.launcher3.util.ComponentKey;
 
@@ -240,7 +243,6 @@
         }
         mSearchBarController = searchController;
         mSearchBarController.initialize(mApps, mSearchInput, mLauncher, this);
-        mSearchBarController.setHintView(findViewById(R.id.search_hint));
         mAdapter.setSearchController(mSearchBarController);
     }
 
@@ -308,6 +310,16 @@
 
         mSearchContainer = findViewById(R.id.search_container);
         mSearchInput = (ExtendedEditText) findViewById(R.id.search_box_input);
+
+        // Update the hint to contain the icon.
+        // Prefix the original hint with two spaces. The first space gets replaced by the icon
+        // using span. The second space is used for a singe space character between the hint
+        // and the icon.
+        SpannableString spanned = new SpannableString("  " + mSearchInput.getHint());
+        spanned.setSpan(new TintedDrawableSpan(getContext(), R.drawable.ic_allapps_search),
+                0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
+        mSearchInput.setHint(spanned);
+
         mSearchContainerOffsetTop = getResources().getDimensionPixelSize(
                 R.dimen.all_apps_search_bar_margin_top);
 
diff --git a/src/com/android/launcher3/allapps/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
index b4a71ca..ac35932 100644
--- a/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
@@ -39,8 +39,7 @@
  * An interface to a search box that AllApps can command.
  */
 public abstract class AllAppsSearchBarController
-        implements TextWatcher, OnEditorActionListener, ExtendedEditText.OnBackKeyListener,
-        View.OnFocusChangeListener {
+        implements TextWatcher, OnEditorActionListener, ExtendedEditText.OnBackKeyListener {
 
     protected Launcher mLauncher;
     protected AlphabeticalAppsList mApps;
@@ -50,8 +49,6 @@
     protected DefaultAppSearchAlgorithm mSearchAlgorithm;
     protected InputMethodManager mInputMethodManager;
 
-    protected View mHintView;
-
     public void setVisibility(int visibility) {
         mInput.setVisibility(visibility);
     }
@@ -69,7 +66,6 @@
         mInput.addTextChangedListener(this);
         mInput.setOnEditorActionListener(this);
         mInput.setOnBackKeyListener(this);
-        mInput.setOnFocusChangeListener(this);
 
         mInputMethodManager = (InputMethodManager)
                 mInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -130,27 +126,6 @@
         return false;
     }
 
-    @Override
-    public void onFocusChange(View view, boolean focused) {
-        if (mHintView != null) {
-            mHintView.setVisibility(focused ? View.INVISIBLE : View.VISIBLE);
-        }
-    }
-
-    /**
-     * Sets a view to serve as the search field's hint.
-     */
-    public void setHintView(View hintView) {
-        mHintView = hintView;
-    }
-
-    /**
-     * Returns the search field's hint view.
-     */
-    public View getHintView() {
-        return mHintView;
-    }
-
     /**
      * Resets the search bar state.
      */
diff --git a/src/com/android/launcher3/graphics/TintedDrawableSpan.java b/src/com/android/launcher3/graphics/TintedDrawableSpan.java
new file mode 100644
index 0000000..f72ce03
--- /dev/null
+++ b/src/com/android/launcher3/graphics/TintedDrawableSpan.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.graphics;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.FontMetricsInt;
+import android.graphics.drawable.Drawable;
+import android.text.style.DynamicDrawableSpan;
+
+/**
+ * {@link DynamicDrawableSpan} which draws a drawable tinted with the current paint color.
+ */
+public class TintedDrawableSpan extends DynamicDrawableSpan {
+
+    private final Drawable mDrawable;
+    private int mOldTint;
+
+    public TintedDrawableSpan(Context context, int resourceId) {
+        super(ALIGN_BOTTOM);
+        mDrawable = context.getDrawable(resourceId);
+        mOldTint = 0;
+    }
+
+    @Override
+    public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
+        fm = fm == null ? paint.getFontMetricsInt() : fm;
+        int iconSize = fm.bottom - fm.top;
+        mDrawable.setBounds(0, 0, iconSize, iconSize);
+        return super.getSize(paint, text, start, end, fm);
+    }
+
+    @Override
+    public void draw(Canvas canvas, CharSequence text,
+            int start, int end, float x, int top, int y, int bottom, Paint paint) {
+        int color = paint.getColor();
+        if (mOldTint != color) {
+            mOldTint = color;
+            mDrawable.setTint(mOldTint);
+        }
+        super.draw(canvas, text, start, end, x, top, y, bottom, paint);
+    }
+
+    @Override
+    public Drawable getDrawable() {
+        return mDrawable;
+    }
+}