summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src
diff options
context:
space:
mode:
authorChet Haase <chet@google.com>2012-10-10 15:41:57 -0700
committerChet Haase <chet@google.com>2012-10-10 16:33:31 -0700
commitc61d70ec46bc44344a419a0a15ccbecd1f8f1a2d (patch)
tree513bf8459deb57013720c5faebf00dd05be9fc2c /packages/SystemUI/src
parentf6138f0720e678f236fe8c442a7660a955da9d10 (diff)
downloadframeworks_base-c61d70ec46bc44344a419a0a15ccbecd1f8f1a2d.zip
frameworks_base-c61d70ec46bc44344a419a0a15ccbecd1f8f1a2d.tar.gz
frameworks_base-c61d70ec46bc44344a419a0a15ccbecd1f8f1a2d.tar.bz2
Cache wallpaper bitmap to avoid re-loading on rotation
Screen rotations force static wallpapers to get recreated. One of the things that happens is that the underlying bitmap resource is loaded. This can be quite expensive for large bitmaps (which is the case on large-display devices). A simple optimization is to retain the bitmap in the wallpaper process, to avoid this re-loading step. We still re-draw and re-upload the texture, but at least we don't re-load the thing. Issue #7324823 Manta wallpaper decode performance is atrocious Change-Id: I0748e275a55992d13704a7dec5910d2dbdc9e2a4
Diffstat (limited to 'packages/SystemUI/src')
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java41
1 files changed, 30 insertions, 11 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index a98c4dc..a874c6d 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -19,6 +19,7 @@ package com.android.systemui;
import android.app.ActivityManager;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
+import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -62,6 +63,8 @@ public class ImageWallpaper extends WallpaperService {
WallpaperManager mWallpaperManager;
+ DrawableEngine mEngine;
+
boolean mIsHwAccelerated;
@Override
@@ -77,12 +80,20 @@ public class ImageWallpaper extends WallpaperService {
}
}
+ @Override
+ public void onTrimMemory(int level) {
+ if (mEngine != null) {
+ mEngine.trimMemory(level);
+ }
+ }
+
private static boolean isEmulator() {
return "1".equals(SystemProperties.get(PROPERTY_KERNEL_QEMU, "0"));
}
public Engine onCreateEngine() {
- return new DrawableEngine();
+ mEngine = new DrawableEngine();
+ return mEngine;
}
class DrawableEngine extends Engine {
@@ -155,6 +166,15 @@ public class ImageWallpaper extends WallpaperService {
setFixedSizeAllowed(true);
}
+ public void trimMemory(int level) {
+ if (level >= ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW &&
+ mBackground != null && mIsHwAccelerated) {
+ mBackground.recycle();
+ mBackground = null;
+ mWallpaperManager.forgetLoadedWallpaper();
+ }
+ }
+
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
if (DEBUG) {
@@ -329,16 +349,17 @@ public class ImageWallpaper extends WallpaperService {
}
} else {
drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
+ if (FIXED_SIZED_SURFACE) {
+ // If the surface is fixed-size, we should only need to
+ // draw it once and then we'll let the window manager
+ // position it appropriately. As such, we no longer needed
+ // the loaded bitmap. Yay!
+ // hw-accelerated path retains bitmap for faster rotation
+ mBackground = null;
+ mWallpaperManager.forgetLoadedWallpaper();
+ }
}
- if (FIXED_SIZED_SURFACE) {
- // If the surface is fixed-size, we should only need to
- // draw it once and then we'll let the window manager
- // position it appropriately. As such, we no longer needed
- // the loaded bitmap. Yay!
- mBackground = null;
- mWallpaperManager.forgetLoadedWallpaper();
- }
}
void updateWallpaperLocked() {
@@ -489,8 +510,6 @@ public class ImageWallpaper extends WallpaperService {
GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
checkGlError();
- bitmap.recycle();
-
return texture;
}