Add blobstore extras to SearchTargetExtras.

go/toast-blobstore-fetcher-launcher

Bug: 262783558
Test: Tested in NexusLauncher branch in ag/21006574
Change-Id: Ie855cb46dbd19f543a0717707650e0a7aee2d372
diff --git a/searchuilib/src/com/android/app/search/SearchTargetExtras.java b/searchuilib/src/com/android/app/search/SearchTargetExtras.java
index 7f29ac1..272d9c3 100644
--- a/searchuilib/src/com/android/app/search/SearchTargetExtras.java
+++ b/searchuilib/src/com/android/app/search/SearchTargetExtras.java
@@ -2,7 +2,9 @@
 
 import static com.android.app.search.LayoutType.TALL_CARD_WITH_IMAGE_NO_ICON;
 
+import android.app.blob.BlobHandle;
 import android.app.search.SearchTarget;
+import android.os.Bundle;
 import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
@@ -38,17 +40,20 @@
     // Indicates the search result app location column
     public static final String BUNDLE_EXTRA_RESULT_APP_GRIDX = "app_gridx";
 
+    // Used for thumbnail loading. Contains handle to retrieve Blobstore asset.
+    public static final String BUNDLE_EXTRA_BLOBSTORE_HANDLE = "blobstore_handle_key";
+
     public static final int GROUPING = 1 << 1;
 
     @Nullable
     public static String getDecoratorId(@Nullable SearchTarget target) {
-        return (target == null || target.getExtras() == null) ? null :
+        return isTargetOrExtrasNull(target) ? null :
                 target.getExtras().getString(BUNDLE_EXTRA_GROUP_ID);
     }
 
     public static int getDecoratorType(@Nullable SearchTarget target) {
         int type = 0;
-        if (target == null || target.getExtras() == null) {
+        if (isTargetOrExtrasNull(target)) {
             return type;
         }
         if (!TextUtils.isEmpty(target.getExtras().getString(BUNDLE_EXTRA_GROUP_ID))) {
@@ -57,6 +62,19 @@
         return type;
     }
 
+    /** Whether or not the SearchTarget's Extras contains a blobstore image. */
+    public static boolean isSearchTargetBlobstoreAsset(@Nullable SearchTarget target) {
+        if (isTargetOrExtrasNull(target)) {
+            return false;
+        }
+        return target.getExtras().getParcelable(
+                BUNDLE_EXTRA_BLOBSTORE_HANDLE) instanceof BlobHandle;
+    }
+
+    private static boolean isTargetOrExtrasNull(@Nullable SearchTarget target) {
+        return target == null || target.getExtras() == null;
+    }
+
     /** Web data related extras and helper methods */
     public static final String BUNDLE_EXTRA_PROXY_WEB_ITEM = "proxy_web_item";
     public static final String BUNDLE_EXTRA_ENTITY = "is_entity";
@@ -90,7 +108,7 @@
 
     /** Whether the search target is a rich answer web result. */
     public static boolean isRichAnswer(@Nullable SearchTarget target) {
-        return target !=null && isAnswer(target)
+        return target != null && isAnswer(target)
                 && target.getLayoutType().equals(TALL_CARD_WITH_IMAGE_NO_ICON);
     }
 }