diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 19707cd5fdd..eb8bc1df335 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -6222,11 +6222,11 @@ public abstract interface class com/facebook/react/views/modal/ReactModalHostVie public abstract fun onRequestClose (Landroid/content/DialogInterface;)V } -public class com/facebook/react/views/progressbar/ProgressBarShadowNode : com/facebook/react/uimanager/LayoutShadowNode, com/facebook/yoga/YogaMeasureFunction { +public final class com/facebook/react/views/progressbar/ProgressBarShadowNode : com/facebook/react/uimanager/LayoutShadowNode, com/facebook/yoga/YogaMeasureFunction { public fun ()V - public fun getStyle ()Ljava/lang/String; + public final fun getStyle ()Ljava/lang/String; public fun measure (Lcom/facebook/yoga/YogaNode;FLcom/facebook/yoga/YogaMeasureMode;FLcom/facebook/yoga/YogaMeasureMode;)J - public fun setStyle (Ljava/lang/String;)V + public final fun setStyle (Ljava/lang/String;)V } public class com/facebook/react/views/progressbar/ProgressBarShadowNode$$PropsSetter : com/facebook/react/uimanager/ViewManagerPropertyUpdater$ShadowNodeSetter { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java deleted file mode 100644 index ccf057e7ece..00000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.views.progressbar; - -import android.util.SparseIntArray; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ProgressBar; -import androidx.annotation.Nullable; -import com.facebook.infer.annotation.Nullsafe; -import com.facebook.react.uimanager.LayoutShadowNode; -import com.facebook.react.uimanager.annotations.ReactProp; -import com.facebook.yoga.YogaMeasureFunction; -import com.facebook.yoga.YogaMeasureMode; -import com.facebook.yoga.YogaMeasureOutput; -import com.facebook.yoga.YogaNode; -import java.util.HashSet; -import java.util.Set; - -/** - * Node responsible for holding the style of the ProgressBar, see under {@link - * android.R.attr.progressBarStyle} for possible styles. ReactProgressBarViewManager manages how - * this style is applied to the ProgressBar. - */ -@Nullsafe(Nullsafe.Mode.LOCAL) -public class ProgressBarShadowNode extends LayoutShadowNode implements YogaMeasureFunction { - - private String mStyle = ReactProgressBarViewManager.DEFAULT_STYLE; - - private final SparseIntArray mHeight; - private final SparseIntArray mWidth; - private final Set mMeasured; - - public ProgressBarShadowNode() { - mHeight = new SparseIntArray(); - mWidth = new SparseIntArray(); - mMeasured = new HashSet<>(); - initMeasureFunction(); - } - - private void initMeasureFunction() { - setMeasureFunction(this); - } - - public @Nullable String getStyle() { - return mStyle; - } - - @ReactProp(name = ReactProgressBarViewManager.PROP_STYLE) - public void setStyle(@Nullable String style) { - mStyle = style == null ? ReactProgressBarViewManager.DEFAULT_STYLE : style; - } - - @Override - public long measure( - YogaNode node, - float width, - YogaMeasureMode widthMode, - float height, - YogaMeasureMode heightMode) { - final int style = ReactProgressBarViewManager.getStyleFromString(getStyle()); - if (!mMeasured.contains(style)) { - ProgressBar progressBar = - ReactProgressBarViewManager.createProgressBar(getThemedContext(), style); - final int spec = - View.MeasureSpec.makeMeasureSpec( - ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); - progressBar.measure(spec, spec); - mHeight.put(style, progressBar.getMeasuredHeight()); - mWidth.put(style, progressBar.getMeasuredWidth()); - mMeasured.add(style); - } - - return YogaMeasureOutput.make(mWidth.get(style), mHeight.get(style)); - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.kt new file mode 100644 index 00000000000..791ab36a340 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.kt @@ -0,0 +1,59 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.views.progressbar + +import android.util.SparseIntArray +import android.view.View +import android.view.ViewGroup +import com.facebook.react.uimanager.LayoutShadowNode +import com.facebook.react.uimanager.annotations.ReactProp +import com.facebook.yoga.YogaMeasureFunction +import com.facebook.yoga.YogaMeasureMode +import com.facebook.yoga.YogaMeasureOutput +import com.facebook.yoga.YogaNode + +/** + * Node responsible for holding the style of the ProgressBar, see under [ ] for possible styles. + * ReactProgressBarViewManager manages how this style is applied to the ProgressBar. + */ +public class ProgressBarShadowNode : LayoutShadowNode(), YogaMeasureFunction { + private val height: SparseIntArray = SparseIntArray() + private val width: SparseIntArray = SparseIntArray() + private val measured: MutableSet = HashSet() + + init { + setMeasureFunction(this) + } + + @set:ReactProp(name = ReactProgressBarViewManager.PROP_STYLE) + public var style: String? = ReactProgressBarViewManager.DEFAULT_STYLE + set(value) { + field = value ?: ReactProgressBarViewManager.DEFAULT_STYLE + } + + override fun measure( + node: YogaNode, + width: Float, + widthMode: YogaMeasureMode, + height: Float, + heightMode: YogaMeasureMode + ): Long { + val style = ReactProgressBarViewManager.getStyleFromString(style) + if (!measured.contains(style)) { + val progressBar = ReactProgressBarViewManager.createProgressBar(themedContext, style) + val spec = + View.MeasureSpec.makeMeasureSpec( + ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED) + progressBar.measure(spec, spec) + this.height.put(style, progressBar.measuredHeight) + this.width.put(style, progressBar.measuredWidth) + measured.add(style) + } + return YogaMeasureOutput.make(this.width[style], this.height[style]) + } +}