Revert "Revert "ImageDecoder: Add AVIF to support list""

This reverts commit c1f3c3a3519b62c8ceb79aa0dc61f0faac93e9ae.

Reason for revert: re-land with error fixing

Change-Id: Icd3079a970fbf855fe2f33eabb0889f34536b78f
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 51f99ec..0b29973 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -38,8 +38,11 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.NinePatchDrawable;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
 import android.net.Uri;
 import android.os.Build;
+import android.os.SystemProperties;
 import android.os.Trace;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -928,6 +931,8 @@
             case "image/x-pentax-pef":
             case "image/x-samsung-srw":
                 return true;
+            case "image/avif":
+                return isP010SupportedForAV1();
             default:
                 return false;
         }
@@ -2063,6 +2068,53 @@
         return decodeBitmapImpl(src, null);
     }
 
+    private static boolean sIsP010SupportedForAV1 = false;
+    private static boolean sIsP010SupportedForAV1Initialized = false;
+    private static final Object sIsP010SupportedForAV1Lock = new Object();
+
+    /**
+     * Checks if the device supports decoding 10-bit AV1.
+     */
+    @SuppressWarnings("AndroidFrameworkCompatChange")  // This is not an app-visible API.
+    private static boolean isP010SupportedForAV1() {
+        synchronized (sIsP010SupportedForAV1Lock) {
+            if (sIsP010SupportedForAV1Initialized) {
+                return sIsP010SupportedForAV1;
+            }
+
+            sIsP010SupportedForAV1Initialized = true;
+
+            if (hasHardwareDecoder("video/av01")) {
+                sIsP010SupportedForAV1 = true;
+                return true;
+            }
+
+            sIsP010SupportedForAV1 = Build.VERSION.DEVICE_INITIAL_SDK_INT
+                    >= Build.VERSION_CODES.S;
+            return sIsP010SupportedForAV1;
+        }
+    }
+
+    /**
+     * Checks if the device has hardware decoder for the target mime type.
+     */
+    private static boolean hasHardwareDecoder(String mime) {
+        final MediaCodecList sMCL = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        for (MediaCodecInfo info : sMCL.getCodecInfos()) {
+            if (info.isEncoder() == false && info.isHardwareAccelerated()) {
+                try {
+                     if (info.getCapabilitiesForType(mime) != null) {
+                         return true;
+                     }
+                } catch (IllegalArgumentException e) {
+                     // mime is not supported
+                     return false;
+                }
+            }
+        }
+        return false;
+    }
+
     /**
      * Private method called by JNI.
      */