diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt index 3fb219518..3e43e80b7 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt @@ -10,9 +10,9 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test -import org.junit.Ignore import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule @@ -85,7 +85,7 @@ class SettingsBasicsTest { verifyThemes() }.goBack { }.openAccessibilitySubMenu { - verifyMenuItems() + verifyAutomaticFontSizingMenuItems() }.goBack { // drill down to submenu } @@ -181,7 +181,7 @@ class SettingsBasicsTest { } @Test - fun changeAccessibilitySettings() { + fun changeAccessibiltySettings() { // Goes through the settings and changes the default text on a webpage, then verifies if the text has changed. val fenixApp = activityIntentTestRule.activity.applicationContext as FenixApplication val webpage = getLoremIpsumAsset(mockWebServer).url @@ -193,7 +193,8 @@ class SettingsBasicsTest { }.openThreeDotMenu { }.openSettings { }.openAccessibilitySubMenu { - verifyMenuItems() + clickFontSizingSwitch() + verifyEnabledMenuItems() changeTextSizeSlider(textSizePercentage) verifyTextSizePercentage(textSizePercentage) }.goBack { @@ -201,6 +202,14 @@ class SettingsBasicsTest { }.openNavigationToolbar { }.enterURLAndEnterToBrowser(webpage) { checkTextSizeOnWebsite(textSizePercentage, fenixApp.components) + }.openTabDrawer { + }.openNewTab { + }.dismiss { + }.openThreeDotMenu { + }.openSettings { + }.openAccessibilitySubMenu { + clickFontSizingSwitch() + verifyMenuItemsAreDisabled() } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt index c02907f69..6402e65cb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt @@ -6,30 +6,32 @@ package org.mozilla.fenix.ui.robots -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.uiautomator.UiDevice import android.view.KeyEvent -import android.view.KeyEvent.KEYCODE_DPAD_RIGHT -import android.view.KeyEvent.KEYCODE_DPAD_LEFT import android.view.KeyEvent.ACTION_DOWN +import android.view.KeyEvent.KEYCODE_DPAD_LEFT +import android.view.KeyEvent.KEYCODE_DPAD_RIGHT import android.view.View import android.widget.SeekBar import android.widget.TextView +import androidx.test.espresso.Espresso.onView import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewAssertion -import org.hamcrest.CoreMatchers.allOf -import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withContentDescription -import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import org.hamcrest.CoreMatchers.allOf import org.hamcrest.Matcher import org.mozilla.fenix.components.Components +import org.mozilla.fenix.helpers.assertIsEnabled +import org.mozilla.fenix.helpers.isEnabled import org.mozilla.fenix.ui.robots.SettingsSubMenuAccessibilityRobot.Companion.DECIMAL_CONVERSION import org.mozilla.fenix.ui.robots.SettingsSubMenuAccessibilityRobot.Companion.MIN_VALUE import org.mozilla.fenix.ui.robots.SettingsSubMenuAccessibilityRobot.Companion.STEP_SIZE @@ -48,7 +50,13 @@ class SettingsSubMenuAccessibilityRobot { const val TEXT_SIZE = 16f } - fun verifyMenuItems() = assertMenuItems() + fun verifyAutomaticFontSizingMenuItems() = assertAutomaticFontSizingMenuItems() + + fun clickFontSizingSwitch() = toggleFontSizingSwitch() + + fun verifyEnabledMenuItems() = assertEnabledMenuItems() + + fun verifyMenuItemsAreDisabled() = assertMenuItemsAreDisabled() fun changeTextSizeSlider(seekBarPercentage: Int) = adjustTextSizeSlider(seekBarPercentage) @@ -69,7 +77,22 @@ class SettingsSubMenuAccessibilityRobot { val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) -private fun assertMenuItems() { +private fun assertAutomaticFontSizingMenuItems() { + onView(withText("Automatic font sizing")) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + val strFont = "Font size will match your Android settings. Disable to manage font size here." + onView(withText(strFont)) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun toggleFontSizingSwitch() { + // Toggle font size to off + onView(withText("Automatic font sizing")) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + .perform(click()) +} + +private fun assertEnabledMenuItems() { assertFontSize() assertSliderBar() } @@ -77,9 +100,11 @@ private fun assertMenuItems() { private fun assertFontSize() { val view = onView(withText("Font Size")) view.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + .check(matches(isEnabled(true))) val strFont = "Make text on websites larger or smaller" onView(withText(strFont)) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + .check(matches(isEnabled(true))) } private fun assertSliderBar() { @@ -103,6 +128,20 @@ private fun assertTextSizePercentage(textSize: Int) { .check(textSizePercentageEquals(textSize)) } +private fun assertMenuItemsAreDisabled() { + onView(withText("Font Size")).assertIsEnabled(false) + + val strFont = "Make text on websites larger or smaller" + + onView(withText(strFont)).assertIsEnabled(false) + + onView(withId(org.mozilla.fenix.R.id.sampleText)).assertIsEnabled(false) + + onView(withId(org.mozilla.fenix.R.id.seekbar_value)).assertIsEnabled(false) + + onView(withId(org.mozilla.fenix.R.id.seekbar)).assertIsEnabled(false) +} + private fun goBackButton() = onView(allOf(withContentDescription("Navigate up"))) diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt index 72dac3b61..1bebe0c5c 100644 --- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -47,7 +47,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize()) { + if (!settings.shouldUseAutoSize) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt index bbfd5cf41..031c1c6c1 100644 --- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -47,7 +47,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize()) { + if (!settings.shouldUseAutoSize) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt index 97027c022..ef75ce688 100644 --- a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -57,7 +57,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize()) { + if (!settings.shouldUseAutoSize) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 291715c87..692625567 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -97,8 +97,8 @@ class Core( trackingProtectionPolicy = trackingProtectionPolicyFactory.createTrackingProtectionPolicy(), historyTrackingDelegate = HistoryDelegate(lazyHistoryStorage), preferredColorScheme = getPreferredColorScheme(), - automaticFontSizeAdjustment = context.settings().shouldUseAutoSize(), - fontInflationEnabled = context.settings().shouldUseAutoSize(), + automaticFontSizeAdjustment = context.settings().shouldUseAutoSize, + fontInflationEnabled = context.settings().shouldUseAutoSize, suspendMediaWhenInactive = false, forceUserScalableContent = context.settings().forceEnableZoom, loginAutofillEnabled = context.settings().shouldAutofillLogins diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt index c1e55db14..02a0f1b29 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt @@ -48,18 +48,35 @@ class AccessibilityFragment : PreferenceFragmentCompat() { val newTextScale = ((newTextSize * STEP_SIZE) + MIN_SCALE_VALUE).toFloat() / PERCENT_TO_DECIMAL + // Save new text scale value. We assume auto sizing is off if this change listener was called. settings.fontSizeFactor = newTextScale + components.core.engine.settings.fontSizeFactor = newTextScale - // If scale is 100%, use the automatic font size adjustment - val useAutoSize = newTextScale == 1F + // Reload the current session to reflect the new text scale + components.useCases.sessionUseCases.reload() + true + } + textSizePreference.isEnabled = !requireContext().settings().shouldUseAutoSize + + val useAutoSizePreference = + requirePreference(R.string.pref_key_accessibility_auto_size) + useAutoSizePreference.setOnPreferenceChangeListener { preference, useAutoSize -> + val settings = preference.context.settings() + val components = preference.context.components + + // Save the new setting value + settings.shouldUseAutoSize = useAutoSize components.core.engine.settings.automaticFontSizeAdjustment = useAutoSize components.core.engine.settings.fontInflationEnabled = useAutoSize - // If using manual sizing, update the engine settings with the new scale + // If using manual sizing, update the engine settings with the local saved setting if (!useAutoSize) { - components.core.engine.settings.fontSizeFactor = newTextScale + components.core.engine.settings.fontSizeFactor = settings.fontSizeFactor } + // Enable the manual sizing controls if automatic sizing is turned off. + textSizePreference.isEnabled = !useAutoSize + // Reload the current session to reflect the new text scale components.useCases.sessionUseCases.reload() true diff --git a/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt index f6bff9a85..e8e67e557 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt @@ -67,30 +67,37 @@ class TextPercentageSeekBarPreference @JvmOverloads constructor( ) : Preference(context, attrs, defStyleAttr, defStyleRes) { /* synthetic access */ internal var mSeekBarValue: Int = 0 + /* synthetic access */ internal var mMin: Int = 0 private var mMax: Int = 0 private var mSeekBarIncrement: Int = 0 + /* synthetic access */ internal var mTrackingTouch: Boolean = false + /* synthetic access */ internal var mSeekBar: SeekBar? = null private var mSeekBarValueTextView: TextView? = null private var mExampleTextTextView: TextView? = null + /** * Whether the SeekBar should respond to the left/right keys */ /* synthetic access */ var isAdjustable: Boolean = false + /** * Whether to show the SeekBar value TextView next to the bar */ private var mShowSeekBarValue: Boolean = false + /** * Whether the SeekBarPreference should continuously save the Seekbar value while it is being dragged. */ /* synthetic access */ var updatesContinuously: Boolean = false + /** * Listener reacting to the [SeekBar] changing value by the user */ @@ -273,6 +280,8 @@ class TextPercentageSeekBarPreference @JvmOverloads constructor( updateExampleTextValue(mSeekBarValue) updateLabelValue(mSeekBarValue) mSeekBar?.isEnabled = isEnabled + mSeekBarValueTextView?.alpha = if (isEnabled) 1F else HALF_ALPHA + mExampleTextTextView?.alpha = if (isEnabled) 1F else HALF_ALPHA mSeekBar?.let { it.thumbOffset = it.thumb.intrinsicWidth.div(2 * PI).roundToInt() } @@ -461,6 +470,7 @@ class TextPercentageSeekBarPreference @JvmOverloads constructor( companion object { private const val TAG = "SeekBarPreference" private const val STEP_SIZE = 5 + private const val HALF_ALPHA = 0.5F private const val MIN_VALUE = 50 private const val DECIMAL_CONVERSION = 100f private const val TEXT_SIZE = 16f diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 57159ab1d..f1a50f454 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -315,13 +315,16 @@ class Settings(private val appContext: Context) : PreferencesHolder { val shouldShowSecurityPinWarning: Boolean get() = loginsSecureWarningCount.underMaxCount() - fun shouldUseAutoSize() = fontSizeFactor == 1F - var shouldUseLightTheme by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_light_theme), default = false ) + var shouldUseAutoSize by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_accessibility_auto_size), + default = true + ) + var fontSizeFactor by floatPreference( appContext.getPreferenceKey(R.string.pref_key_accessibility_font_scale), default = 1f diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index a2ba56477..0a88f97c5 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -11,6 +11,7 @@ pref_key_site_permissions pref_key_add_private_browsing_shortcut pref_key_accessibility + pref_key_accessibility_auto_size pref_key_accessibility_font_scale pref_key_accessibility_force_enable_zoom pref_key_advanced diff --git a/app/src/main/res/xml/accessibility_preferences.xml b/app/src/main/res/xml/accessibility_preferences.xml index 4d8b897bd..a810f7620 100644 --- a/app/src/main/res/xml/accessibility_preferences.xml +++ b/app/src/main/res/xml/accessibility_preferences.xml @@ -4,6 +4,11 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + ("pref_key_accessibility_auto_size") } returns switchPreference + + assertEquals( + switchPreference, + fragment.requirePreference(R.string.pref_key_accessibility_auto_size) + ) } @Test diff --git a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt index d6b3ef2c6..18ca08866 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -258,6 +258,19 @@ class SettingsTest { assertEquals(settings.getTabTimeout(), Settings.ONE_MONTH_MS) } + @Test + fun shouldUseAutoSize() { + // When just created + // Then + assertTrue(settings.shouldUseAutoSize) + + // When + settings.shouldUseAutoSize = false + + // Then + assertFalse(settings.shouldUseAutoSize) + } + @Test fun shouldAutofill() { // When just created