Make shortcuts use adaptive icons

Test: IconFactoryTest.java
PiperOrigin-RevId: 159871437
Change-Id: I8df921f36bde619811129ae0f3013ff77903fc8e
diff --git a/java/com/android/dialer/shortcuts/IconFactory.java b/java/com/android/dialer/shortcuts/IconFactory.java
index a8c4ada..4ec964c 100644
--- a/java/com/android/dialer/shortcuts/IconFactory.java
+++ b/java/com/android/dialer/shortcuts/IconFactory.java
@@ -20,11 +20,16 @@
 import android.content.pm.ShortcutInfo;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.drawable.AdaptiveIconDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
 import android.provider.ContactsContract;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
 import android.support.annotation.WorkerThread;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
@@ -83,6 +88,38 @@
         ContactsContract.Contacts.openContactPhotoInputStream(
             context.getContentResolver(), lookupUri, false /* preferHighres */);
 
+    return VERSION.SDK_INT >= VERSION_CODES.O
+        ? createAdaptiveIcon(displayName, lookupKey, inputStream)
+        : createFlatIcon(displayName, lookupKey, inputStream);
+  }
+
+  @RequiresApi(VERSION_CODES.O)
+  private Icon createAdaptiveIcon(
+      @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) {
+    if (inputStream == null) {
+      LetterTileDrawable letterTileDrawable = new LetterTileDrawable(context.getResources());
+      // The adaptive icons clip the drawable to a safe area inside the drawable. Scale the letter
+      // so it fits inside the safe area.
+      letterTileDrawable.setScale(1f / (1f + AdaptiveIconDrawable.getExtraInsetFraction()));
+      letterTileDrawable.setCanonicalDialerLetterTileDetails(
+          displayName,
+          lookupKey,
+          LetterTileDrawable.SHAPE_RECTANGLE,
+          LetterTileDrawable.TYPE_DEFAULT);
+
+      int iconSize =
+          context
+              .getResources()
+              .getDimensionPixelSize(R.dimen.launcher_shortcut_adaptive_icon_size);
+      return Icon.createWithAdaptiveBitmap(
+          DrawableConverter.drawableToBitmap(letterTileDrawable, iconSize, iconSize));
+    }
+    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+    return Icon.createWithAdaptiveBitmap(bitmap);
+  }
+
+  private Icon createFlatIcon(
+      @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) {
     Drawable drawable;
     if (inputStream == null) {
       // No photo for contact; use a letter tile.