Only use ALLOCATOR_DEFAULT when apps target Q.
Bug: 119510493
Test: manual
Change-Id: Icd7acfd9f899dce46b24db2156acbb3a98b409c8
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 4de1dfc..949cdd6 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -42,6 +42,7 @@
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.DeadObjectException;
@@ -3243,8 +3244,18 @@
Objects.requireNonNull(uri);
Objects.requireNonNull(size);
+ // Older apps might be relying on mutable results, so only consider
+ // giving them hardware bitmaps once they target Q or higher. If modern
+ // apps need mutable thumbnails, they can always roll their own logic.
+ final int allocator;
+ if (getTargetSdkVersion() >= Build.VERSION_CODES.Q) {
+ allocator = ImageDecoder.ALLOCATOR_DEFAULT;
+ } else {
+ allocator = ImageDecoder.ALLOCATOR_SOFTWARE;
+ }
+
try (ContentProviderClient client = acquireContentProviderClient(uri)) {
- return loadThumbnail(client, uri, size, signal, ImageDecoder.ALLOCATOR_DEFAULT);
+ return loadThumbnail(client, uri, size, signal, allocator);
}
}