From 5aa742bc009c2cb2419b348e8e551c9d22679e78 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Thu, 27 Jun 2019 22:26:45 +0800 Subject: [PATCH] Separate vibration preference controller from accessibility Bug: 135056871 Test: manual, robotests Change-Id: Ic309fd69b68bfa1c3290a696e0987de2621f6dc4 --- res/xml/accessibility_settings.xml | 5 +- .../accessibility/AccessibilitySettings.java | 83 ------------------ .../VibrationPreferenceController.java | 77 ++++++++++++++++ .../AccessibilitySettingsTest.java | 26 ------ .../VibrationPreferenceControllerTest.java | 87 +++++++++++++++++++ 5 files changed, 167 insertions(+), 111 deletions(-) create mode 100644 src/com/android/settings/accessibility/VibrationPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index 8353eadaba5..18c38be69b0 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -123,9 +123,10 @@ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutPreferenceController"/> + android:title="@string/accessibility_vibration_settings_title" + android:fragment="com.android.settings.accessibility.VibrationSettings" + settings:controller="com.android.settings.accessibility.VibrationPreferenceController"/> diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index e3f98f4d1e5..383ea85e227 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -16,8 +16,6 @@ package com.android.settings.accessibility; -import static android.os.Vibrator.VibrationIntensity; - import static com.android.settingslib.TwoTargetPreference.ICON_SIZE_MEDIUM; import android.accessibilityservice.AccessibilityServiceInfo; @@ -33,7 +31,6 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; -import android.os.Vibrator; import android.provider.DeviceConfig; import android.provider.SearchIndexableResource; import android.provider.Settings; @@ -110,8 +107,6 @@ public class AccessibilitySettings extends DashboardFragment implements "captioning_preference_screen"; private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN = "magnification_preference_screen"; - private static final String VIBRATION_PREFERENCE_SCREEN = - "vibration_preference_screen"; private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN = "daltonizer_preference"; private static final String DARK_UI_MODE_PREFERENCE = @@ -198,7 +193,6 @@ public class AccessibilitySettings extends DashboardFragment implements private Preference mAccessibilityShortcutPreferenceScreen; private Preference mDisplayDaltonizerPreferenceScreen; private Preference mHearingAidPreference; - private Preference mVibrationPreferenceScreen; private Preference mLiveCaptionPreference; private SwitchPreference mToggleInversionPreference; private AccessibilityHearingAidPreferenceController mHearingAidPreferenceController; @@ -393,9 +387,6 @@ public class AccessibilitySettings extends DashboardFragment implements // Accessibility shortcut. mAccessibilityShortcutPreferenceScreen = findPreference(ACCESSIBILITY_SHORTCUT_PREFERENCE); - // Vibrations. - mVibrationPreferenceScreen = findPreference(VIBRATION_PREFERENCE_SCREEN); - // Dark Mode. mDarkUIModePreference = findPreference(DARK_UI_MODE_PREFERENCE); mDarkUIPreferenceController = new DarkUIPreferenceController(getContext(), @@ -618,8 +609,6 @@ public class AccessibilitySettings extends DashboardFragment implements mSelectLongPressTimeoutPreference.setValue(value); mSelectLongPressTimeoutPreference.setSummary(mLongPressTimeoutValueToTitleMap.get(value)); - updateVibrationSummary(mVibrationPreferenceScreen); - mHearingAidPreferenceController.updateState(mHearingAidPreference); mLiveCaptionPreferenceController.updateState(mLiveCaptionPreference); @@ -638,78 +627,6 @@ public class AccessibilitySettings extends DashboardFragment implements : R.string.accessibility_feature_state_off); } - @VisibleForTesting - void updateVibrationSummary(Preference pref) { - final Context context = getContext(); - final Vibrator vibrator = context.getSystemService(Vibrator.class); - - int ringIntensity = Settings.System.getInt(context.getContentResolver(), - Settings.System.RING_VIBRATION_INTENSITY, - vibrator.getDefaultRingVibrationIntensity()); - if (Settings.System.getInt(context.getContentResolver(), - Settings.System.VIBRATE_WHEN_RINGING, 0) == 0 && !isRampingRingerEnabled(context)) { - ringIntensity = Vibrator.VIBRATION_INTENSITY_OFF; - } - CharSequence ringIntensityString = - VibrationIntensityPreferenceController.getIntensityString(context, ringIntensity); - - int notificationIntensity = Settings.System.getInt(context.getContentResolver(), - Settings.System.NOTIFICATION_VIBRATION_INTENSITY, - vibrator.getDefaultNotificationVibrationIntensity()); - CharSequence notificationIntensityString = - VibrationIntensityPreferenceController.getIntensityString(context, - notificationIntensity); - - int touchIntensity = Settings.System.getInt(context.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_INTENSITY, - vibrator.getDefaultHapticFeedbackIntensity()); - if (Settings.System.getInt(context.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0) { - touchIntensity = Vibrator.VIBRATION_INTENSITY_OFF; - } - CharSequence touchIntensityString = - VibrationIntensityPreferenceController.getIntensityString(context, touchIntensity); - - if (mVibrationPreferenceScreen == null) { - mVibrationPreferenceScreen = findPreference(VIBRATION_PREFERENCE_SCREEN); - } - - if (ringIntensity == touchIntensity && ringIntensity == notificationIntensity) { - mVibrationPreferenceScreen.setSummary(ringIntensityString); - } else { - mVibrationPreferenceScreen.setSummary( - getString(R.string.accessibility_vibration_summary, - ringIntensityString, - notificationIntensityString, - touchIntensityString)); - } - } - - private String getVibrationSummary(Context context, @VibrationIntensity int intensity) { - final boolean supportsMultipleIntensities = context.getResources().getBoolean( - R.bool.config_vibration_supports_multiple_intensities); - if (supportsMultipleIntensities) { - switch (intensity) { - case Vibrator.VIBRATION_INTENSITY_OFF: - return context.getString(R.string.accessibility_vibration_summary_off); - case Vibrator.VIBRATION_INTENSITY_LOW: - return context.getString(R.string.accessibility_vibration_summary_low); - case Vibrator.VIBRATION_INTENSITY_MEDIUM: - return context.getString(R.string.accessibility_vibration_summary_medium); - case Vibrator.VIBRATION_INTENSITY_HIGH: - return context.getString(R.string.accessibility_vibration_summary_high); - default: - return ""; - } - } else { - if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { - return context.getString(R.string.switch_on_text); - } else { - return context.getString(R.string.switch_off_text); - } - } - } - private void updateAccessibilityShortcut(Preference preference) { if (AccessibilityManager.getInstance(getActivity()) .getInstalledAccessibilityServiceList().isEmpty()) { diff --git a/src/com/android/settings/accessibility/VibrationPreferenceController.java b/src/com/android/settings/accessibility/VibrationPreferenceController.java new file mode 100644 index 00000000000..8bfea34ebda --- /dev/null +++ b/src/com/android/settings/accessibility/VibrationPreferenceController.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2019 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.accessibility; + +import android.content.Context; +import android.os.Vibrator; +import android.provider.Settings; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; + +public class VibrationPreferenceController extends BasePreferenceController { + + private final Vibrator mVibrator; + + public VibrationPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + mVibrator = mContext.getSystemService(Vibrator.class); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public CharSequence getSummary() { + int ringIntensity = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.RING_VIBRATION_INTENSITY, + mVibrator.getDefaultRingVibrationIntensity()); + if (Settings.System.getInt(mContext.getContentResolver(), + Settings.System.VIBRATE_WHEN_RINGING, 0) == 0 + && !AccessibilitySettings.isRampingRingerEnabled(mContext)) { + ringIntensity = Vibrator.VIBRATION_INTENSITY_OFF; + } + final CharSequence ringIntensityString = + VibrationIntensityPreferenceController.getIntensityString(mContext, ringIntensity); + + final int notificationIntensity = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.NOTIFICATION_VIBRATION_INTENSITY, + mVibrator.getDefaultNotificationVibrationIntensity()); + final CharSequence notificationIntensityString = + VibrationIntensityPreferenceController.getIntensityString(mContext, + notificationIntensity); + + int touchIntensity = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_INTENSITY, + mVibrator.getDefaultHapticFeedbackIntensity()); + if (Settings.System.getInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0) { + touchIntensity = Vibrator.VIBRATION_INTENSITY_OFF; + } + final CharSequence touchIntensityString = + VibrationIntensityPreferenceController.getIntensityString(mContext, touchIntensity); + + if (ringIntensity == touchIntensity && ringIntensity == notificationIntensity) { + return ringIntensityString; + } else { + return mContext.getString(R.string.accessibility_vibration_summary, ringIntensityString, + notificationIntensityString, touchIntensityString); + } + } +} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index 7e33bb6fba5..e8828a5398a 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -22,12 +22,9 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.content.Context; -import android.os.Vibrator; import android.provider.DeviceConfig; import android.provider.Settings; -import androidx.preference.Preference; - import com.android.settings.R; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowDeviceConfig; @@ -44,7 +41,6 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class AccessibilitySettingsTest { - private static final String VIBRATION_PREFERENCE_SCREEN = "vibration_preference_screen"; private Context mContext; private AccessibilitySettings mSettings; @@ -67,28 +63,6 @@ public class AccessibilitySettingsTest { assertThat(keys).containsAllIn(niks); } - @Test - public void testUpdateVibrationSummary_shouldUpdateSummary() { - final Preference vibrationPreferenceScreen = new Preference(mContext); - doReturn(vibrationPreferenceScreen).when(mSettings).findPreference( - VIBRATION_PREFERENCE_SCREEN); - - vibrationPreferenceScreen.setKey(VIBRATION_PREFERENCE_SCREEN); - - Settings.System.putInt(mContext.getContentResolver(), - Settings.System.NOTIFICATION_VIBRATION_INTENSITY, - Vibrator.VIBRATION_INTENSITY_OFF); - - Settings.System.putInt(mContext.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_INTENSITY, - Vibrator.VIBRATION_INTENSITY_OFF); - - mSettings.updateVibrationSummary(vibrationPreferenceScreen); - assertThat(vibrationPreferenceScreen.getSummary()).isEqualTo( - VibrationIntensityPreferenceController.getIntensityString(mContext, - Vibrator.VIBRATION_INTENSITY_OFF)); - } - @Test @Config(shadows = {ShadowDeviceConfig.class}) public void testIsRampingRingerEnabled_bothFlagsOn_Enabled() { diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java new file mode 100644 index 00000000000..e4d0f4577e4 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceControllerTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2019 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.accessibility; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.os.Vibrator; +import android.provider.Settings; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class VibrationPreferenceControllerTest { + + private static final String VIBRATION_ON = "On"; + private static final String VIBRATION_OFF = "Off"; + + private Context mContext; + private VibrationPreferenceController mController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mController = new VibrationPreferenceController(mContext, "vibration_pref"); + } + + @Test + public void getAvailabilityStatus_byDefault_shouldReturnAvailable() { + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void getSummary_disabledVibration_shouldReturnOffSummary() { + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); + final String expectedResult = mContext.getString(R.string.switch_off_text); + + assertThat(mController.getSummary()).isEqualTo(expectedResult); + } + + @Test + public void getSummary_enabledSomeVibration_shouldReturnVibrationOnSummary() { + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.VIBRATE_WHEN_RINGING, 1); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1); + final String expectedResult = mContext.getString(R.string.accessibility_vibration_summary, + VIBRATION_ON /* ring */, + VIBRATION_OFF /* notification */, + VIBRATION_ON /* touch */); + + assertThat(mController.getSummary()).isEqualTo(expectedResult); + } +}