1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.accessibility; 18 19 import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_HIGH; 20 import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_LOW; 21 import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_MEDIUM; 22 import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_OFF; 23 import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_ON; 24 import static com.google.common.truth.Truth.assertThat; 25 import static org.mockito.Mockito.spy; 26 import static org.mockito.Mockito.when; 27 28 import android.app.Activity; 29 import android.content.Context; 30 import android.content.res.Resources; 31 import android.os.UserManager; 32 import android.os.Vibrator; 33 import android.provider.Settings; 34 35 import com.android.settings.R; 36 import com.android.settings.accessibility.VibrationPreferenceFragment.VibrationIntensityCandidateInfo; 37 import com.android.settings.testutils.FakeFeatureFactory; 38 import com.android.settings.testutils.SettingsRobolectricTestRunner; 39 import com.android.settingslib.widget.CandidateInfo; 40 41 import org.junit.Before; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.mockito.Answers; 45 import org.mockito.Mock; 46 import org.mockito.MockitoAnnotations; 47 import org.robolectric.RuntimeEnvironment; 48 49 import java.util.HashMap; 50 import java.util.List; 51 import java.util.Map; 52 53 @RunWith(SettingsRobolectricTestRunner.class) 54 public class VibrationPreferenceFragmentTest { 55 56 private static final Map<Integer, String> INTENSITY_TO_KEY = new HashMap<>(4); 57 static { INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_OFF, KEY_INTENSITY_OFF)58 INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_OFF, KEY_INTENSITY_OFF); INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_LOW, KEY_INTENSITY_LOW)59 INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_LOW, KEY_INTENSITY_LOW); INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_MEDIUM, KEY_INTENSITY_MEDIUM)60 INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_MEDIUM, KEY_INTENSITY_MEDIUM); INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_HIGH, KEY_INTENSITY_HIGH)61 INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_HIGH, KEY_INTENSITY_HIGH); 62 } 63 64 @Mock 65 private UserManager mUserManager; 66 67 private Context mContext; 68 private Resources mResources; 69 private TestVibrationPreferenceFragment mFragment; 70 71 @Before setUp()72 public void setUp() { 73 MockitoAnnotations.initMocks(this); 74 FakeFeatureFactory.setupForTest(); 75 76 mContext = spy(RuntimeEnvironment.application); 77 mResources = spy(mContext.getResources()); 78 when(mContext.getResources()).thenReturn(mResources); 79 80 mFragment = spy(new TestVibrationPreferenceFragment()); 81 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 82 } 83 84 @Test changeIntensitySetting_shouldResultInCorrespondingKey()85 public void changeIntensitySetting_shouldResultInCorrespondingKey() { 86 setSupportsMultipleIntensities(true); 87 mFragment.onAttach(mContext); 88 for (Map.Entry<Integer, String> entry : INTENSITY_TO_KEY.entrySet()) { 89 Settings.System.putInt(mContext.getContentResolver(), 90 Settings.System.HAPTIC_FEEDBACK_INTENSITY, entry.getKey()); 91 assertThat(mFragment.getDefaultKey()).isEqualTo(entry.getValue()); 92 } 93 } 94 95 @Test changeIntensitySetting_WithoutMultipleIntensitySupport_shouldResultInOn()96 public void changeIntensitySetting_WithoutMultipleIntensitySupport_shouldResultInOn() { 97 setSupportsMultipleIntensities(false); 98 mFragment.onAttach(mContext); 99 for (int intensity : INTENSITY_TO_KEY.keySet()) { 100 Settings.System.putInt(mContext.getContentResolver(), 101 Settings.System.HAPTIC_FEEDBACK_INTENSITY, intensity); 102 final String expectedKey = intensity == Vibrator.VIBRATION_INTENSITY_OFF 103 ? KEY_INTENSITY_OFF 104 : KEY_INTENSITY_ON; 105 assertThat(mFragment.getDefaultKey()).isEqualTo(expectedKey); 106 } 107 } 108 109 @Test initialDefaultKey_shouldBeMedium()110 public void initialDefaultKey_shouldBeMedium() { 111 setSupportsMultipleIntensities(true); 112 mFragment.onAttach(mContext); 113 assertThat(mFragment.getDefaultKey()).isEqualTo(KEY_INTENSITY_MEDIUM); 114 } 115 116 @Test initialDefaultKey_WithoutMultipleIntensitySupport_shouldBeOn()117 public void initialDefaultKey_WithoutMultipleIntensitySupport_shouldBeOn() { 118 setSupportsMultipleIntensities(false); 119 mFragment.onAttach(mContext); 120 assertThat(mFragment.getDefaultKey()).isEqualTo(KEY_INTENSITY_ON); 121 } 122 123 @Test candidates_shouldBeSortedByIntensity()124 public void candidates_shouldBeSortedByIntensity() { 125 setSupportsMultipleIntensities(true); 126 mFragment.onAttach(mContext); 127 final List<? extends CandidateInfo> candidates = mFragment.getCandidates(); 128 assertThat(candidates.size()).isEqualTo(INTENSITY_TO_KEY.size()); 129 VibrationIntensityCandidateInfo prevCandidate = 130 (VibrationIntensityCandidateInfo) candidates.get(0); 131 for (int i = 1; i < candidates.size(); i++) { 132 VibrationIntensityCandidateInfo candidate = 133 (VibrationIntensityCandidateInfo) candidates.get(i); 134 assertThat(candidate.getIntensity()).isLessThan(prevCandidate.getIntensity()); 135 } 136 } 137 setSupportsMultipleIntensities(boolean hasSupport)138 private void setSupportsMultipleIntensities(boolean hasSupport) { 139 when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities)) 140 .thenReturn(hasSupport); 141 } 142 143 private class TestVibrationPreferenceFragment extends VibrationPreferenceFragment { 144 @Override getPreferenceScreenResId()145 protected int getPreferenceScreenResId() { 146 return 0; 147 } 148 149 @Override getMetricsCategory()150 public int getMetricsCategory() { 151 return 0; 152 } 153 154 /** 155 * Get the setting string of the vibration intensity setting this preference is dealing with. 156 */ 157 @Override getVibrationIntensitySetting()158 protected String getVibrationIntensitySetting() { 159 return Settings.System.HAPTIC_FEEDBACK_INTENSITY; 160 } 161 162 @Override getDefaultVibrationIntensity()163 protected int getDefaultVibrationIntensity() { 164 return Vibrator.VIBRATION_INTENSITY_MEDIUM; 165 } 166 167 @Override getContext()168 public Context getContext() { 169 return mContext; 170 } 171 } 172 } 173