From a0c2c11bbfe0c4643b2f645bbf883b918f4ba857 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 23 Mar 2017 13:13:36 -0700 Subject: [PATCH] Change "When in VR mode" to full screen radio button picker Change-Id: I619af85f9c4a2c32daca786f49e898fde9b593f8 Fix: 36557316 Test: make RunSettingsRoboTests --- res/xml/display_settings.xml | 185 +++++++++--------- .../VrDisplayPreferenceController.java | 33 +--- .../display/VrDisplayPreferencePicker.java | 99 ++++++++++ .../widget/RadioButtonPickerFragment.java | 3 +- .../DefaultAppPickerFragmentTest.java | 1 - .../VrDisplayPreferencePickerTest.java | 82 ++++++++ .../shadow/ShadowSecureSettings.java | 11 ++ 7 files changed, 292 insertions(+), 122 deletions(-) create mode 100644 src/com/android/settings/display/VrDisplayPreferencePicker.java create mode 100644 tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index b4ab7dfa21e..c5e5e936373 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -14,115 +14,116 @@ limitations under the License. --> - + - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/com/android/settings/display/VrDisplayPreferenceController.java b/src/com/android/settings/display/VrDisplayPreferenceController.java index 0eb1c88cd88..4fef987463e 100644 --- a/src/com/android/settings/display/VrDisplayPreferenceController.java +++ b/src/com/android/settings/display/VrDisplayPreferenceController.java @@ -17,17 +17,13 @@ import android.app.ActivityManager; import android.content.Context; import android.content.pm.PackageManager; import android.provider.Settings; -import android.support.v7.preference.DropDownPreference; import android.support.v7.preference.Preference; -import android.util.Log; import com.android.settings.R; import com.android.settings.core.PreferenceController; -public class VrDisplayPreferenceController extends PreferenceController implements - Preference.OnPreferenceChangeListener { +public class VrDisplayPreferenceController extends PreferenceController { - private static final String TAG = "VrDisplayPrefContr"; private static final String KEY_VR_DISPLAY_PREF = "vr_display_pref"; public VrDisplayPreferenceController(Context context) { @@ -47,31 +43,14 @@ public class VrDisplayPreferenceController extends PreferenceController implemen @Override public void updateState(Preference preference) { - final DropDownPreference pref = (DropDownPreference) preference; - pref.setEntries(new CharSequence[]{ - mContext.getString(R.string.display_vr_pref_low_persistence), - mContext.getString(R.string.display_vr_pref_off), - }); - pref.setEntryValues(new CharSequence[]{"0", "1"}); - int currentUser = ActivityManager.getCurrentUser(); int current = Settings.Secure.getIntForUser(mContext.getContentResolver(), - Settings.Secure.VR_DISPLAY_MODE, - /*default*/Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE, + Settings.Secure.VR_DISPLAY_MODE, Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE, currentUser); - pref.setValueIndex(current); - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - int i = Integer.parseInt((String) newValue); - int u = ActivityManager.getCurrentUser(); - if (!Settings.Secure.putIntForUser(mContext.getContentResolver(), - Settings.Secure.VR_DISPLAY_MODE, - i, u)) { - Log.e(TAG, "Could not change setting for " + - Settings.Secure.VR_DISPLAY_MODE); + if (current == 0) { + preference.setSummary(R.string.display_vr_pref_low_persistence); + } else { + preference.setSummary(R.string.display_vr_pref_off); } - return true; } } diff --git a/src/com/android/settings/display/VrDisplayPreferencePicker.java b/src/com/android/settings/display/VrDisplayPreferencePicker.java new file mode 100644 index 00000000000..bccdaa5922f --- /dev/null +++ b/src/com/android/settings/display/VrDisplayPreferencePicker.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.display; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.provider.Settings; +import android.text.TextUtils; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.widget.RadioButtonPickerFragment; + +import java.util.ArrayList; +import java.util.List; + +public class VrDisplayPreferencePicker extends RadioButtonPickerFragment { + + static final String PREF_KEY_PREFIX = "vr_display_pref_"; + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.VR_DISPLAY_PREFERENCE; + } + + @Override + protected List getCandidates() { + List candidates = new ArrayList<>(); + final Context context = getContext(); + candidates.add(new VrCandidateInfo(context, 0, R.string.display_vr_pref_low_persistence)); + candidates.add(new VrCandidateInfo(context, 1, R.string.display_vr_pref_off)); + return candidates; + } + + @Override + protected String getDefaultKey() { + int current = Settings.Secure.getIntForUser(getContext().getContentResolver(), + Settings.Secure.VR_DISPLAY_MODE, Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE, + mUserId); + return PREF_KEY_PREFIX + current; + } + + @Override + protected boolean setDefaultKey(String key) { + if (TextUtils.isEmpty(key)) { + return false; + } + switch (key) { + case PREF_KEY_PREFIX + 0: + return Settings.Secure.putIntForUser(getContext().getContentResolver(), + Settings.Secure.VR_DISPLAY_MODE, 0, mUserId); + case PREF_KEY_PREFIX + 1: + return Settings.Secure.putIntForUser(getContext().getContentResolver(), + Settings.Secure.VR_DISPLAY_MODE, 1, mUserId); + } + return false; + } + + static class VrCandidateInfo extends CandidateInfo { + + public final String label; + public final int value; + + public VrCandidateInfo(Context context, int value, int resId) { + super(true); + this.value = value; + label = context.getString(resId); + } + + @Override + public CharSequence loadLabel() { + return label; + } + + @Override + public Drawable loadIcon() { + return null; + } + + @Override + public String getKey() { + return PREF_KEY_PREFIX + value; + } + } +} diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java index 52e8c538ef6..24445395969 100644 --- a/src/com/android/settings/widget/RadioButtonPickerFragment.java +++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java @@ -141,8 +141,7 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr } for (Map.Entry app : mCandidates.entrySet()) { RadioButtonPreference pref = new RadioButtonPreference(getPrefContext()); - bindPreference( - pref, app.getKey(), app.getValue(), defaultKey); + bindPreference(pref, app.getKey(), app.getValue(), defaultKey); bindPreferenceExtra(pref, app.getKey(), app.getValue(), defaultKey, systemDefaultKey); screen.addPreference(pref); } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java index 2c8817931a5..2d9ae9be6c9 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java @@ -17,7 +17,6 @@ package com.android.settings.applications.defaultapps; -import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; diff --git a/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java b/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java new file mode 100644 index 00000000000..56d4c47fe4f --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.display; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import android.content.ContentResolver; +import android.os.UserHandle; +import android.provider.Settings; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.testutils.shadow.ShadowSecureSettings; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +import java.util.List; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class VrDisplayPreferencePickerTest { + + private VrDisplayPreferencePicker mPicker; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mPicker = spy(new VrDisplayPreferencePicker()); + doReturn(RuntimeEnvironment.application).when(mPicker).getContext(); + } + + @Test + public void verifyMetricsConstant() { + assertThat(mPicker.getMetricsCategory()) + .isEqualTo(MetricsProto.MetricsEvent.VR_DISPLAY_PREFERENCE); + } + + @Test + public void getCandidates_shouldReturnTwoCandidates() { + List candidates = mPicker.getCandidates(); + + assertThat(candidates.size()).isEqualTo(2); + assertThat(candidates.get(0).getKey()) + .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 0); + assertThat(candidates.get(1).getKey()) + .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 1); + } + + @Test + @Config(shadows = ShadowSecureSettings.class) + public void getKey_shouldGetFromSettingsProvider() { + final ContentResolver cr = RuntimeEnvironment.application.getContentResolver(); + Settings.Secure.putIntForUser(cr, Settings.Secure.VR_DISPLAY_MODE, 1, + UserHandle.myUserId()); + + assertThat(mPicker.getDefaultKey()) + .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 1); + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java index 5dd54c0087b..fd4d0d2a2ff 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java @@ -52,6 +52,17 @@ public class ShadowSecureSettings { return getString(resolver, name); } + @Implementation + public static boolean putIntForUser(ContentResolver cr, String name, int value, + int userHandle) { + return putInt(cr, name, value); + } + + @Implementation + public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) { + return getInt(cr, name, def); + } + @Implementation public static int getInt(ContentResolver resolver, String name, int defaultValue) { Integer value = (Integer) mValueMap.get(name);