Create plumbing for disabling force-dark
Test: sysui's rounded corners are no longer white
Bug: 102591313
Change-Id: Id99ae38c354cef06b94a5fb79b5b1a9a216a514c
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index fcea0c3..982e5c2 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -843,6 +843,32 @@
return nGetDebugSize(mNativeRenderNode);
}
+ /**
+ * Sets whether or not to allow force dark to apply to this RenderNode.
+ *
+ * Setting this to false will disable the auto-dark feature on everything this RenderNode
+ * draws, including any descendants.
+ *
+ * Setting this to true will allow this RenderNode to be automatically made dark, however
+ * a value of 'true' will not override any 'false' value in its parent chain nor will
+ * it prevent any 'false' in any of its children.
+ *
+ * @param allow Whether or not to allow force dark.
+ * @return true If the value has changed, false otherwise.
+ */
+ public boolean setAllowForceDark(boolean allow) {
+ return nSetAllowForceDark(mNativeRenderNode, allow);
+ }
+
+ /**
+ * See {@link #setAllowForceDark(boolean)}
+ *
+ * @return true if force dark is allowed (default), false if it is disabled
+ */
+ public boolean getAllowForceDark() {
+ return nGetAllowForceDark(mNativeRenderNode);
+ }
+
///////////////////////////////////////////////////////////////////////////
// Animations
///////////////////////////////////////////////////////////////////////////
@@ -1043,4 +1069,8 @@
private static native int nGetWidth(long renderNode);
@CriticalNative
private static native int nGetHeight(long renderNode);
+ @CriticalNative
+ private static native boolean nSetAllowForceDark(long renderNode, boolean allowForceDark);
+ @CriticalNative
+ private static native boolean nGetAllowForceDark(long renderNode);
}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 427f570..6fb1bba 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -895,6 +895,7 @@
HwuiContext(boolean isWideColorGamut) {
mRenderNode = RenderNode.create("HwuiCanvas", null);
mRenderNode.setClipToBounds(false);
+ mRenderNode.setAllowForceDark(false);
mIsWideColorGamut = isWideColorGamut;
mHwuiRenderer = nHwuiCreate(mRenderNode.mNativeRenderNode, mNativeObject,
isWideColorGamut);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 19e3f7f62..f4be9f2 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -15246,6 +15246,40 @@
}
/**
+ * Sets whether or not to allow force dark to apply to this view.
+ *
+ * Setting this to false will disable the auto-dark feature on everything this view
+ * draws, including any descendants.
+ *
+ * Setting this to true will allow this view to be automatically made dark, however
+ * a value of 'true' will not override any 'false' value in its parent chain nor will
+ * it prevent any 'false' in any of its children.
+ *
+ * @param allow Whether or not to allow force dark.
+ *
+ * @hide
+ */
+ public void setAllowForceDark(boolean allow) {
+ if (mRenderNode.setAllowForceDark(allow)) {
+ // Currently toggling force-dark requires a new display list push to apply
+ // TODO: Make it not clobber the display list so this is just a damageSelf() instead
+ invalidate();
+ }
+ }
+
+ /**
+ * See {@link #setAllowForceDark(boolean)}
+ *
+ * @return true if force dark is allowed (default), false if it is disabled
+ *
+ * @hide
+ */
+ @ViewDebug.ExportedProperty(category = "drawing")
+ public boolean getAllowForceDark() {
+ return mRenderNode.getAllowForceDark();
+ }
+
+ /**
* Top position of this view relative to its parent.
*
* @return The top of this view, in pixels.
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 46b19bd..0701f3e 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -444,6 +444,14 @@
return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getHeight();
}
+static jboolean android_view_RenderNode_setAllowForceDark(jlong renderNodePtr, jboolean allow) {
+ return SET_AND_DIRTY(setAllowForceDark, allow, RenderNode::GENERIC);
+}
+
+static jboolean android_view_RenderNode_getAllowForceDark(jlong renderNodePtr) {
+ return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getAllowForceDark();
+}
+
// ----------------------------------------------------------------------------
// RenderProperties - Animations
// ----------------------------------------------------------------------------
@@ -664,6 +672,8 @@
{ "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
{ "nGetWidth", "(J)I", (void*) android_view_RenderNode_getWidth },
{ "nGetHeight", "(J)I", (void*) android_view_RenderNode_getHeight },
+ { "nSetAllowForceDark", "(JZ)Z", (void*) android_view_RenderNode_setAllowForceDark },
+ { "nGetAllowForceDark", "(J)Z", (void*) android_view_RenderNode_getAllowForceDark },
};
int register_android_view_RenderNode(JNIEnv* env) {
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index cea6c1c..9cbbf4e 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -1253,6 +1253,7 @@
final RenderNode node = RenderNode.create("BitmapTemporary", null);
node.setLeftTopRightBottom(0, 0, width, height);
node.setClipToBounds(false);
+ node.setAllowForceDark(false);
final DisplayListCanvas canvas = node.start(width, height);
if (source.getWidth() != width || source.getHeight() != height) {
canvas.scale(width / (float) source.getWidth(),
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 26e5cea..9cfaa6a 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -112,7 +112,9 @@
LOG_ALWAYS_FATAL_IF(!info.damageAccumulator, "DamageAccumulator missing");
MarkAndSweepRemoved observer(&info);
+ const int before = info.disableForceDark;
prepareTreeImpl(observer, info, false);
+ LOG_ALWAYS_FATAL_IF(before != info.disableForceDark, "Mis-matched force dark");
}
void RenderNode::addAnimator(const sp<BaseRenderNodeAnimator>& animator) {
@@ -195,6 +197,11 @@
if (info.mode == TreeInfo::MODE_FULL) {
pushStagingPropertiesChanges(info);
}
+
+ if (!mProperties.getAllowForceDark()) {
+ info.disableForceDark++;
+ }
+
uint32_t animatorDirtyMask = 0;
if (CC_LIKELY(info.runAnimations)) {
animatorDirtyMask = mAnimatorManager.animate(info);
@@ -232,6 +239,9 @@
}
pushLayerUpdate(info);
+ if (!mProperties.getAllowForceDark()) {
+ info.disableForceDark--;
+ }
info.damageAccumulator->popTransform();
}
@@ -273,7 +283,7 @@
if (mDisplayList) {
mDisplayList->syncContents();
- if (CC_UNLIKELY(Properties::forceDarkMode)) {
+ if (CC_UNLIKELY(info && !info->disableForceDark)) {
auto usage = usageHint();
if (mDisplayList->hasText()) {
usage = UsageHint::Foreground;
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 7966845..04379ae 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -535,6 +535,14 @@
return CC_UNLIKELY(promotedToLayer()) ? LayerType::RenderLayer : mLayerProperties.mType;
}
+ bool setAllowForceDark(bool allow) {
+ return RP_SET(mPrimitiveFields.mAllowForceDark, allow);
+ }
+
+ bool getAllowForceDark() const {
+ return mPrimitiveFields.mAllowForceDark;
+ }
+
private:
// Rendering properties
struct PrimitiveFields {
@@ -554,6 +562,7 @@
bool mMatrixOrPivotDirty = false;
bool mProjectBackwards = false;
bool mProjectionReceiver = false;
+ bool mAllowForceDark = true;
Rect mClipBounds;
Outline mOutline;
RevealClip mRevealClip;
diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h
index f2766d6..caa5762 100644
--- a/libs/hwui/TreeInfo.h
+++ b/libs/hwui/TreeInfo.h
@@ -17,6 +17,7 @@
#pragma once
#include "utils/Macros.h"
+#include "Properties.h"
#include <utils/Timers.h>
@@ -93,6 +94,8 @@
bool updateWindowPositions = false;
+ int disableForceDark = Properties::forceDarkMode ? 0 : 1;
+
struct Out {
bool hasFunctors = false;
// This is only updated if evaluateAnimations is true
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 044cc5c..48181bc 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -187,9 +187,11 @@
mOverlay.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
mOverlay.setAlpha(0);
+ mOverlay.setAllowForceDark(false);
mBottomOverlay.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
mBottomOverlay.setAlpha(0);
+ mBottomOverlay.setAllowForceDark(false);
updateViews();