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