Skip to content

Commit d16f0ba

Browse files
Bartlomiej Bloniarzmeta-codesync[bot]
authored andcommitted
Add enableImageTransparentTintColor feature flag (#57607)
Summary: Pull Request resolved: #57607 Adds the `enableImageTransparentTintColor` experiment flag (default off) that gates whether a defined transparent Image `tintColor` (alpha 0) is applied as a real tint (rendering the image invisible) or treated as unassigned/untinted. Config entry plus regenerated accessors only — no behavior change. ## Changelog: [General] [Added] - Add `enableImageTransparentTintColor` feature flag Reviewed By: lenaic Differential Revision: D112572558
1 parent 454bf17 commit d16f0ba

20 files changed

Lines changed: 194 additions & 77 deletions

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<2544e292c44dabe82ad82a9b08a08f08>>
7+
* @generated SignedSource<<2fc347cdb33327437d29e5fd91e24011>>
88
*/
99

1010
/**
@@ -204,6 +204,12 @@ public object ReactNativeFeatureFlags {
204204
@JvmStatic
205205
public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid()
206206

207+
/**
208+
* When enabled, Image `tintColor` is handled as a true optional: any defined color is applied as a tint — including `transparent` (alpha 0), which renders the image invisible — and an unset value clears a previously applied tint. When disabled, the prior behavior is preserved, where a transparent `tintColor` is treated as unassigned and the image renders untinted.
209+
*/
210+
@JvmStatic
211+
public fun enableImageTransparentTintColor(): Boolean = accessor.enableImageTransparentTintColor()
212+
207213
/**
208214
* Dispatches state updates for content offset changes synchronously on the main thread.
209215
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<3331513151f7b17e3902cceb65aaac1e>>
7+
* @generated SignedSource<<a506d2515fce404e19bd61099cc60117>>
88
*/
99

1010
/**
@@ -49,6 +49,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
4949
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
5050
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5151
private var enableImagePrefetchingAndroidCache: Boolean? = null
52+
private var enableImageTransparentTintColorCache: Boolean? = null
5253
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5354
private var enableImperativeFocusCache: Boolean? = null
5455
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -368,6 +369,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
368369
return cached
369370
}
370371

372+
override fun enableImageTransparentTintColor(): Boolean {
373+
var cached = enableImageTransparentTintColorCache
374+
if (cached == null) {
375+
cached = ReactNativeFeatureFlagsCxxInterop.enableImageTransparentTintColor()
376+
enableImageTransparentTintColorCache = cached
377+
}
378+
return cached
379+
}
380+
371381
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
372382
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
373383
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<71e1be630ee2897f3546ccb23db60197>>
7+
* @generated SignedSource<<1ef72233f02973021b83bd2e2aa1f69b>>
88
*/
99

1010
/**
@@ -86,6 +86,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
8686

8787
@DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean
8888

89+
@DoNotStrip @JvmStatic public external fun enableImageTransparentTintColor(): Boolean
90+
8991
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
9092

9193
@DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<cdb20f0cac81beea272ca5de1c200e98>>
7+
* @generated SignedSource<<eb9958ddc04dd1cd8d1add366f5f7741>>
88
*/
99

1010
/**
@@ -81,6 +81,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
8181

8282
override fun enableImagePrefetchingAndroid(): Boolean = false
8383

84+
override fun enableImageTransparentTintColor(): Boolean = false
85+
8486
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8587

8688
override fun enableImperativeFocus(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<1a62a0c778f72aa89ef4acea182f17c8>>
7+
* @generated SignedSource<<9ae32c46a5a6310ef96eb91c9ea5b12e>>
88
*/
99

1010
/**
@@ -53,6 +53,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
5353
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
5454
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5555
private var enableImagePrefetchingAndroidCache: Boolean? = null
56+
private var enableImageTransparentTintColorCache: Boolean? = null
5657
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5758
private var enableImperativeFocusCache: Boolean? = null
5859
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -401,6 +402,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
401402
return cached
402403
}
403404

405+
override fun enableImageTransparentTintColor(): Boolean {
406+
var cached = enableImageTransparentTintColorCache
407+
if (cached == null) {
408+
cached = currentProvider.enableImageTransparentTintColor()
409+
accessedFeatureFlags.add("enableImageTransparentTintColor")
410+
enableImageTransparentTintColorCache = cached
411+
}
412+
return cached
413+
}
414+
404415
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
405416
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
406417
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<3caf8a7b3aea3b40ff888e5f7f81e90d>>
7+
* @generated SignedSource<<1a1d47f2d85404c776e55db40f7dbc6e>>
88
*/
99

1010
/**
@@ -81,6 +81,8 @@ public interface ReactNativeFeatureFlagsProvider {
8181

8282
@DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean
8383

84+
@DoNotStrip public fun enableImageTransparentTintColor(): Boolean
85+
8486
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8587

8688
@DoNotStrip public fun enableImperativeFocus(): Boolean

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<1e6921044c4f10ecc5a5263b671772a2>>
7+
* @generated SignedSource<<28de1e205f30135e96d5cb94a902faec>>
88
*/
99

1010
/**
@@ -213,6 +213,12 @@ class ReactNativeFeatureFlagsJavaProvider
213213
return method(javaProvider_);
214214
}
215215

216+
bool enableImageTransparentTintColor() override {
217+
static const auto method =
218+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImageTransparentTintColor");
219+
return method(javaProvider_);
220+
}
221+
216222
bool enableImmediateUpdateModeForContentOffsetChanges() override {
217223
static const auto method =
218224
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateModeForContentOffsetChanges");
@@ -704,6 +710,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
704710
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
705711
}
706712

713+
bool JReactNativeFeatureFlagsCxxInterop::enableImageTransparentTintColor(
714+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
715+
return ReactNativeFeatureFlags::enableImageTransparentTintColor();
716+
}
717+
707718
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
708719
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
709720
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1107,6 +1118,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11071118
makeNativeMethod(
11081119
"enableImagePrefetchingAndroid",
11091120
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
1121+
makeNativeMethod(
1122+
"enableImageTransparentTintColor",
1123+
JReactNativeFeatureFlagsCxxInterop::enableImageTransparentTintColor),
11101124
makeNativeMethod(
11111125
"enableImmediateUpdateModeForContentOffsetChanges",
11121126
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<28884240a4d0cedf7e1ecfaf34378f8e>>
7+
* @generated SignedSource<<535898dd9498c65f30d56122c06b408b>>
88
*/
99

1010
/**
@@ -117,6 +117,9 @@ class JReactNativeFeatureFlagsCxxInterop
117117
static bool enableImagePrefetchingAndroid(
118118
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
119119

120+
static bool enableImageTransparentTintColor(
121+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
122+
120123
static bool enableImmediateUpdateModeForContentOffsetChanges(
121124
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
122125

packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<c7589193e853646b63d50a4431647521>>
7+
* @generated SignedSource<<8fd664cb106945e5c6e436a0cf36120d>>
88
*/
99

1010
/**
@@ -142,6 +142,10 @@ bool ReactNativeFeatureFlags::enableImagePrefetchingAndroid() {
142142
return getAccessor().enableImagePrefetchingAndroid();
143143
}
144144

145+
bool ReactNativeFeatureFlags::enableImageTransparentTintColor() {
146+
return getAccessor().enableImageTransparentTintColor();
147+
}
148+
145149
bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges() {
146150
return getAccessor().enableImmediateUpdateModeForContentOffsetChanges();
147151
}

packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<214d05a6296f10f2a7ac67a15dc66d1c>>
7+
* @generated SignedSource<<196ba25b807fd064ca6150c7d2cd741c>>
88
*/
99

1010
/**
@@ -184,6 +184,11 @@ class ReactNativeFeatureFlags {
184184
*/
185185
RN_EXPORT static bool enableImagePrefetchingAndroid();
186186

187+
/**
188+
* When enabled, Image `tintColor` is handled as a true optional: any defined color is applied as a tint — including `transparent` (alpha 0), which renders the image invisible — and an unset value clears a previously applied tint. When disabled, the prior behavior is preserved, where a transparent `tintColor` is treated as unassigned and the image renders untinted.
189+
*/
190+
RN_EXPORT static bool enableImageTransparentTintColor();
191+
187192
/**
188193
* Dispatches state updates for content offset changes synchronously on the main thread.
189194
*/

0 commit comments

Comments
 (0)