1 /* 2 * Copyright (C) 2022 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.display; 18 19 import static android.hardware.devicestate.DeviceState.PROPERTY_EMULATED_ONLY; 20 import static android.hardware.devicestate.DeviceState.PROPERTY_FEATURE_REAR_DISPLAY; 21 import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY; 22 import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY; 23 import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED; 24 import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_HALF_OPEN; 25 import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_OPEN; 26 import static android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_LOCKED; 27 28 import static com.google.common.truth.Truth.assertThat; 29 30 import static org.mockito.Mockito.doReturn; 31 import static org.mockito.Mockito.spy; 32 import static org.mockito.Mockito.when; 33 34 import android.app.settings.SettingsEnums; 35 import android.content.Context; 36 import android.content.res.Resources; 37 import android.hardware.devicestate.DeviceState; 38 import android.hardware.devicestate.DeviceStateManager; 39 40 import com.android.settings.R; 41 import com.android.settingslib.core.AbstractPreferenceController; 42 43 import org.junit.Before; 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 import org.mockito.Mock; 47 import org.mockito.MockitoAnnotations; 48 import org.robolectric.RobolectricTestRunner; 49 import org.robolectric.RuntimeEnvironment; 50 51 import java.util.List; 52 import java.util.Set; 53 54 @RunWith(RobolectricTestRunner.class) 55 public class DeviceStateAutoRotateDetailsFragmentTest { 56 private static final DeviceState DEVICE_STATE_FOLDED = new DeviceState( 57 new DeviceState.Configuration.Builder(/* identifier= */ 0, "FOLDED") 58 .setSystemProperties(Set.of( 59 PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY)) 60 .setPhysicalProperties(Set.of( 61 PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED)) 62 .build()); 63 private static final DeviceState DEVICE_STATE_HALF_FOLDED = new DeviceState( 64 new DeviceState.Configuration.Builder(/* identifier= */ 1, "HALF_FOLDED") 65 .setSystemProperties(Set.of( 66 PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY)) 67 .setPhysicalProperties(Set.of( 68 PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_HALF_OPEN)) 69 .build()); 70 private static final DeviceState DEVICE_STATE_UNFOLDED = new DeviceState( 71 new DeviceState.Configuration.Builder(/* identifier= */ 2, "UNFOLDED") 72 .setSystemProperties(Set.of( 73 PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY)) 74 .setPhysicalProperties(Set.of( 75 PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_OPEN)) 76 .build()); 77 private static final DeviceState DEVICE_STATE_REAR_DISPLAY = new DeviceState( 78 new DeviceState.Configuration.Builder(/* identifier= */ 3, "REAR_DISPLAY") 79 .setSystemProperties(Set.of( 80 PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY, 81 PROPERTY_FEATURE_REAR_DISPLAY, PROPERTY_EMULATED_ONLY)) 82 .setPhysicalProperties(Set.of( 83 PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED)) 84 .build()); 85 86 private final DeviceStateAutoRotateDetailsFragment mFragment = 87 spy(new DeviceStateAutoRotateDetailsFragment()); 88 private final Context mContext = spy(RuntimeEnvironment.application); 89 private final Resources mResources = spy(mContext.getResources()); 90 @Mock 91 private DeviceStateManager mDeviceStateManager; 92 93 @Before setUp()94 public void setUp() throws Exception { 95 MockitoAnnotations.initMocks(this); 96 when(mContext.getResources()).thenReturn(mResources); 97 when(mContext.getApplicationContext()).thenReturn(mContext); 98 when(mFragment.getContext()).thenReturn(mContext); 99 when(mFragment.getResources()).thenReturn(mResources); 100 doReturn(mDeviceStateManager).when(mContext).getSystemService(DeviceStateManager.class); 101 setUpPostureMappings(); 102 } 103 104 @Test getMetricsCategory_returnsAutoRotateSettings()105 public void getMetricsCategory_returnsAutoRotateSettings() { 106 assertThat(mFragment.getMetricsCategory()).isEqualTo( 107 SettingsEnums.DISPLAY_DEVICE_STATE_AUTO_ROTATE_SETTINGS); 108 } 109 110 @Test getPreferenceScreenResId_returnsDeviceStateAutoRotationSettings()111 public void getPreferenceScreenResId_returnsDeviceStateAutoRotationSettings() { 112 assertThat(mFragment.getPreferenceScreenResId()).isEqualTo( 113 R.xml.device_state_auto_rotate_settings); 114 } 115 116 @Test createPreferenceControllers_settableDeviceStates_returnsDeviceStateControllers()117 public void createPreferenceControllers_settableDeviceStates_returnsDeviceStateControllers() { 118 enableDeviceStateSettableRotationStates( 119 new String[]{DEVICE_STATE_FOLDED.getIdentifier() + ":" 120 + DEVICE_STATE_ROTATION_LOCK_LOCKED, 121 DEVICE_STATE_UNFOLDED.getIdentifier() + ":" 122 + DEVICE_STATE_ROTATION_LOCK_LOCKED}, 123 new String[]{"Folded", "Unfolded"}); 124 125 List<AbstractPreferenceController> preferenceControllers = 126 mFragment.createPreferenceControllers(mContext); 127 128 assertThat(preferenceControllers).hasSize(2); 129 assertThat(preferenceControllers.get(0)).isInstanceOf( 130 DeviceStateAutoRotateSettingController.class); 131 assertThat(preferenceControllers.get(1)).isInstanceOf( 132 DeviceStateAutoRotateSettingController.class); 133 } 134 135 @Test createPreferenceControllers_noSettableDeviceStates_returnsEmptyList()136 public void createPreferenceControllers_noSettableDeviceStates_returnsEmptyList() { 137 enableDeviceStateSettableRotationStates(new String[]{}, new String[]{}); 138 139 List<AbstractPreferenceController> preferenceControllers = 140 mFragment.createPreferenceControllers(mContext); 141 142 assertThat(preferenceControllers).isEmpty(); 143 } 144 enableDeviceStateSettableRotationStates(String[] settableStates, String[] settableStatesDescriptions)145 private void enableDeviceStateSettableRotationStates(String[] settableStates, 146 String[] settableStatesDescriptions) { 147 when(mResources.getStringArray( 148 com.android.internal.R.array.config_perDeviceStateRotationLockDefaults)).thenReturn( 149 settableStates); 150 when(mResources.getStringArray( 151 R.array.config_settableAutoRotationDeviceStatesDescriptions)).thenReturn( 152 settableStatesDescriptions); 153 DeviceStateAutoRotateSettingManagerProvider.resetInstance(); 154 when(mContext.getResources()).thenReturn(mResources); 155 } 156 157 // Sets up posture mappings for PosturesHelper setUpPostureMappings()158 private void setUpPostureMappings() { 159 when(mResources.getIntArray( 160 com.android.internal.R.array.config_foldedDeviceStates)).thenReturn( 161 new int[]{DEVICE_STATE_FOLDED.getIdentifier()}); 162 when(mResources.getIntArray( 163 com.android.internal.R.array.config_halfFoldedDeviceStates)).thenReturn( 164 new int[]{DEVICE_STATE_HALF_FOLDED.getIdentifier()}); 165 when(mResources.getIntArray( 166 com.android.internal.R.array.config_openDeviceStates)).thenReturn( 167 new int[]{DEVICE_STATE_UNFOLDED.getIdentifier()}); 168 when(mResources.getIntArray( 169 com.android.internal.R.array.config_rearDisplayDeviceStates)).thenReturn( 170 new int[]{DEVICE_STATE_REAR_DISPLAY.getIdentifier()}); 171 when(mDeviceStateManager.getSupportedDeviceStates()).thenReturn( 172 List.of(DEVICE_STATE_FOLDED, DEVICE_STATE_HALF_FOLDED, DEVICE_STATE_UNFOLDED, 173 DEVICE_STATE_REAR_DISPLAY)); 174 } 175 } 176