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