feat(Pressable): add support for PlatformColor and alpha#56395
feat(Pressable): add support for PlatformColor and alpha#56395adrcotfas wants to merge 1 commit intofacebook:mainfrom
Conversation
|
Hi @adrcotfas! Thank you for your pull request and welcome to our community. Action RequiredIn order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you. ProcessIn order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA. Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with If you have received this in error or have any questions, please contact us at cla@meta.com. Thanks! |
|
Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks! |
|
Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks! |
a6fdea3 to
9b4bdac
Compare
Summary:
android_rippleonPressable(andTouchableNativeFeedback.Ripple()) onlyaccepted numeric (pre-processed ARGB int) colors. Passing a
PlatformColorwould throw an invariant in JS, making theme-aware ripple colors impossible.
This PR removes those guards and wires up the full color pipeline:
useAndroidRippleForView.js,TouchableNativeFeedback.js):removed the
invariantthat rejected non-numeric processed colors.TouchableNativeFeedback.Ripple()now acceptsColorValueinstead ofstring.NativeDrawable.h,HostPlatformViewProps.cpp):colorchanged from
int32_ttoSharedColor+ a separatecolorResourcePathsfield for
PlatformColorresource paths. ThefromRawValuepipeline nowresolves both plain colors and
PlatformColorobjects.ReactDrawableHelper.kt):getColor()now handles bothnumeric and
PlatformColormap values viaColorPropConverter.getColor(),catching
JSApplicationCausedNativeExceptionto fall back gracefullyinstead of crashing.
ReactViewGroup.kt): the raw drawabledescription maps are retained on the view, and
onConfigurationChangedre-applies them so ripple colors update automatically on light/dark mode
switch.
A new
alpha: number(0–1) field is also added so users can apply opacity toa
PlatformColorwhose value is fully opaque and can't have alpha embedded atthe JS level. It is applied by multiplying into the resolved color's alpha
channel.
Unresolvable
PlatformColorresources are handled gracefully: on New Arch,C++ omits the
colorkey so Kotlin falls back tocolorControlHighlight; onOld Arch,
ReactDrawableHelpercatches theJSApplicationCausedNativeExceptionand falls back to
colorControlHighlightinstead of crashing.Changelog:
[ANDROID] [ADDED] -
android_ripplenow acceptsPlatformColorfortheme-aware ripple colors, and a new
alpha(0–1) parameter for controllingripple opacity independently of the color value.
Test Plan:
Automated:
PlatformColor + alphato use?attr/colorAccent(matching the RNTester example).
should not crash with an unresolvable PlatformColorverifying the component renders at the JS level without throwing.
Manual (RNTester → Pressable → "Pressable with PlatformColor ripple and alpha"):
PlatformColor('?attr/colorAccent'), no alpha→ full-opacity accent ripplePlatformColor('?attr/colorAccent'), alpha=0.3→ 30% opacity accent ripple#FF0000, no alpha→ full red ripple (regression check)#FF0000, alpha=0.5→ 50% opacity red ripple?attr/doesNotExist) → nocrash, ripple falls back to default
colorControlHighlightgreyScreen_recording_20260410_091000.webm