Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5aa742bc authored by Mill Chen's avatar Mill Chen
Browse files

Separate vibration preference controller from accessibility

Bug: 135056871
Test: manual, robotests
Change-Id: Ic309fd69b68bfa1c3290a696e0987de2621f6dc4
parent 79ce2c95
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -123,9 +123,10 @@
            settings:controller="com.android.settings.accessibility.AccessibilityTimeoutPreferenceController"/>

        <Preference
            android:fragment="com.android.settings.accessibility.VibrationSettings"
            android:key="vibration_preference_screen"
            android:title="@string/accessibility_vibration_settings_title"/>
            android:title="@string/accessibility_vibration_settings_title"
            android:fragment="com.android.settings.accessibility.VibrationSettings"
            settings:controller="com.android.settings.accessibility.VibrationPreferenceController"/>

    </PreferenceCategory>

+0 −83
Original line number Diff line number Diff line
@@ -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()) {
+77 −0
Original line number Diff line number Diff line
/*
 * 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);
        }
    }
}
+0 −26
Original line number Diff line number Diff line
@@ -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() {
+87 −0
Original line number Diff line number Diff line
/*
 * 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);
    }
}