From 5f0d976b37b919b74509b6f22e4ad3fa56422f6c Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Thu, 18 Oct 2012 12:01:34 -0700 Subject: [PATCH] Track size changes correctly for static wallpapers Previous logic compared the surface size to the bitmap size to determine whether to reload the bitmap. This was based on an assumption that the bitmap would be created at the same sizea s the surface. However, the process of how those sizes get determined is different for surfaces and wallpapers, causing an occasional issue where the bitmap gets reloaded frequently, every time the wallpaper is asked to redraw, even though it always gets recreated at the same size. New logic checks previous surface dimensions against current surface dimensions to determine whether the bitmap should be reloaded; we really only want to reload it when the surface size changes. Issue #7373200 pause when toggling between All Apps and Home screen; Home button stays illuminated for a long time Change-Id: I108777b72bd42616ad7cf8274af1b3e6b2ed94e7 --- .../com/android/systemui/ImageWallpaper.java | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 4716668c33d25..0a7dd7c76bf03 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -109,7 +109,7 @@ public class ImageWallpaper extends WallpaperService { private WallpaperObserver mReceiver; Bitmap mBackground; - int mBackgroundWidth = -1, mBackgroundHeight = -1; + int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1; int mLastRotation = -1; float mXOffset; float mYOffset; @@ -156,7 +156,7 @@ public class ImageWallpaper extends WallpaperService { } synchronized (mLock) { - mBackgroundWidth = mBackgroundHeight = -1; + mLastSurfaceWidth = mLastSurfaceHeight = -1; mBackground = null; mRedrawNeeded = true; drawFrameLocked(); @@ -172,6 +172,9 @@ public class ImageWallpaper extends WallpaperService { public void trimMemory(int level) { if (level >= ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW && mBackground != null && mIsHwAccelerated) { + if (DEBUG) { + Log.d(TAG, "trimMemory"); + } mBackground.recycle(); mBackground = null; mWallpaperManager.forgetLoadedWallpaper(); @@ -286,13 +289,13 @@ public class ImageWallpaper extends WallpaperService { @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); - mBackgroundWidth = mBackgroundHeight = -1; + mLastSurfaceWidth = mLastSurfaceHeight = -1; } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); - mBackgroundWidth = mBackgroundHeight = -1; + mLastSurfaceWidth = mLastSurfaceHeight = -1; } @Override @@ -314,9 +317,9 @@ public class ImageWallpaper extends WallpaperService { final int dh = frame.height(); int newRotation = ((WindowManager) getSystemService(WINDOW_SERVICE)). getDefaultDisplay().getRotation(); + boolean surfaceDimensionsChanged = dw != mLastSurfaceWidth || dh != mLastSurfaceHeight; - boolean redrawNeeded = dw != mBackgroundWidth || dh != mBackgroundHeight || - newRotation != mLastRotation; + boolean redrawNeeded = surfaceDimensionsChanged || newRotation != mLastRotation; if (!redrawNeeded && !mOffsetsChanged) { if (DEBUG) { Log.d(TAG, "Suppressed drawFrame since redraw is not needed " @@ -327,21 +330,41 @@ public class ImageWallpaper extends WallpaperService { mLastRotation = newRotation; // Load bitmap if it is not yet loaded or if it was loaded at a different size - if (mBackground == null || dw != mBackgroundWidth || dh != mBackgroundHeight) { + if (mBackground == null || surfaceDimensionsChanged) { if (DEBUG) { - Log.d(TAG, "Reloading bitmap"); + Log.d(TAG, "Reloading bitmap: mBackground, bgw, bgh, dw, dh = " + + mBackground + ", " + + ((mBackground == null) ? 0 : mBackground.getWidth()) + ", " + + ((mBackground == null) ? 0 : mBackground.getHeight()) + ", " + + dw + ", " + dh); } - mWallpaperManager.forgetLoadedWallpaper(); updateWallpaperLocked(); + if (mBackground == null) { + if (DEBUG) { + Log.d(TAG, "Unable to load bitmap"); + } + return; + } + if (DEBUG) { + if (dw != mBackground.getWidth() || dh != mBackground.getHeight()) { + Log.d(TAG, "Surface != bitmap dimensions: surface w/h, bitmap w/h: " + + dw + ", " + dh + ", " + mBackground.getWidth() + ", " + + mBackground.getHeight()); + } + } } - final int availw = dw - mBackgroundWidth; - final int availh = dh - mBackgroundHeight; + final int availw = dw - mBackground.getWidth(); + final int availh = dh - mBackground.getHeight(); int xPixels = availw < 0 ? (int)(availw * mXOffset + .5f) : (availw / 2); int yPixels = availh < 0 ? (int)(availh * mYOffset + .5f) : (availh / 2); mOffsetsChanged = false; mRedrawNeeded = false; + if (surfaceDimensionsChanged) { + mLastSurfaceWidth = dw; + mLastSurfaceHeight = dh; + } mLastXTranslation = xPixels; mLastYTranslation = yPixels; if (!redrawNeeded && xPixels == mLastXTranslation && yPixels == mLastYTranslation) { @@ -374,9 +397,10 @@ public class ImageWallpaper extends WallpaperService { } - void updateWallpaperLocked() { + private void updateWallpaperLocked() { Throwable exception = null; try { + mWallpaperManager.forgetLoadedWallpaper(); // force reload mBackground = mWallpaperManager.getBitmap(); } catch (RuntimeException e) { exception = e; @@ -397,9 +421,6 @@ public class ImageWallpaper extends WallpaperService { Log.w(TAG, "Unable reset to default wallpaper!", ex); } } - - mBackgroundWidth = mBackground != null ? mBackground.getWidth() : 0; - mBackgroundHeight = mBackground != null ? mBackground.getHeight() : 0; } private void drawWallpaperWithCanvas(SurfaceHolder sh, int w, int h, int x, int y) { @@ -413,7 +434,8 @@ public class ImageWallpaper extends WallpaperService { c.translate(x, y); if (w < 0 || h < 0) { c.save(Canvas.CLIP_SAVE_FLAG); - c.clipRect(0, 0, mBackgroundWidth, mBackgroundHeight, Op.DIFFERENCE); + c.clipRect(0, 0, mBackground.getWidth(), mBackground.getHeight(), + Op.DIFFERENCE); c.drawColor(0xff000000); c.restore(); } @@ -429,8 +451,8 @@ public class ImageWallpaper extends WallpaperService { private boolean drawWallpaperWithOpenGL(SurfaceHolder sh, int w, int h, int left, int top) { if (!initGL(sh)) return false; - final float right = left + mBackgroundWidth; - final float bottom = top + mBackgroundHeight; + final float right = left + mBackground.getWidth(); + final float bottom = top + mBackground.getHeight(); final Rect frame = sh.getSurfaceFrame(); final Matrix4f ortho = new Matrix4f();