Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 852ed630 authored by David Liu's avatar David Liu Committed by Android (Google) Code Review
Browse files

Merge "[Settinglib][UI] fixed introPreference summary and button alignment" into main

parents 29cfc76c bc3babea
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/entity_header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
@@ -38,7 +39,9 @@
            android:id="@+id/collapsable_summary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"/>
            android:gravity="center"
            android:minLines="1"
            app:isCollapsable="true"/>

    </LinearLayout>

+4 −27
Original line number Diff line number Diff line
@@ -33,8 +33,8 @@ class IntroPreference @JvmOverloads constructor(
    defStyleRes: Int = 0
) : Preference(context, attrs, defStyleAttr, defStyleRes), GroupSectionDividerMixin {

    private var isCollapsable: Boolean = false
    private var minLines: Int = 2
    private var isCollapsable: Boolean = true
    private var minLines: Int = DEFAULT_MIN_LINES
    private var hyperlinkListener: View.OnClickListener? = null
    private var learnMoreListener: View.OnClickListener? = null
    private var learnMoreText: CharSequence? = null
@@ -42,22 +42,6 @@ class IntroPreference @JvmOverloads constructor(
    init {
        layoutResource = R.layout.settingslib_expressive_preference_intro
        isSelectable = false

        initAttributes(context, attrs, defStyleAttr)
    }

    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
        context.obtainStyledAttributes(
            attrs,
            COLLAPSABLE_TEXT_VIEW_ATTRS, defStyleAttr, 0
        ).apply {
            isCollapsable = getBoolean(IS_COLLAPSABLE, false)
            minLines = getInt(
                MIN_LINES,
                if (isCollapsable) DEFAULT_MIN_LINES else DEFAULT_MAX_LINES
            ).coerceIn(1, DEFAULT_MAX_LINES)
            recycle()
        }
    }

    override fun onBindViewHolder(holder: PreferenceViewHolder) {
@@ -139,13 +123,6 @@ class IntroPreference @JvmOverloads constructor(

    companion object {
        private const val DEFAULT_MAX_LINES = 10
        private const val DEFAULT_MIN_LINES = 2

        private val COLLAPSABLE_TEXT_VIEW_ATTRS =
            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView
        private val MIN_LINES =
            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_android_minLines
        private val IS_COLLAPSABLE =
            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_isCollapsable
        private const val DEFAULT_MIN_LINES = 1
    }
}
+34 −13
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ class CollapsableTextView @JvmOverloads constructor(
    defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private var isCollapsable: Boolean = false
    private var isCollapsable: Boolean = DEFAULT_COLLAPSABLE
    private var isCollapsed: Boolean = false
    private var minLines: Int = DEFAULT_MIN_LINES

@@ -78,24 +78,38 @@ class CollapsableTextView @JvmOverloads constructor(

    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
        context.obtainStyledAttributes(
            attrs, Attrs, defStyleAttr, 0
            attrs, R.styleable.CollapsableTextView, defStyleAttr, 0
        ).apply {
            val gravity = getInt(GravityAttr, Gravity.START)
            val gravity = getInt(gravityAttr, Gravity.START)
            when (gravity) {
                Gravity.CENTER_VERTICAL, Gravity.CENTER, Gravity.CENTER_HORIZONTAL -> {
                    centerHorizontally(titleTextView)
                    centerHorizontally(collapseButton)
                }
            }
            isCollapsable = getBoolean(isCollapsableAttr, DEFAULT_COLLAPSABLE)
            minLines = getInt(minLinesAttr, DEFAULT_MIN_LINES)
            recycle()
        }
    }

    private fun centerHorizontally(view: View) {
        when (view) {
            is MaterialButton -> {
                (view.layoutParams as LayoutParams).apply {
                    startToStart = LayoutParams.PARENT_ID
                    endToEnd = LayoutParams.PARENT_ID
            horizontalBias = 0.5f
                }
            }
            is TextView -> {
                view.gravity = Gravity.CENTER
            }
            else -> {
                (view.layoutParams as LayoutParams).apply {
                    startToStart = LayoutParams.PARENT_ID
                    endToEnd = LayoutParams.PARENT_ID
                }
            }
        }
    }

@@ -113,6 +127,8 @@ class CollapsableTextView @JvmOverloads constructor(
     */
    fun setCollapsable(collapsable: Boolean) {
        isCollapsable = collapsable
        // Make is collapsed when it's collapsable
        if (isCollapsable) isCollapsed = true
        updateView()
    }

@@ -120,8 +136,8 @@ class CollapsableTextView @JvmOverloads constructor(
     * Sets the minimum number of lines to display when collapsed.
     * @param lines The minimum number of lines.
     */
    fun setMinLines(line: Int) {
        minLines = line.coerceIn(1, DEFAULT_MAX_LINES)
    fun setMinLines(lines: Int) {
        minLines = lines.coerceIn(1, DEFAULT_MAX_LINES)
        updateView()
    }

@@ -198,7 +214,7 @@ class CollapsableTextView @JvmOverloads constructor(
        }
        learnMoreSpan = LearnMoreSpan(clickListener = learnMoreListener!!)
        spannableLearnMoreText.setSpan(learnMoreSpan, 0, learnMoreText!!.length, 0)
        learnMoreTextView.setText(spannableLearnMoreText)
        learnMoreTextView.text = spannableLearnMoreText
        learnMoreTextView.visibility = VISIBLE
        isLearnMoreEnabled = true
    }
@@ -211,6 +227,8 @@ class CollapsableTextView @JvmOverloads constructor(
                    icon = collapseButtonResources.expandIcon
                }
                titleTextView.maxLines = minLines
                titleTextView.ellipsize = null
                titleTextView.scrollBarSize = 0
            }

            else -> {
@@ -219,6 +237,7 @@ class CollapsableTextView @JvmOverloads constructor(
                    icon = collapseButtonResources.collapseIcon
                }
                titleTextView.maxLines = DEFAULT_MAX_LINES
                titleTextView.ellipsize = TextUtils.TruncateAt.END
            }
        }
        collapseButton.visibility = if (isCollapsable) VISIBLE else GONE
@@ -235,17 +254,19 @@ class CollapsableTextView @JvmOverloads constructor(
    companion object {
        private const val DEFAULT_MAX_LINES = 10
        private const val DEFAULT_MIN_LINES = 2
        private const val DEFAULT_COLLAPSABLE = true

        private const val LINK_BEGIN_MARKER = "LINK_BEGIN"
        private const val LINK_END_MARKER = "LINK_END"

        private val Attrs = R.styleable.CollapsableTextView
        private val GravityAttr = R.styleable.CollapsableTextView_android_gravity
        private val gravityAttr = R.styleable.CollapsableTextView_android_gravity
        private val minLinesAttr = R.styleable.CollapsableTextView_android_minLines
        private val isCollapsableAttr = R.styleable.CollapsableTextView_isCollapsable
    }
}

internal class LearnMoreSpan(
    val url: String = "",
    url: String = "",
    val clickListener: View.OnClickListener) : URLSpan(url) {
    override fun onClick(widget: View) {
        clickListener.onClick(widget)