From 38545343c6ed615c56f0570e80bfd767abf824de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Pomini?= Date: Mon, 28 Nov 2022 08:06:57 +0000 Subject: [PATCH] Remove usage of GlEngine The new Engine of ImageWallpaper, a CanvasEngine, was enabled in droidFood under a flag. It has been tested for several weeks and is ready to be enabled by default, wihtout any flag. The ImageWallpaperTest has been slightly refactored to fix all warnings and reintroduce two GL tests that were ignored. A very small fix was added in ImageWallpaper.java: if the bitmap fails to load (which should not happen) for another user than USER_SYSTEM, it will be reset to default for this user and not for USER_SYSTEM. Test: atest ImageWallpaperTest Test: atest WallpaperLocalColorExtractorTest Fixes: 243768810 Bug: 243402530 Bug: 254512923 Change-Id: I0bfbe9b6aee7a4da349b412399196504511b69f0 Merged-In: I0bfbe9b6aee7a4da349b412399196504511b69f0 --- packages/SystemUI/AndroidManifest.xml | 5 - .../raw/image_wallpaper_fragment_shader.glsl | 11 - .../raw/image_wallpaper_vertex_shader.glsl | 8 - .../src/com/android/systemui/flags/Flags.kt | 4 - .../systemui/wallpapers/ImageWallpaper.java | 461 +----------------- .../WallpaperLocalColorExtractor.java | 3 +- .../systemui/wallpapers/gl/EglHelper.java | 380 --------------- .../wallpapers/gl/GLWallpaperRenderer.java | 70 --- .../wallpapers/gl/ImageGLProgram.java | 115 ----- .../wallpapers/gl/ImageGLWallpaper.java | 183 ------- .../wallpapers/gl/ImageWallpaperRenderer.java | 195 -------- .../wallpapers/ImageWallpaperTest.java | 187 ++----- .../WallpaperLocalColorExtractorTest.java | 2 +- .../systemui/wallpapers/gl/EglHelperTest.java | 128 ----- .../gl/ImageWallpaperRendererTest.java | 89 ---- 15 files changed, 61 insertions(+), 1780 deletions(-) delete mode 100644 packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl delete mode 100644 packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl rename packages/SystemUI/src/com/android/systemui/wallpapers/{canvas => }/WallpaperLocalColorExtractor.java (99%) delete mode 100644 packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java delete mode 100644 packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java delete mode 100644 packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java delete mode 100644 packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java delete mode 100644 packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java rename packages/SystemUI/tests/src/com/android/systemui/wallpapers/{canvas => }/WallpaperLocalColorExtractorTest.java (99%) delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index acaa008f2a0c6..be56c89424792 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -23,11 +23,6 @@ xmlns:tools="http://schemas.android.com/tools" coreApp="true"> - - - diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl deleted file mode 100644 index e4b6e07786649..0000000000000 --- a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl +++ /dev/null @@ -1,11 +0,0 @@ -precision mediump float; - -// The actual wallpaper texture. -uniform sampler2D uTexture; - -varying vec2 vTextureCoordinates; - -void main() { - // gets the pixel value of the wallpaper for this uv coordinates on screen. - gl_FragColor = texture2D(uTexture, vTextureCoordinates); -} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl deleted file mode 100644 index 4393e2bb0ebf9..0000000000000 --- a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl +++ /dev/null @@ -1,8 +0,0 @@ -attribute vec4 aPosition; -attribute vec2 aTextureCoordinates; -varying vec2 vTextureCoordinates; - -void main() { - vTextureCoordinates = aTextureCoordinates; - gl_Position = aPosition; -} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index c322b129b908f..734a6af51e135 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -253,10 +253,6 @@ object Flags { // TODO(b/254512848): Tracking Bug val REGION_SAMPLING = unreleasedFlag(801, "region_sampling") - // 802 - wallpaper rendering - // TODO(b/254512923): Tracking Bug - @JvmField val USE_CANVAS_RENDERER = unreleasedFlag(802, "use_canvas_renderer") - // 803 - screen contents translation // TODO(b/254513187): Tracking Bug val SCREEN_CONTENTS_TRANSLATION = unreleasedFlag(803, "screen_contents_translation") diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java index ef43702e97b84..1f1b32c1c63ac 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java @@ -16,8 +16,6 @@ package com.android.systemui.wallpapers; -import static com.android.systemui.flags.Flags.USE_CANVAS_RENDERER; - import android.app.WallpaperColors; import android.app.WallpaperManager; import android.graphics.Bitmap; @@ -27,16 +25,10 @@ import android.graphics.Rect; import android.graphics.RectF; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.service.wallpaper.WallpaperService; -import android.util.ArraySet; import android.util.Log; -import android.util.MathUtils; -import android.util.Size; import android.view.Surface; import android.view.SurfaceHolder; import android.view.WindowManager; @@ -45,16 +37,10 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Background; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.DelayableExecutor; -import com.android.systemui.wallpapers.canvas.WallpaperLocalColorExtractor; -import com.android.systemui.wallpapers.gl.EglHelper; -import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import java.io.FileDescriptor; -import java.io.IOException; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -64,455 +50,32 @@ import javax.inject.Inject; */ @SuppressWarnings({"UnusedDeclaration"}) public class ImageWallpaper extends WallpaperService { + private static final String TAG = ImageWallpaper.class.getSimpleName(); - // We delayed destroy render context that subsequent render requests have chance to cancel it. - // 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 @android.annotation.NonNull RectF LOCAL_COLOR_BOUNDS = - new RectF(0, 0, 1, 1); private static final boolean DEBUG = false; - private final ArrayList mLocalColorsToAdd = new ArrayList<>(); - private final ArraySet mColorAreas = new ArraySet<>(); + // keep track of the number of pages of the launcher for local color extraction purposes private volatile int mPages = 1; private boolean mPagesComputed = false; - private HandlerThread mWorker; - // scaled down version - private Bitmap mMiniBitmap; - private final FeatureFlags mFeatureFlags; - // used in canvasEngine to load/unload the bitmap and extract the colors + // used for most tasks (call canvas.drawBitmap, load/unload the bitmap) @Background private final DelayableExecutor mBackgroundExecutor; + + // wait at least this duration before unloading the bitmap private static final int DELAY_UNLOAD_BITMAP = 2000; @Inject - public ImageWallpaper(FeatureFlags featureFlags, - @Background DelayableExecutor backgroundExecutor) { + public ImageWallpaper(@Background DelayableExecutor backgroundExecutor) { super(); - mFeatureFlags = featureFlags; mBackgroundExecutor = backgroundExecutor; } - @Override - public void onCreate() { - super.onCreate(); - mWorker = new HandlerThread(TAG); - mWorker.start(); - } - @Override public Engine onCreateEngine() { - return mFeatureFlags.isEnabled(USE_CANVAS_RENDERER) ? new CanvasEngine() : new GLEngine(); + return new CanvasEngine(); } - @Override - public void onDestroy() { - super.onDestroy(); - mWorker.quitSafely(); - mWorker = null; - mMiniBitmap = null; - } - - class GLEngine extends Engine implements DisplayListener { - // Surface is rejected if size below a threshold on some devices (ie. 8px on elfin) - // set min to 64 px (CTS covers this), please refer to ag/4867989 for detail. - @VisibleForTesting - static final int MIN_SURFACE_WIDTH = 128; - @VisibleForTesting - static final int MIN_SURFACE_HEIGHT = 128; - - private ImageWallpaperRenderer mRenderer; - private EglHelper mEglHelper; - private final Runnable mFinishRenderingTask = this::finishRendering; - private boolean mNeedRedraw; - - private boolean mDisplaySizeValid = false; - private int mDisplayWidth = 1; - private int mDisplayHeight = 1; - - private int mImgWidth = 1; - private int mImgHeight = 1; - - GLEngine() { } - - @VisibleForTesting - GLEngine(Handler handler) { - super(SystemClock::elapsedRealtime, handler); - } - - @Override - public void onCreate(SurfaceHolder surfaceHolder) { - Trace.beginSection("ImageWallpaper.Engine#onCreate"); - mEglHelper = getEglHelperInstance(); - // Deferred init renderer because we need to get wallpaper by display context. - mRenderer = getRendererInstance(); - setFixedSizeAllowed(true); - updateSurfaceSize(); - setShowForAllUsers(true); - - mRenderer.setOnBitmapChanged(b -> { - mLocalColorsToAdd.addAll(mColorAreas); - if (mLocalColorsToAdd.size() > 0) { - updateMiniBitmapAndNotify(b); - } - }); - getDisplayContext().getSystemService(DisplayManager.class) - .registerDisplayListener(this, mWorker.getThreadHandler()); - Trace.endSection(); - } - - @Override - public void onDisplayAdded(int displayId) { } - - @Override - public void onDisplayRemoved(int displayId) { } - - @Override - public void onDisplayChanged(int displayId) { - if (displayId == getDisplayContext().getDisplayId()) { - mDisplaySizeValid = false; - } - } - - EglHelper getEglHelperInstance() { - return new EglHelper(); - } - - ImageWallpaperRenderer getRendererInstance() { - return new ImageWallpaperRenderer(getDisplayContext()); - } - - @Override - public void onOffsetsChanged(float xOffset, float yOffset, - float xOffsetStep, float yOffsetStep, - int xPixelOffset, int yPixelOffset) { - final int pages; - if (xOffsetStep > 0 && xOffsetStep <= 1) { - pages = (int) Math.round(1 / xOffsetStep) + 1; - } else { - pages = 1; - } - if (pages == mPages) return; - mPages = pages; - if (mMiniBitmap == null || mMiniBitmap.isRecycled()) return; - mWorker.getThreadHandler().post(() -> - computeAndNotifyLocalColors(new ArrayList<>(mColorAreas), mMiniBitmap)); - } - - private void updateMiniBitmapAndNotify(Bitmap b) { - if (b == null) return; - int size = Math.min(b.getWidth(), b.getHeight()); - float scale = 1.0f; - if (size > MIN_SURFACE_WIDTH) { - scale = (float) MIN_SURFACE_WIDTH / (float) size; - } - mImgHeight = b.getHeight(); - mImgWidth = b.getWidth(); - mMiniBitmap = Bitmap.createScaledBitmap(b, (int) Math.max(scale * b.getWidth(), 1), - (int) Math.max(scale * b.getHeight(), 1), false); - computeAndNotifyLocalColors(mLocalColorsToAdd, mMiniBitmap); - mLocalColorsToAdd.clear(); - } - - private void updateSurfaceSize() { - Trace.beginSection("ImageWallpaper#updateSurfaceSize"); - SurfaceHolder holder = getSurfaceHolder(); - Size frameSize = mRenderer.reportSurfaceSize(); - int width = Math.max(MIN_SURFACE_WIDTH, frameSize.getWidth()); - int height = Math.max(MIN_SURFACE_HEIGHT, frameSize.getHeight()); - holder.setFixedSize(width, height); - Trace.endSection(); - } - - @Override - public boolean shouldZoomOutWallpaper() { - return true; - } - - @Override - public boolean shouldWaitForEngineShown() { - return true; - } - - @Override - public void onDestroy() { - getDisplayContext().getSystemService(DisplayManager.class) - .unregisterDisplayListener(this); - mMiniBitmap = null; - mWorker.getThreadHandler().post(() -> { - mRenderer.finish(); - mRenderer = null; - mEglHelper.finish(); - mEglHelper = null; - }); - } - - @Override - public boolean supportsLocalColorExtraction() { - return true; - } - - @Override - public void addLocalColorsAreas(@NonNull List regions) { - mWorker.getThreadHandler().post(() -> { - if (mColorAreas.size() + mLocalColorsToAdd.size() == 0) { - setOffsetNotificationsEnabled(true); - } - Bitmap bitmap = mMiniBitmap; - if (bitmap == null) { - mLocalColorsToAdd.addAll(regions); - if (mRenderer != null) mRenderer.use(this::updateMiniBitmapAndNotify); - } else { - computeAndNotifyLocalColors(regions, bitmap); - } - }); - } - - private void computeAndNotifyLocalColors(@NonNull List regions, Bitmap b) { - List colors = getLocalWallpaperColors(regions, b); - mColorAreas.addAll(regions); - try { - notifyLocalColorsChanged(regions, colors); - } catch (RuntimeException e) { - Log.e(TAG, e.getMessage(), e); - } - } - - @Override - public void removeLocalColorsAreas(@NonNull List regions) { - mWorker.getThreadHandler().post(() -> { - mColorAreas.removeAll(regions); - mLocalColorsToAdd.removeAll(regions); - if (mColorAreas.size() + mLocalColorsToAdd.size() == 0) { - setOffsetNotificationsEnabled(false); - } - }); - } - - /** - * Transform the logical coordinates into wallpaper coordinates. - * - * Logical coordinates are organised such that the various pages are non-overlapping. So, - * if there are n pages, the first page will have its X coordinate on the range [0-1/n]. - * - * The real pages are overlapping. If the Wallpaper are a width Ww and the screen a width - * Ws, the relative width of a page Wr is Ws/Ww. This does not change if the number of - * pages increase. - * If there are n pages, the page k starts at the offset k * (1 - Wr) / (n - 1), as the - * last page is at position (1-Wr) and the others are regularly spread on the range [0- - * (1-Wr)]. - */ - private RectF pageToImgRect(RectF area) { - if (!mDisplaySizeValid) { - Rect window = getDisplayContext() - .getSystemService(WindowManager.class) - .getCurrentWindowMetrics() - .getBounds(); - mDisplayWidth = window.width(); - mDisplayHeight = window.height(); - mDisplaySizeValid = true; - } - - // Width of a page for the caller of this API. - float virtualPageWidth = 1f / (float) mPages; - float leftPosOnPage = (area.left % virtualPageWidth) / virtualPageWidth; - float rightPosOnPage = (area.right % virtualPageWidth) / virtualPageWidth; - int currentPage = (int) Math.floor(area.centerX() / virtualPageWidth); - - RectF imgArea = new RectF(); - - if (mImgWidth == 0 || mImgHeight == 0 || mDisplayWidth <= 0 || mDisplayHeight <= 0) { - return imgArea; - } - - imgArea.bottom = area.bottom; - imgArea.top = area.top; - - float imageScale = Math.min(((float) mImgHeight) / mDisplayHeight, 1); - float mappedScreenWidth = mDisplayWidth * imageScale; - float pageWidth = Math.min(1.0f, - mImgWidth > 0 ? mappedScreenWidth / (float) mImgWidth : 1.f); - float pageOffset = (1 - pageWidth) / (float) (mPages - 1); - - imgArea.left = MathUtils.constrain( - leftPosOnPage * pageWidth + currentPage * pageOffset, 0, 1); - imgArea.right = MathUtils.constrain( - rightPosOnPage * pageWidth + currentPage * pageOffset, 0, 1); - if (imgArea.left > imgArea.right) { - // take full page - imgArea.left = 0; - imgArea.right = 1; - } - return imgArea; - } - - private List getLocalWallpaperColors(@NonNull List areas, - Bitmap b) { - List colors = new ArrayList<>(areas.size()); - for (int i = 0; i < areas.size(); i++) { - RectF area = pageToImgRect(areas.get(i)); - if (area == null || !LOCAL_COLOR_BOUNDS.contains(area)) { - colors.add(null); - continue; - } - Rect subImage = new Rect( - (int) Math.floor(area.left * b.getWidth()), - (int) Math.floor(area.top * b.getHeight()), - (int) Math.ceil(area.right * b.getWidth()), - (int) Math.ceil(area.bottom * b.getHeight())); - if (subImage.isEmpty()) { - // Do not notify client. treat it as too small to sample - colors.add(null); - continue; - } - Bitmap colorImg = Bitmap.createBitmap(b, - subImage.left, subImage.top, subImage.width(), subImage.height()); - WallpaperColors color = WallpaperColors.fromBitmap(colorImg); - colors.add(color); - } - return colors; - } - - @Override - public void onSurfaceCreated(SurfaceHolder holder) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(() -> { - Trace.beginSection("ImageWallpaper#onSurfaceCreated"); - mEglHelper.init(holder, needSupportWideColorGamut()); - mRenderer.onSurfaceCreated(); - Trace.endSection(); - }); - } - - @Override - public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(() -> mRenderer.onSurfaceChanged(width, height)); - } - - @Override - public void onSurfaceRedrawNeeded(SurfaceHolder holder) { - if (mWorker == null) return; - mWorker.getThreadHandler().post(this::drawFrame); - } - - private void drawFrame() { - Trace.beginSection("ImageWallpaper#drawFrame"); - preRender(); - requestRender(); - postRender(); - Trace.endSection(); - } - - public void preRender() { - // This method should only be invoked from worker thread. - Trace.beginSection("ImageWallpaper#preRender"); - preRenderInternal(); - Trace.endSection(); - } - - private void preRenderInternal() { - boolean contextRecreated = false; - Rect frame = getSurfaceHolder().getSurfaceFrame(); - cancelFinishRenderingTask(); - - // Check if we need to recreate egl context. - if (!mEglHelper.hasEglContext()) { - mEglHelper.destroyEglSurface(); - if (!mEglHelper.createEglContext()) { - Log.w(TAG, "recreate egl context failed!"); - } else { - contextRecreated = true; - } - } - - // Check if we need to recreate egl surface. - if (mEglHelper.hasEglContext() && !mEglHelper.hasEglSurface()) { - if (!mEglHelper.createEglSurface(getSurfaceHolder(), needSupportWideColorGamut())) { - Log.w(TAG, "recreate egl surface failed!"); - } - } - - // If we recreate egl context, notify renderer to setup again. - if (mEglHelper.hasEglContext() && mEglHelper.hasEglSurface() && contextRecreated) { - mRenderer.onSurfaceCreated(); - mRenderer.onSurfaceChanged(frame.width(), frame.height()); - } - } - - public void requestRender() { - // This method should only be invoked from worker thread. - Trace.beginSection("ImageWallpaper#requestRender"); - requestRenderInternal(); - Trace.endSection(); - } - - private void requestRenderInternal() { - Rect frame = getSurfaceHolder().getSurfaceFrame(); - boolean readyToRender = mEglHelper.hasEglContext() && mEglHelper.hasEglSurface() - && frame.width() > 0 && frame.height() > 0; - - if (readyToRender) { - mRenderer.onDrawFrame(); - if (!mEglHelper.swapBuffer()) { - Log.e(TAG, "drawFrame failed!"); - } - } else { - Log.e(TAG, "requestRender: not ready, has context=" + mEglHelper.hasEglContext() - + ", has surface=" + mEglHelper.hasEglSurface() - + ", frame=" + frame); - } - } - - public void postRender() { - // This method should only be invoked from worker thread. - scheduleFinishRendering(); - reportEngineShown(false /* waitForEngineShown */); - } - - private void cancelFinishRenderingTask() { - if (mWorker == null) return; - mWorker.getThreadHandler().removeCallbacks(mFinishRenderingTask); - } - - private void scheduleFinishRendering() { - if (mWorker == null) return; - cancelFinishRenderingTask(); - mWorker.getThreadHandler().postDelayed(mFinishRenderingTask, DELAY_FINISH_RENDERING); - } - - private void finishRendering() { - Trace.beginSection("ImageWallpaper#finishRendering"); - if (mEglHelper != null) { - mEglHelper.destroyEglSurface(); - mEglHelper.destroyEglContext(); - } - Trace.endSection(); - } - - private boolean needSupportWideColorGamut() { - return mRenderer.isWcgContent(); - } - - @Override - 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); - out.print(prefix); out.print("valid surface="); - out.println(getSurfaceHolder() != null && getSurfaceHolder().getSurface() != null - ? getSurfaceHolder().getSurface().isValid() - : "null"); - - out.print(prefix); out.print("surface frame="); - out.println(getSurfaceHolder() != null ? getSurfaceHolder().getSurfaceFrame() : "null"); - - mEglHelper.dump(prefix, fd, out, args); - mRenderer.dump(prefix, fd, out, args); - } - } - - class CanvasEngine extends WallpaperService.Engine implements DisplayListener { private WallpaperManager mWallpaperManager; private final WallpaperLocalColorExtractor mWallpaperLocalColorExtractor; @@ -736,13 +299,8 @@ public class ImageWallpaper extends WallpaperService { // be loaded, we will go into a cycle. Don't do a build where the // default wallpaper can't be loaded. Log.w(TAG, "Unable to load wallpaper!", exception); - try { - mWallpaperManager.clear(WallpaperManager.FLAG_SYSTEM); - } catch (IOException ex) { - // now we're really screwed. - Log.w(TAG, "Unable reset to default wallpaper!", ex); - } - + mWallpaperManager.clearWallpaper( + WallpaperManager.FLAG_SYSTEM, UserHandle.USER_CURRENT); try { bitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, false); } catch (RuntimeException | OutOfMemoryError e) { @@ -868,7 +426,6 @@ public class ImageWallpaper extends WallpaperService { mWallpaperLocalColorExtractor.setDisplayDimensions(window.width(), window.height()); } - @Override protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { super.dump(prefix, fd, out, args); diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java similarity index 99% rename from packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java rename to packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java index 6cac5c952b7cf..988fd710d2dc3 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java @@ -15,7 +15,7 @@ */ -package com.android.systemui.wallpapers.canvas; +package com.android.systemui.wallpapers; import android.app.WallpaperColors; import android.graphics.Bitmap; @@ -31,7 +31,6 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.util.Assert; -import com.android.systemui.wallpapers.ImageWallpaper; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java deleted file mode 100644 index f9ddce8e3b2ec..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.EGL14.EGL_ALPHA_SIZE; -import static android.opengl.EGL14.EGL_BLUE_SIZE; -import static android.opengl.EGL14.EGL_CONFIG_CAVEAT; -import static android.opengl.EGL14.EGL_CONTEXT_CLIENT_VERSION; -import static android.opengl.EGL14.EGL_DEFAULT_DISPLAY; -import static android.opengl.EGL14.EGL_DEPTH_SIZE; -import static android.opengl.EGL14.EGL_EXTENSIONS; -import static android.opengl.EGL14.EGL_GREEN_SIZE; -import static android.opengl.EGL14.EGL_NONE; -import static android.opengl.EGL14.EGL_NO_CONTEXT; -import static android.opengl.EGL14.EGL_NO_DISPLAY; -import static android.opengl.EGL14.EGL_NO_SURFACE; -import static android.opengl.EGL14.EGL_OPENGL_ES2_BIT; -import static android.opengl.EGL14.EGL_RED_SIZE; -import static android.opengl.EGL14.EGL_RENDERABLE_TYPE; -import static android.opengl.EGL14.EGL_STENCIL_SIZE; -import static android.opengl.EGL14.EGL_SUCCESS; -import static android.opengl.EGL14.eglChooseConfig; -import static android.opengl.EGL14.eglCreateContext; -import static android.opengl.EGL14.eglCreateWindowSurface; -import static android.opengl.EGL14.eglDestroyContext; -import static android.opengl.EGL14.eglDestroySurface; -import static android.opengl.EGL14.eglGetDisplay; -import static android.opengl.EGL14.eglGetError; -import static android.opengl.EGL14.eglInitialize; -import static android.opengl.EGL14.eglMakeCurrent; -import static android.opengl.EGL14.eglQueryString; -import static android.opengl.EGL14.eglSwapBuffers; -import static android.opengl.EGL14.eglTerminate; - -import android.opengl.EGLConfig; -import android.opengl.EGLContext; -import android.opengl.EGLDisplay; -import android.opengl.EGLSurface; -import android.opengl.GLUtils; -import android.text.TextUtils; -import android.util.Log; -import android.view.SurfaceHolder; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -/** - * A helper class to handle EGL management. - */ -public class EglHelper { - private static final String TAG = EglHelper.class.getSimpleName(); - private static final int OPENGLES_VERSION = 2; - // Below two constants make drawing at low priority, so other things can preempt our drawing. - private static final int EGL_CONTEXT_PRIORITY_LEVEL_IMG = 0x3100; - private static final int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103; - private static final boolean DEBUG = true; - - private static final int EGL_GL_COLORSPACE_KHR = 0x309D; - private static final int EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; - - private static final String EGL_IMG_CONTEXT_PRIORITY = "EGL_IMG_context_priority"; - - /** - * https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_gl_colorspace.txt - */ - private static final String KHR_GL_COLOR_SPACE = "EGL_KHR_gl_colorspace"; - - /** - * https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_gl_colorspace_display_p3_passthrough.txt - */ - private static final String EXT_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH = - "EGL_EXT_gl_colorspace_display_p3_passthrough"; - - private EGLDisplay mEglDisplay; - private EGLConfig mEglConfig; - private EGLContext mEglContext; - private EGLSurface mEglSurface; - private final int[] mEglVersion = new int[2]; - private boolean mEglReady; - private final Set mExts; - - public EglHelper() { - mExts = new HashSet<>(); - connectDisplay(); - } - - /** - * Initialize render context. - * @param surfaceHolder surface holder. - * @param wideColorGamut claim if a wcg surface is necessary. - * @return true if the render context is ready. - */ - public boolean init(SurfaceHolder surfaceHolder, boolean wideColorGamut) { - if (!hasEglDisplay() && !connectDisplay()) { - Log.w(TAG, "Can not connect display, abort!"); - return false; - } - - if (!eglInitialize(mEglDisplay, mEglVersion, 0 /* majorOffset */, - mEglVersion, 1 /* minorOffset */)) { - Log.w(TAG, "eglInitialize failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - mEglConfig = chooseEglConfig(); - if (mEglConfig == null) { - Log.w(TAG, "eglConfig not initialized!"); - return false; - } - - if (!createEglContext()) { - Log.w(TAG, "Can't create EGLContext!"); - return false; - } - - if (!createEglSurface(surfaceHolder, wideColorGamut)) { - Log.w(TAG, "Can't create EGLSurface!"); - return false; - } - - mEglReady = true; - return true; - } - - private boolean connectDisplay() { - mExts.clear(); - mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (!hasEglDisplay()) { - Log.w(TAG, "eglGetDisplay failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - String queryString = eglQueryString(mEglDisplay, EGL_EXTENSIONS); - if (!TextUtils.isEmpty(queryString)) { - Collections.addAll(mExts, queryString.split(" ")); - } - return true; - } - - boolean checkExtensionCapability(String extName) { - return mExts.contains(extName); - } - - int getWcgCapability() { - if (checkExtensionCapability(EXT_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH)) { - return EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT; - } - return 0; - } - - private EGLConfig chooseEglConfig() { - int[] configsCount = new int[1]; - EGLConfig[] configs = new EGLConfig[1]; - int[] configSpec = getConfig(); - if (!eglChooseConfig(mEglDisplay, configSpec, 0, configs, 0, 1, configsCount, 0)) { - Log.w(TAG, "eglChooseConfig failed: " + GLUtils.getEGLErrorString(eglGetError())); - return null; - } else { - if (configsCount[0] <= 0) { - Log.w(TAG, "eglChooseConfig failed, invalid configs count: " + configsCount[0]); - return null; - } else { - return configs[0]; - } - } - } - - private int[] getConfig() { - return new int[] { - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 0, - EGL_STENCIL_SIZE, 0, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_CONFIG_CAVEAT, EGL_NONE, - EGL_NONE - }; - } - - /** - * Prepare an EglSurface. - * @param surfaceHolder surface holder. - * @param wcg if need to support wcg. - * @return true if EglSurface is ready. - */ - public boolean createEglSurface(SurfaceHolder surfaceHolder, boolean wcg) { - if (DEBUG) { - Log.d(TAG, "createEglSurface start"); - } - - if (hasEglDisplay() && surfaceHolder.getSurface().isValid()) { - int[] attrs = null; - int wcgCapability = getWcgCapability(); - if (wcg && checkExtensionCapability(KHR_GL_COLOR_SPACE) && wcgCapability > 0) { - attrs = new int[] {EGL_GL_COLORSPACE_KHR, wcgCapability, EGL_NONE}; - } - mEglSurface = askCreatingEglWindowSurface(surfaceHolder, attrs, 0 /* offset */); - } else { - Log.w(TAG, "Create EglSurface failed: hasEglDisplay=" + hasEglDisplay() - + ", has valid surface=" + surfaceHolder.getSurface().isValid()); - return false; - } - - if (!hasEglSurface()) { - Log.w(TAG, "createWindowSurface failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) { - Log.w(TAG, "eglMakeCurrent failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (DEBUG) { - Log.d(TAG, "createEglSurface done"); - } - return true; - } - - EGLSurface askCreatingEglWindowSurface(SurfaceHolder holder, int[] attrs, int offset) { - return eglCreateWindowSurface(mEglDisplay, mEglConfig, holder, attrs, offset); - } - - /** - * Destroy EglSurface. - */ - public void destroyEglSurface() { - if (hasEglSurface()) { - eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - eglDestroySurface(mEglDisplay, mEglSurface); - mEglSurface = EGL_NO_SURFACE; - } - } - - /** - * Check if we have a valid EglSurface. - * @return true if EglSurface is ready. - */ - public boolean hasEglSurface() { - return mEglSurface != null && mEglSurface != EGL_NO_SURFACE; - } - - /** - * Prepare EglContext. - * @return true if EglContext is ready. - */ - public boolean createEglContext() { - if (DEBUG) { - Log.d(TAG, "createEglContext start"); - } - - int[] attrib_list = new int[5]; - int idx = 0; - attrib_list[idx++] = EGL_CONTEXT_CLIENT_VERSION; - attrib_list[idx++] = OPENGLES_VERSION; - if (checkExtensionCapability(EGL_IMG_CONTEXT_PRIORITY)) { - attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG; - attrib_list[idx++] = EGL_CONTEXT_PRIORITY_LOW_IMG; - } - attrib_list[idx] = EGL_NONE; - if (hasEglDisplay()) { - mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT, attrib_list, 0); - } else { - Log.w(TAG, "mEglDisplay is null"); - return false; - } - - if (!hasEglContext()) { - Log.w(TAG, "eglCreateContext failed: " + GLUtils.getEGLErrorString(eglGetError())); - return false; - } - - if (DEBUG) { - Log.d(TAG, "createEglContext done"); - } - return true; - } - - /** - * Destroy EglContext. - */ - public void destroyEglContext() { - if (hasEglContext()) { - eglDestroyContext(mEglDisplay, mEglContext); - mEglContext = EGL_NO_CONTEXT; - } - } - - /** - * Check if we have EglContext. - * @return true if EglContext is ready. - */ - public boolean hasEglContext() { - return mEglContext != null && mEglContext != EGL_NO_CONTEXT; - } - - /** - * Check if we have EglDisplay. - * @return true if EglDisplay is ready. - */ - public boolean hasEglDisplay() { - return mEglDisplay != null && mEglDisplay != EGL_NO_DISPLAY; - } - - /** - * Swap buffer to display. - * @return true if swap successfully. - */ - public boolean swapBuffer() { - boolean status = eglSwapBuffers(mEglDisplay, mEglSurface); - int error = eglGetError(); - if (error != EGL_SUCCESS) { - Log.w(TAG, "eglSwapBuffers failed: " + GLUtils.getEGLErrorString(error)); - } - return status; - } - - /** - * Destroy EglSurface and EglContext, then terminate EGL. - */ - public void finish() { - if (hasEglSurface()) { - destroyEglSurface(); - } - if (hasEglContext()) { - destroyEglContext(); - } - if (hasEglDisplay()) { - terminateEglDisplay(); - } - mEglReady = false; - } - - void terminateEglDisplay() { - eglTerminate(mEglDisplay); - mEglDisplay = EGL_NO_DISPLAY; - } - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - String eglVersion = mEglVersion[0] + "." + mEglVersion[1]; - out.print(prefix); out.print("EGL version="); out.print(eglVersion); - out.print(", "); out.print("EGL ready="); out.print(mEglReady); - out.print(", "); out.print("has EglContext="); out.print(hasEglContext()); - out.print(", "); out.print("has EglSurface="); out.println(hasEglSurface()); - - int[] configs = getConfig(); - StringBuilder sb = new StringBuilder(); - sb.append('{'); - for (int egl : configs) { - sb.append("0x").append(Integer.toHexString(egl)).append(","); - } - sb.setCharAt(sb.length() - 1, '}'); - out.print(prefix); out.print("EglConfig="); out.println(sb.toString()); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java deleted file mode 100644 index 692ced08f6137..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import android.util.Size; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * A renderer which is responsible for making OpenGL calls to render a frame. - */ -public interface GLWallpaperRenderer { - - /** - * Check if the content to render is a WCG content. - */ - boolean isWcgContent(); - - /** - * Called when the surface is created or recreated. - */ - void onSurfaceCreated(); - - /** - * Called when the surface changed size. - * @param width surface width. - * @param height surface height. - */ - void onSurfaceChanged(int width, int height); - - /** - * Called to draw the current frame. - */ - void onDrawFrame(); - - /** - * Ask renderer to report the surface size it needs. - */ - Size reportSurfaceSize(); - - /** - * Called when no need to render any more. - */ - void finish(); - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args); - -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java deleted file mode 100644 index d34eca4831dbd..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_FRAGMENT_SHADER; -import static android.opengl.GLES20.GL_VERTEX_SHADER; -import static android.opengl.GLES20.glAttachShader; -import static android.opengl.GLES20.glCompileShader; -import static android.opengl.GLES20.glCreateProgram; -import static android.opengl.GLES20.glCreateShader; -import static android.opengl.GLES20.glGetAttribLocation; -import static android.opengl.GLES20.glGetUniformLocation; -import static android.opengl.GLES20.glLinkProgram; -import static android.opengl.GLES20.glShaderSource; -import static android.opengl.GLES20.glUseProgram; - -import android.content.Context; -import android.content.res.Resources; -import android.util.Log; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * This class takes charge of linking shader codes and then return a handle for OpenGL ES program. - */ -class ImageGLProgram { - private static final String TAG = ImageGLProgram.class.getSimpleName(); - - private Context mContext; - private int mProgramHandle; - - ImageGLProgram(Context context) { - mContext = context.getApplicationContext(); - } - - private int loadShaderProgram(int vertexId, int fragmentId) { - final String vertexSrc = getShaderResource(vertexId); - final String fragmentSrc = getShaderResource(fragmentId); - final int vertexHandle = getShaderHandle(GL_VERTEX_SHADER, vertexSrc); - final int fragmentHandle = getShaderHandle(GL_FRAGMENT_SHADER, fragmentSrc); - return getProgramHandle(vertexHandle, fragmentHandle); - } - - private String getShaderResource(int shaderId) { - Resources res = mContext.getResources(); - StringBuilder code = new StringBuilder(); - - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(res.openRawResource(shaderId)))) { - String nextLine; - while ((nextLine = reader.readLine()) != null) { - code.append(nextLine).append("\n"); - } - } catch (IOException | Resources.NotFoundException ex) { - Log.d(TAG, "Can not read the shader source", ex); - code = null; - } - - return code == null ? "" : code.toString(); - } - - private int getShaderHandle(int type, String src) { - final int shader = glCreateShader(type); - if (shader == 0) { - Log.d(TAG, "Create shader failed, type=" + type); - return 0; - } - glShaderSource(shader, src); - glCompileShader(shader); - return shader; - } - - private int getProgramHandle(int vertexHandle, int fragmentHandle) { - final int program = glCreateProgram(); - if (program == 0) { - Log.d(TAG, "Can not create OpenGL ES program"); - return 0; - } - - glAttachShader(program, vertexHandle); - glAttachShader(program, fragmentHandle); - glLinkProgram(program); - return program; - } - - boolean useGLProgram(int vertexResId, int fragmentResId) { - mProgramHandle = loadShaderProgram(vertexResId, fragmentResId); - glUseProgram(mProgramHandle); - return true; - } - - int getAttributeHandle(String name) { - return glGetAttribLocation(mProgramHandle, name); - } - - int getUniformHandle(String name) { - return glGetUniformLocation(mProgramHandle, name); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java deleted file mode 100644 index f1659b9a8723b..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_FLOAT; -import static android.opengl.GLES20.GL_LINEAR; -import static android.opengl.GLES20.GL_TEXTURE0; -import static android.opengl.GLES20.GL_TEXTURE_2D; -import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER; -import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER; -import static android.opengl.GLES20.GL_TRIANGLES; -import static android.opengl.GLES20.glActiveTexture; -import static android.opengl.GLES20.glBindTexture; -import static android.opengl.GLES20.glDrawArrays; -import static android.opengl.GLES20.glEnableVertexAttribArray; -import static android.opengl.GLES20.glGenTextures; -import static android.opengl.GLES20.glTexParameteri; -import static android.opengl.GLES20.glUniform1i; -import static android.opengl.GLES20.glVertexAttribPointer; - -import android.graphics.Bitmap; -import android.opengl.GLUtils; -import android.util.Log; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; - -/** - * This class takes charge of the geometry data like vertices and texture coordinates. - * It delivers these data to opengl runtime and triggers draw calls if necessary. - */ -class ImageGLWallpaper { - private static final String TAG = ImageGLWallpaper.class.getSimpleName(); - - private static final String A_POSITION = "aPosition"; - private static final String A_TEXTURE_COORDINATES = "aTextureCoordinates"; - private static final String U_TEXTURE = "uTexture"; - private static final int POSITION_COMPONENT_COUNT = 2; - private static final int TEXTURE_COMPONENT_COUNT = 2; - private static final int BYTES_PER_FLOAT = 4; - - // Vertices to define the square with 2 triangles. - private static final float[] VERTICES = { - -1.0f, -1.0f, - +1.0f, -1.0f, - +1.0f, +1.0f, - +1.0f, +1.0f, - -1.0f, +1.0f, - -1.0f, -1.0f - }; - - // Texture coordinates that maps to vertices. - private static final float[] TEXTURES = { - 0f, 1f, - 1f, 1f, - 1f, 0f, - 1f, 0f, - 0f, 0f, - 0f, 1f - }; - - private final FloatBuffer mVertexBuffer; - private final FloatBuffer mTextureBuffer; - private final ImageGLProgram mProgram; - - private int mAttrPosition; - private int mAttrTextureCoordinates; - private int mUniTexture; - private int mTextureId; - - ImageGLWallpaper(ImageGLProgram program) { - mProgram = program; - - // Create an float array in opengles runtime (native) and put vertex data. - mVertexBuffer = ByteBuffer.allocateDirect(VERTICES.length * BYTES_PER_FLOAT) - .order(ByteOrder.nativeOrder()) - .asFloatBuffer(); - mVertexBuffer.put(VERTICES); - mVertexBuffer.position(0); - - // Create an float array in opengles runtime (native) and put texture data. - mTextureBuffer = ByteBuffer.allocateDirect(TEXTURES.length * BYTES_PER_FLOAT) - .order(ByteOrder.nativeOrder()) - .asFloatBuffer(); - mTextureBuffer.put(TEXTURES); - mTextureBuffer.position(0); - } - - void setup(Bitmap bitmap) { - setupAttributes(); - setupUniforms(); - setupTexture(bitmap); - } - - private void setupAttributes() { - mAttrPosition = mProgram.getAttributeHandle(A_POSITION); - mVertexBuffer.position(0); - glVertexAttribPointer(mAttrPosition, POSITION_COMPONENT_COUNT, GL_FLOAT, - false, 0, mVertexBuffer); - glEnableVertexAttribArray(mAttrPosition); - - mAttrTextureCoordinates = mProgram.getAttributeHandle(A_TEXTURE_COORDINATES); - mTextureBuffer.position(0); - glVertexAttribPointer(mAttrTextureCoordinates, TEXTURE_COMPONENT_COUNT, GL_FLOAT, - false, 0, mTextureBuffer); - glEnableVertexAttribArray(mAttrTextureCoordinates); - } - - private void setupUniforms() { - mUniTexture = mProgram.getUniformHandle(U_TEXTURE); - } - - void draw() { - glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2); - } - - private void setupTexture(Bitmap bitmap) { - final int[] tids = new int[1]; - - if (bitmap == null || bitmap.isRecycled()) { - Log.w(TAG, "setupTexture: invalid bitmap"); - return; - } - - // Generate one texture object and store the id in tids[0]. - glGenTextures(1, tids, 0); - if (tids[0] == 0) { - Log.w(TAG, "setupTexture: glGenTextures() failed"); - return; - } - - try { - // 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); - // Use bilinear texture filtering when minification. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - // Use bilinear texture filtering when magnification. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - mTextureId = tids[0]; - } catch (IllegalArgumentException e) { - Log.w(TAG, "Failed uploading texture: " + e.getLocalizedMessage()); - } - } - - void useTexture() { - // Set the active texture unit to texture unit 0. - glActiveTexture(GL_TEXTURE0); - // Bind the texture to this unit. - glBindTexture(GL_TEXTURE_2D, mTextureId); - // Let the texture sampler in fragment shader to read form this texture unit. - glUniform1i(mUniTexture, 0); - } - - /** - * Called to dump current state. - * @param prefix prefix. - * @param fd fd. - * @param out out. - * @param args args. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - } -} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java deleted file mode 100644 index e393786e29d97..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; -import static android.opengl.GLES20.glClear; -import static android.opengl.GLES20.glClearColor; -import static android.opengl.GLES20.glViewport; - -import android.app.WallpaperManager; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Rect; -import android.os.UserHandle; -import android.util.Log; -import android.util.Size; - -import com.android.systemui.R; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - -/** - * A GL renderer for image wallpaper. - */ -public class ImageWallpaperRenderer implements GLWallpaperRenderer { - private static final String TAG = ImageWallpaperRenderer.class.getSimpleName(); - private static final boolean DEBUG = false; - - private final ImageGLProgram mProgram; - private final ImageGLWallpaper mWallpaper; - private final Rect mSurfaceSize = new Rect(); - private final WallpaperTexture mTexture; - private Consumer mOnBitmapUpdated; - - public ImageWallpaperRenderer(Context context) { - final WallpaperManager wpm = context.getSystemService(WallpaperManager.class); - if (wpm == null) { - Log.w(TAG, "WallpaperManager not available"); - } - - mTexture = new WallpaperTexture(wpm); - mProgram = new ImageGLProgram(context); - mWallpaper = new ImageGLWallpaper(mProgram); - } - - /** - * @hide - */ - public void setOnBitmapChanged(Consumer c) { - mOnBitmapUpdated = c; - } - - /** - * @hide - */ - public void use(Consumer c) { - mTexture.use(c); - } - - @Override - public boolean isWcgContent() { - return mTexture.isWcgContent(); - } - - @Override - public void onSurfaceCreated() { - glClearColor(0f, 0f, 0f, 1.0f); - mProgram.useGLProgram( - R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader); - - mTexture.use(bitmap -> { - if (bitmap == null) { - Log.w(TAG, "reload texture failed!"); - } else if (mOnBitmapUpdated != null) { - mOnBitmapUpdated.accept(bitmap); - } - mWallpaper.setup(bitmap); - }); - } - - @Override - public void onSurfaceChanged(int width, int height) { - glViewport(0, 0, width, height); - } - - @Override - public void onDrawFrame() { - glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height()); - mWallpaper.useTexture(); - mWallpaper.draw(); - } - - @Override - public Size reportSurfaceSize() { - mSurfaceSize.set(mTexture.getTextureDimensions()); - return new Size(mSurfaceSize.width(), mSurfaceSize.height()); - } - - @Override - public void finish() { - } - - @Override - public void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { - out.print(prefix); out.print("mSurfaceSize="); out.print(mSurfaceSize); - out.print(prefix); out.print("mWcgContent="); out.print(isWcgContent()); - mWallpaper.dump(prefix, fd, out, args); - } - - static class WallpaperTexture { - private final AtomicInteger mRefCount; - private final Rect mDimensions; - private final WallpaperManager mWallpaperManager; - private Bitmap mBitmap; - private boolean mWcgContent; - private boolean mTextureUsed; - - private WallpaperTexture(WallpaperManager wallpaperManager) { - mWallpaperManager = wallpaperManager; - mRefCount = new AtomicInteger(); - mDimensions = new Rect(); - } - - public void use(Consumer consumer) { - mRefCount.incrementAndGet(); - synchronized (mRefCount) { - if (mBitmap == null) { - mBitmap = mWallpaperManager.getBitmapAsUser(UserHandle.USER_CURRENT, - false /* hardware */); - mWcgContent = mWallpaperManager.wallpaperSupportsWcg( - WallpaperManager.FLAG_SYSTEM); - mWallpaperManager.forgetLoadedWallpaper(); - if (mBitmap != null) { - mDimensions.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); - mTextureUsed = true; - } else { - Log.w(TAG, "Can't get bitmap"); - } - } - } - if (consumer != null) { - consumer.accept(mBitmap); - } - synchronized (mRefCount) { - final int count = mRefCount.decrementAndGet(); - if (count == 0 && mBitmap != null) { - if (DEBUG) { - Log.v(TAG, "WallpaperTexture: release 0x" + getHash() - + ", refCount=" + count); - } - mBitmap.recycle(); - mBitmap = null; - } - } - } - - private boolean isWcgContent() { - return mWcgContent; - } - - private String getHash() { - return mBitmap != null ? Integer.toHexString(mBitmap.hashCode()) : "null"; - } - - private Rect getTextureDimensions() { - if (!mTextureUsed) { - mDimensions.set(mWallpaperManager.peekBitmapDimensions()); - } - return mDimensions; - } - - @Override - public String toString() { - return "{" + getHash() + ", " + mRefCount.get() + "}"; - } - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java index 30dc0d20600f1..0fdcb95b3eedd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java @@ -19,15 +19,13 @@ package com.android.systemui.wallpapers; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -36,19 +34,13 @@ import static org.mockito.hamcrest.MockitoHamcrest.intThat; import android.app.WallpaperManager; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.ColorSpace; import android.graphics.Rect; import android.hardware.display.DisplayManager; -import android.hardware.display.DisplayManagerGlobal; -import android.os.Handler; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.Display; -import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceHolder; import android.view.WindowManager; @@ -57,28 +49,21 @@ import android.view.WindowMetrics; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; -import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.concurrent.CountDownLatch; - @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class ImageWallpaperTest extends SysuiTestCase { private static final int LOW_BMP_WIDTH = 128; private static final int LOW_BMP_HEIGHT = 128; - private static final int INVALID_BMP_WIDTH = 1; - private static final int INVALID_BMP_HEIGHT = 1; private static final int DISPLAY_WIDTH = 1920; private static final int DISPLAY_HEIGHT = 1080; @@ -99,19 +84,9 @@ public class ImageWallpaperTest extends SysuiTestCase { @Mock private Bitmap mWallpaperBitmap; - private int mBitmapWidth = 1; - private int mBitmapHeight = 1; - - @Mock - private Handler mHandler; - @Mock - private FeatureFlags mFeatureFlags; - FakeSystemClock mFakeSystemClock = new FakeSystemClock(); FakeExecutor mFakeBackgroundExecutor = new FakeExecutor(mFakeSystemClock); - private CountDownLatch mEventCountdown; - @Before public void setUp() throws Exception { allowTestableLooperAsMainThread(); @@ -131,12 +106,8 @@ public class ImageWallpaperTest extends SysuiTestCase { // set up bitmap when(mWallpaperBitmap.getColorSpace()).thenReturn(ColorSpace.get(ColorSpace.Named.SRGB)); when(mWallpaperBitmap.getConfig()).thenReturn(Bitmap.Config.ARGB_8888); - when(mWallpaperBitmap.getWidth()).thenReturn(mBitmapWidth); - when(mWallpaperBitmap.getHeight()).thenReturn(mBitmapHeight); // set up wallpaper manager - when(mWallpaperManager.peekBitmapDimensions()) - .thenReturn(new Rect(0, 0, mBitmapWidth, mBitmapHeight)); when(mWallpaperManager.getBitmapAsUser(eq(UserHandle.USER_CURRENT), anyBoolean())) .thenReturn(mWallpaperBitmap); when(mMockContext.getSystemService(WallpaperManager.class)).thenReturn(mWallpaperManager); @@ -144,104 +115,62 @@ public class ImageWallpaperTest extends SysuiTestCase { // set up surface when(mSurfaceHolder.getSurface()).thenReturn(mSurface); doNothing().when(mSurface).hwuiDestroy(); - - // TODO remove code below. Outdated, used in only in old GL tests (that are ignored) - Resources resources = mock(Resources.class); - when(resources.getConfiguration()).thenReturn(mock(Configuration.class)); - when(mMockContext.getResources()).thenReturn(resources); - DisplayInfo displayInfo = new DisplayInfo(); - displayInfo.logicalWidth = DISPLAY_WIDTH; - displayInfo.logicalHeight = DISPLAY_HEIGHT; - when(mMockContext.getDisplay()).thenReturn( - new Display(mock(DisplayManagerGlobal.class), 0, displayInfo, (Resources) null)); - } - - private void setBitmapDimensions(int bitmapWidth, int bitmapHeight) { - mBitmapWidth = bitmapWidth; - mBitmapHeight = bitmapHeight; - } - - private ImageWallpaper createImageWallpaper() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { - @Override - public Engine onCreateEngine() { - return new GLEngine(mHandler) { - @Override - public Context getDisplayContext() { - return mMockContext; - } - - @Override - public SurfaceHolder getSurfaceHolder() { - return mSurfaceHolder; - } - - @Override - public void setFixedSizeAllowed(boolean allowed) { - super.setFixedSizeAllowed(allowed); - assertWithMessage("mFixedSizeAllowed should be true").that( - allowed).isTrue(); - mEventCountdown.countDown(); - } - }; - } - }; } @Test - @Ignore public void testBitmapWallpaper_normal() { // Will use a image wallpaper with dimensions DISPLAY_WIDTH x DISPLAY_WIDTH. // Then we expect the surface size will be also DISPLAY_WIDTH x DISPLAY_WIDTH. - verifySurfaceSize(DISPLAY_WIDTH /* bmpWidth */, - DISPLAY_WIDTH /* bmpHeight */, - DISPLAY_WIDTH /* surfaceWidth */, - DISPLAY_WIDTH /* surfaceHeight */); + int bitmapSide = DISPLAY_WIDTH; + testSurfaceHelper( + bitmapSide /* bitmapWidth */, + bitmapSide /* bitmapHeight */, + bitmapSide /* expectedSurfaceWidth */, + bitmapSide /* expectedSurfaceHeight */); } @Test - @Ignore public void testBitmapWallpaper_low_resolution() { // Will use a image wallpaper with dimensions BMP_WIDTH x BMP_HEIGHT. // Then we expect the surface size will be also BMP_WIDTH x BMP_HEIGHT. - verifySurfaceSize(LOW_BMP_WIDTH /* bmpWidth */, - LOW_BMP_HEIGHT /* bmpHeight */, - LOW_BMP_WIDTH /* surfaceWidth */, - LOW_BMP_HEIGHT /* surfaceHeight */); + testSurfaceHelper(LOW_BMP_WIDTH /* bitmapWidth */, + LOW_BMP_HEIGHT /* bitmapHeight */, + LOW_BMP_WIDTH /* expectedSurfaceWidth */, + LOW_BMP_HEIGHT /* expectedSurfaceHeight */); } @Test - @Ignore public void testBitmapWallpaper_too_small() { - // Will use a image wallpaper with dimensions INVALID_BMP_WIDTH x INVALID_BMP_HEIGHT. - // Then we expect the surface size will be also MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT. - verifySurfaceSize(INVALID_BMP_WIDTH /* bmpWidth */, - INVALID_BMP_HEIGHT /* bmpHeight */, - ImageWallpaper.GLEngine.MIN_SURFACE_WIDTH /* surfaceWidth */, - ImageWallpaper.GLEngine.MIN_SURFACE_HEIGHT /* surfaceHeight */); + + // test that the surface is always at least MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT + testMinSurfaceHelper(8, 8); + testMinSurfaceHelper(100, 2000); + testMinSurfaceHelper(200, 1); } - private void verifySurfaceSize(int bmpWidth, int bmpHeight, - int surfaceWidth, int surfaceHeight) { - ImageWallpaper.GLEngine wallpaperEngine = - (ImageWallpaper.GLEngine) createImageWallpaper().onCreateEngine(); + @Test + public void testLoadDrawAndUnloadBitmap() { + setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT); - ImageWallpaper.GLEngine engineSpy = spy(wallpaperEngine); + ImageWallpaper.CanvasEngine spyEngine = getSpyEngine(); + spyEngine.onCreate(mSurfaceHolder); + spyEngine.onSurfaceRedrawNeeded(mSurfaceHolder); + assertThat(mFakeBackgroundExecutor.numPending()).isAtLeast(1); - setBitmapDimensions(bmpWidth, bmpHeight); + int n = 0; + while (mFakeBackgroundExecutor.numPending() >= 1) { + n++; + assertThat(n).isAtMost(10); + mFakeBackgroundExecutor.runNextReady(); + mFakeSystemClock.advanceTime(1000); + } - ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mMockContext); - doReturn(renderer).when(engineSpy).getRendererInstance(); - engineSpy.onCreate(engineSpy.getSurfaceHolder()); - - verify(mSurfaceHolder, times(1)).setFixedSize(surfaceWidth, surfaceHeight); - assertWithMessage("setFixedSizeAllowed should have been called.").that( - mEventCountdown.getCount()).isEqualTo(0); + verify(spyEngine, times(1)).drawFrameOnCanvas(mWallpaperBitmap); + assertThat(spyEngine.isBitmapLoaded()).isFalse(); } - - private ImageWallpaper createImageWallpaperCanvas() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { + private ImageWallpaper createImageWallpaper() { + return new ImageWallpaper(mFakeBackgroundExecutor) { @Override public Engine onCreateEngine() { return new CanvasEngine() { @@ -267,7 +196,7 @@ public class ImageWallpaperTest extends SysuiTestCase { } private ImageWallpaper.CanvasEngine getSpyEngine() { - ImageWallpaper imageWallpaper = createImageWallpaperCanvas(); + ImageWallpaper imageWallpaper = createImageWallpaper(); ImageWallpaper.CanvasEngine engine = (ImageWallpaper.CanvasEngine) imageWallpaper.onCreateEngine(); ImageWallpaper.CanvasEngine spyEngine = spy(engine); @@ -280,48 +209,32 @@ public class ImageWallpaperTest extends SysuiTestCase { return spyEngine; } - @Test - public void testMinSurface() { - - // test that the surface is always at least MIN_SURFACE_WIDTH x MIN_SURFACE_HEIGHT - testMinSurfaceHelper(8, 8); - testMinSurfaceHelper(100, 2000); - testMinSurfaceHelper(200, 1); + private void setBitmapDimensions(int bitmapWidth, int bitmapHeight) { + when(mWallpaperManager.peekBitmapDimensions()) + .thenReturn(new Rect(0, 0, bitmapWidth, bitmapHeight)); + when(mWallpaperBitmap.getWidth()).thenReturn(bitmapWidth); + when(mWallpaperBitmap.getHeight()).thenReturn(bitmapHeight); } private void testMinSurfaceHelper(int bitmapWidth, int bitmapHeight) { + testSurfaceHelper(bitmapWidth, bitmapHeight, + Math.max(ImageWallpaper.CanvasEngine.MIN_SURFACE_WIDTH, bitmapWidth), + Math.max(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT, bitmapHeight)); + } + + private void testSurfaceHelper(int bitmapWidth, int bitmapHeight, + int expectedSurfaceWidth, int expectedSurfaceHeight) { clearInvocations(mSurfaceHolder); setBitmapDimensions(bitmapWidth, bitmapHeight); - ImageWallpaper imageWallpaper = createImageWallpaperCanvas(); + ImageWallpaper imageWallpaper = createImageWallpaper(); ImageWallpaper.CanvasEngine engine = (ImageWallpaper.CanvasEngine) imageWallpaper.onCreateEngine(); engine.onCreate(mSurfaceHolder); verify(mSurfaceHolder, times(1)).setFixedSize( - intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_WIDTH)), - intThat(greaterThanOrEqualTo(ImageWallpaper.CanvasEngine.MIN_SURFACE_HEIGHT))); - } - - @Test - public void testLoadDrawAndUnloadBitmap() { - setBitmapDimensions(LOW_BMP_WIDTH, LOW_BMP_HEIGHT); - - ImageWallpaper.CanvasEngine spyEngine = getSpyEngine(); - spyEngine.onCreate(mSurfaceHolder); - spyEngine.onSurfaceRedrawNeeded(mSurfaceHolder); - assertThat(mFakeBackgroundExecutor.numPending()).isAtLeast(1); - - int n = 0; - while (mFakeBackgroundExecutor.numPending() >= 1) { - n++; - assertThat(n).isAtMost(10); - mFakeBackgroundExecutor.runNextReady(); - mFakeSystemClock.advanceTime(1000); - } - - verify(spyEngine, times(1)).drawFrameOnCanvas(mWallpaperBitmap); - assertThat(spyEngine.isBitmapLoaded()).isFalse(); + intThat(equalTo(expectedSurfaceWidth)), + intThat(equalTo(expectedSurfaceHeight))); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java similarity index 99% rename from packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java rename to packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java index 7e8ffeb7f9e1c..fc5f78228f2b3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.wallpapers.canvas; +package com.android.systemui.wallpapers; import static com.google.common.truth.Truth.assertThat; diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java deleted file mode 100644 index a42badeb228f6..0000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atMost; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.graphics.PixelFormat; -import android.testing.AndroidTestingRunner; -import android.view.Surface; -import android.view.SurfaceControl; -import android.view.SurfaceHolder; -import android.view.SurfaceSession; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@Ignore -public class EglHelperTest extends SysuiTestCase { - - @Spy - private EglHelper mEglHelper; - - @Mock - private SurfaceHolder mSurfaceHolder; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - prepareSurface(); - } - - @After - public void tearDown() { - mSurfaceHolder.getSurface().destroy(); - mSurfaceHolder = null; - } - - private void prepareSurface() { - final SurfaceSession session = new SurfaceSession(); - final SurfaceControl control = new SurfaceControl.Builder(session) - .setName("Test") - .setBufferSize(100, 100) - .setFormat(PixelFormat.RGB_888) - .build(); - final Surface surface = new Surface(); - surface.copyFrom(control); - when(mSurfaceHolder.getSurface()).thenReturn(surface); - assertThat(mSurfaceHolder.getSurface()).isNotNull(); - assertThat(mSurfaceHolder.getSurface().isValid()).isTrue(); - } - - @Test - public void testInit_normal() { - mEglHelper.init(mSurfaceHolder, false /* wideColorGamut */); - assertThat(mEglHelper.hasEglDisplay()).isTrue(); - assertThat(mEglHelper.hasEglContext()).isTrue(); - assertThat(mEglHelper.hasEglSurface()).isTrue(); - verify(mEglHelper).askCreatingEglWindowSurface( - any(SurfaceHolder.class), eq(null), anyInt()); - } - - @Test - public void testInit_wide_gamut() { - // In EglHelper, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; - doReturn(0x3490).when(mEglHelper).getWcgCapability(); - // In EglHelper, KHR_GL_COLOR_SPACE = "EGL_KHR_gl_colorspace"; - doReturn(true).when(mEglHelper).checkExtensionCapability("EGL_KHR_gl_colorspace"); - ArgumentCaptor ac = ArgumentCaptor.forClass(int[].class); - // {EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT, EGL_NONE} - final int[] expectedArgument = new int[] {0x309D, 0x3490, 0x3038}; - - mEglHelper.init(mSurfaceHolder, true /* wideColorGamut */); - verify(mEglHelper) - .askCreatingEglWindowSurface(any(SurfaceHolder.class), ac.capture(), anyInt()); - assertThat(ac.getValue()).isNotNull(); - assertThat(ac.getValue()).isEqualTo(expectedArgument); - } - - @Test - @Ignore - public void testFinish_shouldNotCrash() { - mEglHelper.terminateEglDisplay(); - assertThat(mEglHelper.hasEglDisplay()).isFalse(); - assertThat(mEglHelper.hasEglSurface()).isFalse(); - assertThat(mEglHelper.hasEglContext()).isFalse(); - - mEglHelper.finish(); - verify(mEglHelper, never()).destroyEglContext(); - verify(mEglHelper, never()).destroyEglSurface(); - verify(mEglHelper, atMost(1)).terminateEglDisplay(); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java deleted file mode 100644 index 89b2222df69e1..0000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.wallpapers.gl; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; - -import android.app.WallpaperManager; -import android.app.WallpaperManager.ColorManagementProxy; -import android.graphics.Bitmap; -import android.graphics.ColorSpace; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper(setAsMainLooper = true) -@Ignore -public class ImageWallpaperRendererTest extends SysuiTestCase { - - private WallpaperManager mWpmSpy; - - @Before - public void setUp() throws Exception { - final WallpaperManager wpm = mContext.getSystemService(WallpaperManager.class); - mWpmSpy = spy(wpm); - mContext.addMockSystemService(WallpaperManager.class, mWpmSpy); - } - - @Test - public void testWcgContent() throws IOException { - final Bitmap srgbBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); - final Bitmap p3Bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888, - false /* hasAlpha */, ColorSpace.get(ColorSpace.Named.DISPLAY_P3)); - - final ColorManagementProxy proxy = new ColorManagementProxy(mContext); - final ColorManagementProxy cmProxySpy = spy(proxy); - final Set supportedWideGamuts = new HashSet<>(); - supportedWideGamuts.add(ColorSpace.get(ColorSpace.Named.DISPLAY_P3)); - - try { - doReturn(true).when(mWpmSpy).shouldEnableWideColorGamut(); - doReturn(cmProxySpy).when(mWpmSpy).getColorManagementProxy(); - doReturn(supportedWideGamuts).when(cmProxySpy).getSupportedColorSpaces(); - - mWpmSpy.setBitmap(p3Bitmap); - ImageWallpaperRenderer rendererP3 = new ImageWallpaperRenderer(mContext); - rendererP3.reportSurfaceSize(); - assertThat(rendererP3.isWcgContent()).isTrue(); - - mWpmSpy.setBitmap(srgbBitmap); - ImageWallpaperRenderer renderer = new ImageWallpaperRenderer(mContext); - assertThat(renderer.isWcgContent()).isFalse(); - } finally { - srgbBitmap.recycle(); - p3Bitmap.recycle(); - } - } - -}