blob: a0e5b3319f16f84385fd7e999058dc92a18342fe [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.internal.telephony;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.CarrierAssociatedAppEntry;
import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.test.mock.MockContentProvider;
import android.test.mock.MockContentResolver;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArrayMap;
import android.util.ArraySet;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class CarrierAppUtilsTest {
private static final String CARRIER_APP = "com.example.carrier";
private static final ArraySet<String> CARRIER_APPS = new ArraySet<>();
static {
CARRIER_APPS.add(CARRIER_APP);
}
private static final String ASSOCIATED_APP = "com.example.associated";
private static final ArrayMap<String, List<CarrierAssociatedAppEntry>> ASSOCIATED_APPS =
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP,
CarrierAssociatedAppEntry.SDK_UNSPECIFIED);
private static final int USER_ID = 12345;
private static final String CALLING_PACKAGE = "phone";
@Mock private Context mContext;
@Mock private PackageManager mPackageManager;
@Mock private TelephonyManager mTelephonyManager;
private SettingsMockContentProvider mContentProvider;
private MockContentResolver mContentResolver;
private static ArrayMap<String, List<CarrierAssociatedAppEntry>> makeAssociatedApp(
String carrierAppPackage, String associatedAppPackage, int associatedAppAddedInSdk) {
ArrayMap<String, List<CarrierAssociatedAppEntry>> result = new ArrayMap<>();
List<CarrierAssociatedAppEntry> associatedAppList = new ArrayList<>();
associatedAppList.add(
new CarrierAssociatedAppEntry(associatedAppPackage, associatedAppAddedInSdk));
result.put(carrierAppPackage, associatedAppList);
return result;
}
@Before
public void setUp() throws Exception {
System.setProperty("dexmaker.dexcache",
InstrumentationRegistry.getTargetContext().getCacheDir().getPath());
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
MockitoAnnotations.initMocks(this);
Mockito.when(mContext.createContextAsUser(Mockito.any(UserHandle.class), Mockito.eq(0)))
.thenReturn(mContext);
Mockito.when(mContext.createPackageContextAsUser(Mockito.anyString(), Mockito.eq(0),
Mockito.any(UserHandle.class))).thenReturn(mContext);
Mockito.when(mContext.getPackageManager()).thenReturn(mPackageManager);
Mockito.when(mContext.getPackageName()).thenReturn(CALLING_PACKAGE);
// Placeholder, cannot mock final PermissionManager
mContentResolver = new MockContentResolver();
mContentProvider = new SettingsMockContentProvider();
mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, 0, USER_ID);
Mockito.when(mContext.getContentResolver()).thenReturn(mContentResolver);
}
/** No apps configured - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_EmptyList() {
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, new ArraySet<>(), ASSOCIATED_APPS, mContext);
Mockito.verifyNoMoreInteractions(mPackageManager, mTelephonyManager);
}
/** Configured app is missing - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_MissingApp() throws Exception {
Mockito.when(mPackageManager.getApplicationInfo("com.example.missing.app",
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(null);
ArraySet<String> systemCarrierAppsDisabledUntilUsed = new ArraySet<>();
systemCarrierAppsDisabledUntilUsed.add("com.example.missing.app");
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, systemCarrierAppsDisabledUntilUsed, ASSOCIATED_APPS,
mContext);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_VISIBLE));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
Mockito.verifyNoMoreInteractions(mTelephonyManager);
}
/** Configured app is not bundled with the system - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NonSystemApp() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_VISIBLE));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
Mockito.verifyNoMoreInteractions(mTelephonyManager);
}
/**
* Configured app has privileges, but was disabled by the user - should only grant
* permissions.
*/
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_DisabledUser()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/** Configured app has privileges, but was disabled - should only grant permissions. */
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Disabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Configured app has privileges, and is already installed - should only grant permissions. */
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Enabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Configured /data app has privileges - should only grant permissions. */
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_UpdatedApp() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
| ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(appInfo);
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/**
* Configured app has privileges, and is in the default state - should install. Associated app
* is missing and should not be touched.
*/
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_MissingAssociated_Default()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY)).thenReturn(appInfo);
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
}
/**
* Configured app has privileges, and is in the default state along with associated app - should
* install both.
*/
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Associated_Default()
throws Exception {
// Enabling should be done even if this isn't the first run.
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT,
USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
}
/**
* Configured app has privileges, and is uninstalled - should install. Associated app has
* been updated and should not be touched.
*/
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_UpdatedAssociated_DisabledUntilUsed()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationEnabledSetting(CARRIER_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |=
ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
Mockito.when(mPackageManager.getApplicationEnabledSetting(ASSOCIATED_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(null);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
}
/**
* Configured app has privileges, and is uninstalled until used along with associated app -
* should install both.
*/
@Test @SmallTest @Ignore
public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Associated_DisabledUntilUsed()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationEnabledSetting(CARRIER_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
Mockito.when(mPackageManager.getApplicationEnabledSetting(ASSOCIATED_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
}
/** Configured app has no privileges, and was disabled by the user - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_DisabledUser() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Telephony is not initialized, and app was disabled by the user - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_DisabledUser()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Configured app has no privileges, and was uninstalled - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Disabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Telephony is not initialized, and app was uninstalled - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_Disabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Configured app has no privileges, and is explicitly installed - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Enabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Telephony is not initialized, and app is explicitly installed - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_Enabled() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Configured /data app has no privileges - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_UpdatedApp() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
| ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Telephony is not initialized and app is in /data - should do nothing. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_UpdatedApp() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= (ApplicationInfo.FLAG_SYSTEM
| ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_INSTALLED);
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/**
* Configured app has no privileges, and is in the default state - should uninstalled.
* Associated app is installed and should not be touched.
*/
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_EnabledAssociated_Default()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationEnabledSetting(CARRIER_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
Mockito.when(mPackageManager.getApplicationEnabledSetting(ASSOCIATED_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app -
* should uninstall both.
*/
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Associated_Default()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationEnabledSetting(CARRIER_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager.getApplicationEnabledSetting(ASSOCIATED_APP))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has already occurred - should only uninstall configured app.
*/
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Associated_Default_HandledSdk()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT,
USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Different associated app SDK than usual.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS,
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has already occurred - should only uninstall configured app.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_HandledSdk_AssociatedSdkUnspecified()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT,
USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Using SDK_UNSPECIFIED for the associated app's addedInSdk.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred on this SDK level - should uninstall both since the associated
* app's SDK matches.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkCurrent()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED,
Build.VERSION.SDK_INT - 1, USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Different associated app SDK than usual.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS,
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred on the current SDK - should only uninstall configured app
* since the associated app's SDK isn't specified but we've already run at least once.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkUnspecified()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED,
Build.VERSION.SDK_INT - 1, USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Using SDK_UNSPECIFIED for the associated app's addedInSdk.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred on the current SDK - should only uninstall configured app
* since the associated app's SDK doesn't match.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkTooLow()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED,
Build.VERSION.SDK_INT - 1, USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Different associated app SDK than usual.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS,
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT - 1),
mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred on this SDK level - should uninstall both since the associated
* app's SDK is newer than the last evaluation.
*
* While this case is expected to feel somewhat strange, it effectively simulates skipping a
* whole SDK level in a single OTA. For example, the device is on P. A new associated app is
* added on Q, but the user doesn't take the OTA. Then, they take the R OTA, at which point the
* associated app should still be disabled if there's no corresponding SIM, because its SDK
* level is newer than our last round of evaluation.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkInRange()
throws Exception {
Settings.Secure.putIntForUser(
mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED,
Build.VERSION.SDK_INT - 2, USER_ID);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Different associated app SDK than usual.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS,
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT - 1),
mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred ever - should uninstall both regardless of associated app's
* SDK.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_FirstRun_AssociatedSdkCurrent()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Different associated app SDK than usual.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS,
makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/**
* Configured app has no privileges, and is in the default state along with associated app, and
* disabling has not yet occurred ever - should uninstall both regardless of associated app's
* SDK.
*/
@Test @SmallTest
public void testDCAUP_NoPrivileges_Associated_Default_FirstRun_AssociatedSdkUnspecified()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
ApplicationInfo associatedAppInfo = new ApplicationInfo();
associatedAppInfo.packageName = ASSOCIATED_APP;
associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(associatedAppInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
// Using SDK_UNSPECIFIED for the associated app's addedInSdk.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_INSTALLED);
Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/** Telephony is not initialized, and app is in the default state - should uninstall it. */
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_Default() throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_UNINSTALLED);
}
/** Configured app has no privileges, and is disabled until used or not installed - should do
* nothing.
**/
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_DisabledUntilUsed()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP))
.thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager,
mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
/** Telephony is not initialized, and app is disabled until used or not installed - should do
* nothing.
**/
@Test @SmallTest
public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_DisabledUntilUsed()
throws Exception {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.packageName = CARRIER_APP;
appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED;
Mockito.when(mPackageManager
.getApplicationEnabledSetting(Mockito.anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP,
PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
| PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS
| PackageManager.MATCH_SYSTEM_ONLY))
.thenReturn(appInfo);
CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE,
null /* telephonyManager */, mContentResolver, USER_ID, CARRIER_APPS,
ASSOCIATED_APPS, mContext);
Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP,
PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN);
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_INSTALLED));
Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(Mockito.anyString(),
Mockito.eq(PackageManager.SYSTEM_APP_STATE_UNINSTALLED));
}
class SettingsMockContentProvider extends MockContentProvider {
private int mExpectedValue;
@Override
public Bundle call(String method, String request, Bundle args) {
Bundle result = new Bundle();
if (Settings.CALL_METHOD_GET_SECURE.equals(method)) {
result.putString(Settings.NameValueTable.VALUE, Integer.toString(mExpectedValue));
} else {
mExpectedValue = Integer.parseInt(args.getString(Settings.NameValueTable.VALUE));
}
return result;
}
}
}