Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48ebbd77 authored by Ahan Wu's avatar Ahan Wu
Browse files

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
parent dbd26f3f
Loading
Loading
Loading
Loading
+13 −16
Original line number Diff line number Diff line
@@ -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());
                }
            }
+6 −12
Original line number Diff line number Diff line
@@ -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;
+16 −13
Original line number Diff line number Diff line
@@ -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();
    }