Merge "Revert "Add an API to listen for changes in network blocked status of an uid.""
This commit is contained in:
commit
2bb1da3473
2 changed files with 143 additions and 81 deletions
|
|
@ -72,8 +72,8 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_TEST;
|
import static android.net.NetworkCapabilities.TRANSPORT_TEST;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
||||||
import static android.net.NetworkPolicyManager.BLOCKED_REASON_NONE;
|
import static android.net.NetworkPolicyManager.RULE_NONE;
|
||||||
import static android.net.NetworkPolicyManager.blockedReasonsToString;
|
import static android.net.NetworkPolicyManager.uidRulesToString;
|
||||||
import static android.net.NetworkRequest.Type.LISTEN_FOR_BEST;
|
import static android.net.NetworkRequest.Type.LISTEN_FOR_BEST;
|
||||||
import static android.net.shared.NetworkMonitorUtils.isPrivateDnsValidationRequired;
|
import static android.net.shared.NetworkMonitorUtils.isPrivateDnsValidationRequired;
|
||||||
import static android.os.Process.INVALID_UID;
|
import static android.os.Process.INVALID_UID;
|
||||||
|
|
@ -117,6 +117,7 @@ import android.net.INetd;
|
||||||
import android.net.INetworkActivityListener;
|
import android.net.INetworkActivityListener;
|
||||||
import android.net.INetworkMonitor;
|
import android.net.INetworkMonitor;
|
||||||
import android.net.INetworkMonitorCallbacks;
|
import android.net.INetworkMonitorCallbacks;
|
||||||
|
import android.net.INetworkPolicyListener;
|
||||||
import android.net.IOnCompleteListener;
|
import android.net.IOnCompleteListener;
|
||||||
import android.net.IQosCallback;
|
import android.net.IQosCallback;
|
||||||
import android.net.ISocketKeepaliveCallback;
|
import android.net.ISocketKeepaliveCallback;
|
||||||
|
|
@ -134,7 +135,6 @@ import android.net.NetworkInfo;
|
||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
import android.net.NetworkMonitorManager;
|
import android.net.NetworkMonitorManager;
|
||||||
import android.net.NetworkPolicyManager;
|
import android.net.NetworkPolicyManager;
|
||||||
import android.net.NetworkPolicyManager.NetworkPolicyCallback;
|
|
||||||
import android.net.NetworkProvider;
|
import android.net.NetworkProvider;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkScore;
|
import android.net.NetworkScore;
|
||||||
|
|
@ -331,10 +331,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
private volatile boolean mLockdownEnabled;
|
private volatile boolean mLockdownEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stale copy of uid blocked reasons provided by NPMS. As long as they are accessed only in
|
* Stale copy of uid rules provided by NPMS. As long as they are accessed only in internal
|
||||||
* internal handler thread, they don't need a lock.
|
* handler thread, they don't need a lock.
|
||||||
*/
|
*/
|
||||||
private SparseIntArray mUidBlockedReasons = new SparseIntArray();
|
private SparseIntArray mUidRules = new SparseIntArray();
|
||||||
|
/** Flag indicating if background data is restricted. */
|
||||||
|
private boolean mRestrictBackground;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final ConnectivityResources mResources;
|
private final ConnectivityResources mResources;
|
||||||
|
|
@ -508,6 +510,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
// Handle private DNS validation status updates.
|
// Handle private DNS validation status updates.
|
||||||
private static final int EVENT_PRIVATE_DNS_VALIDATION_UPDATE = 38;
|
private static final int EVENT_PRIVATE_DNS_VALIDATION_UPDATE = 38;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to handle onUidRulesChanged event from NetworkPolicyManagerService.
|
||||||
|
*/
|
||||||
|
private static final int EVENT_UID_RULES_CHANGED = 39;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to handle onRestrictBackgroundChanged event from NetworkPolicyManagerService.
|
||||||
|
*/
|
||||||
|
private static final int EVENT_DATA_SAVER_CHANGED = 40;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the network has
|
* Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the network has
|
||||||
* been tested.
|
* been tested.
|
||||||
|
|
@ -583,13 +595,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
*/
|
*/
|
||||||
private static final int EVENT_SET_PROFILE_NETWORK_PREFERENCE = 50;
|
private static final int EVENT_SET_PROFILE_NETWORK_PREFERENCE = 50;
|
||||||
|
|
||||||
/**
|
|
||||||
* Event to specify that reasons for why an uid is blocked changed.
|
|
||||||
* arg1 = uid
|
|
||||||
* arg2 = blockedReasons
|
|
||||||
*/
|
|
||||||
private static final int EVENT_UID_BLOCKED_REASON_CHANGED = 51;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
|
* Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
|
||||||
* should be shown.
|
* should be shown.
|
||||||
|
|
@ -1248,10 +1253,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
|
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
|
||||||
mLocationPermissionChecker = new LocationPermissionChecker(mContext);
|
mLocationPermissionChecker = new LocationPermissionChecker(mContext);
|
||||||
|
|
||||||
// To ensure uid state is synchronized with Network Policy, register for
|
// To ensure uid rules are synchronized with Network Policy, register for
|
||||||
// NetworkPolicyManagerService events must happen prior to NetworkPolicyManagerService
|
// NetworkPolicyManagerService events must happen prior to NetworkPolicyManagerService
|
||||||
// reading existing policy from disk.
|
// reading existing policy from disk.
|
||||||
mPolicyManager.registerNetworkPolicyCallback(null, mPolicyCallback);
|
mPolicyManager.registerListener(mPolicyListener);
|
||||||
|
|
||||||
final PowerManager powerManager = (PowerManager) context.getSystemService(
|
final PowerManager powerManager = (PowerManager) context.getSystemService(
|
||||||
Context.POWER_SERVICE);
|
Context.POWER_SERVICE);
|
||||||
|
|
@ -2232,17 +2237,53 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final NetworkPolicyCallback mPolicyCallback = new NetworkPolicyCallback() {
|
private final INetworkPolicyListener mPolicyListener = new NetworkPolicyManager.Listener() {
|
||||||
@Override
|
@Override
|
||||||
public void onUidBlockedReasonChanged(int uid, int blockedReasons) {
|
public void onUidRulesChanged(int uid, int uidRules) {
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(EVENT_UID_BLOCKED_REASON_CHANGED,
|
mHandler.sendMessage(mHandler.obtainMessage(EVENT_UID_RULES_CHANGED, uid, uidRules));
|
||||||
uid, blockedReasons));
|
}
|
||||||
|
@Override
|
||||||
|
public void onRestrictBackgroundChanged(boolean restrictBackground) {
|
||||||
|
// caller is NPMS, since we only register with them
|
||||||
|
if (LOGD_BLOCKED_NETWORKINFO) {
|
||||||
|
log("onRestrictBackgroundChanged(restrictBackground=" + restrictBackground + ")");
|
||||||
|
}
|
||||||
|
mHandler.sendMessage(mHandler.obtainMessage(
|
||||||
|
EVENT_DATA_SAVER_CHANGED, restrictBackground ? 1 : 0, 0));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void handleUidBlockedReasonChanged(int uid, int blockedReasons) {
|
void handleUidRulesChanged(int uid, int newRules) {
|
||||||
maybeNotifyNetworkBlockedForNewState(uid, blockedReasons);
|
// skip update when we've already applied rules
|
||||||
mUidBlockedReasons.put(uid, blockedReasons);
|
final int oldRules = mUidRules.get(uid, RULE_NONE);
|
||||||
|
if (oldRules == newRules) return;
|
||||||
|
|
||||||
|
maybeNotifyNetworkBlockedForNewUidRules(uid, newRules);
|
||||||
|
|
||||||
|
if (newRules == RULE_NONE) {
|
||||||
|
mUidRules.delete(uid);
|
||||||
|
} else {
|
||||||
|
mUidRules.put(uid, newRules);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleRestrictBackgroundChanged(boolean restrictBackground) {
|
||||||
|
if (mRestrictBackground == restrictBackground) return;
|
||||||
|
|
||||||
|
final List<UidRange> blockedRanges = mVpnBlockedUidRanges;
|
||||||
|
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
|
||||||
|
final boolean curMetered = nai.networkCapabilities.isMetered();
|
||||||
|
maybeNotifyNetworkBlocked(nai, curMetered, curMetered, mRestrictBackground,
|
||||||
|
restrictBackground, blockedRanges, blockedRanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
mRestrictBackground = restrictBackground;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUidBlockedByRules(int uid, int uidRules, boolean isNetworkMetered,
|
||||||
|
boolean isBackgroundRestricted) {
|
||||||
|
return mPolicyManager.checkUidNetworkingBlocked(uid, uidRules, isNetworkMetered,
|
||||||
|
isBackgroundRestricted);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkAnyPermissionOf(String... permissions) {
|
private boolean checkAnyPermissionOf(String... permissions) {
|
||||||
|
|
@ -2716,16 +2757,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
pw.decreaseIndent();
|
pw.decreaseIndent();
|
||||||
pw.println();
|
pw.println();
|
||||||
|
|
||||||
|
pw.print("Restrict background: ");
|
||||||
|
pw.println(mRestrictBackground);
|
||||||
|
pw.println();
|
||||||
|
|
||||||
pw.println("Status for known UIDs:");
|
pw.println("Status for known UIDs:");
|
||||||
pw.increaseIndent();
|
pw.increaseIndent();
|
||||||
final int size = mUidBlockedReasons.size();
|
final int size = mUidRules.size();
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
// Don't crash if the array is modified while dumping in bugreports.
|
// Don't crash if the array is modified while dumping in bugreports.
|
||||||
try {
|
try {
|
||||||
final int uid = mUidBlockedReasons.keyAt(i);
|
final int uid = mUidRules.keyAt(i);
|
||||||
final int blockedReasons = mUidBlockedReasons.valueAt(i);
|
final int uidRules = mUidRules.get(uid, RULE_NONE);
|
||||||
pw.println("UID=" + uid + " blockedReasons="
|
pw.println("UID=" + uid + " rules=" + uidRulesToString(uidRules));
|
||||||
+ blockedReasonsToString(blockedReasons));
|
|
||||||
} catch (ArrayIndexOutOfBoundsException e) {
|
} catch (ArrayIndexOutOfBoundsException e) {
|
||||||
pw.println(" ArrayIndexOutOfBoundsException");
|
pw.println(" ArrayIndexOutOfBoundsException");
|
||||||
} catch (ConcurrentModificationException e) {
|
} catch (ConcurrentModificationException e) {
|
||||||
|
|
@ -4522,8 +4566,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
handlePrivateDnsValidationUpdate(
|
handlePrivateDnsValidationUpdate(
|
||||||
(PrivateDnsValidationUpdate) msg.obj);
|
(PrivateDnsValidationUpdate) msg.obj);
|
||||||
break;
|
break;
|
||||||
case EVENT_UID_BLOCKED_REASON_CHANGED:
|
case EVENT_UID_RULES_CHANGED:
|
||||||
handleUidBlockedReasonChanged(msg.arg1, msg.arg2);
|
handleUidRulesChanged(msg.arg1, msg.arg2);
|
||||||
|
break;
|
||||||
|
case EVENT_DATA_SAVER_CHANGED:
|
||||||
|
handleRestrictBackgroundChanged(toBool(msg.arg1));
|
||||||
break;
|
break;
|
||||||
case EVENT_SET_REQUIRE_VPN_FOR_UIDS:
|
case EVENT_SET_REQUIRE_VPN_FOR_UIDS:
|
||||||
handleSetRequireVpnForUids(toBool(msg.arg1), (UidRange[]) msg.obj);
|
handleSetRequireVpnForUids(toBool(msg.arg1), (UidRange[]) msg.obj);
|
||||||
|
|
@ -4996,8 +5043,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
|
|
||||||
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
|
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
|
||||||
final boolean curMetered = nai.networkCapabilities.isMetered();
|
final boolean curMetered = nai.networkCapabilities.isMetered();
|
||||||
maybeNotifyNetworkBlocked(nai, curMetered, curMetered,
|
maybeNotifyNetworkBlocked(nai, curMetered, curMetered, mRestrictBackground,
|
||||||
mVpnBlockedUidRanges, newVpnBlockedUidRanges);
|
mRestrictBackground, mVpnBlockedUidRanges, newVpnBlockedUidRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
mVpnBlockedUidRanges = newVpnBlockedUidRanges;
|
mVpnBlockedUidRanges = newVpnBlockedUidRanges;
|
||||||
|
|
@ -6780,8 +6827,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
final boolean meteredChanged = oldMetered != newMetered;
|
final boolean meteredChanged = oldMetered != newMetered;
|
||||||
|
|
||||||
if (meteredChanged) {
|
if (meteredChanged) {
|
||||||
maybeNotifyNetworkBlocked(nai, oldMetered, newMetered,
|
maybeNotifyNetworkBlocked(nai, oldMetered, newMetered, mRestrictBackground,
|
||||||
mVpnBlockedUidRanges, mVpnBlockedUidRanges);
|
mRestrictBackground, mVpnBlockedUidRanges, mVpnBlockedUidRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean roamingChanged = prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING)
|
final boolean roamingChanged = prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING)
|
||||||
|
|
@ -7904,8 +7951,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
final boolean metered = nai.networkCapabilities.isMetered();
|
final boolean metered = nai.networkCapabilities.isMetered();
|
||||||
boolean blocked;
|
boolean blocked;
|
||||||
blocked = isUidBlockedByVpn(nri.mUid, mVpnBlockedUidRanges);
|
blocked = isUidBlockedByVpn(nri.mUid, mVpnBlockedUidRanges);
|
||||||
blocked |= NetworkPolicyManager.isUidBlocked(
|
blocked |= isUidBlockedByRules(nri.mUid, mUidRules.get(nri.mUid),
|
||||||
mUidBlockedReasons.get(nri.mUid, BLOCKED_REASON_NONE), metered);
|
metered, mRestrictBackground);
|
||||||
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE, blocked ? 1 : 0);
|
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE, blocked ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7923,14 +7970,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
*
|
*
|
||||||
* @param nai The target NetworkAgentInfo.
|
* @param nai The target NetworkAgentInfo.
|
||||||
* @param oldMetered True if the previous network capabilities is metered.
|
* @param oldMetered True if the previous network capabilities is metered.
|
||||||
|
* @param newRestrictBackground True if data saver is enabled.
|
||||||
*/
|
*/
|
||||||
private void maybeNotifyNetworkBlocked(NetworkAgentInfo nai, boolean oldMetered,
|
private void maybeNotifyNetworkBlocked(NetworkAgentInfo nai, boolean oldMetered,
|
||||||
boolean newMetered, List<UidRange> oldBlockedUidRanges,
|
boolean newMetered, boolean oldRestrictBackground, boolean newRestrictBackground,
|
||||||
List<UidRange> newBlockedUidRanges) {
|
List<UidRange> oldBlockedUidRanges, List<UidRange> newBlockedUidRanges) {
|
||||||
|
|
||||||
for (int i = 0; i < nai.numNetworkRequests(); i++) {
|
for (int i = 0; i < nai.numNetworkRequests(); i++) {
|
||||||
NetworkRequest nr = nai.requestAt(i);
|
NetworkRequest nr = nai.requestAt(i);
|
||||||
NetworkRequestInfo nri = mNetworkRequests.get(nr);
|
NetworkRequestInfo nri = mNetworkRequests.get(nr);
|
||||||
|
final int uidRules = mUidRules.get(nri.mUid);
|
||||||
final boolean oldBlocked, newBlocked, oldVpnBlocked, newVpnBlocked;
|
final boolean oldBlocked, newBlocked, oldVpnBlocked, newVpnBlocked;
|
||||||
|
|
||||||
oldVpnBlocked = isUidBlockedByVpn(nri.mUid, oldBlockedUidRanges);
|
oldVpnBlocked = isUidBlockedByVpn(nri.mUid, oldBlockedUidRanges);
|
||||||
|
|
@ -7938,11 +7987,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
? isUidBlockedByVpn(nri.mUid, newBlockedUidRanges)
|
? isUidBlockedByVpn(nri.mUid, newBlockedUidRanges)
|
||||||
: oldVpnBlocked;
|
: oldVpnBlocked;
|
||||||
|
|
||||||
final int blockedReasons = mUidBlockedReasons.get(nri.mUid, BLOCKED_REASON_NONE);
|
oldBlocked = oldVpnBlocked || isUidBlockedByRules(nri.mUid, uidRules, oldMetered,
|
||||||
oldBlocked = oldVpnBlocked || NetworkPolicyManager.isUidBlocked(
|
oldRestrictBackground);
|
||||||
blockedReasons, oldMetered);
|
newBlocked = newVpnBlocked || isUidBlockedByRules(nri.mUid, uidRules, newMetered,
|
||||||
newBlocked = newVpnBlocked || NetworkPolicyManager.isUidBlocked(
|
newRestrictBackground);
|
||||||
blockedReasons, newMetered);
|
|
||||||
|
|
||||||
if (oldBlocked != newBlocked) {
|
if (oldBlocked != newBlocked) {
|
||||||
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED,
|
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED,
|
||||||
|
|
@ -7952,20 +8000,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify apps with a given UID of the new blocked state according to new uid state.
|
* Notify apps with a given UID of the new blocked state according to new uid rules.
|
||||||
* @param uid The uid for which the rules changed.
|
* @param uid The uid for which the rules changed.
|
||||||
* @param blockedReasons The reasons for why an uid is blocked.
|
* @param newRules The new rules to apply.
|
||||||
*/
|
*/
|
||||||
private void maybeNotifyNetworkBlockedForNewState(int uid, int blockedReasons) {
|
private void maybeNotifyNetworkBlockedForNewUidRules(int uid, int newRules) {
|
||||||
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
|
for (final NetworkAgentInfo nai : mNetworkAgentInfos) {
|
||||||
final boolean metered = nai.networkCapabilities.isMetered();
|
final boolean metered = nai.networkCapabilities.isMetered();
|
||||||
final boolean vpnBlocked = isUidBlockedByVpn(uid, mVpnBlockedUidRanges);
|
final boolean vpnBlocked = isUidBlockedByVpn(uid, mVpnBlockedUidRanges);
|
||||||
final boolean oldBlocked, newBlocked;
|
final boolean oldBlocked, newBlocked;
|
||||||
|
oldBlocked = vpnBlocked || isUidBlockedByRules(
|
||||||
oldBlocked = vpnBlocked || NetworkPolicyManager.isUidBlocked(
|
uid, mUidRules.get(uid), metered, mRestrictBackground);
|
||||||
mUidBlockedReasons.get(uid, BLOCKED_REASON_NONE), metered);
|
newBlocked = vpnBlocked || isUidBlockedByRules(
|
||||||
newBlocked = vpnBlocked || NetworkPolicyManager.isUidBlocked(
|
uid, newRules, metered, mRestrictBackground);
|
||||||
blockedReasons, metered);
|
|
||||||
if (oldBlocked == newBlocked) {
|
if (oldBlocked == newBlocked) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,10 +87,10 @@ import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
|
||||||
import static android.net.NetworkPolicyManager.BLOCKED_METERED_REASON_DATA_SAVER;
|
import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
|
||||||
import static android.net.NetworkPolicyManager.BLOCKED_METERED_REASON_USER_RESTRICTED;
|
import static android.net.NetworkPolicyManager.RULE_NONE;
|
||||||
import static android.net.NetworkPolicyManager.BLOCKED_REASON_BATTERY_SAVER;
|
import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
|
||||||
import static android.net.NetworkPolicyManager.BLOCKED_REASON_NONE;
|
import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
|
||||||
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID;
|
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID;
|
||||||
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK;
|
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK;
|
||||||
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
|
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
|
||||||
|
|
@ -188,6 +188,7 @@ import android.net.IDnsResolver;
|
||||||
import android.net.INetd;
|
import android.net.INetd;
|
||||||
import android.net.INetworkMonitor;
|
import android.net.INetworkMonitor;
|
||||||
import android.net.INetworkMonitorCallbacks;
|
import android.net.INetworkMonitorCallbacks;
|
||||||
|
import android.net.INetworkPolicyListener;
|
||||||
import android.net.IOnCompleteListener;
|
import android.net.IOnCompleteListener;
|
||||||
import android.net.IQosCallback;
|
import android.net.IQosCallback;
|
||||||
import android.net.InetAddresses;
|
import android.net.InetAddresses;
|
||||||
|
|
@ -206,7 +207,6 @@ import android.net.NetworkFactory;
|
||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
import android.net.NetworkPolicyManager;
|
import android.net.NetworkPolicyManager;
|
||||||
import android.net.NetworkPolicyManager.NetworkPolicyCallback;
|
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkScore;
|
import android.net.NetworkScore;
|
||||||
import android.net.NetworkSpecifier;
|
import android.net.NetworkSpecifier;
|
||||||
|
|
@ -423,7 +423,7 @@ public class ConnectivityServiceTest {
|
||||||
private TestNetworkAgentWrapper mEthernetNetworkAgent;
|
private TestNetworkAgentWrapper mEthernetNetworkAgent;
|
||||||
private MockVpn mMockVpn;
|
private MockVpn mMockVpn;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private NetworkPolicyCallback mPolicyCallback;
|
private INetworkPolicyListener mPolicyListener;
|
||||||
private WrappedMultinetworkPolicyTracker mPolicyTracker;
|
private WrappedMultinetworkPolicyTracker mPolicyTracker;
|
||||||
private HandlerThread mAlarmManagerThread;
|
private HandlerThread mAlarmManagerThread;
|
||||||
private TestNetIdManager mNetIdManager;
|
private TestNetIdManager mNetIdManager;
|
||||||
|
|
@ -435,7 +435,8 @@ public class ConnectivityServiceTest {
|
||||||
private TestNetworkCallback mProfileDefaultNetworkCallback;
|
private TestNetworkCallback mProfileDefaultNetworkCallback;
|
||||||
|
|
||||||
// State variables required to emulate NetworkPolicyManagerService behaviour.
|
// State variables required to emulate NetworkPolicyManagerService behaviour.
|
||||||
private int mBlockedReasons = BLOCKED_REASON_NONE;
|
private int mUidRules = RULE_NONE;
|
||||||
|
private boolean mRestrictBackground = false;
|
||||||
|
|
||||||
@Mock DeviceIdleInternal mDeviceIdleInternal;
|
@Mock DeviceIdleInternal mDeviceIdleInternal;
|
||||||
@Mock INetworkManagementService mNetworkManagementService;
|
@Mock INetworkManagementService mNetworkManagementService;
|
||||||
|
|
@ -1374,13 +1375,28 @@ public class ConnectivityServiceTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mockUidNetworkingBlocked() {
|
private void mockUidNetworkingBlocked() {
|
||||||
doAnswer(i -> NetworkPolicyManager.isUidBlocked(mBlockedReasons, i.getArgument(1))
|
doAnswer(i -> mContext.getSystemService(NetworkPolicyManager.class)
|
||||||
|
.checkUidNetworkingBlocked(i.getArgument(0) /* uid */, mUidRules,
|
||||||
|
i.getArgument(1) /* metered */, mRestrictBackground)
|
||||||
).when(mNetworkPolicyManager).isUidNetworkingBlocked(anyInt(), anyBoolean());
|
).when(mNetworkPolicyManager).isUidNetworkingBlocked(anyInt(), anyBoolean());
|
||||||
|
|
||||||
|
doAnswer(inv -> mContext.getSystemService(NetworkPolicyManager.class)
|
||||||
|
.checkUidNetworkingBlocked(inv.getArgument(0) /* uid */,
|
||||||
|
inv.getArgument(1) /* uidRules */,
|
||||||
|
inv.getArgument(2) /* isNetworkMetered */,
|
||||||
|
inv.getArgument(3) /* isBackgroundRestricted */)
|
||||||
|
).when(mNetworkPolicyManager).checkUidNetworkingBlocked(
|
||||||
|
anyInt(), anyInt(), anyBoolean(), anyBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setBlockedReasonChanged(int blockedReasons) {
|
private void setUidRulesChanged(int uidRules) throws RemoteException {
|
||||||
mBlockedReasons = blockedReasons;
|
mUidRules = uidRules;
|
||||||
mPolicyCallback.onUidBlockedReasonChanged(Process.myUid(), blockedReasons);
|
mPolicyListener.onUidRulesChanged(Process.myUid(), mUidRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setRestrictBackgroundChanged(boolean restrictBackground) throws RemoteException {
|
||||||
|
mRestrictBackground = restrictBackground;
|
||||||
|
mPolicyListener.onRestrictBackgroundChanged(mRestrictBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Nat464Xlat getNat464Xlat(NetworkAgentWrapper mna) {
|
private Nat464Xlat getNat464Xlat(NetworkAgentWrapper mna) {
|
||||||
|
|
@ -1522,11 +1538,10 @@ public class ConnectivityServiceTest {
|
||||||
mService.mNascentDelayMs = TEST_NASCENT_DELAY_MS;
|
mService.mNascentDelayMs = TEST_NASCENT_DELAY_MS;
|
||||||
verify(mDeps).makeMultinetworkPolicyTracker(any(), any(), any());
|
verify(mDeps).makeMultinetworkPolicyTracker(any(), any(), any());
|
||||||
|
|
||||||
final ArgumentCaptor<NetworkPolicyCallback> policyCallbackCaptor =
|
final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor =
|
||||||
ArgumentCaptor.forClass(NetworkPolicyCallback.class);
|
ArgumentCaptor.forClass(INetworkPolicyListener.class);
|
||||||
verify(mNetworkPolicyManager).registerNetworkPolicyCallback(any(),
|
verify(mNetworkPolicyManager).registerListener(policyListenerCaptor.capture());
|
||||||
policyCallbackCaptor.capture());
|
mPolicyListener = policyListenerCaptor.getValue();
|
||||||
mPolicyCallback = policyCallbackCaptor.getValue();
|
|
||||||
|
|
||||||
// Create local CM before sending system ready so that we can answer
|
// Create local CM before sending system ready so that we can answer
|
||||||
// getSystemService() correctly.
|
// getSystemService() correctly.
|
||||||
|
|
@ -7250,7 +7265,7 @@ public class ConnectivityServiceTest {
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_BATTERY_SAVER);
|
setUidRulesChanged(RULE_REJECT_ALL);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
||||||
assertNull(mCm.getActiveNetwork());
|
assertNull(mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
||||||
|
|
@ -7258,17 +7273,17 @@ public class ConnectivityServiceTest {
|
||||||
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
||||||
|
|
||||||
// ConnectivityService should cache it not to invoke the callback again.
|
// ConnectivityService should cache it not to invoke the callback again.
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_USER_RESTRICTED);
|
setUidRulesChanged(RULE_REJECT_METERED);
|
||||||
cellNetworkCallback.assertNoCallback();
|
cellNetworkCallback.assertNoCallback();
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setUidRulesChanged(RULE_NONE);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
||||||
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_DATA_SAVER);
|
setUidRulesChanged(RULE_REJECT_METERED);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
||||||
assertNull(mCm.getActiveNetwork());
|
assertNull(mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
||||||
|
|
@ -7293,33 +7308,33 @@ public class ConnectivityServiceTest {
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
||||||
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setUidRulesChanged(RULE_ALLOW_METERED);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
||||||
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setUidRulesChanged(RULE_NONE);
|
||||||
cellNetworkCallback.assertNoCallback();
|
cellNetworkCallback.assertNoCallback();
|
||||||
|
|
||||||
// Restrict background data. Networking is not blocked because the network is unmetered.
|
// Restrict background data. Networking is not blocked because the network is unmetered.
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_DATA_SAVER);
|
setRestrictBackgroundChanged(true);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(true, mCellNetworkAgent);
|
||||||
assertNull(mCm.getActiveNetwork());
|
assertNull(mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
|
||||||
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
assertExtraInfoFromCmBlocked(mCellNetworkAgent);
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_DATA_SAVER);
|
setRestrictBackgroundChanged(true);
|
||||||
cellNetworkCallback.assertNoCallback();
|
cellNetworkCallback.assertNoCallback();
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setUidRulesChanged(RULE_ALLOW_METERED);
|
||||||
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
cellNetworkCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
assertExtraInfoFromCmPresent(mCellNetworkAgent);
|
||||||
|
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setRestrictBackgroundChanged(false);
|
||||||
cellNetworkCallback.assertNoCallback();
|
cellNetworkCallback.assertNoCallback();
|
||||||
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
|
|
@ -7336,9 +7351,9 @@ public class ConnectivityServiceTest {
|
||||||
mockUidNetworkingBlocked();
|
mockUidNetworkingBlocked();
|
||||||
|
|
||||||
// No Networkcallbacks invoked before any network is active.
|
// No Networkcallbacks invoked before any network is active.
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_BATTERY_SAVER);
|
setUidRulesChanged(RULE_REJECT_ALL);
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setUidRulesChanged(RULE_NONE);
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_DATA_SAVER);
|
setUidRulesChanged(RULE_REJECT_METERED);
|
||||||
defaultCallback.assertNoCallback();
|
defaultCallback.assertNoCallback();
|
||||||
|
|
||||||
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
|
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
|
||||||
|
|
@ -7363,8 +7378,8 @@ public class ConnectivityServiceTest {
|
||||||
defaultCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
defaultCallback.expectBlockedStatusCallback(false, mCellNetworkAgent);
|
||||||
|
|
||||||
// Verify there's no Networkcallbacks invoked after data saver on/off.
|
// Verify there's no Networkcallbacks invoked after data saver on/off.
|
||||||
setBlockedReasonChanged(BLOCKED_METERED_REASON_DATA_SAVER);
|
setRestrictBackgroundChanged(true);
|
||||||
setBlockedReasonChanged(BLOCKED_REASON_NONE);
|
setRestrictBackgroundChanged(false);
|
||||||
defaultCallback.assertNoCallback();
|
defaultCallback.assertNoCallback();
|
||||||
|
|
||||||
mCellNetworkAgent.disconnect();
|
mCellNetworkAgent.disconnect();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue