From c4d212c5d4aaabd1f430bdbbfa44d093ceddf901 Mon Sep 17 00:00:00 2001 From: Kangping Dong Date: Thu, 26 Jun 2025 14:51:28 +0800 Subject: [PATCH] [API] make ThreadNetworkSpecifier @SystemApi This class can be used with ConnectivityManager#requestNetwork to request connecting to a specific Thread network from system apps. Bug: 377258309 Flag: com.android.net.thread.flags.thread_mobile_enabled Change-Id: I80cb992380236b045e4e331b9861274d8cd10cfd --- framework-t/api/system-current.txt | 15 +++++++++++++++ .../net/thread/ThreadNetworkSpecifier.java | 6 ++++++ .../thread/cts}/ThreadNetworkSpecifierTest.java | 10 +++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) rename thread/tests/{unit/src/android/net/thread => cts/src/android/net/thread/cts}/ThreadNetworkSpecifierTest.java (96%) diff --git a/framework-t/api/system-current.txt b/framework-t/api/system-current.txt index 5f8f0e312c..e7a4c69ff4 100644 --- a/framework-t/api/system-current.txt +++ b/framework-t/api/system-current.txt @@ -580,5 +580,20 @@ package android.net.thread { method @NonNull public java.util.List getAllThreadNetworkControllers(); } + @FlaggedApi("com.android.net.thread.flags.thread_mobile_enabled") public final class ThreadNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public android.net.thread.ActiveOperationalDataset getActiveOperationalDataset(); + method public boolean shouldCreatePartitionIfNotFound(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class ThreadNetworkSpecifier.Builder { + ctor public ThreadNetworkSpecifier.Builder(); + method @NonNull public android.net.thread.ThreadNetworkSpecifier build(); + method @NonNull public android.net.thread.ThreadNetworkSpecifier.Builder setActiveOperationalDataset(@Nullable android.net.thread.ActiveOperationalDataset); + method @NonNull public android.net.thread.ThreadNetworkSpecifier.Builder setShouldCreatePartitionIfNotFound(boolean); + } + } diff --git a/thread/framework/java/android/net/thread/ThreadNetworkSpecifier.java b/thread/framework/java/android/net/thread/ThreadNetworkSpecifier.java index 4278d420cd..406de97876 100644 --- a/thread/framework/java/android/net/thread/ThreadNetworkSpecifier.java +++ b/thread/framework/java/android/net/thread/ThreadNetworkSpecifier.java @@ -22,8 +22,12 @@ import static android.net.thread.ActiveOperationalDataset.LENGTH_EXTENDED_PAN_ID import static android.net.thread.ActiveOperationalDataset.LENGTH_NETWORK_KEY; import static android.net.thread.ActiveOperationalDataset.LENGTH_PSKC; +import static com.android.net.thread.flags.Flags.FLAG_THREAD_MOBILE_ENABLED; + +import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.os.Parcel; @@ -41,6 +45,8 @@ import java.util.Objects; * * @hide */ +@FlaggedApi(FLAG_THREAD_MOBILE_ENABLED) +@SystemApi public final class ThreadNetworkSpecifier extends NetworkSpecifier implements Parcelable { // TODO: b/427955643 - use NetworkCapabilities#REDACT_FOR_THREAD_NETWORK_PRIVILEGED private static final long REDACT_FOR_THREAD_NETWORK_PRIVILEGED = 1 << 3; diff --git a/thread/tests/unit/src/android/net/thread/ThreadNetworkSpecifierTest.java b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkSpecifierTest.java similarity index 96% rename from thread/tests/unit/src/android/net/thread/ThreadNetworkSpecifierTest.java rename to thread/tests/cts/src/android/net/thread/cts/ThreadNetworkSpecifierTest.java index ebddc6b824..5228f62c26 100644 --- a/thread/tests/unit/src/android/net/thread/ThreadNetworkSpecifierTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkSpecifierTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.net.thread; +package android.net.thread.cts; import static com.android.net.thread.flags.Flags.FLAG_THREAD_MOBILE_ENABLED; import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; @@ -22,12 +22,17 @@ import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; import static com.google.common.io.BaseEncoding.base16; import static com.google.common.truth.Truth.assertThat; +import android.net.thread.ActiveOperationalDataset; +import android.net.thread.ThreadNetworkSpecifier; import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.test.filters.SmallTest; import com.google.common.testing.EqualsTester; +import org.junit.Rule; import org.junit.Test; /** Tests for {@link ThreadNetworkSpecifier}. */ @@ -78,6 +83,9 @@ public final class ThreadNetworkSpecifierTest { private static final ActiveOperationalDataset TEST_DATASET_2 = ActiveOperationalDataset.fromThreadTlvs(DATASET_TLVS_2); + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + @Test public void parcelable_parcelingIsLossLess() { ThreadNetworkSpecifier specifier =