Merge "Cache wallpaper bitmap to avoid re-loading on rotation" into jb-mr1-dev

This commit is contained in:
Chet Haase
2012-10-11 08:03:04 -07:00
committed by Android (Google) Code Review

View File

@@ -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;
}