Only supports ambient mode when necessary.

We only need support ambient mode on specified devices but we currently
enable this attribute on all devices, that means we need redraw every
time when ambient mode changes. However, we can just show / hide
wallpaper window on the devices which not support ambient transition.

In addition, always use portrait dimension as scissor area since we only
do transition in portrait.

Bug: 138021396
Bug: 137962047
Test: Manually test on F2, C1, B4, S4 and walleye.
Test: Set an image wallpaper, switch between home, aod and lockscreen.
Test: Also use finger print to unlock from aod to home directly.
Test: Rotate to landscape, set a new image wallpaper.
Test: Switch between home, aod and lockscreen.
Change-Id: I36dd49363e81df5a260b10695d90aa9d8c70a45a
This commit is contained in:
Ahan Wu
2019-07-23 20:41:52 +08:00
parent a09ee2d39f
commit 0e17480b1f
4 changed files with 38 additions and 24 deletions

View File

@@ -47,7 +47,7 @@ public class ImageWallpaper extends WallpaperService {
// This is to avoid destroying then recreating render context in a very short time.
private static final int DELAY_FINISH_RENDERING = 1000;
private static final int INTERVAL_WAIT_FOR_RENDERING = 100;
private static final int PATIENCE_WAIT_FOR_RENDERING = 5;
private static final int PATIENCE_WAIT_FOR_RENDERING = 10;
private HandlerThread mWorker;
@Override
@@ -124,10 +124,10 @@ public class ImageWallpaper extends WallpaperService {
@Override
public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
long duration = mNeedTransition || animationDuration != 0 ? animationDuration : 0;
if (!mNeedTransition) return;
mWorker.getThreadHandler().post(
() -> mRenderer.updateAmbientMode(inAmbientMode, duration));
if (inAmbientMode && duration == 0) {
() -> mRenderer.updateAmbientMode(inAmbientMode, animationDuration));
if (inAmbientMode && animationDuration == 0) {
// This means that we are transiting from home to aod, to avoid
// race condition between window visibility and transition,
// we don't return until the transition is finished. See b/136643341.

View File

@@ -65,7 +65,7 @@ class ImageRevealHelper {
@Override
public void onAnimationStart(Animator animation) {
if (mRevealListener != null) {
mRevealListener.onRevealStart();
mRevealListener.onRevealStart(true /* animate */);
}
}
});
@@ -73,7 +73,7 @@ class ImageRevealHelper {
private void animate() {
mAnimator.cancel();
mAnimator.setFloatValues(mReveal, !mAwake ? MIN_REVEAL : MAX_REVEAL);
mAnimator.setFloatValues(mReveal, mAwake ? MAX_REVEAL : MIN_REVEAL);
mAnimator.start();
}
@@ -84,12 +84,11 @@ class ImageRevealHelper {
void updateAwake(boolean awake, long duration) {
mAwake = awake;
mAnimator.setDuration(duration);
if (!mAwake && duration == 0) {
// We are transiting from home to aod,
// since main thread is waiting for rendering finished, we only need draw
// the last state directly, which is a black screen.
mReveal = MIN_REVEAL;
mRevealListener.onRevealStart();
if (duration == 0) {
// We are transiting from home to aod or aod to home directly,
// we don't need to do transition in these cases.
mReveal = mAwake ? MAX_REVEAL : MIN_REVEAL;
mRevealListener.onRevealStart(false /* animate */);
mRevealListener.onRevealStateChanged();
mRevealListener.onRevealEnd();
} else {
@@ -110,7 +109,7 @@ class ImageRevealHelper {
/**
* Called back while reveal starts.
*/
void onRevealStart();
void onRevealStart(boolean animate);
/**
* Called back while reveal ends.

View File

@@ -24,6 +24,7 @@ import static android.opengl.GLES20.glViewport;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.util.Log;
@@ -70,7 +71,14 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer,
DisplayInfo displayInfo = new DisplayInfo();
WindowManager wm = context.getSystemService(WindowManager.class);
wm.getDefaultDisplay().getDisplayInfo(displayInfo);
mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
// We only do transition in portrait currently, b/137962047.
int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
} else {
mScissor = new Rect(0, 0, displayInfo.logicalHeight, displayInfo.logicalWidth);
}
mProxy = proxy;
mProgram = new ImageGLProgram(context);
@@ -179,20 +187,24 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer,
}
@Override
public void onRevealStart() {
mScissorMode = true;
// Use current display area of texture.
mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset);
public void onRevealStart(boolean animate) {
if (animate) {
mScissorMode = true;
// Use current display area of texture.
mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset);
}
mProxy.preRender();
}
@Override
public void onRevealEnd() {
mScissorMode = false;
// reset texture coordinates to use full texture.
mWallpaper.adjustTextureCoordinates(null, null, 0, 0);
// We need draw full texture back before finishing render.
mProxy.requestRender();
if (mScissorMode) {
mScissorMode = false;
// reset texture coordinates to use full texture.
mWallpaper.adjustTextureCoordinates(null, null, 0, 0);
// We need draw full texture back before finishing render.
mProxy.requestRender();
}
mProxy.postRender();
}

View File

@@ -482,9 +482,12 @@ public class StatusBar extends SystemUI implements DemoMode,
WallpaperInfo info = wallpaperManager.getWallpaperInfo(UserHandle.USER_CURRENT);
final boolean deviceSupportsAodWallpaper = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_dozeSupportsAodWallpaper);
final boolean imageWallpaperInAmbient =
!DozeParameters.getInstance(mContext).getDisplayNeedsBlanking();
// If WallpaperInfo is null, it must be ImageWallpaper.
final boolean supportsAmbientMode = deviceSupportsAodWallpaper
&& (info == null || info.supportsAmbientMode());
&& ((info == null && imageWallpaperInAmbient)
|| (info != null && info.supportsAmbientMode()));
mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode);