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