Merge "Caption settings cleanup" into main

This commit is contained in:
Riley Jones
2024-11-08 21:06:11 +00:00
committed by Android (Google) Code Review
6 changed files with 142 additions and 25 deletions

View File

@@ -16,6 +16,7 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import android.annotation.Nullable;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
@@ -39,6 +40,7 @@ import java.util.List;
public class CaptioningCustomController extends BasePreferenceController public class CaptioningCustomController extends BasePreferenceController
implements LifecycleObserver, OnStart, OnStop { implements LifecycleObserver, OnStart, OnStop {
@Nullable
private Preference mCustom; private Preference mCustom;
private final CaptionHelper mCaptionHelper; private final CaptionHelper mCaptionHelper;
private final ContentResolver mContentResolver; private final ContentResolver mContentResolver;
@@ -50,32 +52,41 @@ public class CaptioningCustomController extends BasePreferenceController
); );
public CaptioningCustomController(Context context, String preferenceKey) { public CaptioningCustomController(Context context, String preferenceKey) {
super(context, preferenceKey); this(context, preferenceKey, new CaptionHelper(context),
mCaptionHelper = new CaptionHelper(context); new AccessibilitySettingsContentObserver(new Handler(Looper.getMainLooper())));
mContentResolver = context.getContentResolver();
mSettingsContentObserver = new AccessibilitySettingsContentObserver(
new Handler(Looper.getMainLooper()));
mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS,
key -> refreshShowingCustom());
} }
@VisibleForTesting @VisibleForTesting
CaptioningCustomController(Context context, String preferenceKey, CaptioningCustomController(
Context context, String preferenceKey, CaptionHelper captionHelper,
AccessibilitySettingsContentObserver contentObserver) { AccessibilitySettingsContentObserver contentObserver) {
this(context, preferenceKey); super(context, preferenceKey);
mCaptionHelper = new CaptionHelper(context);
mContentResolver = context.getContentResolver();
mSettingsContentObserver = contentObserver; mSettingsContentObserver = contentObserver;
mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS, key -> {
if (mCustom != null) {
mCustom.setVisible(shouldShowPreference());
}
});
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
return (shouldShowPreference()) ? AVAILABLE : AVAILABLE_UNSEARCHABLE;
} else {
return AVAILABLE; return AVAILABLE;
} }
}
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mCustom = screen.findPreference(getPreferenceKey()); mCustom = screen.findPreference(getPreferenceKey());
refreshShowingCustom(); if (mCustom != null) {
mCustom.setVisible(shouldShowPreference());
}
} }
@Override @Override
@@ -88,9 +99,7 @@ public class CaptioningCustomController extends BasePreferenceController
mSettingsContentObserver.unregister(mContentResolver); mSettingsContentObserver.unregister(mContentResolver);
} }
private void refreshShowingCustom() { private boolean shouldShowPreference() {
final boolean isCustomPreset = return mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM;
mCaptionHelper.getRawUserStyle() == CaptioningManager.CaptionStyle.PRESET_CUSTOM;
mCustom.setVisible(isCustomPreset);
} }
} }

View File

