1 /*
2  * Copyright (C) 2021 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.gestures;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.anyInt;
22 import static org.mockito.Mockito.mock;
23 import static org.mockito.Mockito.spy;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26 
27 import android.app.Application;
28 import android.content.res.Resources;
29 import android.provider.Settings;
30 
31 import androidx.annotation.StringRes;
32 import androidx.preference.Preference;
33 import androidx.test.core.app.ApplicationProvider;
34 
35 import com.android.settings.R;
36 
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.junit.runner.RunWith;
40 import org.mockito.MockitoAnnotations;
41 import org.mockito.stubbing.Answer;
42 import org.robolectric.RobolectricTestRunner;
43 
44 @RunWith(RobolectricTestRunner.class)
45 public class LongPressPowerButtonPreferenceControllerTest {
46 
47     private static final String KEY_LONG_PRESS_POWER_BUTTON =
48             "gesture_power_menu_long_press_for_assist";
49 
50     private Application mContext;
51     private Resources mResources;
52     private LongPressPowerButtonPreferenceController mController;
53 
54     @Before
setUp()55     public void setUp() {
56         MockitoAnnotations.initMocks(this);
57         mContext = spy(ApplicationProvider.getApplicationContext());
58         mResources = mock(Resources.class);
59         when(mContext.getResources()).thenReturn(mResources);
60         when(mResources.getString(anyInt())).thenAnswer((Answer<String>) invocation -> {
61             int id = invocation.getArgument(0);
62             return getString(id);
63         });
64         when(mResources.getBoolean(
65                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable))
66                 .thenReturn(true);
67         mController = new LongPressPowerButtonPreferenceController(mContext,
68                 KEY_LONG_PRESS_POWER_BUTTON);
69         mController.mAssistSwitch = mock(Preference.class);
70         mController.mFooterHint = mock(Preference.class);
71     }
72 
73     @Test
isAvailable_configIsTrue_shouldReturnTrue()74     public void isAvailable_configIsTrue_shouldReturnTrue() {
75         when(mResources.getBoolean(
76                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable))
77                 .thenReturn(true);
78 
79         assertThat(mController.isAvailable()).isTrue();
80     }
81 
82     @Test
isAvailable_configIsFalse_shouldReturnFalse()83     public void isAvailable_configIsFalse_shouldReturnFalse() {
84         when(mResources.getBoolean(
85                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable))
86                 .thenReturn(false);
87 
88         assertThat(mController.isAvailable()).isFalse();
89     }
90 
91     @Test
preferenceChecked_powerMenuHintTextShown()92     public void preferenceChecked_powerMenuHintTextShown() {
93         mController.onPreferenceChange(null, true);
94 
95         verify(mController.mFooterHint).setSummary(
96                 getString(
97                         R.string.power_menu_power_volume_up_hint));
98         verify(mController.mFooterHint).setVisible(true);
99     }
100 
101 
102     @Test
preferenceUnchecked_keyChordEnabled_powerMenuHintTextShown()103     public void preferenceUnchecked_keyChordEnabled_powerMenuHintTextShown() {
104         when(mResources.getInteger(
105                 com.android.internal.R.integer.config_keyChordPowerVolumeUp))
106                 .thenReturn(
107                  LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
108 
109         mController.onPreferenceChange(null, false);
110 
111         verify(mController.mFooterHint).setSummary(
112                 getString(
113                         R.string.power_menu_power_volume_up_hint));
114         verify(mController.mFooterHint).setVisible(true);
115     }
116 
117     @Test
preferenceChecked_hushGestureEnabled_powerMenuHintTextIncludesHushHint()118     public void preferenceChecked_hushGestureEnabled_powerMenuHintTextIncludesHushHint() {
119         when(mResources.getBoolean(
120                 com.android.internal.R.bool.config_volumeHushGestureEnabled))
121                 .thenReturn(true);
122 
123         mController.onPreferenceChange(null, true);
124 
125         verify(mController.mFooterHint).setSummary(
126                 getString(
127                         R.string.power_menu_power_volume_up_hint) + "\n\n"
128                         + getString(
129                         R.string.power_menu_power_prevent_ringing_hint));
130         verify(mController.mFooterHint).setVisible(true);
131     }
132 
133 
134     @Test
preferenceUnchecked_keyChordDisabled_powerMenuHintTextHidden()135     public void preferenceUnchecked_keyChordDisabled_powerMenuHintTextHidden() {
136         mController.onPreferenceChange(null, false);
137         when(mResources.getInteger(
138                 com.android.internal.R.integer.config_keyChordPowerVolumeUp))
139                 .thenReturn(
140                      LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
141 
142         verify(mController.mFooterHint).setVisible(false);
143     }
144 
145     @Test
preferenceChecked_longPressPowerSettingSetToAssistant()146     public void preferenceChecked_longPressPowerSettingSetToAssistant() {
147         mController.onPreferenceChange(null, true);
148 
149         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
150                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
151                 PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE);
152         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
153                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
154                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
155         verify(mController.mAssistSwitch).setSummary(
156                 getString(
157                         R.string.power_menu_summary_long_press_for_assist_enabled));
158     }
159 
160     @Test
preferenceUnchecked_longPressPowerSettingSetToDefaultValue()161     public void preferenceUnchecked_longPressPowerSettingSetToDefaultValue() {
162         when(mResources.getInteger(
163                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
164                 .thenReturn(
165                         PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
166 
167         mController.onPreferenceChange(null, false);
168 
169         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
170                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
171                 PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
172         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
173                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
174                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
175         verify(mController.mAssistSwitch).setSummary(
176                 getString(
177                       R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
178     }
179 
180     @Test
preferenceUnchecked_muteChordDefault_longPressPowerSettingSetToDefaultValue()181     public void preferenceUnchecked_muteChordDefault_longPressPowerSettingSetToDefaultValue() {
182         // Value out of range chosen deliberately.
183         when(mResources.getInteger(
184                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
185                 .thenReturn(8);
186         when(mResources.getInteger(
187                 com.android.internal.R.integer.config_keyChordPowerVolumeUp))
188                 .thenReturn(
189                     LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
190 
191         mController.onPreferenceChange(null, false);
192 
193         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
194                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8);
195         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
196                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
197                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
198     }
199 
200     @Test
preferenceUnchecked_assistDefault_setNoAction()201     public void preferenceUnchecked_assistDefault_setNoAction() {
202         // Ensure that the Assistant is the default behavior for LPP.
203         when(mResources.getInteger(
204                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
205                 .thenReturn(
206                         PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE);
207 
208         mController.onPreferenceChange(null, false);
209 
210         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
211                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
212                 PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
213         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
214                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
215                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
216         verify(mController.mAssistSwitch).setSummary(getString(
217                     R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
218     }
219 
getString(@tringRes int id)220     private String getString(@StringRes int id) {
221         return ApplicationProvider.getApplicationContext().getString(id);
222     }
223 }
224