Hide color mode preference depending on Accessibility settings
Currently, when certain Accessibility color transforms are enabled, the color mode preference radio buttons are disabled. To avoid confusing users, hide the color mode preference entirely. If the color mode settings screen is already open when the Accessibility transforms are enabled, return the user back to the previous screen. Bug: 77695840 Test: make ROBOTEST_FILTER=ColorModePreferenceFragmentTest RunSettingsRoboTests -j40 Change-Id: I44812713bdc739b843e5806711d25ea950aa6250
This commit is contained in:
@@ -41,7 +41,9 @@ public class ColorModePreferenceController extends BasePreferenceController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvailabilityStatus() {
|
public int getAvailabilityStatus() {
|
||||||
return mConfigWrapper.isScreenWideColorGamut() ? AVAILABLE : DISABLED_FOR_USER;
|
return mConfigWrapper.isScreenWideColorGamut()
|
||||||
|
&& !getColorDisplayController().getAccessibilityTransformActivated() ?
|
||||||
|
AVAILABLE : DISABLED_FOR_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -16,7 +16,6 @@ package com.android.settings.display;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
|
|
||||||
import com.android.internal.app.ColorDisplayController;
|
import com.android.internal.app.ColorDisplayController;
|
||||||
@@ -25,7 +24,6 @@ import com.android.internal.logging.nano.MetricsProto;
|
|||||||
import com.android.settings.applications.LayoutPreference;
|
import com.android.settings.applications.LayoutPreference;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||||
import com.android.settings.widget.RadioButtonPreference;
|
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import com.android.settingslib.widget.CandidateInfo;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -81,14 +79,13 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment
|
|||||||
@Override
|
@Override
|
||||||
protected List<? extends CandidateInfo> getCandidates() {
|
protected List<? extends CandidateInfo> getCandidates() {
|
||||||
Context c = getContext();
|
Context c = getContext();
|
||||||
final boolean enabled = !mController.getAccessibilityTransformActivated();
|
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_natural),
|
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_natural),
|
||||||
KEY_COLOR_MODE_NATURAL, enabled),
|
KEY_COLOR_MODE_NATURAL, true /* enabled */),
|
||||||
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_boosted),
|
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_boosted),
|
||||||
KEY_COLOR_MODE_BOOSTED, enabled),
|
KEY_COLOR_MODE_BOOSTED, true /* enabled */),
|
||||||
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_saturated),
|
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_saturated),
|
||||||
KEY_COLOR_MODE_SATURATED, enabled)
|
KEY_COLOR_MODE_SATURATED, true /* enabled */)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,16 +150,10 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityTransformChanged(boolean state) {
|
public void onAccessibilityTransformChanged(boolean state) {
|
||||||
// Disable controls when a11y transforms are enabled, and vice versa
|
// Color modes are no not configurable when Accessibility transforms are enabled. Close
|
||||||
final PreferenceScreen screen = getPreferenceScreen();
|
// this fragment in that case.
|
||||||
if (screen != null) {
|
if (state) {
|
||||||
final int count = screen.getPreferenceCount();
|
getActivity().onBackPressed();
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
final Preference pref = screen.getPreference(i);
|
|
||||||
if (pref instanceof RadioButtonPreference) {
|
|
||||||
pref.setEnabled(!state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
package com.android.settings.display;
|
package com.android.settings.display;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
|
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.Mockito.doNothing;
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
@@ -25,6 +24,7 @@ import static org.mockito.Mockito.times;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
@@ -34,7 +34,6 @@ import com.android.internal.logging.nano.MetricsProto;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.applications.LayoutPreference;
|
import com.android.settings.applications.LayoutPreference;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.widget.RadioButtonPreference;
|
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import com.android.settingslib.widget.CandidateInfo;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -46,7 +45,6 @@ import org.mockito.MockitoAnnotations;
|
|||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@@ -58,13 +56,13 @@ public class ColorModePreferenceFragmentTest {
|
|||||||
private ColorDisplayController mController;
|
private ColorDisplayController mController;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private PreferenceScreen mScreen;
|
private Activity mActivity;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
mFragment = spy(new ColorModePreferenceFragmentTestable(mScreen));
|
mFragment = spy(new ColorModePreferenceFragment());
|
||||||
ReflectionHelpers.setField(mFragment, "mController", mController);
|
ReflectionHelpers.setField(mFragment, "mController", mController);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,50 +157,8 @@ public class ColorModePreferenceFragmentTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onAccessibilityTransformChanged_toggles() {
|
public void onAccessibilityTransformChanged_toggles() {
|
||||||
final int radioPrefsCount = 3;
|
when(mFragment.getActivity()).thenReturn(mActivity);
|
||||||
List<RadioButtonPreference> radioPrefs = new ArrayList<>();
|
|
||||||
for (int i = 0; i < radioPrefsCount; i++) {
|
|
||||||
radioPrefs.add(mock(RadioButtonPreference.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
when(mScreen.getPreferenceCount()).thenReturn(radioPrefs.size());
|
|
||||||
when(mScreen.getPreference(anyInt())).thenAnswer(invocation -> {
|
|
||||||
final Object[] args = invocation.getArguments();
|
|
||||||
return radioPrefs.get((int) args[0]);
|
|
||||||
});
|
|
||||||
|
|
||||||
mFragment.onAccessibilityTransformChanged(true /* state */);
|
mFragment.onAccessibilityTransformChanged(true /* state */);
|
||||||
for (int i = 0; i < radioPrefsCount; i++) {
|
verify(mActivity).onBackPressed();
|
||||||
verify(radioPrefs.get(i)).setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
mFragment.onAccessibilityTransformChanged(false /* state */);
|
|
||||||
for (int i = 0; i < radioPrefsCount; i++) {
|
|
||||||
verify(radioPrefs.get(i)).setEnabled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ColorModePreferenceFragmentTestable
|
|
||||||
extends ColorModePreferenceFragment {
|
|
||||||
|
|
||||||
private final PreferenceScreen mPreferenceScreen;
|
|
||||||
|
|
||||||
private ColorModePreferenceFragmentTestable(PreferenceScreen screen) {
|
|
||||||
mPreferenceScreen = screen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A method to return a mock PreferenceScreen.
|
|
||||||
* A real ColorModePreferenceFragment calls super.getPreferenceScreen() to get its
|
|
||||||
* PreferenceScreen handle, which internally dereferenced a PreferenceManager. But in this
|
|
||||||
* test scenario, the PreferenceManager object is uninitialized, so we need to supply the
|
|
||||||
* PreferenceScreen directly.
|
|
||||||
*
|
|
||||||
* @return a mock PreferenceScreen
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PreferenceScreen getPreferenceScreen() {
|
|
||||||
return mPreferenceScreen;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user