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