Adding listener support for color extraction changes
Changing the apps-search layout to use theme attribute instead of hard
coded layout id

Bug: 37616877
Change-Id: Iae601758303f83a2774635f0d88f74d99fc643c3
diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml
index 7d97f25..f3539dc 100644
--- a/res/layout/all_apps.xml
+++ b/res/layout/all_apps.xml
@@ -59,13 +59,15 @@
         <!-- Fast scroller popup -->
         <TextView
             style="@style/FastScrollerPopup"
-            android:layout_below="@+id/search_container"
+            android:layout_alignTop="@+id/apps_list_view"
             android:id="@+id/fast_scroller_popup"
             android:layout_alignParentEnd="true"
             android:layout_marginEnd="@dimen/container_fastscroll_popup_margin" />
 
+        <!-- Note: we are reusing/repurposing a system attribute for search layout, because of a
+         platform bug, which prevents using custom attributes in <include> tag -->
         <include
-            layout="@layout/all_apps_search_container"
+            layout="?android:attr/keyboardLayout"
             android:id="@+id/search_container" />
 
     </com.android.launcher3.allapps.AllAppsRecyclerViewContainerView>
diff --git a/res/layout/all_apps_search_container.xml b/res/layout/all_apps_search_container.xml
index 6addee1..c79360f 100644
--- a/res/layout/all_apps_search_container.xml
+++ b/res/layout/all_apps_search_container.xml
@@ -15,28 +15,28 @@
 -->
 <com.android.launcher3.allapps.search.AppsSearchContainerLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/search_container"
     android:layout_width="match_parent"
     android:layout_height="@dimen/all_apps_search_bar_height"
     android:layout_gravity="center|top"
     android:gravity="center|bottom"
-    android:id="@+id/search_container"
     android:saveEnabled="false">
 
     <com.android.launcher3.ExtendedEditText
         android:id="@+id/search_box_input"
         android:layout_width="match_parent"
         android:layout_height="@dimen/all_apps_search_bar_field_height"
-        android:background="@android:color/transparent"
         android:layout_gravity="bottom"
+        android:background="@android:color/transparent"
         android:focusableInTouchMode="true"
         android:gravity="center"
+        android:hint="@string/all_apps_search_bar_hint"
         android:imeOptions="actionSearch|flagNoExtractUi"
         android:inputType="text|textNoSuggestions|textCapWords"
         android:maxLines="1"
         android:scrollHorizontally="true"
         android:singleLine="true"
         android:textColor="?android:attr/textColorSecondary"
-        android:hint="@string/all_apps_search_bar_hint"
         android:textColorHint="@drawable/all_apps_search_hint"
         android:textSize="16sp" />
 </com.android.launcher3.allapps.search.AppsSearchContainerLayout>
\ No newline at end of file
diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml
index de809b1..bc65a0e 100644
--- a/res/values-sw720dp/styles.xml
+++ b/res/values-sw720dp/styles.xml
@@ -26,6 +26,7 @@
         <item name="android:windowNoTitle">true</item>
         <item name="android:windowActionModeOverlay">true</item>
         <item name="android:colorEdgeEffect">?android:attr/textColorSecondary</item>
+        <item name="android:keyboardLayout">@layout/all_apps_search_container</item>
     </style>
 
     <!-- Workspace -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c3d11e4..e2d9ff4 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -25,6 +25,7 @@
         <item name="android:windowShowWallpaper">true</item>
         <item name="android:windowNoTitle">true</item>
         <item name="android:colorEdgeEffect">#FF757575</item>
+        <item name="android:keyboardLayout">@layout/all_apps_search_container</item>
     </style>
 
     <style name="LauncherTheme" parent="@style/BaseLauncherTheme"></style>
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index c96c2a7..25995dd 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -212,6 +212,8 @@
     private static int NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS = 5;
     @Thunk static int NEW_APPS_ANIMATION_DELAY = 500;
 
+    private final ExtractedColors mExtractedColors = new ExtractedColors();
+
     @Thunk Workspace mWorkspace;
     private View mLauncherView;
     @Thunk DragLayer mDragLayer;
@@ -260,7 +262,6 @@
     private LauncherModel mModel;
     private ModelWriter mModelWriter;
     private IconCache mIconCache;
-    private ExtractedColors mExtractedColors;
     private LauncherAccessibilityDelegate mAccessibilityDelegate;
     private Handler mHandler = new Handler();
     private boolean mIsResumeFromActionScreenOff;
@@ -392,11 +393,10 @@
         // LauncherModel load.
         mPaused = false;
 
-        mLauncherView = getLayoutInflater().inflate(R.layout.launcher, null);
+        mLauncherView = LayoutInflater.from(this).inflate(R.layout.launcher, null);
 
         setupViews();
         mDeviceProfile.layout(this, false /* notifyListeners */);
