• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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