Merge changes from topic "wallpaper-canvas" into tm-qpr-dev
* changes: Remove 0-length bitmap checks Don't recycle the bitmap on CanvasEngine.onDestroy Load wallpaper with correct user id
This commit is contained in:
@@ -31,6 +31,7 @@ import android.os.Handler;
|
|||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.service.wallpaper.WallpaperService;
|
import android.service.wallpaper.WallpaperService;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -598,7 +599,6 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
getDisplayContext().getSystemService(DisplayManager.class)
|
getDisplayContext().getSystemService(DisplayManager.class)
|
||||||
.unregisterDisplayListener(this);
|
.unregisterDisplayListener(this);
|
||||||
mWallpaperLocalColorExtractor.cleanUp();
|
mWallpaperLocalColorExtractor.cleanUp();
|
||||||
unloadBitmap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -676,9 +676,14 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
void drawFrameOnCanvas(Bitmap bitmap) {
|
void drawFrameOnCanvas(Bitmap bitmap) {
|
||||||
Trace.beginSection("ImageWallpaper.CanvasEngine#drawFrame");
|
Trace.beginSection("ImageWallpaper.CanvasEngine#drawFrame");
|
||||||
Surface surface = mSurfaceHolder.getSurface();
|
Surface surface = mSurfaceHolder.getSurface();
|
||||||
Canvas canvas = mWideColorGamut
|
Canvas canvas = null;
|
||||||
? surface.lockHardwareWideColorGamutCanvas()
|
try {
|
||||||
: surface.lockHardwareCanvas();
|
canvas = mWideColorGamut
|
||||||
|
? surface.lockHardwareWideColorGamutCanvas()
|
||||||
|
: surface.lockHardwareCanvas();
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
Log.w(TAG, "Unable to lock canvas", e);
|
||||||
|
}
|
||||||
if (canvas != null) {
|
if (canvas != null) {
|
||||||
Rect dest = mSurfaceHolder.getSurfaceFrame();
|
Rect dest = mSurfaceHolder.getSurfaceFrame();
|
||||||
try {
|
try {
|
||||||
@@ -709,17 +714,6 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void unloadBitmap() {
|
|
||||||
mBackgroundExecutor.execute(this::unloadBitmapSynchronized);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void unloadBitmapSynchronized() {
|
|
||||||
synchronized (mLock) {
|
|
||||||
mBitmapUsages = 0;
|
|
||||||
unloadBitmapInternal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void unloadBitmapInternal() {
|
private void unloadBitmapInternal() {
|
||||||
Trace.beginSection("ImageWallpaper.CanvasEngine#unloadBitmap");
|
Trace.beginSection("ImageWallpaper.CanvasEngine#unloadBitmap");
|
||||||
if (mBitmap != null) {
|
if (mBitmap != null) {
|
||||||
@@ -738,7 +732,7 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
boolean loadSuccess = false;
|
boolean loadSuccess = false;
|
||||||
Bitmap bitmap;
|
Bitmap bitmap;
|
||||||
try {
|
try {
|
||||||
bitmap = mWallpaperManager.getBitmap(false);
|
bitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, false);
|
||||||
if (bitmap != null
|
if (bitmap != null
|
||||||
&& bitmap.getByteCount() > RecordingCanvas.MAX_BITMAP_SIZE) {
|
&& bitmap.getByteCount() > RecordingCanvas.MAX_BITMAP_SIZE) {
|
||||||
throw new RuntimeException("Wallpaper is too large to draw!");
|
throw new RuntimeException("Wallpaper is too large to draw!");
|
||||||
@@ -757,7 +751,7 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
bitmap = mWallpaperManager.getBitmap(false);
|
bitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, false);
|
||||||
} catch (RuntimeException | OutOfMemoryError e) {
|
} catch (RuntimeException | OutOfMemoryError e) {
|
||||||
Log.w(TAG, "Unable to load default wallpaper!", e);
|
Log.w(TAG, "Unable to load default wallpaper!", e);
|
||||||
bitmap = null;
|
bitmap = null;
|
||||||
@@ -770,9 +764,6 @@ public class ImageWallpaper extends WallpaperService {
|
|||||||
Log.e(TAG, "Attempt to load a recycled bitmap");
|
Log.e(TAG, "Attempt to load a recycled bitmap");
|
||||||
} else if (mBitmap == bitmap) {
|
} else if (mBitmap == bitmap) {
|
||||||
Log.e(TAG, "Loaded a bitmap that was already loaded");
|
Log.e(TAG, "Loaded a bitmap that was already loaded");
|
||||||
} else if (bitmap.getWidth() < 1 || bitmap.getHeight() < 1) {
|
|
||||||
Log.e(TAG, "Attempt to load an invalid wallpaper of length "
|
|
||||||
+ bitmap.getWidth() + "x" + bitmap.getHeight());
|
|
||||||
} else {
|
} else {
|
||||||
// at this point, loading is done correctly.
|
// at this point, loading is done correctly.
|
||||||
loadSuccess = true;
|
loadSuccess = true;
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ import static org.mockito.Mockito.clearInvocations;
|
|||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.doNothing;
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
@@ -44,6 +44,7 @@ import android.graphics.Rect;
|
|||||||
import android.hardware.display.DisplayManager;
|
import android.hardware.display.DisplayManager;
|
||||||
import android.hardware.display.DisplayManagerGlobal;
|
import android.hardware.display.DisplayManagerGlobal;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper;
|
import android.testing.TestableLooper;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
@@ -135,9 +136,10 @@ public class ImageWallpaperTest extends SysuiTestCase {
|
|||||||
when(mWallpaperBitmap.getHeight()).thenReturn(mBitmapHeight);
|
when(mWallpaperBitmap.getHeight()).thenReturn(mBitmapHeight);
|
||||||
|
|
||||||
// set up wallpaper manager
|
// set up wallpaper manager
|
||||||
when(mWallpaperManager.peekBitmapDimensions()).thenReturn(
|
when(mWallpaperManager.peekBitmapDimensions())
|
||||||
new Rect(0, 0, mBitmapWidth, mBitmapHeight));
|
.thenReturn(new Rect(0, 0, mBitmapWidth, mBitmapHeight));
|
||||||
when(mWallpaperManager.getBitmap(false)).thenReturn(mWallpaperBitmap);
|
when(mWallpaperManager.getBitmapAsUser(eq(UserHandle.USER_CURRENT), anyBoolean()))
|
||||||
|
.thenReturn(mWallpaperBitmap);
|
||||||
when(mMockContext.getSystemService(WallpaperManager.class)).thenReturn(mWallpaperManager);
|
when(mMockContext.getSystemService(WallpaperManager.class)).thenReturn(mWallpaperManager);
|
||||||
|
|
||||||
// set up surface
|
// set up surface
|
||||||
@@ -286,9 +288,6 @@ public class ImageWallpaperTest extends SysuiTestCase {
|
|||||||
testMinSurfaceHelper(8, 8);
|
testMinSurfaceHelper(8, 8);
|
||||||
testMinSurfaceHelper(100, 2000);
|
testMinSurfaceHelper(100, 2000);
|
||||||
testMinSurfaceHelper(200, 1);
|
testMinSurfaceHelper(200, 1);
|
||||||
testMinSurfaceHelper(0, 1);
|
|
||||||
testMinSurfaceHelper(1, 0);
|
|
||||||
testMinSurfaceHelper(0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testMinSurfaceHelper(int bitmapWidth, int bitmapHeight) {
|
private void testMinSurfaceHelper(int bitmapWidth, int bitmapHeight) {
|
||||||
@@ -306,28 +305,6 @@ public class ImageWallpaperTest extends SysuiTestCase {
|
|||||||
intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT)));
|
intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testZeroBitmap() {
|
|
||||||
// test that a frame is never drawn with a 0 bitmap
|
|
||||||
testZeroBitmapHelper(0, 1);
|
|
||||||
testZeroBitmapHelper(1, 0);
|
|
||||||
testZeroBitmapHelper(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void testZeroBitmapHelper(int bitmapWidth, int bitmapHeight) {
|
|
||||||
|
|
||||||
clearInvocations(mSurfaceHolder);
|
|
||||||
setBitmapDimensions(bitmapWidth, bitmapHeight);
|
|
||||||
|
|
||||||
ImageWallpaper imageWallpaper = createImageWallpaperCanvas();
|
|
||||||
ImageWallpaper.CanvasEngine engine =
|
|
||||||
(ImageWallpaper.CanvasEngine) imageWallpaper.onCreateEngine();
|
|
||||||
ImageWallpaper.CanvasEngine spyEngine = spy(engine);
|
|
||||||
spyEngine.onCreate(mSurfaceHolder);
|
|
||||||
spyEngine.onSurfaceRedrawNeeded(mSurfaceHolder);
|
|
||||||
verify(spyEngine, never()).drawFrameOnCanvas(any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoadDrawAndUnloadBitmap() {
|
public void testLoadDrawAndUnloadBitmap() {
|
||||||
setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT);
|
setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT);
|
||||||
|
|||||||
Reference in New Issue
Block a user