Merge "Import translations. DO NOT MERGE" into ub-launcher3-master
diff --git a/res/values/colors.xml b/res/values/colors.xml
index a7b507c..19bf51a 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -52,4 +52,5 @@
     <color name="fallback_secondary_color">#FF37474F</color>
 
     <color name="notification_icon_default_color">#757575</color> <!-- Gray 600 -->
+    <color name="legacy_icon_background">#FFE0E0E0</color>
 </resources>
diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java
index 2ae7a4a..472b913 100644
--- a/src/com/android/launcher3/graphics/LauncherIcons.java
+++ b/src/com/android/launcher3/graphics/LauncherIcons.java
@@ -29,10 +29,13 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PaintDrawable;
+import android.graphics.drawable.ScaleDrawable;
 import android.os.Process;
 import android.os.UserHandle;
+import android.view.Gravity;
 
 import com.android.launcher3.AppInfo;
 import com.android.launcher3.IconCache;
@@ -45,12 +48,12 @@
 import com.android.launcher3.shortcuts.DeepShortcutManager;
 import com.android.launcher3.shortcuts.ShortcutInfoCompat;
 
-import java.lang.reflect.Method;
-
 /**
  * Helper methods for generating various launcher icons
  */
 public class LauncherIcons {
+    // TODO b/33553066 use the constant defined in MaskableIconDrawable
+    private static final float LEGACY_ICON_SCALE = .7f * .6667f;
 
     private static final Rect sOldBounds = new Rect();
     private static final Canvas sCanvas = new Canvas();
@@ -168,7 +171,7 @@
      * @param scale the scale to apply before drawing {@param icon} on the canvas
      */
     public static Bitmap createIconBitmap(Drawable icon, Context context, float scale) {
-        icon = castToMaskableIconDrawable(icon);
+        icon = wrapToMaskableIconDrawable(context, icon);
         synchronized (sCanvas) {
             final int iconBitmapSize = LauncherAppState.getIDP(context).iconBitmapSize;
 
@@ -224,17 +227,31 @@
         }
     }
 
-    static Drawable castToMaskableIconDrawable(Drawable drawable) {
+    /**
+     * If the platform is running O but the app is not providing MaskableIconDrawable, then
+     * shrink the legacy icon and set it as foreground. Use color drawable as background to
+     * create MaskableIconDrawable.
+     */
+    static Drawable wrapToMaskableIconDrawable(Context context, Drawable drawable) {
         if (!(ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isAtLeastO())) {
             return drawable;
         }
+        int color = context.getResources().getColor(R.color.legacy_icon_background);
+        ColorDrawable colorDrawable = new ColorDrawable(color);
+        ScaleDrawable scaleDrawable = new ScaleDrawable(drawable,
+                Gravity.CENTER, LEGACY_ICON_SCALE, LEGACY_ICON_SCALE);
+        scaleDrawable.setLevel(1);
         try {
             Class clazz = Class.forName("android.graphics.drawable.MaskableIconDrawable");
-            Method method = clazz.getDeclaredMethod("wrap", Drawable.class);
-            return (Drawable) method.invoke(null, drawable);
+            if (!clazz.isAssignableFrom(drawable.getClass())){
+
+                return (Drawable) clazz.getConstructor(Drawable.class, Drawable.class)
+                        .newInstance(colorDrawable, scaleDrawable);
+            }
         } catch (Exception e) {
             return drawable;
         }
+        return drawable;
     }
 
     public static Bitmap createShortcutIcon(ShortcutInfoCompat shortcutInfo, Context context) {
diff --git a/src/com/android/launcher3/util/SQLiteCacheHelper.java b/src/com/android/launcher3/util/SQLiteCacheHelper.java
index d1cfe42..9aabfeb 100644
--- a/src/com/android/launcher3/util/SQLiteCacheHelper.java
+++ b/src/com/android/launcher3/util/SQLiteCacheHelper.java
@@ -9,6 +9,9 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.util.Log;
 
+import com.android.launcher3.Utilities;
+import com.android.launcher3.config.ProviderConfig;
+
 /**
  * An extension of {@link SQLiteOpenHelper} with utility methods for a single table cache DB.
  * Any exception during write operations are ignored, and any version change causes a DB reset.
@@ -16,12 +19,18 @@
 public abstract class SQLiteCacheHelper {
     private static final String TAG = "SQLiteCacheHelper";
 
+    private static final boolean NO_ICON_CACHE = ProviderConfig.IS_DOGFOOD_BUILD &&
+            Utilities.isPropertyEnabled("MEMORY_ONLY_ICON_CACHE");
+
     private final String mTableName;
     private final MySQLiteOpenHelper mOpenHelper;
 
     private boolean mIgnoreWrites;
 
     public SQLiteCacheHelper(Context context, String name, int version, String tableName) {
+        if (NO_ICON_CACHE) {
+            name = null;
+        }
         mTableName = tableName;
         mOpenHelper = new MySQLiteOpenHelper(context, name, version);