Loading core/java/android/net/INetworkStatsService.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package android.net; import android.net.DataUsageRequest; import android.net.INetworkStatsSession; import android.net.Network; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; Loading Loading @@ -68,7 +68,7 @@ interface INetworkStatsService { /** Force update of ifaces. */ void forceUpdateIfaces( in Network[] defaultNetworks, in NetworkState[] networkStates, in NetworkStateSnapshot[] snapshots, in String activeIface, in UnderlyingNetworkInfo[] underlyingNetworkInfos); /** Force update of statistics. */ Loading core/java/android/net/NetworkIdentity.java +28 −16 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package android.net; import static android.net.ConnectivityManager.TYPE_WIFI; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.net.wifi.WifiInfo; Loading Loading @@ -180,29 +179,42 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { } /** * Build a {@link NetworkIdentity} from the given {@link NetworkState} and {@code subType}, * assuming that any mobile networks are using the current IMSI. The subType if applicable, * should be set as one of the TelephonyManager.NETWORK_TYPE_* constants, or * {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. * Build a {@link NetworkIdentity} from the given {@link NetworkState} and * {@code subType}, assuming that any mobile networks are using the current IMSI. * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_* * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. */ public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state, boolean defaultNetwork, @NetworkType int subType) { final int legacyType = state.legacyNetworkType; // TODO: Delete this function after NetworkPolicyManagerService finishes the migration. public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state, boolean defaultNetwork, @NetworkType int subType) { final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties, state.networkCapabilities, state.network, state.subscriberId, state.legacyNetworkType); return buildNetworkIdentity(context, snapshot, defaultNetwork, subType); } String subscriberId = null; /** * Build a {@link NetworkIdentity} from the given {@link NetworkStateSnapshot} and * {@code subType}, assuming that any mobile networks are using the current IMSI. * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_* * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. */ public static NetworkIdentity buildNetworkIdentity(Context context, NetworkStateSnapshot snapshot, boolean defaultNetwork, @NetworkType int subType) { final int legacyType = snapshot.legacyType; final String subscriberId = snapshot.subscriberId; String networkId = null; boolean roaming = !state.networkCapabilities.hasCapability( boolean roaming = !snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); boolean metered = !state.networkCapabilities.hasCapability( boolean metered = !snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_METERED); subscriberId = state.subscriberId; final int oemManaged = getOemBitfield(state.networkCapabilities); final int oemManaged = getOemBitfield(snapshot.networkCapabilities); if (legacyType == TYPE_WIFI) { if (state.networkCapabilities.getSsid() != null) { networkId = state.networkCapabilities.getSsid(); if (snapshot.networkCapabilities.getSsid() != null) { networkId = snapshot.networkCapabilities.getSsid(); if (networkId == null) { // TODO: Figure out if this code path never runs. If so, remove them. final WifiManager wifi = (WifiManager) context.getSystemService( Loading services/core/java/com/android/server/ConnectivityService.java +11 −2 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ import android.net.NetworkSpecifier; import android.net.NetworkStack; import android.net.NetworkStackClient; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkTestResultParcelable; import android.net.NetworkUtils; import android.net.NetworkWatchlistManager; Loading Loading @@ -7948,8 +7949,16 @@ public class ConnectivityService extends IConnectivityManager.Stub final UnderlyingNetworkInfo[] underlyingNetworkInfos = getAllVpnInfo(); try { mStatsService.forceUpdateIfaces(getDefaultNetworks(), getAllNetworkState(), activeIface, underlyingNetworkInfos); final ArrayList<NetworkStateSnapshot> snapshots = new ArrayList<>(); // TODO: Directly use NetworkStateSnapshot when feasible. for (final NetworkState state : getAllNetworkState()) { final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties, state.networkCapabilities, state.network, state.subscriberId, state.legacyNetworkType); snapshots.add(snapshot); } mStatsService.forceUpdateIfaces(getDefaultNetworks(), snapshots.toArray( new NetworkStateSnapshot[0]), activeIface, underlyingNetworkInfos); } catch (Exception ignored) { } } Loading services/core/java/com/android/server/net/NetworkStatsService.java +20 −21 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkIdentity; import android.net.NetworkStack; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStatsHistory; Loading Loading @@ -296,7 +296,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { /** Last states of all networks sent from ConnectivityService. */ @GuardedBy("mStatsLock") @Nullable private NetworkState[] mLastNetworkStates = null; private NetworkStateSnapshot[] mLastNetworkStateSnapshots = null; private final DropBoxNonMonotonicObserver mNonMonotonicObserver = new DropBoxNonMonotonicObserver(); Loading Loading @@ -378,8 +378,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } case MSG_UPDATE_IFACES: { // If no cached states, ignore. if (mLastNetworkStates == null) break; updateIfaces(mDefaultNetworks, mLastNetworkStates, mActiveIface); if (mLastNetworkStateSnapshots == null) break; updateIfaces(mDefaultNetworks, mLastNetworkStateSnapshots, mActiveIface); break; } case MSG_PERFORM_POLL_REGISTER_ALERT: { Loading Loading @@ -967,10 +967,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } @Override public void forceUpdateIfaces( Network[] defaultNetworks, NetworkState[] networkStates, NetworkStateSnapshot[] networkStates, String activeIface, UnderlyingNetworkInfo[] underlyingNetworkInfos) { checkNetworkStackPermission(mContext); Loading Loading @@ -1248,13 +1247,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private void updateIfaces( Network[] defaultNetworks, NetworkState[] networkStates, NetworkStateSnapshot[] snapshots, String activeIface) { synchronized (mStatsLock) { mWakeLock.acquire(); try { mActiveIface = activeIface; updateIfacesLocked(defaultNetworks, networkStates); updateIfacesLocked(defaultNetworks, snapshots); } finally { mWakeLock.release(); } Loading @@ -1262,13 +1261,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } /** * Inspect all current {@link NetworkState} to derive mapping from {@code iface} to {@link * NetworkStatsHistory}. When multiple networks are active on a single {@code iface}, * Inspect all current {@link NetworkStateSnapshot}s to derive mapping from {@code iface} to * {@link NetworkStatsHistory}. When multiple networks are active on a single {@code iface}, * they are combined under a single {@link NetworkIdentitySet}. */ @GuardedBy("mStatsLock") private void updateIfacesLocked(@Nullable Network[] defaultNetworks, @NonNull NetworkState[] states) { @NonNull NetworkStateSnapshot[] snapshots) { if (!mSystemReady) return; if (LOGV) Slog.v(TAG, "updateIfacesLocked()"); Loading @@ -1288,21 +1287,21 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mDefaultNetworks = defaultNetworks; } mLastNetworkStates = states; mLastNetworkStateSnapshots = snapshots; final boolean combineSubtypeEnabled = mSettings.getCombineSubtypeEnabled(); final ArraySet<String> mobileIfaces = new ArraySet<>(); for (NetworkState state : states) { final boolean isMobile = isNetworkTypeMobile(state.legacyNetworkType); final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, state.network); for (NetworkStateSnapshot snapshot : snapshots) { final boolean isMobile = isNetworkTypeMobile(snapshot.legacyType); final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.network); final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED : getSubTypeForState(state); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state, : getSubTypeForStateSnapshot(snapshot); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot, isDefault, subType); // Traffic occurring on the base interface is always counted for // both total usage and UID details. final String baseIface = state.linkProperties.getInterfaceName(); final String baseIface = snapshot.linkProperties.getInterfaceName(); if (baseIface != null) { findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident); findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident); Loading @@ -1312,7 +1311,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // If IMS is metered, then the IMS network usage has already included VT usage. // VT is considered always metered in framework's layer. If VT is not metered // per carrier's policy, modem will report 0 usage for VT calls. if (state.networkCapabilities.hasCapability( if (snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.getMetered()) { // Copy the identify from IMS one but mark it as metered. Loading Loading @@ -1358,7 +1357,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // (or non eBPF offloaded) TX they would appear on both, however egress interface // accounting is explicitly bypassed for traffic from the clat uid. // final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks(); final List<LinkProperties> stackedLinks = snapshot.linkProperties.getStackedLinks(); for (LinkProperties stackedLink : stackedLinks) { final String stackedIface = stackedLink.getInterfaceName(); if (stackedIface != null) { Loading @@ -1381,7 +1380,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { * {@link PhoneStateListener}. Otherwise, return 0 given that other networks with different * transport types do not actually fill this value. */ private int getSubTypeForState(@NonNull NetworkState state) { private int getSubTypeForStateSnapshot(@NonNull NetworkStateSnapshot state) { if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { return 0; } Loading services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -2043,7 +2043,8 @@ public class NetworkPolicyManagerServiceTest { final NetworkCapabilities networkCapabilities = new NetworkCapabilities(); networkCapabilities.addTransportType(TRANSPORT_WIFI); networkCapabilities.setSSID(TEST_SSID); return new NetworkState(TYPE_WIFI, prop, networkCapabilities, null, null); return new NetworkState(TYPE_WIFI, prop, networkCapabilities, new Network(TEST_NET_ID), null); } private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception { Loading Loading
core/java/android/net/INetworkStatsService.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package android.net; import android.net.DataUsageRequest; import android.net.INetworkStatsSession; import android.net.Network; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; Loading Loading @@ -68,7 +68,7 @@ interface INetworkStatsService { /** Force update of ifaces. */ void forceUpdateIfaces( in Network[] defaultNetworks, in NetworkState[] networkStates, in NetworkStateSnapshot[] snapshots, in String activeIface, in UnderlyingNetworkInfo[] underlyingNetworkInfos); /** Force update of statistics. */ Loading
core/java/android/net/NetworkIdentity.java +28 −16 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package android.net; import static android.net.ConnectivityManager.TYPE_WIFI; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.net.wifi.WifiInfo; Loading Loading @@ -180,29 +179,42 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { } /** * Build a {@link NetworkIdentity} from the given {@link NetworkState} and {@code subType}, * assuming that any mobile networks are using the current IMSI. The subType if applicable, * should be set as one of the TelephonyManager.NETWORK_TYPE_* constants, or * {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. * Build a {@link NetworkIdentity} from the given {@link NetworkState} and * {@code subType}, assuming that any mobile networks are using the current IMSI. * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_* * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. */ public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state, boolean defaultNetwork, @NetworkType int subType) { final int legacyType = state.legacyNetworkType; // TODO: Delete this function after NetworkPolicyManagerService finishes the migration. public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state, boolean defaultNetwork, @NetworkType int subType) { final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties, state.networkCapabilities, state.network, state.subscriberId, state.legacyNetworkType); return buildNetworkIdentity(context, snapshot, defaultNetwork, subType); } String subscriberId = null; /** * Build a {@link NetworkIdentity} from the given {@link NetworkStateSnapshot} and * {@code subType}, assuming that any mobile networks are using the current IMSI. * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_* * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not. */ public static NetworkIdentity buildNetworkIdentity(Context context, NetworkStateSnapshot snapshot, boolean defaultNetwork, @NetworkType int subType) { final int legacyType = snapshot.legacyType; final String subscriberId = snapshot.subscriberId; String networkId = null; boolean roaming = !state.networkCapabilities.hasCapability( boolean roaming = !snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); boolean metered = !state.networkCapabilities.hasCapability( boolean metered = !snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_METERED); subscriberId = state.subscriberId; final int oemManaged = getOemBitfield(state.networkCapabilities); final int oemManaged = getOemBitfield(snapshot.networkCapabilities); if (legacyType == TYPE_WIFI) { if (state.networkCapabilities.getSsid() != null) { networkId = state.networkCapabilities.getSsid(); if (snapshot.networkCapabilities.getSsid() != null) { networkId = snapshot.networkCapabilities.getSsid(); if (networkId == null) { // TODO: Figure out if this code path never runs. If so, remove them. final WifiManager wifi = (WifiManager) context.getSystemService( Loading
services/core/java/com/android/server/ConnectivityService.java +11 −2 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ import android.net.NetworkSpecifier; import android.net.NetworkStack; import android.net.NetworkStackClient; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkTestResultParcelable; import android.net.NetworkUtils; import android.net.NetworkWatchlistManager; Loading Loading @@ -7948,8 +7949,16 @@ public class ConnectivityService extends IConnectivityManager.Stub final UnderlyingNetworkInfo[] underlyingNetworkInfos = getAllVpnInfo(); try { mStatsService.forceUpdateIfaces(getDefaultNetworks(), getAllNetworkState(), activeIface, underlyingNetworkInfos); final ArrayList<NetworkStateSnapshot> snapshots = new ArrayList<>(); // TODO: Directly use NetworkStateSnapshot when feasible. for (final NetworkState state : getAllNetworkState()) { final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties, state.networkCapabilities, state.network, state.subscriberId, state.legacyNetworkType); snapshots.add(snapshot); } mStatsService.forceUpdateIfaces(getDefaultNetworks(), snapshots.toArray( new NetworkStateSnapshot[0]), activeIface, underlyingNetworkInfos); } catch (Exception ignored) { } } Loading
services/core/java/com/android/server/net/NetworkStatsService.java +20 −21 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkIdentity; import android.net.NetworkStack; import android.net.NetworkState; import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStatsHistory; Loading Loading @@ -296,7 +296,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { /** Last states of all networks sent from ConnectivityService. */ @GuardedBy("mStatsLock") @Nullable private NetworkState[] mLastNetworkStates = null; private NetworkStateSnapshot[] mLastNetworkStateSnapshots = null; private final DropBoxNonMonotonicObserver mNonMonotonicObserver = new DropBoxNonMonotonicObserver(); Loading Loading @@ -378,8 +378,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } case MSG_UPDATE_IFACES: { // If no cached states, ignore. if (mLastNetworkStates == null) break; updateIfaces(mDefaultNetworks, mLastNetworkStates, mActiveIface); if (mLastNetworkStateSnapshots == null) break; updateIfaces(mDefaultNetworks, mLastNetworkStateSnapshots, mActiveIface); break; } case MSG_PERFORM_POLL_REGISTER_ALERT: { Loading Loading @@ -967,10 +967,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } @Override public void forceUpdateIfaces( Network[] defaultNetworks, NetworkState[] networkStates, NetworkStateSnapshot[] networkStates, String activeIface, UnderlyingNetworkInfo[] underlyingNetworkInfos) { checkNetworkStackPermission(mContext); Loading Loading @@ -1248,13 +1247,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private void updateIfaces( Network[] defaultNetworks, NetworkState[] networkStates, NetworkStateSnapshot[] snapshots, String activeIface) { synchronized (mStatsLock) { mWakeLock.acquire(); try { mActiveIface = activeIface; updateIfacesLocked(defaultNetworks, networkStates); updateIfacesLocked(defaultNetworks, snapshots); } finally { mWakeLock.release(); } Loading @@ -1262,13 +1261,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } /** * Inspect all current {@link NetworkState} to derive mapping from {@code iface} to {@link * NetworkStatsHistory}. When multiple networks are active on a single {@code iface}, * Inspect all current {@link NetworkStateSnapshot}s to derive mapping from {@code iface} to * {@link NetworkStatsHistory}. When multiple networks are active on a single {@code iface}, * they are combined under a single {@link NetworkIdentitySet}. */ @GuardedBy("mStatsLock") private void updateIfacesLocked(@Nullable Network[] defaultNetworks, @NonNull NetworkState[] states) { @NonNull NetworkStateSnapshot[] snapshots) { if (!mSystemReady) return; if (LOGV) Slog.v(TAG, "updateIfacesLocked()"); Loading @@ -1288,21 +1287,21 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mDefaultNetworks = defaultNetworks; } mLastNetworkStates = states; mLastNetworkStateSnapshots = snapshots; final boolean combineSubtypeEnabled = mSettings.getCombineSubtypeEnabled(); final ArraySet<String> mobileIfaces = new ArraySet<>(); for (NetworkState state : states) { final boolean isMobile = isNetworkTypeMobile(state.legacyNetworkType); final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, state.network); for (NetworkStateSnapshot snapshot : snapshots) { final boolean isMobile = isNetworkTypeMobile(snapshot.legacyType); final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.network); final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED : getSubTypeForState(state); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state, : getSubTypeForStateSnapshot(snapshot); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot, isDefault, subType); // Traffic occurring on the base interface is always counted for // both total usage and UID details. final String baseIface = state.linkProperties.getInterfaceName(); final String baseIface = snapshot.linkProperties.getInterfaceName(); if (baseIface != null) { findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident); findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident); Loading @@ -1312,7 +1311,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // If IMS is metered, then the IMS network usage has already included VT usage. // VT is considered always metered in framework's layer. If VT is not metered // per carrier's policy, modem will report 0 usage for VT calls. if (state.networkCapabilities.hasCapability( if (snapshot.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.getMetered()) { // Copy the identify from IMS one but mark it as metered. Loading Loading @@ -1358,7 +1357,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // (or non eBPF offloaded) TX they would appear on both, however egress interface // accounting is explicitly bypassed for traffic from the clat uid. // final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks(); final List<LinkProperties> stackedLinks = snapshot.linkProperties.getStackedLinks(); for (LinkProperties stackedLink : stackedLinks) { final String stackedIface = stackedLink.getInterfaceName(); if (stackedIface != null) { Loading @@ -1381,7 +1380,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { * {@link PhoneStateListener}. Otherwise, return 0 given that other networks with different * transport types do not actually fill this value. */ private int getSubTypeForState(@NonNull NetworkState state) { private int getSubTypeForStateSnapshot(@NonNull NetworkStateSnapshot state) { if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { return 0; } Loading
services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -2043,7 +2043,8 @@ public class NetworkPolicyManagerServiceTest { final NetworkCapabilities networkCapabilities = new NetworkCapabilities(); networkCapabilities.addTransportType(TRANSPORT_WIFI); networkCapabilities.setSSID(TEST_SSID); return new NetworkState(TYPE_WIFI, prop, networkCapabilities, null, null); return new NetworkState(TYPE_WIFI, prop, networkCapabilities, new Network(TEST_NET_ID), null); } private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception { Loading