diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogTitle.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogTitle.kt new file mode 100644 index 00000000000..2dfad101298 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogTitle.kt @@ -0,0 +1,55 @@ +/* + * 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.modules.dialog + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView + +/** + * Reimplementation of Android's internal DialogTitle. This class will attempt to render titles on + * two lines if they are too long, applying ellipsis as necessary. + * + * @see + * https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/core/java/com/android/internal/widget/DialogTitle.java + */ +internal class DialogTitle : TextView { + + constructor( + context: Context, + attrs: AttributeSet, + defStyleAttr: Int, + defStyleRes: Int, + ) : super(context, attrs, defStyleAttr, defStyleRes) + + constructor( + context: Context, + attrs: AttributeSet, + defStyleAttr: Int, + ) : super(context, attrs, defStyleAttr) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context) : super(context) + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + val layout = layout + if (layout != null) { + val lineCount = layout.lineCount + if (lineCount > 0) { + val ellipsisCount = layout.getEllipsisCount(lineCount - 1) + if (ellipsisCount > 0) { + setSingleLine(false) + setMaxLines(2) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + } + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/res/views/alert/layout/alert_title_layout.xml b/packages/react-native/ReactAndroid/src/main/res/views/alert/layout/alert_title_layout.xml index 0677d76b4b0..1814ab47fc8 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/alert/layout/alert_title_layout.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/alert/layout/alert_title_layout.xml @@ -6,9 +6,10 @@ android:orientation="horizontal" android:paddingStart="?android:attr/dialogPreferredPadding" android:paddingTop="18dp" - android:paddingEnd="?android:attr/dialogPreferredPadding"> + android:paddingEnd="?android:attr/dialogPreferredPadding" + > - + />