Providing a default color extraction implementation.
Enabling FeatureFlag LAUNCHER3_GRADIENT_ALL_APPS

Change-Id: I86d982344a4a04a79bde6dce714b1f0bff90f992
diff --git a/res/values/config.xml b/res/values/config.xml
index a467a5c..9b7c795 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -105,6 +105,9 @@
     <!-- Name of a user event dispatcher class. -->
     <string name="user_event_dispatcher_class" translatable="false"></string>
 
+    <!-- Name of a color extraction implementation class. -->
+    <string name="color_extraction_impl_class" translatable="false"></string>
+
     <!-- Package name of the default wallpaper picker. -->
     <string name="wallpaper_picker_package" translatable="false"></string>
 
diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java
similarity index 89%
rename from src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java
rename to src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java
index 7c131f1..5a0e78b 100644
--- a/src/com/android/launcher3/dynamicui/colorextraction/types/Tonal.java
+++ b/src/com/android/launcher3/dynamicui/ColorExtractionAlgorithm.java
@@ -1,5 +1,22 @@
-package com.android.launcher3.dynamicui.colorextraction.types;
+/*
+ * Copyright (C) 2017 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.dynamicui;
+
+import android.content.Context;
 import android.graphics.Color;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -8,6 +25,8 @@
 import android.util.Pair;
 import android.util.SparseIntArray;
 
+import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
 import com.android.launcher3.compat.WallpaperColorsCompat;
 
 import java.util.ArrayList;
@@ -15,13 +34,16 @@
 import java.util.Comparator;
 import java.util.List;
 
-
 /**
  * Implementation of tonal color extraction
- *
- * TODO remove this class if available by platform
- */
-public class Tonal implements ExtractionType {
+ **/
+public class ColorExtractionAlgorithm {
+
+    public static ColorExtractionAlgorithm newInstance(Context context) {
+        return Utilities.getOverrideObject(ColorExtractionAlgorithm.class,
+                context.getApplicationContext(), R.string.color_extraction_impl_class);
+    }
+
     private static final String TAG = "Tonal";
 
     // Used for tonal palette fitting
@@ -32,6 +54,9 @@
     private static final float MIN_COLOR_OCCURRENCE = 0.1f;
     private static final float MIN_LUMINOSITY = 0.5f;
 
+    public ColorExtractionAlgorithm() {
+    }
+
     public @Nullable Pair<Integer, Integer> extractInto(WallpaperColorsCompat wallpaperColors) {
         if (wallpaperColors == null) {
             return null;
@@ -142,34 +167,12 @@
         float delta = v - data[index];
 
         for (int i = 0; i < data.length; i++) {
-            fitData[i] = constrain(data[i] + delta, min, max);
+            fitData[i] = Utilities.boundToRange(data[i] + delta, min, max);
         }
 
         return fitData;
     }
 
-    // TODO no MathUtils
-    private static float constrain(float x, float min, float max) {
-        x = Math.min(x, max);
-        x = Math.max(x, min);
-        return x;
-    }
-
-    /*function adjustSatLumForFit(val, points, fitIndex) {
-        var fitValue = lerpBetweenPoints(points, fitIndex);
-        var diff = val - fitValue;
-
-        var newPoints = [];
-        for (var ii=0; ii<points.length; ii++) {
-            var point = [points[ii][0], points[ii][1]];
-            point[1] += diff;
-            if (point[1] > 1) point[1] = 1;
-            if (point[1] < 0) point[1] = 0;
-            newPoints[ii] = point;
-        }
-        return newPoints;
-    }*/
-
     /**
      * Finds the closest color in a palette, given another HSL color
      *
@@ -308,5 +311,5 @@
                     new float[] { 0.241f, 0.316f, 0.46f, 0.586f, 0.655f, 0.7f, 0.75f, 0.8f, 0.84f, 0.88f }
             )
     };
-}
 
+}
diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
index 20fc424..ca85b6a 100644
--- a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
+++ b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
@@ -7,8 +7,6 @@
 
 import com.android.launcher3.compat.WallpaperColorsCompat;
 import com.android.launcher3.compat.WallpaperManagerCompat;
-import com.android.launcher3.dynamicui.colorextraction.types.ExtractionType;
-import com.android.launcher3.dynamicui.colorextraction.types.Tonal;
 
 import java.util.ArrayList;
 
@@ -31,7 +29,7 @@
 
     private final ArrayList<OnChangeListener> mListeners = new ArrayList<>();
     private final WallpaperManagerCompat mWallpaperManager;
-    private final ExtractionType mExtractionType;
+    private final ColorExtractionAlgorithm mExtractionType;
     private int mMainColor;
     private int mSecondaryColor;
     private boolean mIsDark;
@@ -40,7 +38,7 @@
     private WallpaperColorInfo(Context context) {
         mWallpaperManager = WallpaperManagerCompat.getInstance(context);
         mWallpaperManager.addOnColorsChangedListener(this);
-        mExtractionType = new Tonal(); // TODO create and use DefaultExtractionLogic
+        mExtractionType = ColorExtractionAlgorithm.newInstance(context);
         update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM));
     }
 
diff --git a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java b/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java
deleted file mode 100644
index ba7408f..0000000
--- a/src/com/android/launcher3/dynamicui/colorextraction/types/ExtractionType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.android.launcher3.dynamicui.colorextraction.types;
-
-import android.support.annotation.Nullable;
-import android.util.Pair;
-
-import com.android.launcher3.compat.WallpaperColorsCompat;
-
-
-/**
- * Interface to allow various color extraction implementations.
- */
-public interface ExtractionType {
-
-    /**
-     * Executes color extraction by reading WallpaperColors and setting
-     * main and secondary colors.
-     *
-     * @param wallpaperColors where to read from
-     * @return a pair of main and secondary color
-     */
-    @Nullable Pair<Integer, Integer> extractInto(WallpaperColorsCompat wallpaperColors);
-}
diff --git a/src_flags/com/android/launcher3/config/FeatureFlags.java b/src_flags/com/android/launcher3/config/FeatureFlags.java
index 6562466..ed169b6 100644
--- a/src_flags/com/android/launcher3/config/FeatureFlags.java
+++ b/src_flags/com/android/launcher3/config/FeatureFlags.java
@@ -39,7 +39,7 @@
     // When enabled the promise icon is visible in all apps while installation an app.
     public static boolean LAUNCHER3_PROMISE_APPS_IN_ALL_APPS = true;
     // When enabled uses the AllAppsRadialGradientAndScrimDrawable for all apps
-    public static boolean LAUNCHER3_GRADIENT_ALL_APPS = false;
+    public static boolean LAUNCHER3_GRADIENT_ALL_APPS = true;
     // When enabled allows use of physics based motions in the Launcher.
     public static boolean LAUNCHER3_PHYSICS = true;