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 import com.android.settingslib.utils.StringUtil;
17 
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.Mock;
22 import org.mockito.MockitoAnnotations;
23 import org.robolectric.RobolectricTestRunner;
24 import org.robolectric.RuntimeEnvironment;
25 
26 import java.util.HashMap;
27 import java.util.Map;
28 
29 @RunWith(RobolectricTestRunner.class)
30 public class AppLocationPermissionPreferenceControllerTest {
31 
32     private AppLocationPermissionPreferenceController mController;
33 
34     @Mock
35     private Context mContext;
36 
37     private LifecycleOwner mLifecycleOwner;
38     private Lifecycle mLifecycle;
39     private LocationManager mLocationManager;
40     private LocationSettings mLocationSettings;
41 
42     @Before
setUp()43     public void setUp() {
44         MockitoAnnotations.initMocks(this);
45         mContext = RuntimeEnvironment.application;
46         mLifecycleOwner = () -> mLifecycle;
47         mLifecycle = new Lifecycle(mLifecycleOwner);
48         mLocationSettings = spy(new LocationSettings());
49         when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle);
50         mController = new AppLocationPermissionPreferenceController(mContext, "key");
51         mController.init(mLocationSettings);
52         mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
53     }
54 
55     @Test
isAvailable_noLocationLinkPermission_shouldReturnFalse()56     public void isAvailable_noLocationLinkPermission_shouldReturnFalse() {
57         Settings.Global.putInt(mContext.getContentResolver(),
58                 Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 0);
59 
60         assertThat(mController.isAvailable()).isFalse();
61     }
62 
63     @Test
displayPreference_hasLocationLinkPermission_shouldReturnTrue()64     public void displayPreference_hasLocationLinkPermission_shouldReturnTrue() {
65         Settings.Global.putInt(mContext.getContentResolver(),
66                 Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 1);
67 
68         assertThat(mController.isAvailable()).isTrue();
69     }
70 
71     @Test
getSummary_whenLocationIsOff_shouldReturnStringForOff()72     public void getSummary_whenLocationIsOff_shouldReturnStringForOff() {
73         mLocationManager.setLocationEnabledForUser(false, android.os.Process.myUserHandle());
74 
75         assertThat(mController.getSummary()).isEqualTo(
76                 mContext.getString(R.string.location_app_permission_summary_location_off));
77     }
78 
79     @Test
getSummary_whenLocationIsOn_shouldReturnLoadingString()80     public void getSummary_whenLocationIsOn_shouldReturnLoadingString() {
81         mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
82 
83         assertThat(mController.getSummary()).isEqualTo(
84                 mContext.getString(R.string.location_settings_loading_app_permission_stats));
85     }
86 
87     @Test
getSummary_whenLocationAppCountIsOne_shouldShowSingularString()88     public void getSummary_whenLocationAppCountIsOne_shouldShowSingularString() {
89         mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
90         mController.mNumHasLocation = 1;
91         mController.mNumTotal = 1;
92 
93         Map<String, Object> arguments = new HashMap<>();
94         arguments.put("count", 1);
95         arguments.put("total", 1);
96         assertThat(mController.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
97                 arguments, R.string.location_app_permission_summary_location_on));
98     }
99 
100     @Test
getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString()101     public void getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString() {
102         mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
103         mController.mNumHasLocation = 5;
104         mController.mNumTotal = 10;
105 
106         Map<String, Object> arguments = new HashMap<>();
107         arguments.put("count", 5);
108         arguments.put("total", 10);
109         assertThat(mController.getSummary()).isEqualTo(StringUtil.getIcuPluralsString(mContext,
110                 arguments, R.string.location_app_permission_summary_location_on));
111     }
112 }
113