From a8a74e2ccce6ef2f35d08bc84a63c7dbac2bfeb1 Mon Sep 17 00:00:00 2001 From: Nagendra Prasad Nagarle Basavaraju Date: Tue, 20 Feb 2024 19:09:30 +0000 Subject: [PATCH] Udpate setNetworkSpecifier to support Satellite Transport. - Allow adding two non test transports i.e. satellite and cellular at setNetworkSpecifier, to receive network requests related to satellite transport capabilities Bug: 324347502 Test: atest FrameworksNetTests Change-Id: I03a3d701e214792184bacfe5b5b59cdef61d555e --- .../src/android/net/NetworkCapabilities.java | 8 +++- .../android/net/NetworkCapabilitiesTest.java | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/framework/src/android/net/NetworkCapabilities.java b/framework/src/android/net/NetworkCapabilities.java index f6ef75ea11..84a0d29e6f 100644 --- a/framework/src/android/net/NetworkCapabilities.java +++ b/framework/src/android/net/NetworkCapabilities.java @@ -1770,9 +1770,13 @@ public final class NetworkCapabilities implements Parcelable { public @NonNull NetworkCapabilities setNetworkSpecifier( @NonNull NetworkSpecifier networkSpecifier) { if (networkSpecifier != null - // Transport can be test, or test + a single other transport + // Transport can be test, or test + a single other transport or cellular + satellite + // transport. Note: cellular + satellite combination is allowed since both transport + // use the same specifier, TelephonyNetworkSpecifier. && mTransportTypes != (1L << TRANSPORT_TEST) - && Long.bitCount(mTransportTypes & ~(1L << TRANSPORT_TEST)) != 1) { + && Long.bitCount(mTransportTypes & ~(1L << TRANSPORT_TEST)) != 1 + && (mTransportTypes & ~(1L << TRANSPORT_TEST)) + != (1 << TRANSPORT_CELLULAR | 1 << TRANSPORT_SATELLITE)) { throw new IllegalStateException("Must have a single non-test transport specified to " + "use setNetworkSpecifier"); } diff --git a/tests/common/java/android/net/NetworkCapabilitiesTest.java b/tests/common/java/android/net/NetworkCapabilitiesTest.java index 3a3459bd99..3124b1b197 100644 --- a/tests/common/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/common/java/android/net/NetworkCapabilitiesTest.java @@ -54,6 +54,7 @@ import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; import static android.net.NetworkCapabilities.SIGNAL_STRENGTH_UNSPECIFIED; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; +import static android.net.NetworkCapabilities.TRANSPORT_SATELLITE; import static android.net.NetworkCapabilities.TRANSPORT_TEST; import static android.net.NetworkCapabilities.TRANSPORT_USB; import static android.net.NetworkCapabilities.TRANSPORT_VPN; @@ -760,6 +761,47 @@ public class NetworkCapabilitiesTest { () -> nc2.addTransportType(TRANSPORT_WIFI)); } + @Test + public void testSetNetworkSpecifierWithCellularAndSatelliteMultiTransportNc() { + final TelephonyNetworkSpecifier specifier = new TelephonyNetworkSpecifier(1); + NetworkCapabilities nc = new NetworkCapabilities.Builder() + .addTransportType(TRANSPORT_CELLULAR) + .addTransportType(TRANSPORT_SATELLITE) + .setNetworkSpecifier(specifier) + .build(); + // Adding a specifier did not crash with 2 transports if it is cellular + satellite + assertEquals(specifier, nc.getNetworkSpecifier()); + } + + @Test + public void testSetNetworkSpecifierWithWifiAndSatelliteMultiTransportNc() { + final TelephonyNetworkSpecifier specifier = new TelephonyNetworkSpecifier(1); + NetworkCapabilities.Builder nc1 = new NetworkCapabilities.Builder(); + nc1.addTransportType(TRANSPORT_SATELLITE).addTransportType(TRANSPORT_WIFI); + // Adding multiple transports specifier to crash, apart from cellular + satellite + // combination + assertThrows("Cannot set NetworkSpecifier on a NetworkCapability with multiple transports!", + IllegalStateException.class, + () -> nc1.build().setNetworkSpecifier(specifier)); + assertThrows("Cannot set NetworkSpecifier on a NetworkCapability with multiple transports!", + IllegalStateException.class, + () -> nc1.setNetworkSpecifier(specifier)); + } + + @Test + public void testSetNetworkSpecifierOnTestWithCellularAndSatelliteMultiTransportNc() { + final TelephonyNetworkSpecifier specifier = new TelephonyNetworkSpecifier(1); + NetworkCapabilities nc = new NetworkCapabilities.Builder() + .addTransportType(TRANSPORT_TEST) + .addTransportType(TRANSPORT_CELLULAR) + .addTransportType(TRANSPORT_SATELLITE) + .setNetworkSpecifier(specifier) + .build(); + // Adding a specifier did not crash with 3 transports , TEST + CELLULAR + SATELLITE and if + // one is test + assertEquals(specifier, nc.getNetworkSpecifier()); + } + @Test public void testSetNetworkSpecifierOnTestMultiTransportNc() { final NetworkSpecifier specifier = CompatUtil.makeEthernetNetworkSpecifier("eth0");