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