Merge "Jarjar all classes in service-connectivity"
diff --git a/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java b/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java
index 69471a1..5584db2 100644
--- a/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java
+++ b/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java
@@ -49,7 +49,6 @@
import com.android.internal.util.StateMachine;
import com.android.networkstack.apishim.ConnectivityManagerShimImpl;
import com.android.networkstack.apishim.common.ConnectivityManagerShim;
-import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
import java.util.HashMap;
import java.util.HashSet;
@@ -162,12 +161,7 @@
}
ConnectivityManagerShim mCmShim = ConnectivityManagerShimImpl.newInstance(mContext);
mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_DEFAULT_INTERNET);
- try {
- mCmShim.registerSystemDefaultNetworkCallback(mDefaultNetworkCallback, mHandler);
- } catch (UnsupportedApiLevelException e) {
- Log.wtf(TAG, "registerSystemDefaultNetworkCallback is not supported");
- return;
- }
+ mCmShim.registerSystemDefaultNetworkCallback(mDefaultNetworkCallback, mHandler);
if (mEntitlementMgr == null) {
mEntitlementMgr = entitle;
}
diff --git a/framework/api/current.txt b/framework/api/current.txt
index 7692e30..715a532 100644
--- a/framework/api/current.txt
+++ b/framework/api/current.txt
@@ -310,6 +310,7 @@
field public static final int NET_CAPABILITY_ENTERPRISE = 29; // 0x1d
field public static final int NET_CAPABILITY_FOREGROUND = 19; // 0x13
field public static final int NET_CAPABILITY_FOTA = 3; // 0x3
+ field public static final int NET_CAPABILITY_HEAD_UNIT = 32; // 0x20
field public static final int NET_CAPABILITY_IA = 7; // 0x7
field public static final int NET_CAPABILITY_IMS = 4; // 0x4
field public static final int NET_CAPABILITY_INTERNET = 12; // 0xc
@@ -333,6 +334,7 @@
field public static final int TRANSPORT_CELLULAR = 0; // 0x0
field public static final int TRANSPORT_ETHERNET = 3; // 0x3
field public static final int TRANSPORT_LOWPAN = 6; // 0x6
+ field public static final int TRANSPORT_USB = 8; // 0x8
field public static final int TRANSPORT_VPN = 4; // 0x4
field public static final int TRANSPORT_WIFI = 1; // 0x1
field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
diff --git a/framework/src/android/net/NetworkCapabilities.java b/framework/src/android/net/NetworkCapabilities.java
index 3a07db3..ec71d3d 100644
--- a/framework/src/android/net/NetworkCapabilities.java
+++ b/framework/src/android/net/NetworkCapabilities.java
@@ -262,6 +262,7 @@
NET_CAPABILITY_ENTERPRISE,
NET_CAPABILITY_VSIM,
NET_CAPABILITY_BIP,
+ NET_CAPABILITY_HEAD_UNIT,
})
public @interface NetCapability { }
@@ -495,8 +496,13 @@
@SystemApi
public static final int NET_CAPABILITY_BIP = 31;
+ /**
+ * Indicates that this network is connected to an automotive head unit.
+ */
+ public static final int NET_CAPABILITY_HEAD_UNIT = 32;
+
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
- private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_BIP;
+ private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_HEAD_UNIT;
/**
* Network capabilities that are expected to be mutable, i.e., can change while a particular
@@ -514,7 +520,10 @@
| (1 << NET_CAPABILITY_NOT_SUSPENDED)
| (1 << NET_CAPABILITY_PARTIAL_CONNECTIVITY)
| (1 << NET_CAPABILITY_TEMPORARILY_NOT_METERED)
- | (1 << NET_CAPABILITY_NOT_VCN_MANAGED);
+ | (1 << NET_CAPABILITY_NOT_VCN_MANAGED)
+ // The value of NET_CAPABILITY_HEAD_UNIT is 32, which cannot use int to do bit shift,
+ // otherwise there will be an overflow. Use long to do bit shift instead.
+ | (1L << NET_CAPABILITY_HEAD_UNIT);
/**
* Network capabilities that are not allowed in NetworkRequests. This exists because the
@@ -868,6 +877,7 @@
TRANSPORT_WIFI_AWARE,
TRANSPORT_LOWPAN,
TRANSPORT_TEST,
+ TRANSPORT_USB,
})
public @interface Transport { }
@@ -914,10 +924,15 @@
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public static final int TRANSPORT_TEST = 7;
+ /**
+ * Indicates this network uses a USB transport.
+ */
+ public static final int TRANSPORT_USB = 8;
+
/** @hide */
public static final int MIN_TRANSPORT = TRANSPORT_CELLULAR;
/** @hide */
- public static final int MAX_TRANSPORT = TRANSPORT_TEST;
+ public static final int MAX_TRANSPORT = TRANSPORT_USB;
/** @hide */
public static boolean isValidTransport(@Transport int transportType) {
@@ -932,7 +947,8 @@
"VPN",
"WIFI_AWARE",
"LOWPAN",
- "TEST"
+ "TEST",
+ "USB"
};
/**
@@ -2121,6 +2137,7 @@
case NET_CAPABILITY_ENTERPRISE: return "ENTERPRISE";
case NET_CAPABILITY_VSIM: return "VSIM";
case NET_CAPABILITY_BIP: return "BIP";
+ case NET_CAPABILITY_HEAD_UNIT: return "HEAD_UNIT";
default: return Integer.toString(capability);
}
}
diff --git a/service/Android.bp b/service/Android.bp
index 848de12..abaeeb3 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -53,8 +53,8 @@
"src/**/*.java",
":framework-connectivity-shared-srcs",
":services-connectivity-shared-srcs",
- // TODO: move to net-utils-device-common, enable shrink optimization to avoid extra classes
- ":net-module-utils-srcs",
+ // TODO: move to net-utils-device-common
+ ":connectivity-module-utils-srcs",
],
libs: [
"framework-annotations-lib",
@@ -65,7 +65,8 @@
"ServiceConnectivityResources",
],
static_libs: [
- "dnsresolver_aidl_interface-V7-java",
+ "dnsresolver_aidl_interface-V8-java",
+ "modules-utils-build",
"modules-utils-os",
"net-utils-device-common",
"net-utils-framework-common",
diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java
index e05dc52..770aa8a 100644
--- a/service/src/com/android/server/ConnectivityService.java
+++ b/service/src/com/android/server/ConnectivityService.java
@@ -402,30 +402,45 @@
}
/**
- * The priority value is used when issue uid ranges rules to netd. Netd will use the priority
- * value and uid ranges to generate corresponding ip rules specific to the given preference.
- * Thus, any device originated data traffic of the applied uids can be routed to the altered
- * default network which has highest priority.
+ * For per-app preferences, requests contain an int to signify which request
+ * should have priority. The priority is passed to netd which will use it
+ * together with UID ranges to generate the corresponding IP rule. This serves
+ * to direct device-originated data traffic of the specific UIDs to the correct
+ * default network for each app.
+ * Priorities passed to netd must be in the 0~999 range. Larger values code for
+ * a lower priority, {@see NativeUidRangeConfig}
*
- * Note: The priority value should be in 0~1000. Larger value means lower priority, see
- * {@link NativeUidRangeConfig}.
+ * Requests that don't code for a per-app preference use PREFERENCE_PRIORITY_INVALID.
+ * The default request uses PREFERENCE_PRIORITY_DEFAULT.
*/
- // This is default priority value for those NetworkRequests which doesn't have preference to
- // alter default network and use the global one.
+ // Bound for the lowest valid priority.
+ static final int PREFERENCE_PRIORITY_LOWEST = 999;
+ // Used when sending to netd to code for "no priority".
+ static final int PREFERENCE_PRIORITY_NONE = 0;
+ // Priority for requests that don't code for a per-app preference. As it is
+ // out of the valid range, the corresponding priority should be
+ // PREFERENCE_PRIORITY_NONE when sending to netd.
@VisibleForTesting
- static final int DEFAULT_NETWORK_PRIORITY_NONE = 0;
- // Used by automotive devices to set the network preferences used to direct traffic at an
- // application level. See {@link #setOemNetworkPreference}.
+ static final int PREFERENCE_PRIORITY_INVALID = Integer.MAX_VALUE;
+ // Priority for the default internet request. Since this must always have the
+ // lowest priority, its value is larger than the largest acceptable value. As
+ // it is out of the valid range, the corresponding priority should be
+ // PREFERENCE_PRIORITY_NONE when sending to netd.
+ static final int PREFERENCE_PRIORITY_DEFAULT = 1000;
+ // As a security feature, VPNs have the top priority.
+ static final int PREFERENCE_PRIORITY_VPN = 0; // Netd supports only 0 for VPN.
+ // Priority of per-app OEM preference. See {@link #setOemNetworkPreference}.
@VisibleForTesting
- static final int DEFAULT_NETWORK_PRIORITY_OEM = 10;
- // Request that a user profile is put by default on a network matching a given preference.
+ static final int PREFERENCE_PRIORITY_OEM = 10;
+ // Priority of per-profile preference, such as used by enterprise networks.
// See {@link #setProfileNetworkPreference}.
@VisibleForTesting
- static final int DEFAULT_NETWORK_PRIORITY_PROFILE = 20;
- // Set by MOBILE_DATA_PREFERRED_UIDS setting. Use mobile data in preference even when
- // higher-priority networks are connected.
+ static final int PREFERENCE_PRIORITY_PROFILE = 20;
+ // Priority of user setting to prefer mobile data even when networks with
+ // better scores are connected.
+ // See {@link ConnectivitySettingsManager#setMobileDataPreferredUids}
@VisibleForTesting
- static final int DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED = 30;
+ static final int PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED = 30;
/**
* used internally to clear a wakelock when transitioning
@@ -4206,13 +4221,16 @@
private void handleRemoveNetworkRequest(@NonNull final NetworkRequestInfo nri) {
ensureRunningOnConnectivityServiceThread();
- nri.unlinkDeathRecipient();
for (final NetworkRequest req : nri.mRequests) {
- mNetworkRequests.remove(req);
+ if (null == mNetworkRequests.remove(req)) {
+ logw("Attempted removal of untracked request " + req + " for nri " + nri);
+ continue;
+ }
if (req.isListen()) {
removeListenRequestFromNetworks(req);
}
}
+ nri.unlinkDeathRecipient();
if (mDefaultNetworkRequests.remove(nri)) {
// If this request was one of the defaults, then the UID rules need to be updated
// WARNING : if the app(s) for which this network request is the default are doing
@@ -4227,7 +4245,7 @@
mNetd.networkRemoveUidRangesParcel(new NativeUidRangeConfig(
satisfier.network.getNetId(),
toUidRangeStableParcels(nri.getUids()),
- nri.getDefaultNetworkPriority()));
+ nri.getPriorityForNetd()));
} catch (RemoteException e) {
loge("Exception setting network preference default network", e);
}
@@ -5697,11 +5715,7 @@
final int mAsUid;
// Default network priority of this request.
- private final int mDefaultNetworkPriority;
-
- int getDefaultNetworkPriority() {
- return mDefaultNetworkPriority;
- }
+ final int mPreferencePriority;
// In order to preserve the mapping of NetworkRequest-to-callback when apps register
// callbacks using a returned NetworkRequest, the original NetworkRequest needs to be
@@ -5733,12 +5747,12 @@
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r,
@Nullable final PendingIntent pi, @Nullable String callingAttributionTag) {
this(asUid, Collections.singletonList(r), r, pi, callingAttributionTag,
- DEFAULT_NETWORK_PRIORITY_NONE);
+ PREFERENCE_PRIORITY_INVALID);
}
NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
@NonNull final NetworkRequest requestForCallback, @Nullable final PendingIntent pi,
- @Nullable String callingAttributionTag, final int defaultNetworkPriority) {
+ @Nullable String callingAttributionTag, final int preferencePriority) {
ensureAllNetworkRequestsHaveType(r);
mRequests = initializeRequests(r);
mNetworkRequestForCallback = requestForCallback;
@@ -5756,7 +5770,7 @@
*/
mCallbackFlags = NetworkCallback.FLAG_NONE;
mCallingAttributionTag = callingAttributionTag;
- mDefaultNetworkPriority = defaultNetworkPriority;
+ mPreferencePriority = preferencePriority;
}
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r, @Nullable final Messenger m,
@@ -5786,7 +5800,7 @@
mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = callbackFlags;
mCallingAttributionTag = callingAttributionTag;
- mDefaultNetworkPriority = DEFAULT_NETWORK_PRIORITY_NONE;
+ mPreferencePriority = PREFERENCE_PRIORITY_INVALID;
linkDeathRecipient();
}
@@ -5826,18 +5840,18 @@
mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = nri.mCallbackFlags;
mCallingAttributionTag = nri.mCallingAttributionTag;
- mDefaultNetworkPriority = DEFAULT_NETWORK_PRIORITY_NONE;
+ mPreferencePriority = PREFERENCE_PRIORITY_INVALID;
linkDeathRecipient();
}
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r) {
- this(asUid, Collections.singletonList(r), DEFAULT_NETWORK_PRIORITY_NONE);
+ this(asUid, Collections.singletonList(r), PREFERENCE_PRIORITY_INVALID);
}
NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
- final int defaultNetworkPriority) {
+ final int preferencePriority) {
this(asUid, r, r.get(0), null /* pi */, null /* callingAttributionTag */,
- defaultNetworkPriority);
+ preferencePriority);
}
// True if this NRI is being satisfied. It also accounts for if the nri has its satisifer
@@ -5878,11 +5892,24 @@
}
}
+ boolean hasHigherPriorityThan(@NonNull final NetworkRequestInfo target) {
+ // Compare two priorities, larger value means lower priority.
+ return mPreferencePriority < target.mPreferencePriority;
+ }
+
+ int getPriorityForNetd() {
+ if (mPreferencePriority >= PREFERENCE_PRIORITY_NONE
+ && mPreferencePriority <= PREFERENCE_PRIORITY_LOWEST) {
+ return mPreferencePriority;
+ }
+ return PREFERENCE_PRIORITY_NONE;
+ }
+
@Override
public void binderDied() {
log("ConnectivityService NetworkRequestInfo binderDied(" +
- mRequests + ", " + mBinder + ")");
- releaseNetworkRequests(mRequests);
+ "uid/pid:" + mUid + "/" + mPid + ", " + mBinder + ")");
+ mHandler.post(() -> handleRemoveNetworkRequest(this));
}
@Override
@@ -5894,7 +5921,8 @@
+ mNetworkRequestForCallback.requestId
+ " " + mRequests
+ (mPendingIntent == null ? "" : " to trigger " + mPendingIntent)
- + " callback flags: " + mCallbackFlags;
+ + " callback flags: " + mCallbackFlags
+ + " priority: " + mPreferencePriority;
}
}
@@ -6312,12 +6340,6 @@
return mNextNetworkProviderId.getAndIncrement();
}
- private void releaseNetworkRequests(List<NetworkRequest> networkRequests) {
- for (int i = 0; i < networkRequests.size(); i++) {
- releaseNetworkRequest(networkRequests.get(i));
- }
- }
-
@Override
public void releaseNetworkRequest(NetworkRequest networkRequest) {
ensureNetworkRequestHasType(networkRequest);
@@ -6486,17 +6508,18 @@
*/
@NonNull
private NetworkRequestInfo getDefaultRequestTrackingUid(final int uid) {
+ NetworkRequestInfo highestPriorityNri = mDefaultRequest;
for (final NetworkRequestInfo nri : mDefaultNetworkRequests) {
- if (nri == mDefaultRequest) {
- continue;
- }
// Checking the first request is sufficient as only multilayer requests will have more
// than one request and for multilayer, all requests will track the same uids.
if (nri.mRequests.get(0).networkCapabilities.appliesToUid(uid)) {
- return nri;
+ // Find out the highest priority request.
+ if (nri.hasHigherPriorityThan(highestPriorityNri)) {
+ highestPriorityNri = nri;
+ }
}
}
- return mDefaultRequest;
+ return highestPriorityNri;
}
/**
@@ -6626,6 +6649,7 @@
}
private NetworkAgentInfo getDefaultNetworkForUid(final int uid) {
+ NetworkRequestInfo highestPriorityNri = mDefaultRequest;
for (final NetworkRequestInfo nri : mDefaultNetworkRequests) {
// Currently, all network requests will have the same uids therefore checking the first
// one is sufficient. If/when uids are tracked at the nri level, this can change.
@@ -6635,11 +6659,13 @@
}
for (final UidRange range : uids) {
if (range.contains(uid)) {
- return nri.getSatisfier();
+ if (nri.hasHigherPriorityThan(highestPriorityNri)) {
+ highestPriorityNri = nri;
+ }
}
}
}
- return getDefaultNetwork();
+ return highestPriorityNri.getSatisfier();
}
@Nullable
@@ -7485,7 +7511,7 @@
}
}
- private void updateUidRanges(boolean add, NetworkAgentInfo nai, Set<UidRange> uidRanges) {
+ private void updateVpnUidRanges(boolean add, NetworkAgentInfo nai, Set<UidRange> uidRanges) {
int[] exemptUids = new int[2];
// TODO: Excluding VPN_UID is necessary in order to not to kill the TCP connection used
// by PPTP. Fix this by making Vpn set the owner UID to VPN_UID instead of system when
@@ -7498,10 +7524,10 @@
try {
if (add) {
mNetd.networkAddUidRangesParcel(new NativeUidRangeConfig(
- nai.network.netId, ranges, DEFAULT_NETWORK_PRIORITY_NONE));
+ nai.network.netId, ranges, PREFERENCE_PRIORITY_VPN));
} else {
mNetd.networkRemoveUidRangesParcel(new NativeUidRangeConfig(
- nai.network.netId, ranges, DEFAULT_NETWORK_PRIORITY_NONE));
+ nai.network.netId, ranges, PREFERENCE_PRIORITY_VPN));
}
} catch (Exception e) {
loge("Exception while " + (add ? "adding" : "removing") + " uid ranges " + uidRanges +
@@ -7563,10 +7589,10 @@
// This can prevent the sockets of uid 1-2, 4-5 from being closed. It also reduce the
// number of binder calls from 6 to 4.
if (!newRanges.isEmpty()) {
- updateUidRanges(true, nai, newRanges);
+ updateVpnUidRanges(true, nai, newRanges);
}
if (!prevRanges.isEmpty()) {
- updateUidRanges(false, nai, prevRanges);
+ updateVpnUidRanges(false, nai, prevRanges);
}
final boolean wasFiltering = requiresVpnIsolation(nai, prevNc, nai.linkProperties);
final boolean shouldFilter = requiresVpnIsolation(nai, newNc, nai.linkProperties);
@@ -7846,13 +7872,13 @@
mNetd.networkAddUidRangesParcel(new NativeUidRangeConfig(
newDefaultNetwork.network.getNetId(),
toUidRangeStableParcels(nri.getUids()),
- nri.getDefaultNetworkPriority()));
+ nri.getPriorityForNetd()));
}
if (null != oldDefaultNetwork) {
mNetd.networkRemoveUidRangesParcel(new NativeUidRangeConfig(
oldDefaultNetwork.network.getNetId(),
toUidRangeStableParcels(nri.getUids()),
- nri.getDefaultNetworkPriority()));
+ nri.getPriorityForNetd()));
}
} catch (RemoteException | ServiceSpecificException e) {
loge("Exception setting app default network", e);
@@ -9881,21 +9907,6 @@
mQosCallbackTracker.unregisterCallback(callback);
}
- // Network preference per-profile and OEM network preferences can't be set at the same
- // time, because it is unclear what should happen if both preferences are active for
- // one given UID. To make it possible, the stack would have to clarify what would happen
- // in case both are active at the same time. The implementation may have to be adjusted
- // to implement the resulting rules. For example, a priority could be defined between them,
- // where the OEM preference would be considered less or more important than the enterprise
- // preference ; this would entail implementing the priorities somehow, e.g. by doing
- // UID arithmetic with UID ranges or passing a priority to netd so that the routing rules
- // are set at the right level. Other solutions are possible, e.g. merging of the
- // preferences for the relevant UIDs.
- private static void throwConcurrentPreferenceException() {
- throw new IllegalStateException("Can't set NetworkPreferenceForUser and "
- + "set OemNetworkPreference at the same time");
- }
-
/**
* Request that a user profile is put by default on a network matching a given preference.
*
@@ -9924,15 +9935,7 @@
if (!um.isManagedProfile(profile.getIdentifier())) {
throw new IllegalArgumentException("Profile must be a managed profile");
}
- // Strictly speaking, mOemNetworkPreferences should only be touched on the
- // handler thread. However it is an immutable object, so reading the reference is
- // safe - it's just possible the value is slightly outdated. For the final check,
- // see #handleSetProfileNetworkPreference. But if this can be caught here it is a
- // lot easier to understand, so opportunistically check it.
- // TODO: Have a priority for each preference.
- if (!mOemNetworkPreferences.isEmpty() || !mMobileDataPreferredUids.isEmpty()) {
- throwConcurrentPreferenceException();
- }
+
final NetworkCapabilities nc;
switch (preference) {
case ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT:
@@ -9975,7 +9978,7 @@
TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids()));
final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs,
- DEFAULT_NETWORK_PRIORITY_PROFILE);
+ PREFERENCE_PRIORITY_PROFILE);
result.add(nri);
}
return result;
@@ -9984,20 +9987,6 @@
private void handleSetProfileNetworkPreference(
@NonNull final ProfileNetworkPreferences.Preference preference,
@Nullable final IOnCompleteListener listener) {
- // setProfileNetworkPreference and setOemNetworkPreference are mutually exclusive, in
- // particular because it's not clear what preference should win in case both apply
- // to the same app.
- // The binder call has already checked this, but as mOemNetworkPreferences is only
- // touched on the handler thread, it's theoretically not impossible that it has changed
- // since.
- // TODO: Have a priority for each preference.
- if (!mOemNetworkPreferences.isEmpty() || !mMobileDataPreferredUids.isEmpty()) {
- // This may happen on a device with an OEM preference set when a user is removed.
- // In this case, it's safe to ignore. In particular this happens in the tests.
- loge("handleSetProfileNetworkPreference, but OEM network preferences not empty");
- return;
- }
-
validateNetworkCapabilitiesOfProfileNetworkPreference(preference.capabilities);
mProfileNetworkPreferences = mProfileNetworkPreferences.plus(preference);
@@ -10006,7 +9995,7 @@
() -> {
final ArraySet<NetworkRequestInfo> nris =
createNrisFromProfileNetworkPreferences(mProfileNetworkPreferences);
- replaceDefaultNetworkRequestsForPreference(nris);
+ replaceDefaultNetworkRequestsForPreference(nris, PREFERENCE_PRIORITY_PROFILE);
});
// Finally, rematch.
rematchAllNetworksAndRequests();
@@ -10046,26 +10035,19 @@
}
setNetworkRequestUids(requests, ranges);
nris.add(new NetworkRequestInfo(Process.myUid(), requests,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED));
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED));
return nris;
}
private void handleMobileDataPreferredUidsChanged() {
- // Ignore update preference because it's not clear what preference should win in case both
- // apply to the same app.
- // TODO: Have a priority for each preference.
- if (!mOemNetworkPreferences.isEmpty() || !mProfileNetworkPreferences.isEmpty()) {
- loge("Ignore mobile data preference change because other preferences are not empty");
- return;
- }
-
mMobileDataPreferredUids = ConnectivitySettingsManager.getMobileDataPreferredUids(mContext);
mSystemNetworkRequestCounter.transact(
mDeps.getCallingUid(), 1 /* numOfNewRequests */,
() -> {
final ArraySet<NetworkRequestInfo> nris =
createNrisFromMobileDataPreferredUids(mMobileDataPreferredUids);
- replaceDefaultNetworkRequestsForPreference(nris);
+ replaceDefaultNetworkRequestsForPreference(nris,
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
});
// Finally, rematch.
rematchAllNetworksAndRequests();
@@ -10107,16 +10089,6 @@
validateOemNetworkPreferences(preference);
}
- // TODO: Have a priority for each preference.
- if (!mProfileNetworkPreferences.isEmpty() || !mMobileDataPreferredUids.isEmpty()) {
- // Strictly speaking, mProfileNetworkPreferences should only be touched on the
- // handler thread. However it is an immutable object, so reading the reference is
- // safe - it's just possible the value is slightly outdated. For the final check,
- // see #handleSetOemPreference. But if this can be caught here it is a
- // lot easier to understand, so opportunistically check it.
- throwConcurrentPreferenceException();
- }
-
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_OEM_NETWORK_PREFERENCE,
new Pair<>(preference, listener)));
}
@@ -10163,17 +10135,6 @@
if (DBG) {
log("set OEM network preferences :" + preference.toString());
}
- // setProfileNetworkPreference and setOemNetworkPreference are mutually exclusive, in
- // particular because it's not clear what preference should win in case both apply
- // to the same app.
- // The binder call has already checked this, but as mOemNetworkPreferences is only
- // touched on the handler thread, it's theoretically not impossible that it has changed
- // since.
- // TODO: Have a priority for each preference.
- if (!mProfileNetworkPreferences.isEmpty() || !mMobileDataPreferredUids.isEmpty()) {
- logwtf("handleSetOemPreference, but per-profile network preferences not empty");
- return;
- }
mOemNetworkPreferencesLogs.log("UPDATE INITIATED: " + preference);
final int uniquePreferenceCount = new ArraySet<>(
@@ -10184,7 +10145,7 @@
final ArraySet<NetworkRequestInfo> nris =
new OemNetworkRequestFactory()
.createNrisFromOemNetworkPreferences(preference);
- replaceDefaultNetworkRequestsForPreference(nris);
+ replaceDefaultNetworkRequestsForPreference(nris, PREFERENCE_PRIORITY_OEM);
});
mOemNetworkPreferences = preference;
@@ -10198,9 +10159,12 @@
}
private void replaceDefaultNetworkRequestsForPreference(
- @NonNull final Set<NetworkRequestInfo> nris) {
- // Pass in a defensive copy as this collection will be updated on remove.
- handleRemoveNetworkRequests(new ArraySet<>(mDefaultNetworkRequests));
+ @NonNull final Set<NetworkRequestInfo> nris, final int preferencePriority) {
+ // Skip the requests which are set by other network preference. Because the uid range rules
+ // should stay in netd.
+ final Set<NetworkRequestInfo> requests = new ArraySet<>(mDefaultNetworkRequests);
+ requests.removeIf(request -> request.mPreferencePriority != preferencePriority);
+ handleRemoveNetworkRequests(requests);
addPerAppDefaultNetworkRequests(nris);
}
@@ -10394,8 +10358,7 @@
ranges.add(new UidRange(uid, uid));
}
setNetworkRequestUids(requests, ranges);
- return new NetworkRequestInfo(
- Process.myUid(), requests, DEFAULT_NETWORK_PRIORITY_OEM);
+ return new NetworkRequestInfo(Process.myUid(), requests, PREFERENCE_PRIORITY_OEM);
}
private NetworkRequest createUnmeteredNetworkRequest() {
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index 527897e..e45aa98 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -1101,10 +1101,10 @@
}
}
- private void waitForActiveNetworkMetered(final int targetTransportType,
+ private Network waitForActiveNetworkMetered(final int targetTransportType,
final boolean requestedMeteredness, final boolean useSystemDefault)
throws Exception {
- final CountDownLatch latch = new CountDownLatch(1);
+ final CompletableFuture<Network> networkFuture = new CompletableFuture<>();
final NetworkCallback networkCallback = new NetworkCallback() {
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
@@ -1112,7 +1112,7 @@
final boolean metered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED);
if (metered == requestedMeteredness) {
- latch.countDown();
+ networkFuture.complete(network);
}
}
};
@@ -1132,18 +1132,20 @@
// Changing meteredness on wifi involves reconnecting, which can take several seconds
// (involves re-associating, DHCP...).
- if (!latch.await(NETWORK_CALLBACK_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
- fail("Timed out waiting for active network metered status to change to "
- + requestedMeteredness + " ; network = " + mCm.getActiveNetwork());
- }
+ return networkFuture.get(NETWORK_CALLBACK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (TimeoutException e) {
+ throw new AssertionError("Timed out waiting for active network metered status to "
+ + "change to " + requestedMeteredness + " ; network = "
+ + mCm.getActiveNetwork(), e);
} finally {
mCm.unregisterNetworkCallback(networkCallback);
}
}
- private void setWifiMeteredStatusAndWait(String ssid, boolean isMetered) throws Exception {
+ private Network setWifiMeteredStatusAndWait(String ssid, boolean isMetered) throws Exception {
setWifiMeteredStatus(ssid, Boolean.toString(isMetered) /* metered */);
- waitForActiveNetworkMetered(TRANSPORT_WIFI,
+ mCtsNetUtils.ensureWifiConnected();
+ return waitForActiveNetworkMetered(TRANSPORT_WIFI,
isMetered /* requestedMeteredness */,
true /* useSystemDefault */);
}
@@ -1209,8 +1211,7 @@
Integer.toString(newMeteredPreference));
// Wifi meterness changes from unmetered to metered will disconnect and reconnect since
// R.
- setWifiMeteredStatusAndWait(ssid, true);
- final Network network = mCtsNetUtils.ensureWifiConnected();
+ final Network network = setWifiMeteredStatusAndWait(ssid, true);
assertEquals(ssid, unquoteSSID(mWifiManager.getConnectionInfo().getSSID()));
assertEquals(mCm.getNetworkCapabilities(network).hasCapability(
NET_CAPABILITY_NOT_METERED), false);
diff --git a/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt b/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
index 40f39a4..9203f8f 100644
--- a/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
+++ b/tests/unit/java/android/net/util/KeepaliveUtilsTest.kt
@@ -104,7 +104,7 @@
// Check valid customization generates expected array.
val validRes = arrayOf("0,3", "1,0", "4,4")
- val expectedValidRes = intArrayOf(3, 0, 0, 0, 4, 0, 0, 0)
+ val expectedValidRes = intArrayOf(3, 0, 0, 0, 4, 0, 0, 0, 0)
val mockContext = getMockedContextWithStringArrayRes(
R.array.config_networkSupportedKeepaliveCount,
diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java
index 18805a0..e28f3c4 100644
--- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java
@@ -125,10 +125,10 @@
import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;
-import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED;
-import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_NONE;
-import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_OEM;
-import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_PROFILE;
+import static com.android.server.ConnectivityService.PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED;
+import static com.android.server.ConnectivityService.PREFERENCE_PRIORITY_OEM;
+import static com.android.server.ConnectivityService.PREFERENCE_PRIORITY_PROFILE;
+import static com.android.server.ConnectivityService.PREFERENCE_PRIORITY_VPN;
import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyType;
import static com.android.testutils.ConcurrentUtils.await;
import static com.android.testutils.ConcurrentUtils.durationOf;
@@ -176,6 +176,8 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import static java.util.Arrays.asList;
+
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -309,7 +311,6 @@
import com.android.internal.app.IBatteryStats;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnProfile;
-import com.android.internal.util.ArrayUtils;
import com.android.internal.util.WakeupMessage;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
@@ -437,6 +438,7 @@
private static final String TEST_PACKAGE_NAME = "com.android.test.package";
private static final int TEST_PACKAGE_UID = 123;
private static final int TEST_PACKAGE_UID2 = 321;
+ private static final int TEST_PACKAGE_UID3 = 456;
private static final String ALWAYS_ON_PACKAGE = "com.android.test.alwaysonvpn";
private static final String INTERFACE_NAME = "interface";
@@ -1295,10 +1297,10 @@
verify(mMockNetd, times(1)).networkAddUidRangesParcel(
new NativeUidRangeConfig(mMockVpn.getNetwork().getNetId(),
- toUidRangeStableParcels(uids), DEFAULT_NETWORK_PRIORITY_NONE));
+ toUidRangeStableParcels(uids), PREFERENCE_PRIORITY_VPN));
verify(mMockNetd, never()).networkRemoveUidRangesParcel(argThat(config ->
mMockVpn.getNetwork().getNetId() == config.netId
- && DEFAULT_NETWORK_PRIORITY_NONE == config.subPriority));
+ && PREFERENCE_PRIORITY_VPN == config.subPriority));
mAgentRegistered = true;
verify(mMockNetd).networkCreate(nativeNetworkConfigVpn(getNetwork().netId,
!mMockNetworkAgent.isBypassableVpn(), mVpnType));
@@ -1602,9 +1604,8 @@
MockitoAnnotations.initMocks(this);
- when(mUserManager.getAliveUsers()).thenReturn(Arrays.asList(PRIMARY_USER_INFO));
- when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE));
+ when(mUserManager.getAliveUsers()).thenReturn(asList(PRIMARY_USER_INFO));
+ when(mUserManager.getUserHandles(anyBoolean())).thenReturn(asList(PRIMARY_USER_HANDLE));
when(mUserManager.getUserInfo(PRIMARY_USER)).thenReturn(PRIMARY_USER_INFO);
// canHaveRestrictedProfile does not take a userId. It applies to the userId of the context
// it was started from, i.e., PRIMARY_USER.
@@ -1812,7 +1813,7 @@
eq(UserHandle.getCallingUserId()))).thenReturn(myPackageInfo);
when(mPackageManager.getInstalledPackages(eq(GET_PERMISSIONS | MATCH_ANY_USER))).thenReturn(
- Arrays.asList(new PackageInfo[] {
+ asList(new PackageInfo[] {
buildPackageInfo(/* SYSTEM */ false, APP1_UID),
buildPackageInfo(/* SYSTEM */ false, APP2_UID),
buildPackageInfo(/* SYSTEM */ false, VPN_UID)
@@ -1829,7 +1830,7 @@
ResolveInfo rInfo = new ResolveInfo();
rInfo.serviceInfo = new ServiceInfo();
rInfo.serviceInfo.metaData = new Bundle();
- final List<ResolveInfo> services = Arrays.asList(new ResolveInfo[]{rInfo});
+ final List<ResolveInfo> services = asList(new ResolveInfo[]{rInfo});
when(mPackageManager.queryIntentServicesAsUser(any(), eq(PackageManager.GET_META_DATA),
eq(userId))).thenReturn(services);
when(mPackageManager.getPackageUidAsUser(TEST_PACKAGE_NAME, userId))
@@ -4846,8 +4847,8 @@
final ContentResolver cr = mServiceContext.getContentResolver();
final String settingName = ConnectivitySettingsManager.NETWORK_METERED_MULTIPATH_PREFERENCE;
- for (int config : Arrays.asList(0, 3, 2)) {
- for (String setting: Arrays.asList(null, "0", "2", "1")) {
+ for (int config : asList(0, 3, 2)) {
+ for (String setting: asList(null, "0", "2", "1")) {
mPolicyTracker.mConfigMeteredMultipathPreference = config;
Settings.Global.putString(cr, settingName, setting);
mPolicyTracker.reevaluate();
@@ -6006,10 +6007,10 @@
networkCallback.expectCallback(CallbackEntry.BLOCKED_STATUS, networkAgent);
networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, networkAgent);
networkCallback.assertNoCallback();
- checkDirectlyConnectedRoutes(cbi.getLp(), Arrays.asList(myIpv4Address),
- Arrays.asList(myIpv4DefaultRoute));
+ checkDirectlyConnectedRoutes(cbi.getLp(), asList(myIpv4Address),
+ asList(myIpv4DefaultRoute));
checkDirectlyConnectedRoutes(mCm.getLinkProperties(networkAgent.getNetwork()),
- Arrays.asList(myIpv4Address), Arrays.asList(myIpv4DefaultRoute));
+ asList(myIpv4Address), asList(myIpv4DefaultRoute));
// Verify direct routes are added during subsequent link properties updates.
LinkProperties newLp = new LinkProperties(lp);
@@ -6021,8 +6022,8 @@
cbi = networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, networkAgent);
networkCallback.assertNoCallback();
checkDirectlyConnectedRoutes(cbi.getLp(),
- Arrays.asList(myIpv4Address, myIpv6Address1, myIpv6Address2),
- Arrays.asList(myIpv4DefaultRoute));
+ asList(myIpv4Address, myIpv6Address1, myIpv6Address2),
+ asList(myIpv4DefaultRoute));
mCm.unregisterNetworkCallback(networkCallback);
}
@@ -6350,9 +6351,9 @@
mResolverParamsParcelCaptor.capture());
ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(1, resolvrParams.servers.length);
- assertTrue(ArrayUtils.contains(resolvrParams.servers, "2001:db8::1"));
+ assertTrue(CollectionUtils.contains(resolvrParams.servers, "2001:db8::1"));
// Opportunistic mode.
- assertTrue(ArrayUtils.contains(resolvrParams.tlsServers, "2001:db8::1"));
+ assertTrue(CollectionUtils.contains(resolvrParams.tlsServers, "2001:db8::1"));
reset(mMockDnsResolver);
cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
@@ -6362,12 +6363,12 @@
mResolverParamsParcelCaptor.capture());
resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(2, resolvrParams.servers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
- new String[]{"2001:db8::1", "192.0.2.1"}));
+ assertTrue(new ArraySet<>(resolvrParams.servers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
// Opportunistic mode.
assertEquals(2, resolvrParams.tlsServers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
- new String[]{"2001:db8::1", "192.0.2.1"}));
+ assertTrue(new ArraySet<>(resolvrParams.tlsServers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
reset(mMockDnsResolver);
final String TLS_SPECIFIER = "tls.example.com";
@@ -6382,8 +6383,8 @@
mResolverParamsParcelCaptor.capture());
resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(2, resolvrParams.servers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
- new String[]{"2001:db8::1", "192.0.2.1"}));
+ assertTrue(new ArraySet<>(resolvrParams.servers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
reset(mMockDnsResolver);
}
@@ -6490,12 +6491,12 @@
mResolverParamsParcelCaptor.capture());
ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(2, resolvrParams.tlsServers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
- new String[] { "2001:db8::1", "192.0.2.1" }));
+ assertTrue(new ArraySet<>(resolvrParams.tlsServers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
// Opportunistic mode.
assertEquals(2, resolvrParams.tlsServers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
- new String[] { "2001:db8::1", "192.0.2.1" }));
+ assertTrue(new ArraySet<>(resolvrParams.tlsServers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
reset(mMockDnsResolver);
cellNetworkCallback.expectCallback(CallbackEntry.AVAILABLE, mCellNetworkAgent);
cellNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED,
@@ -6512,8 +6513,8 @@
mResolverParamsParcelCaptor.capture());
resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(2, resolvrParams.servers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
- new String[] { "2001:db8::1", "192.0.2.1" }));
+ assertTrue(new ArraySet<>(resolvrParams.servers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
reset(mMockDnsResolver);
cellNetworkCallback.assertNoCallback();
@@ -6522,11 +6523,11 @@
mResolverParamsParcelCaptor.capture());
resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(2, resolvrParams.servers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.servers,
- new String[] { "2001:db8::1", "192.0.2.1" }));
+ assertTrue(new ArraySet<>(resolvrParams.servers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
assertEquals(2, resolvrParams.tlsServers.length);
- assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers,
- new String[] { "2001:db8::1", "192.0.2.1" }));
+ assertTrue(new ArraySet<>(resolvrParams.tlsServers).containsAll(
+ asList("2001:db8::1", "192.0.2.1")));
reset(mMockDnsResolver);
cellNetworkCallback.assertNoCallback();
@@ -7562,7 +7563,7 @@
// Start the restricted profile, and check that the UID within it loses network access.
when(mPackageManager.getPackageUidAsUser(ALWAYS_ON_PACKAGE, RESTRICTED_USER))
.thenReturn(UserHandle.getUid(RESTRICTED_USER, VPN_UID));
- when(mUserManager.getAliveUsers()).thenReturn(Arrays.asList(PRIMARY_USER_INFO,
+ when(mUserManager.getAliveUsers()).thenReturn(asList(PRIMARY_USER_INFO,
RESTRICTED_USER_INFO));
// TODO: check that VPN app within restricted profile still has access, etc.
final Intent addedIntent = new Intent(ACTION_USER_ADDED);
@@ -7573,7 +7574,7 @@
assertNull(mCm.getActiveNetworkForUid(restrictedUid));
// Stop the restricted profile, and check that the UID within it has network access again.
- when(mUserManager.getAliveUsers()).thenReturn(Arrays.asList(PRIMARY_USER_INFO));
+ when(mUserManager.getAliveUsers()).thenReturn(asList(PRIMARY_USER_INFO));
// Send a USER_REMOVED broadcast and expect to lose the UID range for the restricted user.
final Intent removedIntent = new Intent(ACTION_USER_REMOVED);
@@ -7998,7 +7999,7 @@
// networks, ConnectivityService does not guarantee the order in which callbacks are fired.
private void assertBlockedCallbackInAnyOrder(TestNetworkCallback callback, boolean blocked,
TestNetworkAgentWrapper... agents) {
- final List<Network> expectedNetworks = Arrays.asList(agents).stream()
+ final List<Network> expectedNetworks = asList(agents).stream()
.map((agent) -> agent.getNetwork())
.collect(Collectors.toList());
@@ -8694,7 +8695,7 @@
mResolverParamsParcelCaptor.capture());
ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue();
assertEquals(1, resolvrParams.servers.length);
- assertTrue(ArrayUtils.contains(resolvrParams.servers, "8.8.8.8"));
+ assertTrue(CollectionUtils.contains(resolvrParams.servers, "8.8.8.8"));
for (final LinkProperties stackedLp : stackedLpsAfterChange) {
verify(mDeps).reportNetworkInterfaceForTransports(
@@ -9367,7 +9368,7 @@
InOrder inOrder = inOrder(mMockNetd);
// Update to new range which is old range minus APP1, i.e. only APP2
- final Set<UidRange> newRanges = new HashSet<>(Arrays.asList(
+ final Set<UidRange> newRanges = new HashSet<>(asList(
new UidRange(vpnRange.start, APP1_UID - 1),
new UidRange(APP1_UID + 1, vpnRange.stop)));
mMockVpn.setUids(newRanges);
@@ -10477,11 +10478,11 @@
if (add) {
inOrder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(
new NativeUidRangeConfig(mMockVpn.getNetwork().getNetId(),
- toUidRangeStableParcels(vpnRanges), DEFAULT_NETWORK_PRIORITY_NONE));
+ toUidRangeStableParcels(vpnRanges), PREFERENCE_PRIORITY_VPN));
} else {
inOrder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(
new NativeUidRangeConfig(mMockVpn.getNetwork().getNetId(),
- toUidRangeStableParcels(vpnRanges), DEFAULT_NETWORK_PRIORITY_NONE));
+ toUidRangeStableParcels(vpnRanges), PREFERENCE_PRIORITY_VPN));
}
inOrder.verify(mMockNetd, times(1)).socketDestroy(eq(toUidRangeStableParcels(vpnRanges)),
@@ -10509,7 +10510,7 @@
verify(mProxyTracker, never()).sendProxyBroadcast();
// Update to new range which is old range minus APP1, i.e. only APP2
- final Set<UidRange> newRanges = new HashSet<>(Arrays.asList(
+ final Set<UidRange> newRanges = new HashSet<>(asList(
new UidRange(vpnRange.start, APP1_UID - 1),
new UidRange(APP1_UID + 1, vpnRange.stop)));
mMockVpn.setUids(newRanges);
@@ -10955,7 +10956,7 @@
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final NetworkRequestInfo nri = nris.iterator().next();
- assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
+ assertEquals(PREFERENCE_PRIORITY_OEM, nri.mPreferencePriority);
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
@@ -10985,7 +10986,7 @@
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final NetworkRequestInfo nri = nris.iterator().next();
- assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
+ assertEquals(PREFERENCE_PRIORITY_OEM, nri.mPreferencePriority);
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
@@ -11012,7 +11013,7 @@
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final NetworkRequestInfo nri = nris.iterator().next();
- assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
+ assertEquals(PREFERENCE_PRIORITY_OEM, nri.mPreferencePriority);
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
@@ -11036,7 +11037,7 @@
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final NetworkRequestInfo nri = nris.iterator().next();
- assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
+ assertEquals(PREFERENCE_PRIORITY_OEM, nri.mPreferencePriority);
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
@@ -11110,7 +11111,7 @@
final int secondUserTestPackageUid = UserHandle.getUid(SECONDARY_USER, TEST_PACKAGE_UID);
final int thirdUserTestPackageUid = UserHandle.getUid(TERTIARY_USER, TEST_PACKAGE_UID);
when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE, SECONDARY_USER_HANDLE, TERTIARY_USER_HANDLE));
+ asList(PRIMARY_USER_HANDLE, SECONDARY_USER_HANDLE, TERTIARY_USER_HANDLE));
// Arrange PackageManager mocks testing for users who have and don't have a package.
mockGetApplicationInfoThrowsNameNotFound(TEST_PACKAGE_NAME, PRIMARY_USER_HANDLE);
@@ -11414,19 +11415,29 @@
@OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup,
@NonNull final UidRangeParcel[] uidRanges,
@NonNull final String testPackageName) throws Exception {
- setupSetOemNetworkPreferenceForPreferenceTest(
- networkPrefToSetup, uidRanges, testPackageName, true);
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPrefToSetup, uidRanges,
+ testPackageName, PRIMARY_USER_HANDLE, true /* hasAutomotiveFeature */);
}
private void setupSetOemNetworkPreferenceForPreferenceTest(
@OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup,
@NonNull final UidRangeParcel[] uidRanges,
@NonNull final String testPackageName,
+ @NonNull final UserHandle user) throws Exception {
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPrefToSetup, uidRanges,
+ testPackageName, user, true /* hasAutomotiveFeature */);
+ }
+
+ private void setupSetOemNetworkPreferenceForPreferenceTest(
+ @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup,
+ @NonNull final UidRangeParcel[] uidRanges,
+ @NonNull final String testPackageName,
+ @NonNull final UserHandle user,
final boolean hasAutomotiveFeature) throws Exception {
mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, hasAutomotiveFeature);
// These tests work off a single UID therefore using 'start' is valid.
- mockGetApplicationInfo(testPackageName, uidRanges[0].start);
+ mockGetApplicationInfo(testPackageName, uidRanges[0].start, user);
setOemNetworkPreference(networkPrefToSetup, testPackageName);
}
@@ -11717,11 +11728,11 @@
verify(mMockNetd, times(addUidRangesTimes)).networkAddUidRangesParcel(argThat(config ->
(useAnyIdForAdd ? true : addUidRangesNetId == config.netId)
&& Arrays.equals(addedUidRanges, config.uidRanges)
- && DEFAULT_NETWORK_PRIORITY_OEM == config.subPriority));
+ && PREFERENCE_PRIORITY_OEM == config.subPriority));
verify(mMockNetd, times(removeUidRangesTimes)).networkRemoveUidRangesParcel(
argThat(config -> (useAnyIdForRemove ? true : removeUidRangesNetId == config.netId)
&& Arrays.equals(removedUidRanges, config.uidRanges)
- && DEFAULT_NETWORK_PRIORITY_OEM == config.subPriority));
+ && PREFERENCE_PRIORITY_OEM == config.subPriority));
if (shouldDestroyNetwork) {
verify(mMockNetd, times(1))
.networkDestroy((useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)));
@@ -11771,7 +11782,7 @@
// Add an OEM default network request to track.
setupSetOemNetworkPreferenceForPreferenceTest(
- networkPref, uidRanges, validTestPackageName,
+ networkPref, uidRanges, validTestPackageName, PRIMARY_USER_HANDLE,
false /* hasAutomotiveFeature */);
// Two requests should now exist; the system default and the test request.
@@ -12047,7 +12058,7 @@
final int secondUser = 10;
final UserHandle secondUserHandle = new UserHandle(secondUser);
when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle));
+ asList(PRIMARY_USER_HANDLE, secondUserHandle));
// Arrange PackageManager mocks
final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID);
@@ -12088,7 +12099,7 @@
final int secondUser = 10;
final UserHandle secondUserHandle = new UserHandle(secondUser);
when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE));
+ asList(PRIMARY_USER_HANDLE));
// Arrange PackageManager mocks
final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID);
@@ -12116,7 +12127,7 @@
// Send a broadcast indicating a user was added.
when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle));
+ asList(PRIMARY_USER_HANDLE, secondUserHandle));
final Intent addedIntent = new Intent(ACTION_USER_ADDED);
addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser));
processBroadcast(addedIntent);
@@ -12129,7 +12140,7 @@
// Send a broadcast indicating a user was removed.
when(mUserManager.getUserHandles(anyBoolean())).thenReturn(
- Arrays.asList(PRIMARY_USER_HANDLE));
+ asList(PRIMARY_USER_HANDLE));
final Intent removedIntent = new Intent(ACTION_USER_REMOVED);
removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser));
processBroadcast(removedIntent);
@@ -12876,7 +12887,7 @@
// is not handled specially, the rules are always active as long as a preference is set.
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
mCellNetworkAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
// The enterprise network is not ready yet.
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback,
@@ -12892,10 +12903,10 @@
nativeNetworkConfigPhysical(workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM));
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
inOrder.verify(mMockNetd).networkRemoveUidRangesParcel(new NativeUidRangeConfig(
mCellNetworkAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
// Make sure changes to the work agent send callbacks to the app in the work profile, but
// not to the other apps.
@@ -12945,7 +12956,7 @@
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback);
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
mCellNetworkAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
inOrder.verify(mMockNetd).networkDestroy(workAgent.getNetwork().netId);
mCellNetworkAgent.disconnect();
@@ -12970,7 +12981,7 @@
workAgent2.getNetwork().netId, INetd.PERMISSION_SYSTEM));
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent2.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
workAgent2.setNetworkValid(true /* isStrictMode */);
workAgent2.mNetworkMonitor.forceReevaluation(Process.myUid());
@@ -13017,7 +13028,7 @@
mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
registerDefaultNetworkCallbacks();
@@ -13033,7 +13044,7 @@
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback);
inOrder.verify(mMockNetd).networkRemoveUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
workAgent.disconnect();
mCellNetworkAgent.disconnect();
@@ -13079,7 +13090,7 @@
listener.expectOnComplete();
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle2),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(workAgent);
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback,
@@ -13090,7 +13101,7 @@
listener.expectOnComplete();
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle4),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
app4Cb.expectAvailableCallbacksValidated(workAgent);
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback,
@@ -13101,7 +13112,7 @@
listener.expectOnComplete();
inOrder.verify(mMockNetd).networkRemoveUidRangesParcel(new NativeUidRangeConfig(
workAgent.getNetwork().netId, uidRangeFor(testHandle2),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent);
assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback,
@@ -13130,7 +13141,7 @@
mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
inOrder.verify(mMockNetd).networkAddUidRangesParcel(new NativeUidRangeConfig(
mCellNetworkAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
+ PREFERENCE_PRIORITY_PROFILE));
final Intent removedIntent = new Intent(ACTION_USER_REMOVED);
removedIntent.putExtra(Intent.EXTRA_USER, testHandle);
@@ -13138,39 +13149,7 @@
inOrder.verify(mMockNetd).networkRemoveUidRangesParcel(new NativeUidRangeConfig(
mCellNetworkAgent.getNetwork().netId, uidRangeFor(testHandle),
- DEFAULT_NETWORK_PRIORITY_PROFILE));
- }
-
- /**
- * Make sure that OEM preference and per-profile preference can't be used at the same
- * time and throw ISE if tried
- */
- @Test
- public void testOemPreferenceAndProfilePreferenceExclusive() throws Exception {
- final UserHandle testHandle = UserHandle.of(TEST_WORK_PROFILE_USER_ID);
- mServiceContext.setWorkProfile(testHandle, true);
- final TestOnCompleteListener listener = new TestOnCompleteListener();
-
- setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(
- OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY);
- assertThrows("Should not be able to set per-profile pref while OEM prefs present",
- IllegalStateException.class, () ->
- mCm.setProfileNetworkPreference(testHandle,
- PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
- r -> r.run(), listener));
-
- // Empty the OEM prefs
- final TestOemListenerCallback oemPrefListener = new TestOemListenerCallback();
- final OemNetworkPreferences emptyOemPref = new OemNetworkPreferences.Builder().build();
- mService.setOemNetworkPreference(emptyOemPref, oemPrefListener);
- oemPrefListener.expectOnComplete();
-
- mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
- r -> r.run(), listener);
- listener.expectOnComplete();
- assertThrows("Should not be able to set OEM prefs while per-profile pref is on",
- IllegalStateException.class , () ->
- mService.setOemNetworkPreference(emptyOemPref, oemPrefListener));
+ PREFERENCE_PRIORITY_PROFILE));
}
/**
@@ -13341,8 +13320,7 @@
assertEquals(1, nris.size());
assertTrue(nri.isMultilayerRequest());
assertEquals(nri.getUids(), uidRangesForUids(uids));
- assertEquals(DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED,
- nri.getDefaultNetworkPriority());
+ assertEquals(PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED, nri.mPreferencePriority);
}
/**
@@ -13394,7 +13372,7 @@
final Set<Integer> uids1 = Set.of(PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID));
final UidRangeParcel[] uidRanges1 = toUidRangeStableParcels(uidRangesForUids(uids1));
final NativeUidRangeConfig config1 = new NativeUidRangeConfig(cellNetId, uidRanges1,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED);
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
setAndUpdateMobileDataPreferredUids(uids1);
inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config1);
inorder.verify(mMockNetd, never()).networkRemoveUidRangesParcel(any());
@@ -13406,7 +13384,7 @@
SECONDARY_USER_HANDLE.getUid(TEST_PACKAGE_UID));
final UidRangeParcel[] uidRanges2 = toUidRangeStableParcels(uidRangesForUids(uids2));
final NativeUidRangeConfig config2 = new NativeUidRangeConfig(cellNetId, uidRanges2,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED);
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
setAndUpdateMobileDataPreferredUids(uids2);
inorder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(config1);
inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config2);
@@ -13454,7 +13432,7 @@
final Set<Integer> uids = Set.of(PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID));
final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUids(uids));
final NativeUidRangeConfig wifiConfig = new NativeUidRangeConfig(wifiNetId, uidRanges,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED);
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
setAndUpdateMobileDataPreferredUids(uids);
inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(wifiConfig);
inorder.verify(mMockNetd, never()).networkRemoveUidRangesParcel(any());
@@ -13470,7 +13448,7 @@
final int cellNetId = mCellNetworkAgent.getNetwork().netId;
final NativeUidRangeConfig cellConfig = new NativeUidRangeConfig(cellNetId, uidRanges,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED);
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
inorder.verify(mMockNetd, times(1)).networkCreate(nativeNetworkConfigPhysical(
cellNetId, INetd.PERMISSION_NONE));
inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(cellConfig);
@@ -13499,7 +13477,7 @@
final int cellNetId2 = mCellNetworkAgent.getNetwork().netId;
final NativeUidRangeConfig cellConfig2 = new NativeUidRangeConfig(cellNetId2, uidRanges,
- DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED);
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
inorder.verify(mMockNetd, times(1)).networkCreate(nativeNetworkConfigPhysical(
cellNetId2, INetd.PERMISSION_NONE));
inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(cellConfig2);
@@ -13580,4 +13558,181 @@
waitForIdle();
});
}
+
+ @Test
+ public void testAllNetworkPreferencesCanCoexist()
+ throws Exception {
+ final InOrder inorder = inOrder(mMockNetd);
+ @OemNetworkPreferences.OemNetworkPreference final int networkPref =
+ OEM_NETWORK_PREFERENCE_OEM_PAID;
+ final UserHandle testHandle = setupEnterpriseNetwork();
+
+ setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true);
+ final int cellNetId = mCellNetworkAgent.getNetwork().netId;
+ inorder.verify(mMockNetd, times(1)).networkCreate(nativeNetworkConfigPhysical(
+ cellNetId, INetd.PERMISSION_NONE));
+
+ // Set oem network preference
+ final int[] uids1 = new int[] { PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID) };
+ final UidRangeParcel[] uidRanges1 = toUidRangeStableParcels(uidRangesForUids(uids1));
+ final NativeUidRangeConfig config1 = new NativeUidRangeConfig(cellNetId, uidRanges1,
+ PREFERENCE_PRIORITY_OEM);
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges1, TEST_PACKAGE_NAME);
+ inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config1);
+ inorder.verify(mMockNetd, never()).networkRemoveUidRangesParcel(any());
+
+ // Set user profile network preference
+ final TestNetworkAgentWrapper workAgent = makeEnterpriseNetworkAgent();
+ workAgent.connect(true);
+
+ final TestOnCompleteListener listener = new TestOnCompleteListener();
+ mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
+ r -> r.run(), listener);
+ listener.expectOnComplete();
+ final NativeUidRangeConfig config2 = new NativeUidRangeConfig(workAgent.getNetwork().netId,
+ uidRangeFor(testHandle), PREFERENCE_PRIORITY_PROFILE);
+ inorder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
+ workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM));
+ inorder.verify(mMockNetd, never()).networkRemoveUidRangesParcel(any());
+ inorder.verify(mMockNetd).networkAddUidRangesParcel(config2);
+
+ // Set MOBILE_DATA_PREFERRED_UIDS setting
+ final Set<Integer> uids2 = Set.of(PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID2));
+ final UidRangeParcel[] uidRanges2 = toUidRangeStableParcels(uidRangesForUids(uids2));
+ final NativeUidRangeConfig config3 = new NativeUidRangeConfig(cellNetId, uidRanges2,
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
+ setAndUpdateMobileDataPreferredUids(uids2);
+ inorder.verify(mMockNetd, never()).networkRemoveUidRangesParcel(any());
+ inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config3);
+
+ // Set oem network preference again with different uid.
+ final Set<Integer> uids3 = Set.of(PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID3));
+ final UidRangeParcel[] uidRanges3 = toUidRangeStableParcels(uidRangesForUids(uids3));
+ final NativeUidRangeConfig config4 = new NativeUidRangeConfig(cellNetId, uidRanges3,
+ PREFERENCE_PRIORITY_OEM);
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges3, "com.android.test");
+ inorder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(config1);
+ inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config4);
+
+ // Remove user profile network preference
+ mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_DEFAULT,
+ r -> r.run(), listener);
+ listener.expectOnComplete();
+ inorder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(config2);
+ inorder.verify(mMockNetd, never()).networkAddUidRangesParcel(any());
+
+ // Set MOBILE_DATA_PREFERRED_UIDS setting again with same uid as oem network preference.
+ final NativeUidRangeConfig config6 = new NativeUidRangeConfig(cellNetId, uidRanges3,
+ PREFERENCE_PRIORITY_MOBILE_DATA_PREFERERRED);
+ setAndUpdateMobileDataPreferredUids(uids3);
+ inorder.verify(mMockNetd, times(1)).networkRemoveUidRangesParcel(config3);
+ inorder.verify(mMockNetd, times(1)).networkAddUidRangesParcel(config6);
+ }
+
+ @Test
+ public void testNetworkCallbackAndActiveNetworkForUid_AllNetworkPreferencesEnabled()
+ throws Exception {
+ // File a request for cell to ensure it doesn't go down.
+ final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback();
+ final NetworkRequest cellRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR).build();
+ mCm.requestNetwork(cellRequest, cellNetworkCallback);
+ cellNetworkCallback.assertNoCallback();
+
+ // Register callbacks and have wifi network as default network.
+ registerDefaultNetworkCallbacks();
+ mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+ mWiFiNetworkAgent.connect(true);
+ mDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent);
+ mProfileDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent);
+ mTestPackageDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent);
+ assertEquals(mWiFiNetworkAgent.getNetwork(),
+ mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Set MOBILE_DATA_PREFERRED_UIDS setting with TEST_WORK_PROFILE_APP_UID and
+ // TEST_PACKAGE_UID. Both mProfileDefaultNetworkCallback and
+ // mTestPackageDefaultNetworkCallback should receive callback with cell network.
+ setAndUpdateMobileDataPreferredUids(Set.of(TEST_WORK_PROFILE_APP_UID, TEST_PACKAGE_UID));
+ mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+ mCellNetworkAgent.connect(true);
+ cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+ mDefaultNetworkCallback.assertNoCallback();
+ mProfileDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+ mTestPackageDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+ assertEquals(mCellNetworkAgent.getNetwork(),
+ mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Set user profile network preference with test profile. mProfileDefaultNetworkCallback
+ // should receive callback with higher priority network preference (enterprise network).
+ // The others should have no callbacks.
+ final UserHandle testHandle = setupEnterpriseNetwork();
+ final TestNetworkAgentWrapper workAgent = makeEnterpriseNetworkAgent();
+ workAgent.connect(true);
+ final TestOnCompleteListener listener = new TestOnCompleteListener();
+ mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
+ r -> r.run(), listener);
+ listener.expectOnComplete();
+ assertNoCallbacks(mDefaultNetworkCallback, mTestPackageDefaultNetworkCallback);
+ mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(workAgent);
+ assertEquals(workAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Set oem network preference with TEST_PACKAGE_UID. mTestPackageDefaultNetworkCallback
+ // should receive callback with higher priority network preference (current default network)
+ // and the others should have no callbacks.
+ @OemNetworkPreferences.OemNetworkPreference final int networkPref =
+ OEM_NETWORK_PREFERENCE_OEM_PAID;
+ final int[] uids1 = new int[] { TEST_PACKAGE_UID };
+ final UidRangeParcel[] uidRanges1 = toUidRangeStableParcels(uidRangesForUids(uids1));
+ setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges1, TEST_PACKAGE_NAME);
+ assertNoCallbacks(mDefaultNetworkCallback, mProfileDefaultNetworkCallback);
+ mTestPackageDefaultNetworkCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+ assertEquals(workAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+
+ // Set oem network preference with TEST_WORK_PROFILE_APP_UID. Both
+ // mProfileDefaultNetworkCallback and mTestPackageDefaultNetworkCallback should receive
+ // callback.
+ final int[] uids2 = new int[] { TEST_WORK_PROFILE_APP_UID };
+ final UidRangeParcel[] uidRanges2 = toUidRangeStableParcels(uidRangesForUids(uids2));
+ when(mUserManager.getUserHandles(anyBoolean())).thenReturn(Arrays.asList(testHandle));
+ setupSetOemNetworkPreferenceForPreferenceTest(
+ networkPref, uidRanges2, "com.android.test", testHandle);
+ mDefaultNetworkCallback.assertNoCallback();
+ mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
+ mTestPackageDefaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent);
+ assertEquals(mWiFiNetworkAgent.getNetwork(),
+ mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Remove oem network preference, mProfileDefaultNetworkCallback should receive callback
+ // with current highest priority network preference (enterprise network) and the others
+ // should have no callbacks.
+ final TestOemListenerCallback oemPrefListener = new TestOemListenerCallback();
+ mService.setOemNetworkPreference(
+ new OemNetworkPreferences.Builder().build(), oemPrefListener);
+ oemPrefListener.expectOnComplete();
+ assertNoCallbacks(mDefaultNetworkCallback, mTestPackageDefaultNetworkCallback);
+ mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(workAgent);
+ assertEquals(workAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Remove user profile network preference.
+ mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_DEFAULT,
+ r -> r.run(), listener);
+ listener.expectOnComplete();
+ assertNoCallbacks(mDefaultNetworkCallback, mTestPackageDefaultNetworkCallback);
+ mProfileDefaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent);
+ assertEquals(mCellNetworkAgent.getNetwork(),
+ mCm.getActiveNetworkForUid(TEST_WORK_PROFILE_APP_UID));
+ assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(TEST_PACKAGE_UID));
+
+ // Disconnect wifi
+ mWiFiNetworkAgent.disconnect();
+ assertNoCallbacks(mProfileDefaultNetworkCallback, mTestPackageDefaultNetworkCallback);
+ mDefaultNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
+ mDefaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent);
+ }
}