diff --git a/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt b/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt new file mode 100644 index 000000000..68a2b2e61 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +package org.mozilla.fenix.ext + +import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.AbsoluteSizeSpan +import android.text.style.ForegroundColorSpan +import androidx.core.content.ContextCompat +import mozilla.components.support.ktx.android.util.dpToPx + +fun SpannableString.setTextSize(context: Context, textSize: Int) = + this.setSpan( + AbsoluteSizeSpan(textSize.dpToPx(context.resources.displayMetrics)), + 0, + this.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + +fun SpannableString.setTextColor(context: Context, colorResId: Int) = + this.setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + context, + colorResId + ) + ), + 0, + this.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt index 57eeea68f..eee57c745 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolder.kt @@ -37,17 +37,17 @@ class OnboardingTrackingProtectionViewHolder(view: View) : RecyclerView.ViewHold isChecked = view.context.settings().shouldUseTrackingProtection setOnCheckedChangeListener { _, isChecked -> updateTrackingProtectionSetting(isChecked) - updateRadioGroupState(view, isChecked) + updateRadioGroupState(isChecked) } } - setupRadioGroup(view, trackingProtectionToggle.isChecked) - updateRadioGroupState(view, trackingProtectionToggle.isChecked) + setupRadioGroup(trackingProtectionToggle.isChecked) + updateRadioGroupState(trackingProtectionToggle.isChecked) } - private fun setupRadioGroup(view: View, isChecked: Boolean) { + private fun setupRadioGroup(isChecked: Boolean) { - updateRadioGroupState(view, isChecked) + updateRadioGroupState(isChecked) addToRadioGroup(standardTrackingProtection, strictTrackingProtection) @@ -58,56 +58,20 @@ class OnboardingTrackingProtectionViewHolder(view: View) : RecyclerView.ViewHold standardTrackingProtection.onClickListener { updateTrackingProtectionPolicy() - view.context.components.analytics.metrics + itemView.context.components.analytics.metrics .track(Event.OnboardingTrackingProtection(Setting.STANDARD)) } - view.clickable_region_standard.apply { - setOnClickListener { - standardTrackingProtection.performClick() - view.context.components.analytics.metrics - .track(Event.OnboardingTrackingProtection(Setting.STANDARD)) - } - val standardTitle = view.context.getString( - R.string.onboarding_tracking_protection_standard_button_2 - ) - val standardSummary = view.context.getString( - R.string.onboarding_tracking_protection_standard_button_description_2 - ) - contentDescription = "$standardTitle. $standardSummary" - } - strictTrackingProtection.onClickListener { updateTrackingProtectionPolicy() - view.context.components.analytics.metrics + itemView.context.components.analytics.metrics .track(Event.OnboardingTrackingProtection(Setting.STRICT)) } - - view.clickable_region_strict.apply { - setOnClickListener { - strictTrackingProtection.performClick() - view.context.components.analytics.metrics - .track(Event.OnboardingTrackingProtection(Setting.STRICT)) - } - val strictTitle = - view.context.getString(R.string.onboarding_tracking_protection_strict_option) - val strictSummary = - view.context.getString(R.string.onboarding_tracking_protection_strict_button_description_2) - contentDescription = "$strictTitle. $strictSummary" - } } - private fun updateRadioGroupState(view: View, isChecked: Boolean) { + private fun updateRadioGroupState(isChecked: Boolean) { standardTrackingProtection.isEnabled = isChecked strictTrackingProtection.isEnabled = isChecked - - view.protection_standard_description.isEnabled = isChecked - view.protection_strict_description.isEnabled = isChecked - view.clickable_region_standard.isClickable = isChecked - - view.protection_standard_title.isEnabled = isChecked - view.protection_strict_title.isEnabled = isChecked - view.clickable_region_strict.isClickable = isChecked } private fun updateTrackingProtectionSetting(enabled: Boolean) { diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingRadioButton.kt b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingRadioButton.kt index 697156f5b..4ed8d330c 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingRadioButton.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingRadioButton.kt @@ -5,12 +5,16 @@ package org.mozilla.fenix.onboarding import android.content.Context +import android.text.SpannableString +import android.text.SpannableStringBuilder import android.util.AttributeSet import android.widget.ImageView import androidx.appcompat.widget.AppCompatRadioButton import androidx.core.content.edit import androidx.core.content.withStyledAttributes import org.mozilla.fenix.R +import org.mozilla.fenix.ext.setTextColor +import org.mozilla.fenix.ext.setTextSize import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.view.GroupableRadioButton import org.mozilla.fenix.utils.view.uncheckAll @@ -23,6 +27,8 @@ class OnboardingRadioButton( private var illustration: ImageView? = null private var clickListener: (() -> Unit)? = null var key: Int = 0 + var title: Int = 0 + var description: Int = 0 init { context.withStyledAttributes( @@ -31,6 +37,9 @@ class OnboardingRadioButton( 0, 0 ) { key = getResourceId(R.styleable.OnboardingRadioButton_onboardingKey, 0) + title = getResourceId(R.styleable.OnboardingRadioButton_onboardingKeyTitle, 0) + description = + getResourceId(R.styleable.OnboardingRadioButton_onboardingKeyDescription, 0) } } @@ -52,6 +61,28 @@ class OnboardingRadioButton( toggleRadioGroups() clickListener?.invoke() } + if (title != 0) { + setRadioButtonText(context) + } + } + + private fun setRadioButtonText(context: Context) { + val builder = SpannableStringBuilder() + + val spannableTitle = SpannableString(resources.getString(title)) + spannableTitle.setTextSize(context, TITLE_TEXT_SIZE) + spannableTitle.setTextColor(context, R.color.primary_state_list_text_color) + + builder.append(spannableTitle) + + if (description != 0) { + val spannableDescription = SpannableString(resources.getString(description)) + spannableDescription.setTextSize(context, DESCRIPTION_TEXT_SIZE) + spannableDescription.setTextColor(context, R.color.secondary_state_list_text_color) + builder.append("\n") + builder.append(spannableDescription) + } + this.text = builder } override fun updateRadioValue(isChecked: Boolean) { @@ -69,4 +100,9 @@ class OnboardingRadioButton( radioGroups.uncheckAll() } } + + companion object { + private const val TITLE_TEXT_SIZE = 16 + private const val DESCRIPTION_TEXT_SIZE = 14 + } } diff --git a/app/src/main/res/layout/onboarding_theme_picker.xml b/app/src/main/res/layout/onboarding_theme_picker.xml index 4b5cd64a1..bf6757c7b 100644 --- a/app/src/main/res/layout/onboarding_theme_picker.xml +++ b/app/src/main/res/layout/onboarding_theme_picker.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + app:onboardingKey="@string/pref_key_follow_device_theme" + app:onboardingKeyDescription="@string/onboarding_theme_automatic_summary" + app:onboardingKeyTitle="@string/onboarding_theme_automatic_title" + tools:text="Automatic" /> - - - diff --git a/app/src/main/res/layout/onboarding_tracking_protection.xml b/app/src/main/res/layout/onboarding_tracking_protection.xml index 1bf3fcd85..78a7df377 100644 --- a/app/src/main/res/layout/onboarding_tracking_protection.xml +++ b/app/src/main/res/layout/onboarding_tracking_protection.xml @@ -7,7 +7,9 @@ android:id="@+id/onboarding_card" style="@style/OnboardingCardLightWithPadding" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:clipChildren="false" + android:clipToPadding="false"> - - - - - - - + app:onboardingKey="@string/pref_key_tracking_protection_standard_option" + app:onboardingKeyDescription="@string/onboarding_tracking_protection_standard_button_description_2" + app:onboardingKeyTitle="@string/onboarding_tracking_protection_standard_button_2" + tools:text="Standard" /> - - - - + app:onboardingKey="@string/pref_key_tracking_protection_strict_default" + app:onboardingKeyDescription="@string/onboarding_tracking_protection_strict_button_description_2" + app:onboardingKeyTitle="@string/onboarding_tracking_protection_strict_option" + tools:text="Strict" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 881f04879..f3ed115f1 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -84,6 +84,8 @@ + +