summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWu Ahan <ahanwu@google.com>2020-04-08 06:45:23 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-04-08 06:45:23 +0000
commit27393d9f077b842d4611d8b1572e6fc62a5094c2 (patch)
tree60a47b6591339d599d45be7faba0fa3888879a6a
parent663079facfb0e03a866b5d7b66f0a5e367cce999 (diff)
parenta1b4489ffa8a24f9530065eb5d9611c28593b8ee (diff)
downloadframeworks_base-27393d9f077b842d4611d8b1572e6fc62a5094c2.tar.gz
frameworks_base-27393d9f077b842d4611d8b1572e6fc62a5094c2.tar.bz2
frameworks_base-27393d9f077b842d4611d8b1572e6fc62a5094c2.zip
Merge "DO NOT MERGE Fix ImageWallpaper memory regression" into qt-qpr1-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java57
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java11
2 files changed, 45 insertions, 23 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 319d1177622..fa3405fab8d 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -18,12 +18,14 @@ package com.android.systemui;
import android.app.ActivityManager;
import android.content.Context;
+import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.HandlerThread;
import android.os.Trace;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.util.Size;
+import android.view.DisplayInfo;
import android.view.SurfaceHolder;
import com.android.internal.annotations.VisibleForTesting;
@@ -84,14 +86,19 @@ public class ImageWallpaper extends WallpaperService {
private StatusBarStateController mController;
private final Runnable mFinishRenderingTask = this::finishRendering;
private final boolean mNeedTransition;
+ private boolean mShouldStopTransition;
+ private final boolean mIsHighEndGfx;
+ private final boolean mDisplayNeedsBlanking;
+ private final DisplayInfo mDisplayInfo = new DisplayInfo();
private final Object mMonitor = new Object();
private boolean mNeedRedraw;
// This variable can only be accessed in synchronized block.
private boolean mWaitingForRendering;
GLEngine(Context context) {
- mNeedTransition = ActivityManager.isHighEndGfx()
- && !DozeParameters.getInstance(context).getDisplayNeedsBlanking();
+ mIsHighEndGfx = ActivityManager.isHighEndGfx();
+ mDisplayNeedsBlanking = DozeParameters.getInstance(context).getDisplayNeedsBlanking();
+ mNeedTransition = mIsHighEndGfx && !mDisplayNeedsBlanking;
// We will preserve EGL context when we are in lock screen or aod
// to avoid janking in following transition, we need to release when back to home.
@@ -99,12 +106,14 @@ public class ImageWallpaper extends WallpaperService {
if (mController != null) {
mController.addCallback(this /* StateListener */);
}
- mEglHelper = new EglHelper();
- mRenderer = new ImageWallpaperRenderer(context, this /* SurfaceProxy */);
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
+ mEglHelper = new EglHelper();
+ // Deferred init renderer because we need to get wallpaper by display context.
+ mRenderer = new ImageWallpaperRenderer(getDisplayContext(), this /* SurfaceProxy */);
+ getDisplayContext().getDisplay().getDisplayInfo(mDisplayInfo);
setFixedSizeAllowed(true);
setOffsetNotificationsEnabled(true);
updateSurfaceSize();
@@ -118,6 +127,26 @@ public class ImageWallpaper extends WallpaperService {
holder.setFixedSize(width, height);
}
+ /**
+ * Check if necessary to stop transition with current wallpaper on this device. <br/>
+ * This should only be invoked after {@link #onSurfaceCreated(SurfaceHolder)}}
+ * is invoked since it needs display context and surface frame size.
+ *
+ * @return true if need to stop transition
+ */
+ @VisibleForTesting
+ boolean checkIfShouldStopTransition() {
+ int orientation = getDisplayContext().getResources().getConfiguration().orientation;
+ boolean portrait = orientation == Configuration.ORIENTATION_PORTRAIT;
+ Rect frame = getSurfaceHolder().getSurfaceFrame();
+ int frameWidth = frame.width();
+ int frameHeight = frame.height();
+ int displayWidth = portrait ? mDisplayInfo.logicalWidth : mDisplayInfo.logicalHeight;
+ int displayHeight = portrait ? mDisplayInfo.logicalHeight : mDisplayInfo.logicalWidth;
+ return mNeedTransition
+ && (frameWidth < displayWidth || frameHeight < displayHeight);
+ }
+
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
float yOffsetStep, int xPixelOffset, int yPixelOffset) {
@@ -128,12 +157,14 @@ public class ImageWallpaper extends WallpaperService {
@Override
public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
if (mWorker == null || !mNeedTransition) return;
+ final long duration = mShouldStopTransition ? 0 : animationDuration;
if (DEBUG) {
Log.d(TAG, "onAmbientModeChanged: inAmbient=" + inAmbientMode
- + ", duration=" + animationDuration);
+ + ", duration=" + duration
+ + ", mShouldStopTransition=" + mShouldStopTransition);
}
mWorker.getThreadHandler().post(
- () -> mRenderer.updateAmbientMode(inAmbientMode, animationDuration));
+ () -> mRenderer.updateAmbientMode(inAmbientMode, duration));
if (inAmbientMode && animationDuration == 0) {
// This means that we are transiting from home to aod, to avoid
// race condition between window visibility and transition,
@@ -169,13 +200,13 @@ public class ImageWallpaper extends WallpaperService {
mRenderer = null;
mEglHelper.finish();
mEglHelper = null;
- getSurfaceHolder().getSurface().hwuiDestroy();
});
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
if (mWorker == null) return;
+ mShouldStopTransition = checkIfShouldStopTransition();
mWorker.getThreadHandler().post(() -> {
mEglHelper.init(holder);
mRenderer.onSurfaceCreated();
@@ -365,15 +396,13 @@ public class ImageWallpaper extends WallpaperService {
protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
super.dump(prefix, fd, out, args);
out.print(prefix); out.print("Engine="); out.println(this);
-
- boolean isHighEndGfx = ActivityManager.isHighEndGfx();
- out.print(prefix); out.print("isHighEndGfx="); out.println(isHighEndGfx);
-
- DozeParameters dozeParameters = DozeParameters.getInstance(getApplicationContext());
+ out.print(prefix); out.print("isHighEndGfx="); out.println(mIsHighEndGfx);
out.print(prefix); out.print("displayNeedsBlanking=");
- out.println(dozeParameters != null ? dozeParameters.getDisplayNeedsBlanking() : "null");
-
+ out.println(mDisplayNeedsBlanking);
+ out.print(prefix); out.print("displayInfo="); out.print(mDisplayInfo);
out.print(prefix); out.print("mNeedTransition="); out.println(mNeedTransition);
+ out.print(prefix); out.print("mShouldStopTransition=");
+ out.println(mShouldStopTransition);
out.print(prefix); out.print("StatusBarState=");
out.println(mController != null ? mController.getState() : "null");
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
index be6f7bfe258..5f6588f9fca 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
@@ -31,7 +31,6 @@ import android.util.Log;
import android.util.MathUtils;
import android.util.Size;
import android.view.DisplayInfo;
-import android.view.WindowManager;
import com.android.systemui.R;
@@ -70,8 +69,7 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer,
}
DisplayInfo displayInfo = new DisplayInfo();
- WindowManager wm = context.getSystemService(WindowManager.class);
- wm.getDefaultDisplay().getDisplayInfo(displayInfo);
+ context.getDisplay().getDisplayInfo(displayInfo);
// We only do transition in portrait currently, b/137962047.
int orientation = context.getResources().getConfiguration().orientation;
@@ -115,12 +113,7 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer,
mBitmap = mWallpaperManager.getBitmap();
mWallpaperManager.forgetLoadedWallpaper();
if (mBitmap != null) {
- float scale = (float) mScissor.height() / mBitmap.getHeight();
- int surfaceHeight = Math.max(mScissor.height(), mBitmap.getHeight());
- int surfaceWidth = scale > 1f
- ? Math.round(mBitmap.getWidth() * scale)
- : mBitmap.getWidth();
- mSurfaceSize.set(0, 0, surfaceWidth, surfaceHeight);
+ mSurfaceSize.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
}
}
if (DEBUG) {