diff options
author | 2023-10-31 02:01:06 +0000 | |
---|---|---|
committer | 2023-11-07 22:48:57 +0000 | |
commit | 417accdcaac72dffce9039c971cb867fcf279653 (patch) | |
tree | cf9fb964f30abf7972b8584bd0d5ccdaa185b8cf | |
parent | 10614f6487059a631cda474e820a6e6ff33e208d (diff) |
refactor(force invert): use enum/intdef for force dark type in setForceDark() functions
This allows the RenderNode to differentiate between normal force dark
and force force-dark (force invert color). In the next CL we will treat
force invert slightly differently, not allowing devs to opt-out of force
dark in individual Views/RenderNodes.
This also sets us up to specify a "force light" mode for force invert,
if we ever need it.
Bug: 282821643
Test: atest ViewRootImplTest
Change-Id: I8cc0fe099cccabdd09ea072aca1e70527e91e1a8
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 9 | ||||
-rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 10 | ||||
-rw-r--r-- | graphics/java/android/graphics/ForceDarkType.java | 60 | ||||
-rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 12 | ||||
-rw-r--r-- | libs/hwui/TreeInfo.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 11 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 9 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 3 | ||||
-rw-r--r-- | libs/hwui/utils/ForceDark.h | 34 |
10 files changed, 126 insertions, 28 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index c9c1f20d2f37..d97dfb0f9c94 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -123,6 +123,7 @@ import android.content.res.TypedArray; import android.graphics.BLASTBufferQueue; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ForceDarkType; import android.graphics.FrameInfo; import android.graphics.HardwareRenderer; import android.graphics.HardwareRenderer.FrameDrawingCallback; @@ -1796,7 +1797,7 @@ public final class ViewRootImpl implements ViewParent, /** Returns true if force dark should be enabled according to various settings */ @VisibleForTesting - public boolean isForceDarkEnabled() { + public @ForceDarkType.ForceDarkTypeDef int determineForceDarkType() { if (forceInvertColor()) { boolean isForceInvertEnabled = Settings.Secure.getIntForUser( mContext.getContentResolver(), @@ -1808,7 +1809,7 @@ public final class ViewRootImpl implements ViewParent, // for dark mode in configuration.uiMode. Instead, we assume that the force invert // setting will be enabled at the same time dark theme is in the Settings app. if (isForceInvertEnabled) { - return true; + return ForceDarkType.FORCE_INVERT_COLOR_DARK; } } @@ -1822,12 +1823,12 @@ public final class ViewRootImpl implements ViewParent, && a.getBoolean(R.styleable.Theme_forceDarkAllowed, forceDarkAllowedDefault); a.recycle(); } - return useAutoDark; + return useAutoDark ? ForceDarkType.FORCE_DARK : ForceDarkType.NONE; } private void updateForceDarkMode() { if (mAttachInfo.mThreadedRenderer == null) return; - if (mAttachInfo.mThreadedRenderer.setForceDark(isForceDarkEnabled())) { + if (mAttachInfo.mThreadedRenderer.setForceDark(determineForceDarkType())) { // TODO: Don't require regenerating all display lists to apply this setting invalidateWorld(mView); } diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java index e7117a7da0e9..dfe6cf81813d 100644 --- a/core/tests/coretests/src/android/view/ViewRootImplTest.java +++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java @@ -49,6 +49,7 @@ import static org.junit.Assume.assumeTrue; import android.app.Instrumentation; import android.app.UiModeManager; import android.content.Context; +import android.graphics.ForceDarkType; import android.hardware.display.DisplayManagerGlobal; import android.os.Binder; import android.os.SystemProperties; @@ -593,7 +594,7 @@ public class ViewRootImplTest { mViewRootImpl.updateConfiguration(sContext.getDisplayNoVerify().getDisplayId()) ); - assertThat(mViewRootImpl.isForceDarkEnabled()).isFalse(); + assertThat(mViewRootImpl.determineForceDarkType()).isEqualTo(ForceDarkType.NONE); } @Test @@ -613,7 +614,8 @@ public class ViewRootImplTest { mViewRootImpl.updateConfiguration(sContext.getDisplayNoVerify().getDisplayId()) ); - assertThat(mViewRootImpl.isForceDarkEnabled()).isTrue(); + assertThat(mViewRootImpl.determineForceDarkType()) + .isEqualTo(ForceDarkType.FORCE_INVERT_COLOR_DARK); } @Test @@ -634,7 +636,7 @@ public class ViewRootImplTest { mViewRootImpl.updateConfiguration(sContext.getDisplayNoVerify().getDisplayId()) ); - assertThat(mViewRootImpl.isForceDarkEnabled()).isFalse(); + assertThat(mViewRootImpl.determineForceDarkType()).isEqualTo(ForceDarkType.NONE); } @Test @@ -654,7 +656,7 @@ public class ViewRootImplTest { mViewRootImpl.updateConfiguration(sContext.getDisplayNoVerify().getDisplayId()) ); - assertThat(mViewRootImpl.isForceDarkEnabled()).isTrue(); + assertThat(mViewRootImpl.determineForceDarkType()).isEqualTo(ForceDarkType.FORCE_DARK); } private boolean setForceDarkSysProp(boolean isForceDarkEnabled) { diff --git a/graphics/java/android/graphics/ForceDarkType.java b/graphics/java/android/graphics/ForceDarkType.java new file mode 100644 index 000000000000..396b03703bb9 --- /dev/null +++ b/graphics/java/android/graphics/ForceDarkType.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 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 android.graphics; + +import android.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * The style of force dark to use in {@link HardwareRenderer}. + * + * You must keep this in sync with the C++ enum ForceDarkType in + * frameworks/base/libs/hwui/utils/ForceDark.h + * + * @hide + */ +public class ForceDarkType { + /** + * Force dark disabled: normal, default operation. + * + * @hide + */ + public static final int NONE = 0; + + /** + * Use force dark + * @hide + */ + public static final int FORCE_DARK = 1; + + /** + * Force force-dark. {@see Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED} + * @hide */ + public static final int FORCE_INVERT_COLOR_DARK = 2; + + /** @hide */ + @IntDef({ + NONE, + FORCE_DARK, + FORCE_INVERT_COLOR_DARK, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ForceDarkTypeDef {} + +} diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index 8cd262e783d8..20e393eaee6d 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -182,7 +182,7 @@ public class HardwareRenderer { /** @hide */ protected RenderNode mRootNode; private boolean mOpaque = true; - private boolean mForceDark = false; + private int mForceDark = ForceDarkType.NONE; private @ActivityInfo.ColorMode int mColorMode = ActivityInfo.COLOR_MODE_DEFAULT; private float mDesiredSdrHdrRatio = 1f; @@ -571,10 +571,10 @@ public class HardwareRenderer { * Whether or not the force-dark feature should be used for this renderer. * @hide */ - public boolean setForceDark(boolean enable) { - if (mForceDark != enable) { - mForceDark = enable; - nSetForceDark(mNativeProxy, enable); + public boolean setForceDark(@ForceDarkType.ForceDarkTypeDef int type) { + if (mForceDark != type) { + mForceDark = type; + nSetForceDark(mNativeProxy, type); return true; } return false; @@ -1597,7 +1597,7 @@ public class HardwareRenderer { private static native void nAllocateBuffers(long nativeProxy); - private static native void nSetForceDark(long nativeProxy, boolean enabled); + private static native void nSetForceDark(long nativeProxy, int type); private static native void nSetDisplayDensityDpi(int densityDpi); diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp index 750f869e2551..a3b02d825e02 100644 --- a/libs/hwui/TreeInfo.cpp +++ b/libs/hwui/TreeInfo.cpp @@ -24,7 +24,7 @@ TreeInfo::TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContex : mode(mode) , prepareTextures(mode == MODE_FULL) , canvasContext(canvasContext) - , disableForceDark(canvasContext.useForceDark() ? 0 : 1) + , disableForceDark(canvasContext.getForceDarkType() == ForceDarkType::NONE ? 1 : 0) , screenSize(canvasContext.getNextFrameSize()) {} } // namespace android::uirenderer diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 422ffeaecfd0..d15b1680de94 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -35,6 +35,7 @@ #include <gui/TraceUtils.h> #include <include/encode/SkPngEncoder.h> #include <inttypes.h> +#include <log/log.h> #include <media/NdkImage.h> #include <media/NdkImageReader.h> #include <nativehelper/JNIPlatformHelp.h> @@ -53,11 +54,11 @@ #include <algorithm> #include <atomic> -#include <log/log.h> #include <vector> #include "JvmErrorReporter.h" #include "android_graphics_HardwareRendererObserver.h" +#include "utils/ForceDark.h" namespace android { @@ -824,10 +825,10 @@ static void android_view_ThreadedRenderer_allocateBuffers(JNIEnv* env, jobject c proxy->allocateBuffers(); } -static void android_view_ThreadedRenderer_setForceDark(JNIEnv* env, jobject clazz, - jlong proxyPtr, jboolean enable) { +static void android_view_ThreadedRenderer_setForceDark(JNIEnv* env, jobject clazz, jlong proxyPtr, + jint type) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); - proxy->setForceDark(enable); + proxy->setForceDark(static_cast<ForceDarkType>(type)); } static void android_view_ThreadedRenderer_preload(JNIEnv*, jclass) { @@ -1016,7 +1017,7 @@ static const JNINativeMethod gMethods[] = { {"nSetIsolatedProcess", "(Z)V", (void*)android_view_ThreadedRenderer_setIsolatedProcess}, {"nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority}, {"nAllocateBuffers", "(J)V", (void*)android_view_ThreadedRenderer_allocateBuffers}, - {"nSetForceDark", "(JZ)V", (void*)android_view_ThreadedRenderer_setForceDark}, + {"nSetForceDark", "(JI)V", (void*)android_view_ThreadedRenderer_setForceDark}, {"nSetDisplayDensityDpi", "(I)V", (void*)android_view_ThreadedRenderer_setDisplayDensityDpi}, {"nInitDisplayInfo", "(IIFIJJZZ)V", (void*)android_view_ThreadedRenderer_initDisplayInfo}, diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 37e4f7ecca54..be9b649030ae 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -46,6 +46,7 @@ #include "renderstate/RenderState.h" #include "renderthread/RenderTask.h" #include "renderthread/RenderThread.h" +#include "utils/ForceDark.h" #include "utils/RingBuffer.h" namespace android { @@ -194,11 +195,9 @@ public: mRenderPipeline->setPictureCapturedCallback(callback); } - void setForceDark(bool enable) { mUseForceDark = enable; } + void setForceDark(ForceDarkType type) { mForceDarkType = type; } - bool useForceDark() { - return mUseForceDark; - } + ForceDarkType getForceDarkType() { return mForceDarkType; } SkISize getNextFrameSize() const; @@ -321,7 +320,7 @@ private: nsecs_t mLastDropVsync = 0; bool mOpaque; - bool mUseForceDark = false; + ForceDarkType mForceDarkType = ForceDarkType::NONE; LightInfo mLightInfo; LightGeometry mLightGeometry = {{0, 0, 0}, 0}; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index be163bad77a7..c3c136feef69 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -417,8 +417,8 @@ void RenderProxy::removeFrameMetricsObserver(FrameMetricsObserver* observerPtr) }); } -void RenderProxy::setForceDark(bool enable) { - mRenderThread.queue().post([this, enable]() { mContext->setForceDark(enable); }); +void RenderProxy::setForceDark(ForceDarkType type) { + mRenderThread.queue().post([this, type]() { mContext->setForceDark(type); }); } void RenderProxy::copySurfaceInto(ANativeWindow* window, std::shared_ptr<CopyRequest>&& request) { diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 47c1b0cd28e5..f2d8e94c7bd2 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -31,6 +31,7 @@ #include "DrawFrameTask.h" #include "SwapBehavior.h" #include "hwui/Bitmap.h" +#include "utils/ForceDark.h" class SkBitmap; class SkPicture; @@ -142,7 +143,7 @@ public: void addFrameMetricsObserver(FrameMetricsObserver* observer); void removeFrameMetricsObserver(FrameMetricsObserver* observer); - void setForceDark(bool enable); + void setForceDark(ForceDarkType type); static void copySurfaceInto(ANativeWindow* window, std::shared_ptr<CopyRequest>&& request); static void prepareToDraw(Bitmap& bitmap); diff --git a/libs/hwui/utils/ForceDark.h b/libs/hwui/utils/ForceDark.h new file mode 100644 index 000000000000..28538c4b7a7b --- /dev/null +++ b/libs/hwui/utils/ForceDark.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 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. + */ + +#ifndef FORCEDARKUTILS_H +#define FORCEDARKUTILS_H + +namespace android { +namespace uirenderer { + +/** + * The type of force dark set on the renderer, if any. + * + * This should stay in sync with the java @IntDef in + * frameworks/base/graphics/java/android/graphics/ForceDarkType.java + */ +enum class ForceDarkType : __uint8_t { NONE = 0, FORCE_DARK = 1, FORCE_INVERT_COLOR_DARK = 2 }; + +} /* namespace uirenderer */ +} /* namespace android */ + +#endif // FORCEDARKUTILS_H
\ No newline at end of file |