Merge "Allow a list of configs to be sent for enterprise slice" am: 78bc18e26b

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2019626

Change-Id: Ib4a2dd432997865c8127ff8e47bb62a34ca4c0ee
This commit is contained in:
Sooraj Sasindran
2022-03-15 04:17:57 +00:00
committed by Automerger Merge Worker
7 changed files with 182 additions and 188 deletions

View File

@@ -7192,7 +7192,7 @@ package android.app.admin {
method @Nullable public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName);
method @Nullable public java.util.List<java.lang.String> getPermittedInputMethods(@NonNull android.content.ComponentName);
method public int getPersonalAppsSuspendedReasons(@NonNull android.content.ComponentName);
method @NonNull public android.app.admin.PreferentialNetworkServiceConfig getPreferentialNetworkServiceConfig();
method @NonNull public java.util.List<android.app.admin.PreferentialNetworkServiceConfig> getPreferentialNetworkServiceConfigs();
method public int getRequiredPasswordComplexity();
method public long getRequiredStrongAuthTimeout(@Nullable android.content.ComponentName);
method public boolean getScreenCaptureDisabled(@Nullable android.content.ComponentName);
@@ -7335,7 +7335,7 @@ package android.app.admin {
method public boolean setPermittedCrossProfileNotificationListeners(@NonNull android.content.ComponentName, @Nullable java.util.List<java.lang.String>);
method public boolean setPermittedInputMethods(@NonNull android.content.ComponentName, java.util.List<java.lang.String>);
method public void setPersonalAppsSuspended(@NonNull android.content.ComponentName, boolean);
method public void setPreferentialNetworkServiceConfig(@NonNull android.app.admin.PreferentialNetworkServiceConfig);
method public void setPreferentialNetworkServiceConfigs(@NonNull java.util.List<android.app.admin.PreferentialNetworkServiceConfig>);
method public void setPreferentialNetworkServiceEnabled(boolean);
method public void setProfileEnabled(@NonNull android.content.ComponentName);
method public void setProfileName(@NonNull android.content.ComponentName, String);

View File

@@ -16,6 +16,8 @@
package android.app.admin;
import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import android.Manifest.permission;
@@ -10266,7 +10268,7 @@ public class DevicePolicyManager {
}
/**
* Sets whether preferential network service is enabled on the work profile.
* Sets whether preferential network service is enabled.
* For example, an organization can have a deal/agreement with a carrier that all of
* the work data from its employees’ devices will be sent via a network service dedicated
* for enterprise use.
@@ -10274,75 +10276,72 @@ public class DevicePolicyManager {
* An example of a supported preferential network service is the Enterprise
* slice on 5G networks.
*
* By default, preferential network service is disabled on the work profile on supported
* carriers and devices. Admins can explicitly enable it with this API.
* On fully-managed devices this method is unsupported because all traffic is considered
* work traffic.
* By default, preferential network service is disabled on the work profile and
* fully managed devices, on supported carriers and devices.
* Admins can explicitly enable it with this API.
*
* <p> This method enables preferential network service with a default configuration.
* To fine-tune the configuration, use {@link #setPreferentialNetworkServiceConfig) instead.
* To fine-tune the configuration, use {@link #setPreferentialNetworkServiceConfigs) instead.
* <p> Before Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* this method can be called by the profile owner of a managed profile.
* <p> Starting from Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* This method can be called by the profile owner of a managed profile
* or device owner.
*
* <p>This method can only be called by the profile owner of a managed profile.
* @param enabled whether preferential network service should be enabled.
* @throws SecurityException if the caller is not the profile owner.
* @throws SecurityException if the caller is not the profile owner or device owner.
**/
public void setPreferentialNetworkServiceEnabled(boolean enabled) {
throwIfParentInstance("setPreferentialNetworkServiceEnabled");
if (mService == null) {
return;
}
try {
mService.setPreferentialNetworkServiceEnabled(enabled);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
PreferentialNetworkServiceConfig.Builder configBuilder =
new PreferentialNetworkServiceConfig.Builder();
configBuilder.setEnabled(enabled);
if (enabled) {
configBuilder.setNetworkId(NET_ENTERPRISE_ID_1);
}
setPreferentialNetworkServiceConfigs(List.of(configBuilder.build()));
}
/**
* Indicates whether preferential network service is enabled.
*
* <p>This method can be called by the profile owner of a managed profile.
* <p> Before Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* This method can be called by the profile owner of a managed profile.
* <p> Starting from Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* This method can be called by the profile owner of a managed profile
* or device owner.
*
* @return whether preferential network service is enabled.
* @throws SecurityException if the caller is not the profile owner.
* @throws SecurityException if the caller is not the profile owner or device owner.
*/
public boolean isPreferentialNetworkServiceEnabled() {
throwIfParentInstance("isPreferentialNetworkServiceEnabled");
if (mService == null) {
return false;
}
try {
return mService.isPreferentialNetworkServiceEnabled(myUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return getPreferentialNetworkServiceConfigs().stream().anyMatch(c -> c.isEnabled());
}
/**
* Sets preferential network configuration on the work profile.
* Sets preferential network configurations.
* {@see PreferentialNetworkServiceConfig}
*
* An example of a supported preferential network service is the Enterprise
* slice on 5G networks.
*
* By default, preferential network service is disabled on the work profile on supported
* carriers and devices. Admins can explicitly enable it with this API.
* On fully-managed devices this method is unsupported because all traffic is considered
* work traffic.
* By default, preferential network service is disabled on the work profile and fully managed
* devices, on supported carriers and devices. Admins can explicitly enable it with this API.
* If admin wants to have multiple enterprise slices,
* it can be configured by passing list of {@link PreferentialNetworkServiceConfig} objects.
*
* <p>This method can only be called by the profile owner of a managed profile.
* @param preferentialNetworkServiceConfig preferential network configuration.
* @throws SecurityException if the caller is not the profile owner.
* @param preferentialNetworkServiceConfigs list of preferential network configurations.
* @throws SecurityException if the caller is not the profile owner or device owner.
**/
public void setPreferentialNetworkServiceConfig(
@NonNull PreferentialNetworkServiceConfig preferentialNetworkServiceConfig) {
throwIfParentInstance("setPreferentialNetworkServiceConfig");
public void setPreferentialNetworkServiceConfigs(
@NonNull List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs) {
throwIfParentInstance("setPreferentialNetworkServiceConfigs");
if (mService == null) {
return;
}
try {
mService.setPreferentialNetworkServiceConfig(preferentialNetworkServiceConfig);
mService.setPreferentialNetworkServiceConfigs(preferentialNetworkServiceConfigs);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -10352,18 +10351,16 @@ public class DevicePolicyManager {
* Get preferential network configuration
* {@see PreferentialNetworkServiceConfig}
*
* <p>This method can be called by the profile owner of a managed profile.
*
* @return preferential network configuration.
* @throws SecurityException if the caller is not the profile owner.
* @throws SecurityException if the caller is not the profile owner or device owner.
*/
public @NonNull PreferentialNetworkServiceConfig getPreferentialNetworkServiceConfig() {
throwIfParentInstance("getPreferentialNetworkServiceConfig");
public @NonNull List<PreferentialNetworkServiceConfig> getPreferentialNetworkServiceConfigs() {
throwIfParentInstance("getPreferentialNetworkServiceConfigs");
if (mService == null) {
return PreferentialNetworkServiceConfig.DEFAULT;
return List.of(PreferentialNetworkServiceConfig.DEFAULT);
}
try {
return mService.getPreferentialNetworkServiceConfig();
return mService.getPreferentialNetworkServiceConfigs();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -12807,13 +12804,18 @@ public class DevicePolicyManager {
}
/**
* Called by device owner to add an override APN.
* Called by device owner or profile owner to add an override APN.
*
* <p>This method may returns {@code -1} if {@code apnSetting} conflicts with an existing
* override APN. Update the existing conflicted APN with
* {@link #updateOverrideApn(ComponentName, int, ApnSetting)} instead of adding a new entry.
* <p>Two override APNs are considered to conflict when all the following APIs return
* the same values on both override APNs:
* <p> Before Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Only device owners can add APNs.
* <p> Starting from Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Device and profile owners can add enterprise APNs
* ({@link ApnSetting#TYPE_ENTERPRISE}), while only device owners can add other type of APNs.
* <ul>
* <li>{@link ApnSetting#getOperatorNumeric()}</li>
* <li>{@link ApnSetting#getApnName()}</li>
@@ -12832,7 +12834,8 @@ public class DevicePolicyManager {
* @param apnSetting the override APN to insert
* @return The {@code id} of inserted override APN. Or {@code -1} when failed to insert into
* the database.
* @throws SecurityException if {@code admin} is not a device owner.
* @throws SecurityException If request is for enterprise APN {@code admin} is either device
* owner or profile owner and in all other types of APN if {@code admin} is not a device owner.
*
* @see #setOverrideApnsEnabled(ComponentName, boolean)
*/
@@ -12849,20 +12852,26 @@ public class DevicePolicyManager {
}
/**
* Called by device owner to update an override APN.
* Called by device owner or profile owner to update an override APN.
*
* <p>This method may returns {@code false} if there is no override APN with the given
* {@code apnId}.
* <p>This method may also returns {@code false} if {@code apnSetting} conflicts with an
* existing override APN. Update the existing conflicted APN instead.
* <p>See {@link #addOverrideApn} for the definition of conflict.
* <p> Before Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Only device owners can update APNs.
* <p> Starting from Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Device and profile owners can update enterprise APNs
* ({@link ApnSetting#TYPE_ENTERPRISE}), while only device owners can update other type of APNs.
*
* @param admin which {@link DeviceAdminReceiver} this request is associated with
* @param apnId the {@code id} of the override APN to update
* @param apnSetting the override APN to update
* @return {@code true} if the required override APN is successfully updated,
* {@code false} otherwise.
* @throws SecurityException if {@code admin} is not a device owner.
* @throws SecurityException If request is for enterprise APN {@code admin} is either device
* owner or profile owner and in all other types of APN if {@code admin} is not a device owner.
*
* @see #setOverrideApnsEnabled(ComponentName, boolean)
*/
@@ -12880,16 +12889,22 @@ public class DevicePolicyManager {
}
/**
* Called by device owner to remove an override APN.
* Called by device owner or profile owner to remove an override APN.
*
* <p>This method may returns {@code false} if there is no override APN with the given
* {@code apnId}.
* <p> Before Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Only device owners can remove APNs.
* <p> Starting from Android version {@link android.os.Build.VERSION_CODES#TIRAMISU}:
* Device and profile owners can remove enterprise APNs
* ({@link ApnSetting#TYPE_ENTERPRISE}), while only device owners can remove other type of APNs.
*
* @param admin which {@link DeviceAdminReceiver} this request is associated with
* @param apnId the {@code id} of the override APN to remove
* @return {@code true} if the required override APN is successfully removed, {@code false}
* otherwise.
* @throws SecurityException if {@code admin} is not a device owner.
* @throws SecurityException If request is for enterprise APN {@code admin} is either device
* owner or profile owner and in all other types of APN if {@code admin} is not a device owner.
*
* @see #setOverrideApnsEnabled(ComponentName, boolean)
*/

View File

@@ -278,12 +278,9 @@ interface IDevicePolicyManager {
void setSecondaryLockscreenEnabled(in ComponentName who, boolean enabled);
boolean isSecondaryLockscreenEnabled(in UserHandle userHandle);
void setPreferentialNetworkServiceEnabled(in boolean enabled);
boolean isPreferentialNetworkServiceEnabled(int userHandle);
void setPreferentialNetworkServiceConfig(
in PreferentialNetworkServiceConfig preferentialNetworkServiceConfig);
PreferentialNetworkServiceConfig getPreferentialNetworkServiceConfig();
void setPreferentialNetworkServiceConfigs(
in List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs);
List<PreferentialNetworkServiceConfig> getPreferentialNetworkServiceConfigs();
void setLockTaskPackages(in ComponentName who, in String[] packages);
String[] getLockTaskPackages(in ComponentName who);

View File

@@ -28,7 +28,7 @@ import java.util.Objects;
/**
* Network configuration to be set for the user profile
* {@see DevicePolicyManager#setPreferentialNetworkServiceConfig}.
* {@see DevicePolicyManager#setPreferentialNetworkServiceConfigs}.
*/
public final class PreferentialNetworkServiceConfig implements Parcelable {
final boolean mIsEnabled;
@@ -147,8 +147,6 @@ public final class PreferentialNetworkServiceConfig implements Parcelable {
/**
* @return preference enterprise identifier.
* valid values starts from
* {@link #PREFERENTIAL_NETWORK_ID_1} to {@link #PREFERENTIAL_NETWORK_ID_5}.
* preference identifier is applicable only if preference network service is enabled
*
*/
@@ -286,8 +284,6 @@ public final class PreferentialNetworkServiceConfig implements Parcelable {
/**
* Set the preferential network identifier.
* Valid values starts from {@link #PREFERENTIAL_NETWORK_ID_1} to
* {@link #PREFERENTIAL_NETWORK_ID_5}.
* preference identifier is applicable only if preferential network service is enabled.
* @param preferenceId preference Id
* @return The builder to facilitate chaining.

View File

@@ -295,8 +295,8 @@ class ActiveAdmin {
public boolean mAdminCanGrantSensorsPermissions;
public boolean mPreferentialNetworkServiceEnabled =
DevicePolicyManager.PREFERENTIAL_NETWORK_SERVICE_ENABLED_DEFAULT;
public PreferentialNetworkServiceConfig mPreferentialNetworkServiceConfig =
PreferentialNetworkServiceConfig.DEFAULT;
public List<PreferentialNetworkServiceConfig> mPreferentialNetworkServiceConfigs =
List.of(PreferentialNetworkServiceConfig.DEFAULT);
private static final boolean USB_DATA_SIGNALING_ENABLED_DEFAULT = true;
boolean mUsbDataSignalingEnabled = USB_DATA_SIGNALING_ENABLED_DEFAULT;

View File

@@ -110,13 +110,13 @@ import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT;
import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE;
import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE_NO_FALLBACK;
import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1;
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
import static android.provider.Telephony.Carriers.DPC_URI;
import static android.provider.Telephony.Carriers.ENFORCE_KEY;
import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
import static android.provider.Telephony.Carriers.INVALID_APN_ID;
import static android.security.keystore.AttestationUtils.USE_INDIVIDUAL_ATTESTATION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_ENTRY_POINT_ADB;
@@ -3314,14 +3314,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
updatePermissionPolicyCache(userId);
updateAdminCanGrantSensorsPermissionCache(userId);
final PreferentialNetworkServiceConfig preferentialNetworkServiceConfig;
final List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs;
synchronized (getLockObject()) {
ActiveAdmin owner = getDeviceOrProfileOwnerAdminLocked(userId);
preferentialNetworkServiceConfig = owner != null
? owner.mPreferentialNetworkServiceConfig
: PreferentialNetworkServiceConfig.DEFAULT;
preferentialNetworkServiceConfigs = owner != null
? owner.mPreferentialNetworkServiceConfigs
: List.of(PreferentialNetworkServiceConfig.DEFAULT);
}
updateNetworkPreferenceForUser(userId, preferentialNetworkServiceConfig);
updateNetworkPreferenceForUser(userId, preferentialNetworkServiceConfigs);
startOwnerService(userId, "start-user");
}
@@ -3338,7 +3338,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
void handleStopUser(int userId) {
updateNetworkPreferenceForUser(userId, PreferentialNetworkServiceConfig.DEFAULT);
updateNetworkPreferenceForUser(userId, List.of(PreferentialNetworkServiceConfig.DEFAULT));
stopOwnerService(userId, "stop-user");
}
@@ -12002,87 +12002,50 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
public void setPreferentialNetworkServiceEnabled(boolean enabled) {
public void setPreferentialNetworkServiceConfigs(
List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs) {
if (!mHasFeature) {
return;
}
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(isProfileOwner(caller),
"Caller is not profile owner;"
+ " only profile owner may control the preferential network service");
Preconditions.checkCallAuthorization(isProfileOwner(caller)
|| isDeviceOwner(caller),
"Caller is not profile owner or device owner;"
+ " only profile owner or device owner may control the preferential"
+ " network service");
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(
caller.getUserId());
if (requiredAdmin != null
&& requiredAdmin.mPreferentialNetworkServiceEnabled != enabled) {
requiredAdmin.mPreferentialNetworkServiceEnabled = enabled;
if (!requiredAdmin.mPreferentialNetworkServiceConfigs.equals(
preferentialNetworkServiceConfigs)) {
requiredAdmin.mPreferentialNetworkServiceConfigs =
new ArrayList<>(preferentialNetworkServiceConfigs);
saveSettingsLocked(caller.getUserId());
}
}
updateNetworkPreferenceForUser(caller.getUserId(), enabled);
updateNetworkPreferenceForUser(caller.getUserId(), preferentialNetworkServiceConfigs);
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.SET_PREFERENTIAL_NETWORK_SERVICE_ENABLED)
.setBoolean(enabled)
.setBoolean(preferentialNetworkServiceConfigs
.stream().anyMatch(c -> c.isEnabled()))
.write();
}
@Override
public boolean isPreferentialNetworkServiceEnabled(int userHandle) {
public List<PreferentialNetworkServiceConfig> getPreferentialNetworkServiceConfigs() {
if (!mHasFeature) {
return false;
return List.of(PreferentialNetworkServiceConfig.DEFAULT);
}
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(isProfileOwner(caller),
"Caller is not profile owner");
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(userHandle);
if (requiredAdmin != null) {
return requiredAdmin.mPreferentialNetworkServiceEnabled;
} else {
return false;
}
}
}
@Override
public void setPreferentialNetworkServiceConfig(
PreferentialNetworkServiceConfig preferentialNetworkServiceConfig) {
if (!mHasFeature) {
return;
}
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(isProfileOwner(caller),
"Caller is not profile owner;"
+ " only profile owner may control the preferential network service");
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(
caller.getUserId());
if (!requiredAdmin.mPreferentialNetworkServiceConfig.equals(
preferentialNetworkServiceConfig)) {
requiredAdmin.mPreferentialNetworkServiceConfig = preferentialNetworkServiceConfig;
saveSettingsLocked(caller.getUserId());
}
}
updateNetworkPreferenceForUser(caller.getUserId(), preferentialNetworkServiceConfig);
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.SET_PREFERENTIAL_NETWORK_SERVICE_ENABLED)
.setBoolean(preferentialNetworkServiceConfig.isEnabled())
.write();
}
@Override
public PreferentialNetworkServiceConfig getPreferentialNetworkServiceConfig() {
if (!mHasFeature) {
return PreferentialNetworkServiceConfig.DEFAULT;
}
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(isProfileOwner(caller),
"Caller is not profile owner");
Preconditions.checkCallAuthorization(isProfileOwner(caller)
|| isDeviceOwner(caller),
"Caller is not profile owner or device owner;"
+ " only profile owner or device owner may retrieve the preferential"
+ " network service configurations");
synchronized (getLockObject()) {
final ActiveAdmin requiredAdmin = getProfileOwnerAdminLocked(caller.getUserId());
return requiredAdmin.mPreferentialNetworkServiceConfig;
return requiredAdmin.mPreferentialNetworkServiceConfigs;
}
}
@@ -16081,7 +16044,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
Objects.requireNonNull(who, "ComponentName is null");
Objects.requireNonNull(apnSetting, "ApnSetting is null in addOverrideApn");
final CallerIdentity caller = getCallerIdentity(who);
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
if (apnSetting.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE) {
Preconditions.checkCallAuthorization(isDeviceOwner(caller)
|| isProfileOwner(caller));
} else {
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
}
TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
if (tm != null) {
@@ -16089,7 +16057,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
() -> tm.addDevicePolicyOverrideApn(mContext, apnSetting));
} else {
Slogf.w(LOG_TAG, "TelephonyManager is null when trying to add override apn");
return Telephony.Carriers.INVALID_APN_ID;
return INVALID_APN_ID;
}
}
@@ -16102,7 +16070,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
Objects.requireNonNull(who, "ComponentName is null");
Objects.requireNonNull(apnSetting, "ApnSetting is null in updateOverrideApn");
final CallerIdentity caller = getCallerIdentity(who);
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
ApnSetting apn = getApnSetting(apnId);
if (apn != null && apn.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE
&& apnSetting.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE) {
Preconditions.checkCallAuthorization(isDeviceOwner(caller)
|| isProfileOwner(caller));
} else {
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
}
if (apnId < 0) {
return false;
@@ -16124,7 +16099,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
Objects.requireNonNull(who, "ComponentName is null");
final CallerIdentity caller = getCallerIdentity(who);
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
ApnSetting apn = getApnSetting(apnId);
if (apn != null && apn.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE) {
Preconditions.checkCallAuthorization(isDeviceOwner(caller)
|| isProfileOwner(caller));
} else {
Preconditions.checkCallAuthorization(isDeviceOwner(caller));
}
return removeOverrideApnUnchecked(apnId);
}
@@ -16138,6 +16119,27 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return numDeleted > 0;
}
private ApnSetting getApnSetting(int apnId) {
if (apnId < 0) {
return null;
}
ApnSetting apnSetting = null;
Cursor cursor = mInjector.binderWithCleanCallingIdentity(
() -> mContext.getContentResolver().query(
Uri.withAppendedPath(DPC_URI, Integer.toString(apnId)), null, null, null,
Telephony.Carriers.DEFAULT_SORT_ORDER));
if (cursor != null) {
while (cursor.moveToNext()) {
apnSetting = ApnSetting.makeApnSetting(cursor);
if (apnSetting != null) {
break;
}
}
cursor.close();
}
return apnSetting;
}
@Override
public List<ApnSetting> getOverrideApns(@NonNull ComponentName who) {
if (!mHasFeature || !mHasTelephonyFeature) {
@@ -17824,54 +17826,38 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
private void updateNetworkPreferenceForUser(int userId,
boolean preferentialNetworkServiceEnabled) {
List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs) {
if (!isManagedProfile(userId)) {
return;
}
ProfileNetworkPreference.Builder preferenceBuilder =
new ProfileNetworkPreference.Builder();
if (preferentialNetworkServiceEnabled) {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_ENTERPRISE);
preferenceBuilder.setPreferenceEnterpriseId(NET_ENTERPRISE_ID_1);
} else {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_DEFAULT);
}
List<ProfileNetworkPreference> preferences = new ArrayList<>();
preferences.add(preferenceBuilder.build());
mInjector.binderWithCleanCallingIdentity(() ->
mInjector.getConnectivityManager().setProfileNetworkPreferences(
UserHandle.of(userId), preferences,
null /* executor */, null /* listener */));
}
private void updateNetworkPreferenceForUser(int userId,
PreferentialNetworkServiceConfig preferentialNetworkServiceConfig) {
if (!isManagedProfile(userId)) {
return;
}
ProfileNetworkPreference.Builder preferenceBuilder =
new ProfileNetworkPreference.Builder();
if (preferentialNetworkServiceConfig.isEnabled()) {
if (preferentialNetworkServiceConfig.isFallbackToDefaultConnectionAllowed()) {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_ENTERPRISE);
for (PreferentialNetworkServiceConfig preferentialNetworkServiceConfig :
preferentialNetworkServiceConfigs) {
ProfileNetworkPreference.Builder preferenceBuilder =
new ProfileNetworkPreference.Builder();
if (preferentialNetworkServiceConfig.isEnabled()) {
if (preferentialNetworkServiceConfig.isFallbackToDefaultConnectionAllowed()) {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_ENTERPRISE);
} else {
preferenceBuilder.setPreference(
PROFILE_NETWORK_PREFERENCE_ENTERPRISE_NO_FALLBACK);
}
} else {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_ENTERPRISE_NO_FALLBACK);
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_DEFAULT);
}
} else {
preferenceBuilder.setPreference(PROFILE_NETWORK_PREFERENCE_DEFAULT);
List<Integer> allowedUids = Arrays.stream(
preferentialNetworkServiceConfig.getIncludedUids()).boxed().collect(
Collectors.toList());
List<Integer> excludedUids = Arrays.stream(
preferentialNetworkServiceConfig.getExcludedUids()).boxed().collect(
Collectors.toList());
preferenceBuilder.setIncludedUids(allowedUids);
preferenceBuilder.setExcludedUids(excludedUids);
preferenceBuilder.setPreferenceEnterpriseId(
preferentialNetworkServiceConfig.getNetworkId());
preferences.add(preferenceBuilder.build());
}
List<Integer> allowedUids = Arrays.stream(
preferentialNetworkServiceConfig.getIncludedUids()).boxed().collect(
Collectors.toList());
List<Integer> excludedUids = Arrays.stream(
preferentialNetworkServiceConfig.getExcludedUids()).boxed().collect(
Collectors.toList());
preferenceBuilder.setIncludedUids(allowedUids);
preferenceBuilder.setExcludedUids(excludedUids);
preferenceBuilder.setPreferenceEnterpriseId(
preferentialNetworkServiceConfig.getNetworkId());
List<ProfileNetworkPreference> preferences = new ArrayList<>();
preferences.add(preferenceBuilder.build());
mInjector.binderWithCleanCallingIdentity(() ->
mInjector.getConnectivityManager().setProfileNetworkPreferences(
UserHandle.of(userId), preferences,

View File

@@ -4137,8 +4137,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
@Test
public void testSetPreferentialNetworkServiceConfig_noProfileOwner() throws Exception {
assertExpectException(SecurityException.class, null,
() -> dpm.setPreferentialNetworkServiceConfig(
PreferentialNetworkServiceConfig.DEFAULT));
() -> dpm.setPreferentialNetworkServiceConfigs(
List.of(PreferentialNetworkServiceConfig.DEFAULT)));
}
@Test
@@ -4178,10 +4178,10 @@ public class DevicePolicyManagerTest extends DpmTestBase {
addManagedProfile(admin1, managedProfileAdminUid, admin1);
mContext.binder.callingUid = managedProfileAdminUid;
dpm.setPreferentialNetworkServiceConfig(PreferentialNetworkServiceConfig.DEFAULT);
dpm.setPreferentialNetworkServiceConfigs(
List.of(PreferentialNetworkServiceConfig.DEFAULT));
assertThat(dpm.isPreferentialNetworkServiceEnabled()).isFalse();
assertThat(dpm.getPreferentialNetworkServiceConfig()
.isEnabled()).isFalse();
assertThat(dpm.getPreferentialNetworkServiceConfigs().get(0).isEnabled()).isFalse();
ProfileNetworkPreference preferenceDetails =
new ProfileNetworkPreference.Builder()
@@ -4207,8 +4207,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
addManagedProfile(admin1, managedProfileAdminUid, admin1);
mContext.binder.callingUid = managedProfileAdminUid;
dpm.setPreferentialNetworkServiceConfig(preferentialNetworkServiceConfigEnabled);
assertThat(dpm.getPreferentialNetworkServiceConfig()
dpm.setPreferentialNetworkServiceConfigs(List.of(preferentialNetworkServiceConfigEnabled));
assertThat(dpm.getPreferentialNetworkServiceConfigs().get(0)
.isEnabled()).isTrue();
ProfileNetworkPreference preferenceDetails =
new ProfileNetworkPreference.Builder()
@@ -4237,8 +4237,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
.setFallbackToDefaultConnectionAllowed(false)
.setIncludedUids(new int[]{1, 2})
.build();
dpm.setPreferentialNetworkServiceConfig(preferentialNetworkServiceConfigEnabled);
assertThat(dpm.getPreferentialNetworkServiceConfig()
dpm.setPreferentialNetworkServiceConfigs(List.of(preferentialNetworkServiceConfigEnabled));
assertThat(dpm.getPreferentialNetworkServiceConfigs().get(0)
.isEnabled()).isTrue();
List<Integer> includedList = new ArrayList<>();
includedList.add(1);
@@ -4272,8 +4272,8 @@ public class DevicePolicyManagerTest extends DpmTestBase {
.setExcludedUids(new int[]{1, 2})
.build();
dpm.setPreferentialNetworkServiceConfig(preferentialNetworkServiceConfigEnabled);
assertThat(dpm.getPreferentialNetworkServiceConfig()
dpm.setPreferentialNetworkServiceConfigs(List.of(preferentialNetworkServiceConfigEnabled));
assertThat(dpm.getPreferentialNetworkServiceConfigs().get(0)
.isEnabled()).isTrue();
List<Integer> excludedUids = new ArrayList<>();
excludedUids.add(1);