-        mExtractedColors = new ExtractedColors();
         loadExtractedColorsAndColorItems();
 
         mPopupDataProvider = new PopupDataProvider(this);
@@ -465,12 +465,7 @@
     @Override
     public void onExtractedColorsChanged() {
         loadExtractedColorsAndColorItems();
-        if (mAllAppsController != null) {
-            mAllAppsController.onExtractedColorsChanged();
-        }
-        if (mLauncherCallbacks != null) {
-            mLauncherCallbacks.onExtractedColorsChanged();
-        }
+        mExtractedColors.notifyChange();
     }
 
     public ExtractedColors getExtractedColors() {
diff --git a/src/com/android/launcher3/LauncherCallbacks.java b/src/com/android/launcher3/LauncherCallbacks.java
index ea4aeb9..d66b14c 100644
--- a/src/com/android/launcher3/LauncherCallbacks.java
+++ b/src/com/android/launcher3/LauncherCallbacks.java
@@ -97,6 +97,4 @@
     int getSearchBarHeight();
 
     boolean shouldShowDiscoveryBounce();
-
-    void onExtractedColorsChanged();
 }
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 121ce4c..9c1854a 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -42,7 +42,7 @@
  * closer to top or closer to the page indicator.
  */
 public class AllAppsTransitionController implements TouchController, VerticalPullDetector.Listener,
-        View.OnLayoutChangeListener {
+        View.OnLayoutChangeListener, ExtractedColors.OnChangeListener {
 
     private static final String TAG = "AllAppsTrans";
     private static final boolean DBG = false;
@@ -107,6 +107,7 @@
 
         mEvaluator = new ArgbEvaluator();
         mAllAppsBackgroundColor = Themes.getAttrColor(l, android.R.attr.colorPrimary);
+        mLauncher.getExtractedColors().addOnChangeListener(this);
     }
 
     @Override
@@ -288,6 +289,7 @@
         mScrimView.setProgress(progress);
     }
 
+    @Override
     public void onExtractedColorsChanged() {
         if (FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) {
             if (mGradientView != null) {
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index f291a80..0474419 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -195,6 +195,8 @@
     private int mNumPredictedAppsPerRow;
     private int mNumAppRowsInAdapter;
 
+    private boolean mHasSearchDivider = true;
+
     public AlphabeticalAppsList(Context context) {
         mLauncher = Launcher.getLauncher(context);
         mIndexer = new AlphabeticIndexCompat(context);
@@ -343,6 +345,10 @@
         onAppsUpdated();
     }
 
+    public void disableSearchDivider() {
+        mHasSearchDivider = false;
+    }
+
     /**
      * Updates internals when the set of apps are updated.
      */
@@ -429,8 +435,10 @@
             }
         }
 
-        // Add the search divider
-        mAdapterItems.add(AdapterItem.asSearchDivider(position++));
+        if (mHasSearchDivider) {
+            // Add the search divider
+            mAdapterItems.add(AdapterItem.asSearchDivider(position++));
+        }
 
         // Process the predicted app components
         mPredictedApps.clear();
diff --git a/src/com/android/launcher3/dynamicui/ExtractedColors.java b/src/com/android/launcher3/dynamicui/ExtractedColors.java
index 3c4aba1..108a21f 100644
--- a/src/com/android/launcher3/dynamicui/ExtractedColors.java
+++ b/src/com/android/launcher3/dynamicui/ExtractedColors.java
@@ -26,6 +26,7 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.config.FeatureFlags;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 
 /**
@@ -80,6 +81,7 @@
 
     private static final String COLOR_SEPARATOR = ",";
 
+    private final ArrayList<OnChangeListener> mListeners = new ArrayList<>();
     private final int[] mColors;
 
     public ExtractedColors() {
@@ -171,4 +173,22 @@
         setColorAtIndex(idx, wallpaperPalette == null
                 ? DEFAULT_VALUES[idx] : wallpaperPalette.getVibrantColor(DEFAULT_VALUES[idx]));
     }
+
+    public void addOnChangeListener(OnChangeListener listener) {
+        mListeners.add(listener);
+    }
+
+    public void notifyChange() {
+        for (OnChangeListener listener : mListeners) {
+            listener.onExtractedColorsChanged();
+        }
+    }
+
+    /**
+     * Interface for listening for extracted color changes
+     */
+    public interface OnChangeListener {
+
+        void onExtractedColorsChanged();
+    }
 }
diff --git a/src/com/android/launcher3/testing/LauncherExtension.java b/src/com/android/launcher3/testing/LauncherExtension.java
index 36df22c..8d43518 100644
--- a/src/com/android/launcher3/testing/LauncherExtension.java
+++ b/src/com/android/launcher3/testing/LauncherExtension.java
@@ -219,8 +219,5 @@
         public boolean shouldShowDiscoveryBounce() {
             return false;
         }
-
-        @Override
-        public void onExtractedColorsChanged() { }
     }
 }