From 39f0ea91063c5225108300a79f18b68a2123025d Mon Sep 17 00:00:00 2001 From: Handa Wang Date: Fri, 25 Oct 2024 09:20:00 +0000 Subject: [PATCH] [Thread] Add NAT64 switch to Thread demo app This CL adds a switch to the Thread demo app that allows the user to enable or disable NAT64. See screenshot https://screenshot.googleplex.com/3UDJ6wXqRf6WKRy. Bug: 375559106 Change-Id: I2a5c9f08ef664e62a5c34987eedb321e2b01fd85 --- .../ThreadNetworkSettingsFragment.java | 49 +++++++++++++++++++ .../thread_network_settings_fragment.xml | 19 ++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/thread/demoapp/java/com/android/threadnetwork/demoapp/ThreadNetworkSettingsFragment.java b/thread/demoapp/java/com/android/threadnetwork/demoapp/ThreadNetworkSettingsFragment.java index 2659d24fac..ea30e2631f 100644 --- a/thread/demoapp/java/com/android/threadnetwork/demoapp/ThreadNetworkSettingsFragment.java +++ b/thread/demoapp/java/com/android/threadnetwork/demoapp/ThreadNetworkSettingsFragment.java @@ -28,6 +28,7 @@ import android.net.RouteInfo; import android.net.thread.ActiveOperationalDataset; import android.net.thread.OperationalDatasetTimestamp; import android.net.thread.PendingOperationalDataset; +import android.net.thread.ThreadConfiguration; import android.net.thread.ThreadNetworkController; import android.net.thread.ThreadNetworkException; import android.net.thread.ThreadNetworkManager; @@ -45,6 +46,8 @@ import android.widget.TextView; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import com.google.android.material.switchmaterial.SwitchMaterial; + import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -63,6 +66,7 @@ public final class ThreadNetworkSettingsFragment extends Fragment { private TextView mTextNetworkInfo; private TextView mMigrateNetworkState; private TextView mEphemeralKeyStateText; + private SwitchMaterial mNat64Switch; private Executor mMainExecutor; private int mDeviceRole; @@ -72,6 +76,7 @@ public final class ThreadNetworkSettingsFragment extends Fragment { private String mEphemeralKey; private Instant mEphemeralKeyExpiry; private Timer mEphemeralKeyLifetimeTimer; + private ThreadConfiguration mThreadConfiguration; private static final byte[] DEFAULT_ACTIVE_DATASET_TLVS = base16().lowerCase() @@ -110,6 +115,10 @@ public final class ThreadNetworkSettingsFragment extends Fragment { } } + private static String booleanToEnabledOrDisabled(boolean enabled) { + return enabled ? "Enabled" : "Disabled"; + } + @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -181,11 +190,16 @@ public final class ThreadNetworkSettingsFragment extends Fragment { this.mActiveDataset = newActiveDataset; updateState(); }); + mThreadController.registerConfigurationCallback( + mMainExecutor, this::updateConfiguration); } mTextState = (TextView) view.findViewById(R.id.text_state); mTextNetworkInfo = (TextView) view.findViewById(R.id.text_network_info); mEphemeralKeyStateText = (TextView) view.findViewById(R.id.text_ephemeral_key_state); + mNat64Switch = (SwitchMaterial) view.findViewById(R.id.switch_nat64); + mNat64Switch.setOnCheckedChangeListener( + (buttonView, isChecked) -> doSetNat64Enabled(isChecked)); if (mThreadController == null) { mTextState.setText("Thread not supported!"); @@ -303,6 +317,34 @@ public final class ThreadNetworkSettingsFragment extends Fragment { }); } + private void doSetNat64Enabled(boolean enabled) { + if (mThreadConfiguration == null) { + Log.e(TAG, "Thread configuration is not available"); + return; + } + final ThreadConfiguration config = + new ThreadConfiguration.Builder(mThreadConfiguration) + .setNat64Enabled(enabled) + .build(); + mThreadController.setConfiguration( + config, + mMainExecutor, + new OutcomeReceiver<>() { + @Override + public void onError(ThreadNetworkException error) { + Log.e( + TAG, + "Failed to set NAT64 " + booleanToEnabledOrDisabled(enabled), + error); + } + + @Override + public void onResult(Void v) { + Log.i(TAG, "Successfully set NAT64 " + booleanToEnabledOrDisabled(enabled)); + } + }); + } + private void updateState() { Log.i( TAG, @@ -368,4 +410,11 @@ public final class ThreadNetworkSettingsFragment extends Fragment { } mTextNetworkInfo.setText(sb.toString()); } + + private void updateConfiguration(ThreadConfiguration config) { + Log.i(TAG, "Updating configuration: " + config); + + mThreadConfiguration = config; + mNat64Switch.setChecked(config.isNat64Enabled()); + } } diff --git a/thread/demoapp/res/layout/thread_network_settings_fragment.xml b/thread/demoapp/res/layout/thread_network_settings_fragment.xml index ac89a2ff6f..ec80447005 100644 --- a/thread/demoapp/res/layout/thread_network_settings_fragment.xml +++ b/thread/demoapp/res/layout/thread_network_settings_fragment.xml @@ -17,7 +17,8 @@ + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + + + +