From a78d36354af49c64547099f48512337c89565e1f Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Tue, 25 Jun 2019 09:22:05 -0400 Subject: [PATCH] Switch RadioButtonPreference to ConstraintLayout Also ensure that RTL works properly. --- .../settings/AccountAuthErrorPreference.kt | 2 +- .../fenix/settings/AccountPreference.kt | 2 +- .../settings/DefaultBrowserPreference.kt | 2 +- .../org/mozilla/fenix/settings/Extensions.kt | 16 ++-- .../fenix/settings/RadioButtonPreference.kt | 58 +++++--------- .../RadioSearchEngineListPreference.kt | 2 +- .../settings/SearchEngineListPreference.kt | 2 +- .../layout/preference_widget_radiobutton.xml | 78 +++++++++---------- 8 files changed, 68 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccountAuthErrorPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/AccountAuthErrorPreference.kt index 277c64580..d4d944514 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccountAuthErrorPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccountAuthErrorPreference.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.R class AccountAuthErrorPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - attributeSetId: Int = 0 + attributeSetId: Int = android.R.attr.preferenceStyle ) : Preference(context, attrs, attributeSetId) { var email: String? = null diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccountPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/AccountPreference.kt index 6e67b3775..574c328fe 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccountPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccountPreference.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.R class AccountPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - attributeSetId: Int = 0 + attributeSetId: Int = android.R.attr.preferenceStyle ) : Preference(context, attrs, attributeSetId) { var displayName: String? = null var email: String? = null diff --git a/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserPreference.kt index eec2c095f..7fd745419 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserPreference.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.R class DefaultBrowserPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - attributeSetId: Int = 0 + attributeSetId: Int = android.R.attr.preferenceStyle ) : Preference(context, attrs, attributeSetId) { private var switchView: Switch? = null diff --git a/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt index 4c93f2a49..0e9c42e20 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt @@ -98,17 +98,17 @@ fun PhoneFeature.getPreferenceKey(context: Context): String { } } -/* In devices with Android 6, when we use android:button="@null" android:drawableStart doesn't work via xml -* as a result we have to apply it programmatically. More info about this issue https://github.com/mozilla-mobile/fenix/issues/1414 -*/ +/** + * In devices with Android 6, when we use android:button="@null" android:drawableStart doesn't work via xml + * as a result we have to apply it programmatically. More info about this issue https://github.com/mozilla-mobile/fenix/issues/1414 + */ fun RadioButton.setStartCheckedIndicator() { - val attr = - ThemeManager.resolveAttribute(android.R.attr.listChoiceIndicatorSingle, context) + val attr = ThemeManager.resolveAttribute(android.R.attr.listChoiceIndicatorSingle, context) val buttonDrawable = ContextCompat.getDrawable(context, attr) - buttonDrawable.apply { - this?.setBounds(0, 0, this.intrinsicWidth, this.intrinsicHeight) + buttonDrawable?.apply { + setBounds(0, 0, this.intrinsicWidth, this.intrinsicHeight) } - this.setCompoundDrawables(buttonDrawable, null, null, null) + setCompoundDrawablesRelative(buttonDrawable, null, null, null) } fun initBlockedByAndroidView(phoneFeature: PhoneFeature, blockedByAndroidView: View) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt index 2a192c81e..4f4a6af17 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt @@ -5,30 +5,26 @@ package org.mozilla.fenix.settings import android.content.Context -import android.text.TextUtils import android.util.AttributeSet import android.view.View import android.widget.RadioButton import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.core.content.res.TypedArrayUtils +import androidx.core.content.res.TypedArrayUtils.getAttr import androidx.core.content.withStyledAttributes import androidx.core.text.HtmlCompat import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import org.mozilla.fenix.R -import org.mozilla.fenix.ThemeManager import org.mozilla.fenix.utils.Settings class RadioButtonPreference @JvmOverloads constructor( context: Context, - attrs: AttributeSet? = null, - attributeSetId: Int = 0 -) : Preference(context, attrs, attributeSetId) { + attrs: AttributeSet? = null +) : Preference(context, attrs) { private val radioGroups = mutableListOf() private lateinit var summaryView: TextView private lateinit var radioButton: RadioButton - var shouldSummaryBeParsedAsHtmlContent: Boolean = true + private var shouldSummaryBeParsedAsHtmlContent: Boolean = true private var defaultValue: Boolean = false private var clickListener: (() -> Unit)? = null @@ -38,38 +34,19 @@ class RadioButtonPreference @JvmOverloads constructor( context.withStyledAttributes( attrs, androidx.preference.R.styleable.Preference, - TypedArrayUtils.getAttr( - context, androidx.preference.R.attr.preferenceStyle, android.R.attr.preferenceStyle - ), + getAttr(context, androidx.preference.R.attr.preferenceStyle, android.R.attr.preferenceStyle), 0 ) { - if (hasValue(androidx.preference.R.styleable.Preference_defaultValue)) { - defaultValue = getBoolean( - androidx.preference.R.styleable.Preference_defaultValue, - false - ) - } else if (hasValue(androidx.preference.R.styleable.Preference_android_defaultValue)) { - defaultValue = getBoolean( - androidx.preference.R.styleable.Preference_android_defaultValue, - false - ) + defaultValue = when { + hasValue(androidx.preference.R.styleable.Preference_defaultValue) -> + getBoolean(androidx.preference.R.styleable.Preference_defaultValue, false) + hasValue(androidx.preference.R.styleable.Preference_android_defaultValue) -> + getBoolean(androidx.preference.R.styleable.Preference_android_defaultValue, false) + else -> false } } } - /* In devices with Android 6, when we use android:button="@null" android:drawableStart doesn't work via xml - * as a result we have to apply it programmatically. More info about this issue https://github.com/mozilla-mobile/fenix/issues/1414 - */ - fun RadioButton.setStartCheckedIndicator() { - val attr = - ThemeManager.resolveAttribute(android.R.attr.listChoiceIndicatorSingle, context) - val buttonDrawable = ContextCompat.getDrawable(context, attr) - buttonDrawable.apply { - this?.setBounds(0, 0, this.intrinsicWidth, this.intrinsicHeight) - } - this.setCompoundDrawables(buttonDrawable, null, null, null) - } - fun addToRadioGroup(radioPreference: RadioButtonPreference) { radioGroups.add(radioPreference) } @@ -118,20 +95,21 @@ class RadioButtonPreference @JvmOverloads constructor( private fun bindTitle(holder: PreferenceViewHolder) { val titleView = holder.findViewById(R.id.title) as TextView - if (!TextUtils.isEmpty(title)) { + if (!title.isNullOrEmpty()) { titleView.text = title } } private fun bindSummaryView(holder: PreferenceViewHolder) { summaryView = holder.findViewById(R.id.widget_summary) as TextView - if (!TextUtils.isEmpty(summary)) { - if (shouldSummaryBeParsedAsHtmlContent) { - summaryView.text = - HtmlCompat.fromHtml(summary.toString(), HtmlCompat.FROM_HTML_MODE_COMPACT) + + if (!summary.isNullOrEmpty()) { + summaryView.text = if (shouldSummaryBeParsedAsHtmlContent) { + HtmlCompat.fromHtml(summary.toString(), HtmlCompat.FROM_HTML_MODE_COMPACT) } else { - summaryView.text = summary + summary } + summaryView.visibility = View.VISIBLE } else { summaryView.visibility = View.GONE diff --git a/app/src/main/java/org/mozilla/fenix/settings/RadioSearchEngineListPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/RadioSearchEngineListPreference.kt index ad58ed73c..b801e69b3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/RadioSearchEngineListPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/RadioSearchEngineListPreference.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.utils.Settings class RadioSearchEngineListPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 + defStyleAttr: Int = android.R.attr.preferenceStyle ) : SearchEngineListPreference(context, attrs, defStyleAttr) { override val itemResId: Int get() = R.layout.search_engine_radio_button diff --git a/app/src/main/java/org/mozilla/fenix/settings/SearchEngineListPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/SearchEngineListPreference.kt index 8c052dca1..b6ecc2b00 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SearchEngineListPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SearchEngineListPreference.kt @@ -31,7 +31,7 @@ import kotlin.coroutines.CoroutineContext abstract class SearchEngineListPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 + defStyleAttr: Int = android.R.attr.preferenceStyle ) : Preference(context, attrs, defStyleAttr), CompoundButton.OnCheckedChangeListener, CoroutineScope { private val job = Job() override val coroutineContext: CoroutineContext diff --git a/app/src/main/res/layout/preference_widget_radiobutton.xml b/app/src/main/res/layout/preference_widget_radiobutton.xml index 517f7c702..86303fe98 100644 --- a/app/src/main/res/layout/preference_widget_radiobutton.xml +++ b/app/src/main/res/layout/preference_widget_radiobutton.xml @@ -3,9 +3,9 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - - - - - - - - + + + + + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorSecondary" + tools:text="@string/preference_recommended_settings_summary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/radio_button" + app:layout_constraintStart_toStartOf="@+id/title" /> - - - - - - - \ No newline at end of file +