1 package com.android.settings.location; 2 3 import static com.google.common.truth.Truth.assertThat; 4 5 import static org.mockito.Mockito.spy; 6 import static org.mockito.Mockito.when; 7 8 import android.content.Context; 9 import android.location.LocationManager; 10 import android.provider.Settings; 11 12 import androidx.lifecycle.LifecycleOwner; 13 14 import com.android.settings.R; 15 import com.android.settingslib.core.lifecycle.Lifecycle; 16 17 import org.junit.Before; 18 import org.junit.Test; 19 import org.junit.runner.RunWith; 20 import org.mockito.Mock; 21 import org.mockito.MockitoAnnotations; 22 import org.robolectric.RobolectricTestRunner; 23 import org.robolectric.RuntimeEnvironment; 24 25 @RunWith(RobolectricTestRunner.class) 26 public class AppLocationPermissionPreferenceControllerTest { 27 28 private AppLocationPermissionPreferenceController mController; 29 30 @Mock 31 private Context mContext; 32 33 private LifecycleOwner mLifecycleOwner; 34 private Lifecycle mLifecycle; 35 private LocationManager mLocationManager; 36 private LocationSettings mLocationSettings; 37 38 @Before setUp()39 public void setUp() { 40 MockitoAnnotations.initMocks(this); 41 mContext = RuntimeEnvironment.application; 42 mLifecycleOwner = () -> mLifecycle; 43 mLifecycle = new Lifecycle(mLifecycleOwner); 44 mLocationSettings = spy(new LocationSettings()); 45 when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle); 46 mController = new AppLocationPermissionPreferenceController(mContext, "key"); 47 mController.init(mLocationSettings); 48 mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 49 } 50 51 @Test isAvailable_noLocationLinkPermission_shouldReturnFalse()52 public void isAvailable_noLocationLinkPermission_shouldReturnFalse() { 53 Settings.Global.putInt(mContext.getContentResolver(), 54 Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 0); 55 56 assertThat(mController.isAvailable()).isFalse(); 57 } 58 59 @Test displayPreference_hasLocationLinkPermission_shouldReturnTrue()60 public void displayPreference_hasLocationLinkPermission_shouldReturnTrue() { 61 Settings.Global.putInt(mContext.getContentResolver(), 62 Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 1); 63 64 assertThat(mController.isAvailable()).isTrue(); 65 } 66 67 @Test getSummary_whenLocationIsOff_shouldReturnStringForOff()68 public void getSummary_whenLocationIsOff_shouldReturnStringForOff() { 69 mLocationManager.setLocationEnabledForUser(false, android.os.Process.myUserHandle()); 70 71 assertThat(mController.getSummary()).isEqualTo( 72 mContext.getString(R.string.location_app_permission_summary_location_off)); 73 } 74 75 @Test getSummary_whenLocationIsOn_shouldReturnLoadingString()76 public void getSummary_whenLocationIsOn_shouldReturnLoadingString() { 77 mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle()); 78 79 assertThat(mController.getSummary()).isEqualTo( 80 mContext.getString(R.string.location_settings_loading_app_permission_stats)); 81 } 82 83 @Test getSummary_whenLocationAppCountIsOne_shouldShowSingularString()84 public void getSummary_whenLocationAppCountIsOne_shouldShowSingularString() { 85 mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle()); 86 mController.mNumHasLocation = 1; 87 mController.mNumTotal = 1; 88 89 assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getQuantityString( 90 R.plurals.location_app_permission_summary_location_on, 1, 1, 1)); 91 } 92 93 @Test getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString()94 public void getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString() { 95 mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle()); 96 mController.mNumHasLocation = 5; 97 mController.mNumTotal = 10; 98 99 assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getQuantityString( 100 R.plurals.location_app_permission_summary_location_on, 5, 5, 10)); 101 } 102 } 103