• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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.car.settings.applications.managedomainurls;
18 
19 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
20 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
21 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
22 
23 import static com.google.common.truth.Truth.assertThat;
24 
25 import static org.mockito.Mockito.when;
26 
27 import android.car.userlib.CarUserManagerHelper;
28 import android.content.Context;
29 import android.content.pm.ActivityInfo;
30 import android.content.pm.ApplicationInfo;
31 import android.content.pm.ResolveInfo;
32 
33 import androidx.lifecycle.Lifecycle;
34 import androidx.preference.ListPreference;
35 
36 import com.android.car.settings.CarSettingsRobolectricTestRunner;
37 import com.android.car.settings.R;
38 import com.android.car.settings.common.PreferenceControllerTestHelper;
39 import com.android.car.settings.testutils.ShadowApplicationPackageManager;
40 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
41 import com.android.settingslib.applications.ApplicationsState;
42 
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.Test;
46 import org.junit.runner.RunWith;
47 import org.mockito.Mock;
48 import org.mockito.MockitoAnnotations;
49 import org.robolectric.RuntimeEnvironment;
50 import org.robolectric.annotation.Config;
51 import org.robolectric.shadow.api.Shadow;
52 
53 import java.util.Arrays;
54 
55 @RunWith(CarSettingsRobolectricTestRunner.class)
56 @Config(shadows = {ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class})
57 public class AppLinkStatePreferenceControllerTest {
58 
59     private static final int USER_ID = 10;
60     private static final String TEST_PACKAGE_NAME = "com.example.test";
61     private static final int TEST_PACKAGE_ID = 1;
62     private static final String TEST_LABEL = "Test App";
63     private static final String TEST_PATH = "TEST_PATH";
64     private static final String TEST_ACTIVITY = "TestActivity";
65 
66     private Context mContext;
67     private ListPreference mPreference;
68     private PreferenceControllerTestHelper<AppLinkStatePreferenceController> mControllerHelper;
69     private AppLinkStatePreferenceController mController;
70     @Mock
71     private CarUserManagerHelper mCarUserManagerHelper;
72 
73     @Before
setUp()74     public void setUp() {
75         MockitoAnnotations.initMocks(this);
76         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
77         when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
78 
79         mContext = RuntimeEnvironment.application;
80         mPreference = new ListPreference(mContext);
81         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
82                 AppLinkStatePreferenceController.class);
83         mController = mControllerHelper.getController();
84     }
85 
86     @After
tearDown()87     public void tearDown() {
88         ShadowCarUserManagerHelper.reset();
89         ShadowApplicationPackageManager.reset();
90     }
91 
92     @Test
refreshUi_isBrowserApp_isDisabled()93     public void refreshUi_isBrowserApp_isDisabled() {
94         ApplicationInfo info = new ApplicationInfo();
95         info.packageName = TEST_PACKAGE_NAME;
96         info.uid = TEST_PACKAGE_ID;
97         info.sourceDir = TEST_PATH;
98         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
99                 TEST_PACKAGE_ID);
100 
101         setupIsBrowserApp(true);
102 
103         mController.setAppEntry(entry);
104         mControllerHelper.setPreference(mPreference);
105         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
106 
107         mController.refreshUi();
108 
109         assertThat(mPreference.isEnabled()).isFalse();
110     }
111 
112     @Test
refreshUi_isNotBrowserApp_noDomainUrls_isDisabled()113     public void refreshUi_isNotBrowserApp_noDomainUrls_isDisabled() {
114         ApplicationInfo info = new ApplicationInfo();
115         info.packageName = TEST_PACKAGE_NAME;
116         info.uid = TEST_PACKAGE_ID;
117         info.sourceDir = TEST_PATH;
118         info.privateFlags = 0;
119         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
120                 TEST_PACKAGE_ID);
121 
122         setupIsBrowserApp(false);
123 
124         mController.setAppEntry(entry);
125         mControllerHelper.setPreference(mPreference);
126         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
127 
128         mController.refreshUi();
129 
130         assertThat(mPreference.isEnabled()).isFalse();
131     }
132 
133     @Test
refreshUi_isNotBrowserApp_hasDomainUrls_isEnabled()134     public void refreshUi_isNotBrowserApp_hasDomainUrls_isEnabled() {
135         ApplicationInfo info = new ApplicationInfo();
136         info.packageName = TEST_PACKAGE_NAME;
137         info.uid = TEST_PACKAGE_ID;
138         info.sourceDir = TEST_PATH;
139         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
140         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
141                 TEST_PACKAGE_ID);
142 
143         setupIsBrowserApp(false);
144 
145         mController.setAppEntry(entry);
146         mControllerHelper.setPreference(mPreference);
147         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
148 
149         mController.refreshUi();
150 
151         assertThat(mPreference.isEnabled()).isTrue();
152     }
153 
154     @Test
refreshUi_isNotBrowserApp_hasDomainUrls_defaultState_entrySetToAsk()155     public void refreshUi_isNotBrowserApp_hasDomainUrls_defaultState_entrySetToAsk() {
156         ApplicationInfo info = new ApplicationInfo();
157         info.packageName = TEST_PACKAGE_NAME;
158         info.uid = TEST_PACKAGE_ID;
159         info.sourceDir = TEST_PATH;
160         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
161         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
162                 TEST_PACKAGE_ID);
163 
164         setupIsBrowserApp(false);
165 
166         mController.setAppEntry(entry);
167         mControllerHelper.setPreference(mPreference);
168         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
169 
170         mController.refreshUi();
171 
172         assertThat(mPreference.getEntry()).isEqualTo(
173                 mContext.getString(R.string.app_link_open_ask));
174     }
175 
176     @Test
refreshUi_isNotBrowserApp_hasDomainUrls_askState_entrySetToAsk()177     public void refreshUi_isNotBrowserApp_hasDomainUrls_askState_entrySetToAsk() {
178         ApplicationInfo info = new ApplicationInfo();
179         info.packageName = TEST_PACKAGE_NAME;
180         info.uid = TEST_PACKAGE_ID;
181         info.sourceDir = TEST_PATH;
182         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
183         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
184                 TEST_PACKAGE_ID);
185 
186         setupIsBrowserApp(false);
187         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
188                 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
189 
190         mController.setAppEntry(entry);
191         mControllerHelper.setPreference(mPreference);
192         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
193 
194         mController.refreshUi();
195 
196         assertThat(mPreference.getEntry()).isEqualTo(
197                 mContext.getString(R.string.app_link_open_ask));
198     }
199 
200     @Test
refreshUi_isNotBrowserApp_hasDomainUrls_alwaysState_entrySetToAlways()201     public void refreshUi_isNotBrowserApp_hasDomainUrls_alwaysState_entrySetToAlways() {
202         ApplicationInfo info = new ApplicationInfo();
203         info.packageName = TEST_PACKAGE_NAME;
204         info.uid = TEST_PACKAGE_ID;
205         info.sourceDir = TEST_PATH;
206         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
207         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
208                 TEST_PACKAGE_ID);
209 
210         setupIsBrowserApp(false);
211         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
212                 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, USER_ID);
213 
214         mController.setAppEntry(entry);
215         mControllerHelper.setPreference(mPreference);
216         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
217 
218         mController.refreshUi();
219 
220         assertThat(mPreference.getEntry()).isEqualTo(
221                 mContext.getString(R.string.app_link_open_always));
222     }
223 
224     @Test
refreshUi_isNotBrowserApp_hasDomainUrls_neverState_entrySetToNever()225     public void refreshUi_isNotBrowserApp_hasDomainUrls_neverState_entrySetToNever() {
226         ApplicationInfo info = new ApplicationInfo();
227         info.packageName = TEST_PACKAGE_NAME;
228         info.uid = TEST_PACKAGE_ID;
229         info.sourceDir = TEST_PATH;
230         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
231         ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
232                 TEST_PACKAGE_ID);
233 
234         setupIsBrowserApp(false);
235         mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
236                 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, USER_ID);
237 
238         mController.setAppEntry(entry);
239         mControllerHelper.setPreference(mPreference);
240         mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
241 
242         mController.refreshUi();
243 
244         assertThat(mPreference.getEntry()).isEqualTo(
245                 mContext.getString(R.string.app_link_open_never));
246     }
247 
setupIsBrowserApp(boolean isBrowserApp)248     private void setupIsBrowserApp(boolean isBrowserApp) {
249         ResolveInfo resolveInfo = new ResolveInfo();
250         resolveInfo.activityInfo = new ActivityInfo();
251         resolveInfo.handleAllWebDataURI = isBrowserApp;
252         AppLaunchSettingsBasePreferenceController.sBrowserIntent.setPackage(TEST_PACKAGE_NAME);
253         getShadowPackageManager().addResolveInfoForIntent(
254                 AppLaunchSettingsBasePreferenceController.sBrowserIntent,
255                 Arrays.asList(resolveInfo));
256     }
257 
getShadowPackageManager()258     private ShadowApplicationPackageManager getShadowPackageManager() {
259         return Shadow.extract(mContext.getPackageManager());
260     }
261 }
262