Merge "[FUI22] Support getAllNetworkStateSnapshot"
This commit is contained in:
@@ -6,6 +6,7 @@ package android.net {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class ConnectivityManager {
|
public class ConnectivityManager {
|
||||||
|
method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshot();
|
||||||
method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
|
method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
|
||||||
method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @Nullable android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
|
method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @Nullable android.os.Handler, @NonNull android.net.ConnectivityManager.NetworkCallback);
|
||||||
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle);
|
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle);
|
||||||
|
|||||||
@@ -1258,6 +1258,25 @@ public class ConnectivityManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of {@link NetworkStateSnapshot}s, one for each network that is currently
|
||||||
|
* connected.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@SystemApi(client = MODULE_LIBRARIES)
|
||||||
|
@RequiresPermission(anyOf = {
|
||||||
|
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
|
||||||
|
android.Manifest.permission.NETWORK_STACK,
|
||||||
|
android.Manifest.permission.NETWORK_SETTINGS})
|
||||||
|
@NonNull
|
||||||
|
public List<NetworkStateSnapshot> getAllNetworkStateSnapshot() {
|
||||||
|
try {
|
||||||
|
return mService.getAllNetworkStateSnapshot();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link Network} object currently serving a given type, or
|
* Returns the {@link Network} object currently serving a given type, or
|
||||||
* null if the given type is not connected.
|
* null if the given type is not connected.
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import android.net.NetworkCapabilities;
|
|||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkState;
|
import android.net.NetworkState;
|
||||||
|
import android.net.NetworkStateSnapshot;
|
||||||
import android.net.OemNetworkPreferences;
|
import android.net.OemNetworkPreferences;
|
||||||
import android.net.ProxyInfo;
|
import android.net.ProxyInfo;
|
||||||
import android.net.UidRange;
|
import android.net.UidRange;
|
||||||
@@ -79,6 +80,8 @@ interface IConnectivityManager
|
|||||||
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
|
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
|
||||||
NetworkState[] getAllNetworkState();
|
NetworkState[] getAllNetworkState();
|
||||||
|
|
||||||
|
List<NetworkStateSnapshot> getAllNetworkStateSnapshot();
|
||||||
|
|
||||||
boolean isActiveNetworkMetered();
|
boolean isActiveNetworkMetered();
|
||||||
|
|
||||||
boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress,
|
boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress,
|
||||||
|
|||||||
@@ -1886,26 +1886,48 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Consider delete this function or turn it into a no-op method.
|
||||||
@Override
|
@Override
|
||||||
public NetworkState[] getAllNetworkState() {
|
public NetworkState[] getAllNetworkState() {
|
||||||
// This contains IMSI details, so make sure the caller is privileged.
|
// This contains IMSI details, so make sure the caller is privileged.
|
||||||
PermissionUtils.enforceNetworkStackPermission(mContext);
|
PermissionUtils.enforceNetworkStackPermission(mContext);
|
||||||
|
|
||||||
final ArrayList<NetworkState> result = new ArrayList<>();
|
final ArrayList<NetworkState> result = new ArrayList<>();
|
||||||
for (Network network : getAllNetworks()) {
|
for (NetworkStateSnapshot snapshot : getAllNetworkStateSnapshot()) {
|
||||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
|
// NetworkStateSnapshot doesn't contain NetworkInfo, so need to fetch it from the
|
||||||
// TODO: Consider include SUSPENDED networks.
|
// NetworkAgentInfo.
|
||||||
|
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(snapshot.network);
|
||||||
if (nai != null && nai.networkInfo.isConnected()) {
|
if (nai != null && nai.networkInfo.isConnected()) {
|
||||||
// TODO (b/73321673) : NetworkState contains a copy of the
|
result.add(new NetworkState(new NetworkInfo(nai.networkInfo),
|
||||||
// NetworkCapabilities, which may contain UIDs of apps to which the
|
snapshot.linkProperties, snapshot.networkCapabilities, snapshot.network,
|
||||||
// network applies. Should the UIDs be cleared so as not to leak or
|
snapshot.subscriberId));
|
||||||
// interfere ?
|
|
||||||
result.add(nai.getNetworkState());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result.toArray(new NetworkState[result.size()]);
|
return result.toArray(new NetworkState[result.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public List<NetworkStateSnapshot> getAllNetworkStateSnapshot() {
|
||||||
|
// This contains IMSI details, so make sure the caller is privileged.
|
||||||
|
PermissionUtils.enforceNetworkStackPermission(mContext);
|
||||||
|
|
||||||
|
final ArrayList<NetworkStateSnapshot> result = new ArrayList<>();
|
||||||
|
for (Network network : getAllNetworks()) {
|
||||||
|
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
|
||||||
|
// TODO: Consider include SUSPENDED networks, which should be considered as
|
||||||
|
// temporary shortage of connectivity of a connected network.
|
||||||
|
if (nai != null && nai.networkInfo.isConnected()) {
|
||||||
|
// TODO (b/73321673) : NetworkStateSnapshot contains a copy of the
|
||||||
|
// NetworkCapabilities, which may contain UIDs of apps to which the
|
||||||
|
// network applies. Should the UIDs be cleared so as not to leak or
|
||||||
|
// interfere ?
|
||||||
|
result.add(nai.getNetworkStateSnapshot());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isActiveNetworkMetered() {
|
public boolean isActiveNetworkMetered() {
|
||||||
enforceAccessPermission();
|
enforceAccessPermission();
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import android.net.NetworkCapabilities;
|
|||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkMonitorManager;
|
import android.net.NetworkMonitorManager;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkState;
|
import android.net.NetworkStateSnapshot;
|
||||||
import android.net.QosCallbackException;
|
import android.net.QosCallbackException;
|
||||||
import android.net.QosFilter;
|
import android.net.QosFilter;
|
||||||
import android.net.QosFilterParcelable;
|
import android.net.QosFilterParcelable;
|
||||||
@@ -890,15 +890,18 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
|||||||
mScore = score;
|
mScore = score;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkState getNetworkState() {
|
/**
|
||||||
|
* Return a {@link NetworkStateSnapshot} for this network.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public NetworkStateSnapshot getNetworkStateSnapshot() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
// Network objects are outwardly immutable so there is no point in duplicating.
|
// Network objects are outwardly immutable so there is no point in duplicating.
|
||||||
// Duplicating also precludes sharing socket factories and connection pools.
|
// Duplicating also precludes sharing socket factories and connection pools.
|
||||||
final String subscriberId = (networkAgentConfig != null)
|
final String subscriberId = (networkAgentConfig != null)
|
||||||
? networkAgentConfig.subscriberId : null;
|
? networkAgentConfig.subscriberId : null;
|
||||||
return new NetworkState(new NetworkInfo(networkInfo),
|
return new NetworkStateSnapshot(network, new NetworkCapabilities(networkCapabilities),
|
||||||
new LinkProperties(linkProperties),
|
new LinkProperties(linkProperties), subscriberId, networkInfo.getType());
|
||||||
new NetworkCapabilities(networkCapabilities), network, subscriberId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ import static com.android.testutils.ConcurrentUtils.await;
|
|||||||
import static com.android.testutils.ConcurrentUtils.durationOf;
|
import static com.android.testutils.ConcurrentUtils.durationOf;
|
||||||
import static com.android.testutils.ExceptionUtils.ignoreExceptions;
|
import static com.android.testutils.ExceptionUtils.ignoreExceptions;
|
||||||
import static com.android.testutils.HandlerUtils.waitForIdleSerialExecutor;
|
import static com.android.testutils.HandlerUtils.waitForIdleSerialExecutor;
|
||||||
|
import static com.android.testutils.MiscAsserts.assertContainsAll;
|
||||||
import static com.android.testutils.MiscAsserts.assertContainsExactly;
|
import static com.android.testutils.MiscAsserts.assertContainsExactly;
|
||||||
import static com.android.testutils.MiscAsserts.assertEmpty;
|
import static com.android.testutils.MiscAsserts.assertEmpty;
|
||||||
import static com.android.testutils.MiscAsserts.assertLength;
|
import static com.android.testutils.MiscAsserts.assertLength;
|
||||||
@@ -203,6 +204,7 @@ import android.net.NetworkRequest;
|
|||||||
import android.net.NetworkSpecifier;
|
import android.net.NetworkSpecifier;
|
||||||
import android.net.NetworkStack;
|
import android.net.NetworkStack;
|
||||||
import android.net.NetworkStackClient;
|
import android.net.NetworkStackClient;
|
||||||
|
import android.net.NetworkStateSnapshot;
|
||||||
import android.net.NetworkTestResultParcelable;
|
import android.net.NetworkTestResultParcelable;
|
||||||
import android.net.OemNetworkPreferences;
|
import android.net.OemNetworkPreferences;
|
||||||
import android.net.ProxyInfo;
|
import android.net.ProxyInfo;
|
||||||
@@ -1663,6 +1665,7 @@ public class ConnectivityServiceTest {
|
|||||||
assertNull(mCm.getActiveNetworkForUid(Process.myUid()));
|
assertNull(mCm.getActiveNetworkForUid(Process.myUid()));
|
||||||
// Test getAllNetworks()
|
// Test getAllNetworks()
|
||||||
assertEmpty(mCm.getAllNetworks());
|
assertEmpty(mCm.getAllNetworks());
|
||||||
|
assertEmpty(mCm.getAllNetworkStateSnapshot());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -10659,4 +10662,83 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
// default NCs will be unregistered in tearDown
|
// default NCs will be unregistered in tearDown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAllNetworkStateSnapshot() throws Exception {
|
||||||
|
verifyNoNetwork();
|
||||||
|
|
||||||
|
// Setup test cellular network with specified LinkProperties and NetworkCapabilities,
|
||||||
|
// verify the content of the snapshot matches.
|
||||||
|
final LinkProperties cellLp = new LinkProperties();
|
||||||
|
final LinkAddress myIpv4Addr = new LinkAddress(InetAddress.getByName("192.0.2.129"), 25);
|
||||||
|
final LinkAddress myIpv6Addr = new LinkAddress(InetAddress.getByName("2001:db8::1"), 64);
|
||||||
|
cellLp.setInterfaceName("test01");
|
||||||
|
cellLp.addLinkAddress(myIpv4Addr);
|
||||||
|
cellLp.addLinkAddress(myIpv6Addr);
|
||||||
|
cellLp.addRoute(new RouteInfo(InetAddress.getByName("fe80::1234")));
|
||||||
|
cellLp.addRoute(new RouteInfo(InetAddress.getByName("192.0.2.254")));
|
||||||
|
cellLp.addRoute(new RouteInfo(myIpv4Addr, null));
|
||||||
|
cellLp.addRoute(new RouteInfo(myIpv6Addr, null));
|
||||||
|
final NetworkCapabilities cellNcTemplate = new NetworkCapabilities.Builder()
|
||||||
|
.addTransportType(TRANSPORT_CELLULAR).addCapability(NET_CAPABILITY_MMS).build();
|
||||||
|
|
||||||
|
final TestNetworkCallback cellCb = new TestNetworkCallback();
|
||||||
|
mCm.requestNetwork(new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build(),
|
||||||
|
cellCb);
|
||||||
|
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp, cellNcTemplate);
|
||||||
|
mCellNetworkAgent.connect(true);
|
||||||
|
cellCb.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
|
||||||
|
List<NetworkStateSnapshot> snapshots = mCm.getAllNetworkStateSnapshot();
|
||||||
|
assertLength(1, snapshots);
|
||||||
|
|
||||||
|
// Compose the expected cellular snapshot for verification.
|
||||||
|
final NetworkCapabilities cellNc =
|
||||||
|
mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork());
|
||||||
|
final NetworkStateSnapshot cellSnapshot = new NetworkStateSnapshot(
|
||||||
|
mCellNetworkAgent.getNetwork(), cellNc, cellLp,
|
||||||
|
null, ConnectivityManager.TYPE_MOBILE);
|
||||||
|
assertEquals(cellSnapshot, snapshots.get(0));
|
||||||
|
|
||||||
|
// Connect wifi and verify the snapshots.
|
||||||
|
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
|
||||||
|
mWiFiNetworkAgent.connect(true);
|
||||||
|
waitForIdle();
|
||||||
|
// Compose the expected wifi snapshot for verification.
|
||||||
|
final NetworkCapabilities wifiNc =
|
||||||
|
mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork());
|
||||||
|
final NetworkStateSnapshot wifiSnapshot = new NetworkStateSnapshot(
|
||||||
|
mWiFiNetworkAgent.getNetwork(), wifiNc, new LinkProperties(), null,
|
||||||
|
ConnectivityManager.TYPE_WIFI);
|
||||||
|
|
||||||
|
snapshots = mCm.getAllNetworkStateSnapshot();
|
||||||
|
assertLength(2, snapshots);
|
||||||
|
assertContainsAll(snapshots, cellSnapshot, wifiSnapshot);
|
||||||
|
|
||||||
|
// Set cellular as suspended, verify the snapshots will not contain suspended networks.
|
||||||
|
// TODO: Consider include SUSPENDED networks, which should be considered as
|
||||||
|
// temporary shortage of connectivity of a connected network.
|
||||||
|
mCellNetworkAgent.suspend();
|
||||||
|
waitForIdle();
|
||||||
|
snapshots = mCm.getAllNetworkStateSnapshot();
|
||||||
|
assertLength(1, snapshots);
|
||||||
|
assertEquals(wifiSnapshot, snapshots.get(0));
|
||||||
|
|
||||||
|
// Disconnect wifi, verify the snapshots contain nothing.
|
||||||
|
mWiFiNetworkAgent.disconnect();
|
||||||
|
waitForIdle();
|
||||||
|
snapshots = mCm.getAllNetworkStateSnapshot();
|
||||||
|
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
|
||||||
|
assertLength(0, snapshots);
|
||||||
|
|
||||||
|
mCellNetworkAgent.resume();
|
||||||
|
waitForIdle();
|
||||||
|
snapshots = mCm.getAllNetworkStateSnapshot();
|
||||||
|
assertLength(1, snapshots);
|
||||||
|
assertEquals(cellSnapshot, snapshots.get(0));
|
||||||
|
|
||||||
|
mCellNetworkAgent.disconnect();
|
||||||
|
waitForIdle();
|
||||||
|
verifyNoNetwork();
|
||||||
|
mCm.unregisterNetworkCallback(cellCb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user