From b3eea625ec589e2f180ab079f44ef37f346927c4 Mon Sep 17 00:00:00 2001 From: Riley Jones Date: Tue, 5 Nov 2024 23:08:44 +0000 Subject: [PATCH] Caption settings cleanup Bug: 353757664 Test: atest com.android.settings.accessibility Test: Manually verify conditions described in bug Flag: com.android.settings.accessibility.fix_a11y_settings_search Change-Id: Iff25702843e5dd3e7ebcca1a13f190d48cf83e7a --- .../CaptioningCustomController.java | 39 ++++++++++++------- .../CaptioningWindowColorController.java | 20 ++++++++-- .../CaptioningWindowOpacityController.java | 20 ++++++++-- .../CaptioningCustomControllerTest.java | 28 ++++++++++++- .../CaptioningWindowColorControllerTest.java | 29 +++++++++++++- ...CaptioningWindowOpacityControllerTest.java | 31 ++++++++++++++- 6 files changed, 142 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/accessibility/CaptioningCustomController.java b/src/com/android/settings/accessibility/CaptioningCustomController.java index 28a99a7d254..1b5b7e161e8 100644 --- a/src/com/android/settings/accessibility/CaptioningCustomController.java +++ b/src/com/android/settings/accessibility/CaptioningCustomController.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility; +import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; import android.os.Handler; @@ -39,6 +40,7 @@ import java.util.List; public class CaptioningCustomController extends BasePreferenceController implements LifecycleObserver, OnStart, OnStop { + @Nullable private Preference mCustom; private final CaptionHelper mCaptionHelper; private final ContentResolver mContentResolver; @@ -50,32 +52,41 @@ public class CaptioningCustomController extends BasePreferenceController ); public CaptioningCustomController(Context context, String preferenceKey) { - super(context, preferenceKey); - mCaptionHelper = new CaptionHelper(context); - mContentResolver = context.getContentResolver(); - mSettingsContentObserver = new AccessibilitySettingsContentObserver( - new Handler(Looper.getMainLooper())); - mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS, - key -> refreshShowingCustom()); + this(context, preferenceKey, new CaptionHelper(context), + new AccessibilitySettingsContentObserver(new Handler(Looper.getMainLooper()))); } @VisibleForTesting - CaptioningCustomController(Context context, String preferenceKey, + CaptioningCustomController( + Context context, String preferenceKey, CaptionHelper captionHelper, AccessibilitySettingsContentObserver contentObserver) { - this(context, preferenceKey); + super(context, preferenceKey); + mCaptionHelper = new CaptionHelper(context); + mContentResolver = context.getContentResolver(); mSettingsContentObserver = contentObserver; + mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS, key -> { + if (mCustom != null) { + mCustom.setVisible(shouldShowPreference()); + } + }); } @Override public int getAvailabilityStatus() { - return AVAILABLE; + if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) { + return (shouldShowPreference()) ? AVAILABLE : AVAILABLE_UNSEARCHABLE; + } else { + return AVAILABLE; + } } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mCustom = screen.findPreference(getPreferenceKey()); - refreshShowingCustom(); + if (mCustom != null) { + mCustom.setVisible(shouldShowPreference()); + } } @Override @@ -88,9 +99,7 @@ public class CaptioningCustomController extends BasePreferenceController mSettingsContentObserver.unregister(mContentResolver); } - private void refreshShowingCustom() { - final boolean isCustomPreset = - mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM; - mCustom.setVisible(isCustomPreset); + private boolean shouldShowPreference() { + return mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM; } } diff --git a/src/com/android/settings/accessibility/CaptioningWindowColorController.java b/src/com/android/settings/accessibility/CaptioningWindowColorController.java index 238a75a8b6a..b72b9739084 100644 --- a/src/com/android/settings/accessibility/CaptioningWindowColorController.java +++ b/src/com/android/settings/accessibility/CaptioningWindowColorController.java @@ -19,10 +19,12 @@ package com.android.settings.accessibility; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; +import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager.CaptionStyle; import androidx.preference.PreferenceScreen; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener; import com.android.settings.core.BasePreferenceController; @@ -34,14 +36,26 @@ public class CaptioningWindowColorController extends BasePreferenceController private final CaptionHelper mCaptionHelper; private int mCachedNonDefaultOpacity = CaptionStyle.COLOR_UNSPECIFIED; - public CaptioningWindowColorController(Context context, String preferenceKey) { + @VisibleForTesting + CaptioningWindowColorController(Context context, String preferenceKey, + CaptionHelper captionHelper) { super(context, preferenceKey); - mCaptionHelper = new CaptionHelper(context); + mCaptionHelper = captionHelper; + } + + public CaptioningWindowColorController(Context context, String preferenceKey) { + this(context, preferenceKey, new CaptionHelper(context)); } @Override public int getAvailabilityStatus() { - return AVAILABLE; + if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) { + return (mCaptionHelper.getRawUserStyle() + == CaptioningManager.CaptionStyle.PRESET_CUSTOM) + ? AVAILABLE : AVAILABLE_UNSEARCHABLE; + } else { + return AVAILABLE; + } } @Override diff --git a/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java b/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java index ef288039780..0e6c6ff4822 100644 --- a/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java +++ b/src/com/android/settings/accessibility/CaptioningWindowOpacityController.java @@ -18,9 +18,11 @@ package com.android.settings.accessibility; import android.content.Context; import android.content.res.Resources; +import android.view.accessibility.CaptioningManager; import androidx.preference.PreferenceScreen; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener; import com.android.settings.core.BasePreferenceController; @@ -31,14 +33,26 @@ public class CaptioningWindowOpacityController extends BasePreferenceController private final CaptionHelper mCaptionHelper; - public CaptioningWindowOpacityController(Context context, String preferenceKey) { + @VisibleForTesting + CaptioningWindowOpacityController(Context context, String preferenceKey, + CaptionHelper captionHelper) { super(context, preferenceKey); - mCaptionHelper = new CaptionHelper(context); + mCaptionHelper = captionHelper; + } + + public CaptioningWindowOpacityController(Context context, String preferenceKey) { + this(context, preferenceKey, new CaptionHelper(context)); } @Override public int getAvailabilityStatus() { - return AVAILABLE; + if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) { + return (mCaptionHelper.getRawUserStyle() + == CaptioningManager.CaptionStyle.PRESET_CUSTOM) + ? AVAILABLE : AVAILABLE_UNSEARCHABLE; + } else { + return AVAILABLE; + } } @Override diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java index 838d9e04b7b..e0e5d4981b6 100644 --- a/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningCustomControllerTest.java @@ -23,6 +23,9 @@ import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.Context; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.view.accessibility.CaptioningManager.CaptionStyle; @@ -49,6 +52,8 @@ public class CaptioningCustomControllerTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Mock private PreferenceScreen mScreen; @Mock @@ -57,22 +62,43 @@ public class CaptioningCustomControllerTest { private ContentResolver mContentResolver; private CaptioningCustomController mController; private Preference mPreference; + private CaptionHelper mCaptionHelper; @Before public void setUp() { mContentResolver = mContext.getContentResolver(); - mController = new CaptioningCustomController(mContext, PREF_KEY, + mCaptionHelper = new CaptionHelper(mContext); + mController = new CaptioningCustomController(mContext, PREF_KEY, mCaptionHelper, mAccessibilitySettingsContentObserver); mPreference = new Preference(mContext); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); } @Test + @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getAvailabilityStatus_shouldReturnAvailable() { assertThat(mController.getAvailabilityStatus()) .isEqualTo(BasePreferenceController.AVAILABLE); } + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_customCaption_shouldReturnAvailable() { + mCaptionHelper.setRawUserStyle(CaptionStyle.PRESET_CUSTOM); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_notCustom_shouldReturnUnsearchable() { + mCaptionHelper.setRawUserStyle(0); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE); + } + @Test public void displayPreference_byDefault_shouldIsInvisible() { diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java index 12582145c20..e39c57e8837 100644 --- a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowColorControllerTest.java @@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.util.AttributeSet; import android.view.accessibility.CaptioningManager; @@ -53,16 +56,21 @@ public class CaptioningWindowColorControllerTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Mock private PreferenceScreen mScreen; private final Context mContext = ApplicationProvider.getApplicationContext(); private CaptioningWindowColorController mController; private ColorPreference mPreference; private ShadowCaptioningManager mShadowCaptioningManager; + private CaptionHelper mCaptionHelper; @Before public void setUp() { - mController = new CaptioningWindowColorController(mContext, "captioning_window_color"); + mCaptionHelper = new CaptionHelper(mContext); + mController = new CaptioningWindowColorController( + mContext, "captioning_window_color", mCaptionHelper); final AttributeSet attributeSet = Robolectric.buildAttributeSet().build(); mPreference = new ColorPreference(mContext, attributeSet); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); @@ -71,11 +79,30 @@ public class CaptioningWindowColorControllerTest { } @Test + @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getAvailabilityStatus_shouldReturnAvailable() { assertThat(mController.getAvailabilityStatus()) .isEqualTo(BasePreferenceController.AVAILABLE); } + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_customCaption_shouldReturnAvailable() { + mCaptionHelper.setRawUserStyle(CaptionStyle.PRESET_CUSTOM); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_noCustom_shouldReturnUnsearchable() { + mCaptionHelper.setRawUserStyle(0); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE); + } + @Test public void getSummary_defaultValue_shouldReturnNone() { mController.displayPreference(mScreen); diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java index 0e872a09d09..2b41eb053d9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/CaptioningWindowOpacityControllerTest.java @@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.util.AttributeSet; import android.view.accessibility.CaptioningManager; @@ -48,19 +51,24 @@ import org.robolectric.shadows.ShadowCaptioningManager; /** Tests for {@link CaptioningWindowOpacityController}. */ @RunWith(RobolectricTestRunner.class) public class CaptioningWindowOpacityControllerTest { - @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + @Mock private PreferenceScreen mScreen; private final Context mContext = ApplicationProvider.getApplicationContext(); private CaptioningWindowOpacityController mController; private ColorPreference mPreference; private ShadowCaptioningManager mShadowCaptioningManager; + private CaptionHelper mCaptionHelper; @Before public void setUp() { - mController = new CaptioningWindowOpacityController(mContext, "captioning_window_opacity"); + mCaptionHelper = new CaptionHelper(mContext); + mController = new CaptioningWindowOpacityController( + mContext, "captioning_window_opacity", mCaptionHelper); final AttributeSet attributeSet = Robolectric.buildAttributeSet().build(); mPreference = new ColorPreference(mContext, attributeSet); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); @@ -69,11 +77,30 @@ public class CaptioningWindowOpacityControllerTest { } @Test + @DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getAvailabilityStatus_shouldReturnAvailable() { assertThat(mController.getAvailabilityStatus()) .isEqualTo(BasePreferenceController.AVAILABLE); } + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_customCaption_shouldReturnAvailable() { + mCaptionHelper.setRawUserStyle(CaptioningManager.CaptionStyle.PRESET_CUSTOM); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + @EnableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) + public void getAvailabilityStatus_notCustom_shouldReturnUnsearchable() { + mCaptionHelper.setRawUserStyle(0); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE_UNSEARCHABLE); + } + @Test public void getSummary_defaultValue_shouldReturnNonTransparent() { mController.displayPreference(mScreen);