Release the bitmap reference and textures when user changes the wallpaper.
We don't need the bitmap after we uploads it to texture so we nullify the reference to get it can be gced. We also need to release the graphic memory when user changes the wallpaper or the graphic memory will increase dramatically. Bug: 128897294 Test: Change wallpaper, observes android profiler Change-Id: I207d67741e6a7643a13ba97fccdab355dd09e30c
This commit is contained in:
@@ -19,9 +19,7 @@ package com.android.systemui;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.opengl.GLSurfaceView;
|
||||
import android.os.Build;
|
||||
import android.service.wallpaper.WallpaperService;
|
||||
import android.util.Log;
|
||||
import android.view.SurfaceHolder;
|
||||
|
||||
import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
|
||||
@@ -33,16 +31,8 @@ import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
|
||||
public class ImageWallpaper extends WallpaperService {
|
||||
private static final String TAG = ImageWallpaper.class.getSimpleName();
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Engine onCreateEngine() {
|
||||
if (Build.IS_DEBUGGABLE) {
|
||||
Log.v(TAG, "We are using GLEngine");
|
||||
}
|
||||
return new GLEngine(this);
|
||||
}
|
||||
|
||||
@@ -72,8 +62,15 @@ public class ImageWallpaper extends WallpaperService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if (mWallpaperSurfaceView != null) {
|
||||
mWallpaperSurfaceView.onPause();
|
||||
}
|
||||
}
|
||||
|
||||
private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView {
|
||||
private WallpaperStatusListener mWallpaperChangedListener;
|
||||
private WallpaperStatusListener mWallpaperStatusListener;
|
||||
|
||||
GLWallpaperSurfaceView(Context context) {
|
||||
super(context);
|
||||
@@ -88,18 +85,18 @@ public class ImageWallpaper extends WallpaperService {
|
||||
@Override
|
||||
public void setRenderer(Renderer renderer) {
|
||||
super.setRenderer(renderer);
|
||||
mWallpaperChangedListener = (WallpaperStatusListener) renderer;
|
||||
mWallpaperStatusListener = (WallpaperStatusListener) renderer;
|
||||
}
|
||||
|
||||
private void notifyAmbientModeChanged(boolean inAmbient, long duration) {
|
||||
if (mWallpaperChangedListener != null) {
|
||||
mWallpaperChangedListener.onAmbientModeChanged(inAmbient, duration);
|
||||
if (mWallpaperStatusListener != null) {
|
||||
mWallpaperStatusListener.onAmbientModeChanged(inAmbient, duration);
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyOffsetsChanged(float xOffset, float yOffset) {
|
||||
if (mWallpaperChangedListener != null) {
|
||||
mWallpaperChangedListener.onOffsetsChanged(
|
||||
if (mWallpaperStatusListener != null) {
|
||||
mWallpaperStatusListener.onOffsetsChanged(
|
||||
xOffset, yOffset, getHolder().getSurfaceFrame());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,9 +110,10 @@ class ImageGLWallpaper {
|
||||
mTextureBuffer.position(0);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
void setup(Bitmap bitmap) {
|
||||
setupAttributes();
|
||||
setupUniforms();
|
||||
setupTexture(bitmap);
|
||||
}
|
||||
|
||||
private void setupAttributes() {
|
||||
@@ -159,7 +160,7 @@ class ImageGLWallpaper {
|
||||
glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2);
|
||||
}
|
||||
|
||||
void setupTexture(Bitmap bitmap) {
|
||||
private void setupTexture(Bitmap bitmap) {
|
||||
final int[] tids = new int[1];
|
||||
|
||||
if (bitmap == null) {
|
||||
@@ -174,7 +175,7 @@ class ImageGLWallpaper {
|
||||
return;
|
||||
}
|
||||
|
||||
// Bind a named texture to a texturing target.
|
||||
// Bind a named texture to a target.
|
||||
glBindTexture(GL_TEXTURE_2D, tids[0]);
|
||||
// Load the bitmap data and copy it over into the texture object that is currently bound.
|
||||
GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);
|
||||
@@ -195,15 +196,8 @@ class ImageGLWallpaper {
|
||||
glUniform1i(mUniTexture, 0);
|
||||
}
|
||||
|
||||
void adjustTextureCoordinates(Bitmap bitmap, int surfaceWidth, int surfaceHeight,
|
||||
float xOffset, float yOffset) {
|
||||
if (bitmap == null) {
|
||||
Log.d(TAG, "adjustTextureCoordinates: invalid bitmap");
|
||||
return;
|
||||
}
|
||||
|
||||
int bitmapWidth = bitmap.getWidth();
|
||||
int bitmapHeight = bitmap.getHeight();
|
||||
void adjustTextureCoordinates(int bitmapWidth, int bitmapHeight,
|
||||
int surfaceWidth, int surfaceHeight, float xOffset, float yOffset) {
|
||||
float ratioW = 1f;
|
||||
float ratioH = 1f;
|
||||
float rX = 0f;
|
||||
|
||||
@@ -58,6 +58,10 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
private int mWidth = 0;
|
||||
private int mHeight = 0;
|
||||
|
||||
private Bitmap mBitmap;
|
||||
private int mBitmapWidth = 0;
|
||||
private int mBitmapHeight = 0;
|
||||
|
||||
public ImageWallpaperRenderer(Context context, ImageGLView glView) {
|
||||
mWallpaperManager = context.getSystemService(WallpaperManager.class);
|
||||
if (mWallpaperManager == null) {
|
||||
@@ -71,8 +75,12 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
mGLView = glView;
|
||||
|
||||
if (mWallpaperManager != null) {
|
||||
mBitmap = mWallpaperManager.getBitmap();
|
||||
mBitmapWidth = mBitmap.getWidth();
|
||||
mBitmapHeight = mBitmap.getHeight();
|
||||
// Compute per85 as transition threshold, this is an async work.
|
||||
mImageProcessHelper.startComputingPercentile85(mWallpaperManager.getBitmap());
|
||||
mImageProcessHelper.startComputingPercentile85(mBitmap);
|
||||
mWallpaperManager.forgetLoadedWallpaper();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +89,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
glClearColor(0f, 0f, 0f, 1.0f);
|
||||
mProgram.useGLProgram(
|
||||
R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader);
|
||||
mWallpaper.setup();
|
||||
mWallpaper.setupTexture(mWallpaperManager.getBitmap());
|
||||
mWallpaper.setup(mBitmap);
|
||||
mBitmap = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -94,8 +102,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
}
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(),
|
||||
width, height, mXOffset, mYOffset);
|
||||
mWallpaper.adjustTextureCoordinates(
|
||||
mBitmapWidth, mBitmapHeight, width, height, mXOffset, mYOffset);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -132,13 +140,7 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
|
||||
@Override
|
||||
public void onOffsetsChanged(float xOffset, float yOffset, Rect frame) {
|
||||
if (frame == null || mWallpaperManager == null
|
||||
|| (xOffset == mXOffset && yOffset == mYOffset)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Bitmap bitmap = mWallpaperManager.getBitmap();
|
||||
if (bitmap == null) {
|
||||
if (frame == null || (xOffset == mXOffset && yOffset == mYOffset)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -151,7 +153,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
|
||||
Log.d(TAG, "onOffsetsChanged: width=" + width + ", height=" + height
|
||||
+ ", xOffset=" + mXOffset + ", yOffset=" + mYOffset);
|
||||
}
|
||||
mWallpaper.adjustTextureCoordinates(bitmap, width, height, mXOffset, mYOffset);
|
||||
mWallpaper.adjustTextureCoordinates(
|
||||
mBitmapWidth, mBitmapHeight, width, height, mXOffset, mYOffset);
|
||||
requestRender();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user