Changing status bar color extraction to use region decoder
Change-Id: Ie9913a9cb28948128e6624dc3a335c790fa5a11a
diff --git a/src/com/android/launcher3/dynamicui/ColorExtractionService.java b/src/com/android/launcher3/dynamicui/ColorExtractionService.java
index 193b193..1a127dc 100644
--- a/src/com/android/launcher3/dynamicui/ColorExtractionService.java
+++ b/src/com/android/launcher3/dynamicui/ColorExtractionService.java
@@ -64,17 +64,10 @@
} else {
// We extract colors for the hotseat and status bar separately,
// since they only consider part of the wallpaper.
- extractedColors.updateHotseatPalette(getHotseatPallete());
+ extractedColors.updateHotseatPalette(getHotseatPalette());
if (FeatureFlags.LIGHT_STATUS_BAR) {
- int statusBarHeight = getResources()
- .getDimensionPixelSize(R.dimen.status_bar_height);
- Bitmap wallpaper = ((BitmapDrawable) wallpaperManager.getDrawable()).getBitmap();
- Palette statusBarPalette = Palette.from(wallpaper)
- .setRegion(0, 0, wallpaper.getWidth(), statusBarHeight)
- .clearFilters()
- .generate();
- extractedColors.updateStatusBarPalette(statusBarPalette);
+ extractedColors.updateStatusBarPalette(getStatusBarPalette());
}
}
@@ -90,7 +83,7 @@
}
@TargetApi(Build.VERSION_CODES.N)
- private Palette getHotseatPallete() {
+ private Palette getHotseatPalette() {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
if (Utilities.ATLEAST_NOUGAT) {
try (ParcelFileDescriptor fd = wallpaperManager
@@ -117,4 +110,34 @@
.clearFilters()
.generate();
}
+
+ @TargetApi(Build.VERSION_CODES.N)
+ private Palette getStatusBarPalette() {
+ WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
+ int statusBarHeight = getResources()
+ .getDimensionPixelSize(R.dimen.status_bar_height);
+
+ if (Utilities.ATLEAST_NOUGAT) {
+ try (ParcelFileDescriptor fd = wallpaperManager
+ .getWallpaperFile(WallpaperManager.FLAG_SYSTEM)) {
+ BitmapRegionDecoder decoder = BitmapRegionDecoder
+ .newInstance(fd.getFileDescriptor(), false);
+ Rect decodeRegion = new Rect(0, 0,
+ decoder.getWidth(), statusBarHeight);
+ Bitmap bitmap = decoder.decodeRegion(decodeRegion, null);
+ decoder.recycle();
+ if (bitmap != null) {
+ return Palette.from(bitmap).clearFilters().generate();
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Fetching partial bitmap failed, trying old method", e);
+ }
+ }
+
+ Bitmap wallpaper = ((BitmapDrawable) wallpaperManager.getDrawable()).getBitmap();
+ return Palette.from(wallpaper)
+ .setRegion(0, 0, wallpaper.getWidth(), statusBarHeight)
+ .clearFilters()
+ .generate();
+ }
}