@@ -19,10 +19,12 @@ package com.android.settings.accessibility;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.view.accessibility.CaptioningManager;
import android.view.accessibility.CaptioningManager.CaptionStyle; import android.view.accessibility.CaptioningManager.CaptionStyle;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener; import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
@@ -34,15 +36,27 @@ public class CaptioningWindowColorController extends BasePreferenceController
private final CaptionHelper mCaptionHelper; private final CaptionHelper mCaptionHelper;
private int mCachedNonDefaultOpacity = CaptionStyle.COLOR_UNSPECIFIED; private int mCachedNonDefaultOpacity = CaptionStyle.COLOR_UNSPECIFIED;
public CaptioningWindowColorController(Context context, String preferenceKey) { @VisibleForTesting
CaptioningWindowColorController(Context context, String preferenceKey,
CaptionHelper captionHelper) {
super(context, preferenceKey); super(context, preferenceKey);
mCaptionHelper = new CaptionHelper(context); mCaptionHelper = captionHelper;
}
public CaptioningWindowColorController(Context context, String preferenceKey) {
this(context, preferenceKey, new CaptionHelper(context));
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
return (mCaptionHelper.getRawUserStyle()
== CaptioningManager.CaptionStyle.PRESET_CUSTOM)
? AVAILABLE : AVAILABLE_UNSEARCHABLE;
} else {
return AVAILABLE; return AVAILABLE;
} }
}
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {

View File

@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.view.accessibility.CaptioningManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener; import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
@@ -31,15 +33,27 @@ public class CaptioningWindowOpacityController extends BasePreferenceController
private final CaptionHelper mCaptionHelper; private final CaptionHelper mCaptionHelper;
public CaptioningWindowOpacityController(Context context, String preferenceKey) { @VisibleForTesting
CaptioningWindowOpacityController(Context context, String preferenceKey,
CaptionHelper captionHelper) {
super(context, preferenceKey); super(context, preferenceKey);
mCaptionHelper = new CaptionHelper(context); mCaptionHelper = captionHelper;
}
public CaptioningWindowOpacityController(Context context, String preferenceKey) {
this(context, preferenceKey, new CaptionHelper(context));
} }
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
if (com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {
return (mCaptionHelper.getRawUserStyle()
== CaptioningManager.CaptionStyle.PRESET_CUSTOM)
? AVAILABLE : AVAILABLE_UNSEARCHABLE;
} else {
return AVAILABLE; return AVAILABLE;
} }
}
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {

View File

@@ -23,6 +23,9 @@ import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; 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.provider.Settings;
import android.view.accessibility.CaptioningManager.CaptionStyle; import android.view.accessibility.CaptioningManager.CaptionStyle;
@@ -49,6 +52,8 @@ public class CaptioningCustomControllerTest {
@Rule @Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule(); public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock @Mock
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
@Mock @Mock
@@ -57,22 +62,43 @@ public class CaptioningCustomControllerTest {
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
private CaptioningCustomController mController; private CaptioningCustomController mController;
private Preference mPreference; private Preference mPreference;
private CaptionHelper mCaptionHelper;
@Before @Before
public void setUp() { public void setUp() {
mContentResolver = mContext.getContentResolver(); mContentResolver = mContext.getContentResolver();
mController = new CaptioningCustomController(mContext, PREF_KEY, mCaptionHelper = new CaptionHelper(mContext);
mController = new CaptioningCustomController(mContext, PREF_KEY, mCaptionHelper,
mAccessibilitySettingsContentObserver); mAccessibilitySettingsContentObserver);
mPreference = new Preference(mContext); mPreference = new Preference(mContext);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
} }
@Test @Test
@DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() { public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus()) assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE); .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 @Test
public void displayPreference_byDefault_shouldIsInvisible() { public void displayPreference_byDefault_shouldIsInvisible() {

View File

@@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; 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.provider.Settings;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager;
@@ -53,16 +56,21 @@ public class CaptioningWindowColorControllerTest {
@Rule @Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule(); public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock @Mock
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
private final Context mContext = ApplicationProvider.getApplicationContext(); private final Context mContext = ApplicationProvider.getApplicationContext();
private CaptioningWindowColorController mController; private CaptioningWindowColorController mController;
private ColorPreference mPreference; private ColorPreference mPreference;
private ShadowCaptioningManager mShadowCaptioningManager; private ShadowCaptioningManager mShadowCaptioningManager;
private CaptionHelper mCaptionHelper;
@Before @Before
public void setUp() { 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(); final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
mPreference = new ColorPreference(mContext, attributeSet); mPreference = new ColorPreference(mContext, attributeSet);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -71,11 +79,30 @@ public class CaptioningWindowColorControllerTest {
} }
@Test @Test
@DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() { public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus()) assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE); .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 @Test
public void getSummary_defaultValue_shouldReturnNone() { public void getSummary_defaultValue_shouldReturnNone() {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);

View File

@@ -24,6 +24,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; 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.provider.Settings;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager;
@@ -48,19 +51,24 @@ import org.robolectric.shadows.ShadowCaptioningManager;
/** Tests for {@link CaptioningWindowOpacityController}. */ /** Tests for {@link CaptioningWindowOpacityController}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class CaptioningWindowOpacityControllerTest { public class CaptioningWindowOpacityControllerTest {
@Rule @Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule(); public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock @Mock
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
private final Context mContext = ApplicationProvider.getApplicationContext(); private final Context mContext = ApplicationProvider.getApplicationContext();
private CaptioningWindowOpacityController mController; private CaptioningWindowOpacityController mController;
private ColorPreference mPreference; private ColorPreference mPreference;
private ShadowCaptioningManager mShadowCaptioningManager; private ShadowCaptioningManager mShadowCaptioningManager;
private CaptionHelper mCaptionHelper;
@Before @Before
public void setUp() { 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(); final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
mPreference = new ColorPreference(mContext, attributeSet); mPreference = new ColorPreference(mContext, attributeSet);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -69,11 +77,30 @@ public class CaptioningWindowOpacityControllerTest {
} }
@Test @Test
@DisableFlags(Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH)
public void getAvailabilityStatus_shouldReturnAvailable() { public void getAvailabilityStatus_shouldReturnAvailable() {
assertThat(mController.getAvailabilityStatus()) assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE); .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 @Test
public void getSummary_defaultValue_shouldReturnNonTransparent() { public void getSummary_defaultValue_shouldReturnNonTransparent() {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);