• 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.users;
18 
19 import static android.provider.Settings.Secure.TIMEOUT_TO_DOCK_USER;
20 
21 import static com.google.common.truth.Truth.assertThat;
22 
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
26 
27 import android.content.Context;
28 import android.content.res.Resources;
29 import android.os.UserHandle;
30 import android.os.UserManager;
31 import android.provider.Settings;
32 
33 import androidx.test.core.app.ApplicationProvider;
34 
35 import com.android.settings.R;
36 import com.android.settings.core.BasePreferenceController;
37 import com.android.settings.fuelgauge.BatteryBackupHelperTest.ShadowUserHandle;
38 import com.android.settings.testutils.shadow.ShadowSecureSettings;
39 
40 import org.junit.After;
41 import org.junit.Before;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 import org.robolectric.RobolectricTestRunner;
47 import org.robolectric.annotation.Config;
48 
49 @RunWith(RobolectricTestRunner.class)
50 @Config(shadows = {ShadowSecureSettings.class, ShadowUserHandle.class})
51 public class TimeoutToDockUserPreferenceControllerTest {
52     private Context mContext;
53     private Resources mResources;
54     private TimeoutToDockUserPreferenceController mController;
55 
56     @Mock
57     private UserManager mUserManager;
58 
59     private static final String FAKE_PREFERENCE_KEY = "timeout_to_dock_user_preference";
60 
61     private String[] mEntries;
62     private String[] mValues;
63 
64     @Before
setUp()65     public void setUp() {
66         MockitoAnnotations.initMocks(this);
67 
68         mContext = spy(ApplicationProvider.getApplicationContext());
69         mResources = spy(mContext.getResources());
70         doReturn(mResources).when(mContext).getResources();
71         when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
72 
73         mEntries = mResources.getStringArray(
74                 R.array.switch_to_dock_user_when_docked_timeout_entries);
75         mValues = mResources.getStringArray(
76                 R.array.switch_to_dock_user_when_docked_timeout_values);
77 
78         mController = new TimeoutToDockUserPreferenceController(mContext, FAKE_PREFERENCE_KEY);
79 
80         // Feature enabled.
81         when(mResources.getBoolean(
82                 com.android.internal.R.bool.config_enableTimeoutToDockUserWhenDocked)).thenReturn(
83                 true);
84 
85         // Multi-user feature enabled.
86         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED,
87                 1);
88 
89         // User switching not blocked.
90         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
91 
92         // Set to user 1;
93         ShadowUserHandle.setUid(1);
94     }
95 
96     @After
tearDown()97     public void tearDown() {
98         ShadowUserHandle.reset();
99     }
100 
101     @Test
getAvailabilityStatus_featureFlagDisabled_returnUnsupportedOnDevice()102     public void getAvailabilityStatus_featureFlagDisabled_returnUnsupportedOnDevice() {
103         when(mResources.getBoolean(
104                 com.android.internal.R.bool.config_enableTimeoutToDockUserWhenDocked)).thenReturn(
105                 false);
106 
107         assertThat(mController.getAvailabilityStatus()).isEqualTo(
108                 BasePreferenceController.UNSUPPORTED_ON_DEVICE);
109     }
110 
111     @Test
getAvailabilityStatus_multiUserDisabled_returnConditionallyUnavailable()112     public void getAvailabilityStatus_multiUserDisabled_returnConditionallyUnavailable() {
113         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED,
114                 0);
115 
116         assertThat(mController.getAvailabilityStatus()).isEqualTo(
117                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
118     }
119 
120     @Test
getAvailabilityStatus_userSwitchingBlocked_returnConditionallyUnavailable()121     public void getAvailabilityStatus_userSwitchingBlocked_returnConditionallyUnavailable() {
122         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
123 
124         assertThat(mController.getAvailabilityStatus()).isEqualTo(
125                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
126     }
127 
128     @Test
getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser()129     public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() {
130         when(mUserManager.getMainUser()).thenReturn(UserHandle.CURRENT);
131         when(mUserManager.isUserForeground()).thenReturn(true);
132 
133         assertThat(mController.getAvailabilityStatus()).isEqualTo(
134                 BasePreferenceController.DISABLED_FOR_USER);
135     }
136 
137     @Test
getAvailabilityStatus_featureAndMultiUserEnabledAndNonMainUser_returnAvailable()138     public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonMainUser_returnAvailable() {
139         when(mUserManager.isUserForeground()).thenReturn(true);
140 
141         assertThat(mController.getAvailabilityStatus()).isEqualTo(
142                 BasePreferenceController.AVAILABLE);
143     }
144 
145     @Test
getSummary_settingNotSet()146     public void getSummary_settingNotSet() {
147         Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_DOCK_USER,
148                 null, UserHandle.myUserId());
149 
150         assertThat(mController.getSummary().toString()).isEqualTo(
151                 mEntries[TimeoutToDockUserSettings.DEFAULT_TIMEOUT_SETTING_VALUE_INDEX]);
152     }
153 
154     @Test
getSummary_setToNever()155     public void getSummary_setToNever() {
156         Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_DOCK_USER,
157                 mValues[0], UserHandle.myUserId());
158 
159         assertThat(mController.getSummary().toString()).isEqualTo(mEntries[0]);
160     }
161 
162     @Test
getSummary_setToOneMinute()163     public void getSummary_setToOneMinute() {
164         Settings.Secure.putStringForUser(mContext.getContentResolver(), TIMEOUT_TO_DOCK_USER,
165                 mValues[1], UserHandle.myUserId());
166 
167         assertThat(mController.getSummary().toString()).isEqualTo(mEntries[1]);
168     }
169 }
170