Merge "Release the bitmap reference and textures when user changes the wallpaper."

This commit is contained in:
Wu Ahan
2019-03-21 09:03:28 +00:00
committed by Android (Google) Code Review
3 changed files with 35 additions and 41 deletions

View File

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

View File

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

View File

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