[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
This commit is contained in:
Handa Wang 2024-10-25 09:20:00 +00:00
commit 39f0ea9106
2 changed files with 66 additions and 2 deletions

View file

@ -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());
}
}

View file

@ -17,7 +17,8 @@
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
@ -92,7 +93,21 @@
android:id="@+id/text_ephemeral_key_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:textSize="12sp" />
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Configuration"
android:textSize="16sp"
android:textStyle="bold" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_nat64"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="false"
android:text="NAT64" />
</LinearLayout>
</ScrollView>