diff --git a/res/layout/wifi_network_config.xml b/res/layout/wifi_network_config.xml
index 3de1a38c3ea..dbd3e673913 100644
--- a/res/layout/wifi_network_config.xml
+++ b/res/layout/wifi_network_config.xml
@@ -708,6 +708,13 @@
style="@style/wifi_item_spinner"
android:prompt="@string/wifi_privacy_settings"
android:entries="@array/wifi_privacy_entries"/>
+
+
Use device MAC
+
+ - Send device name to network
+ - Don\u0027t send device name to network
+
+
- No
- Yes
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 5d45cb235b8..39c77a17924 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -72,6 +72,7 @@ import com.android.settings.ProxySelector;
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.Utils;
import com.android.settingslib.utils.ThreadUtils;
@@ -154,6 +155,10 @@ public class WifiConfigController implements TextWatcher,
@VisibleForTesting static final int PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC = 0;
@VisibleForTesting static final int PRIVACY_SPINNER_INDEX_DEVICE_MAC = 1;
+ // Should be the same index value as wifi_dhcp_entries in arrays.xml
+ @VisibleForTesting static final int DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE = 0;
+ @VisibleForTesting static final int DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE = 1;
+
/* Phase2 methods supported by PEAP are limited */
private ArrayAdapter mPhase2PeapAdapter;
/* Phase2 methods supported by TTLS are limited */
@@ -194,6 +199,7 @@ public class WifiConfigController implements TextWatcher,
private Spinner mMeteredSettingsSpinner;
private Spinner mHiddenSettingsSpinner;
private Spinner mPrivacySettingsSpinner;
+ private Spinner mDhcpSettingsSpinner;
private TextView mHiddenWarningView;
private TextView mProxyHostView;
private TextView mProxyPortView;
@@ -291,6 +297,7 @@ public class WifiConfigController implements TextWatcher,
mMeteredSettingsSpinner = mView.findViewById(R.id.metered_settings);
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
mPrivacySettingsSpinner = mView.findViewById(R.id.privacy_settings);
+ mDhcpSettingsSpinner = mView.findViewById(R.id.dhcp_settings);
if (mWifiManager.isConnectedMacRandomizationSupported()) {
View privacySettingsLayout = mView.findViewById(R.id.privacy_settings_fields);
privacySettingsLayout.setVisibility(View.VISIBLE);
@@ -323,6 +330,12 @@ public class WifiConfigController implements TextWatcher,
config.macRandomizationSetting == WifiConfiguration.RANDOMIZATION_PERSISTENT
? PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC : PRIVACY_SPINNER_INDEX_DEVICE_MAC);
+ mDhcpSettingsSpinner.setSelection(
+ config.isSendDhcpHostnameEnabled()
+ ? DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE :
+ DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE
+ );
+
if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
mIpSettingsSpinner.setSelection(STATIC_IP);
showAdvancedFields = true;
@@ -841,6 +854,12 @@ public class WifiConfigController implements TextWatcher,
: WifiConfiguration.RANDOMIZATION_NONE;
}
+ if (mDhcpSettingsSpinner != null) {
+ config.setSendDhcpHostnameEnabled(WifiPrivacyPreferenceController.Companion
+ .translatePrefValueToSendDhcpHostnameEnabled(mDhcpSettingsSpinner
+ .getSelectedItemPosition()));
+ }
+
return config;
}
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 7c9b1d1b471..1e405686e19 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -74,6 +74,7 @@ import com.android.settings.ProxySelector;
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.Utils;
@@ -208,6 +209,8 @@ public class WifiConfigController2 implements TextWatcher,
private Spinner mHiddenSettingsSpinner;
@Nullable
private Spinner mPrivacySettingsSpinner;
+ @Nullable
+ private Spinner mDhcpSettingsSpinner;
private TextView mHiddenWarningView;
private TextView mProxyHostView;
private TextView mProxyPortView;
@@ -308,6 +311,7 @@ public class WifiConfigController2 implements TextWatcher,
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
if (!mHideMeteredAndPrivacy && mWifiManager.isConnectedMacRandomizationSupported()) {
mPrivacySettingsSpinner = mView.findViewById(R.id.privacy_settings);
+ mDhcpSettingsSpinner = mView.findViewById(R.id.dhcp_settings);
mView.findViewById(R.id.privacy_settings_fields).setVisibility(View.VISIBLE);
}
mHiddenSettingsSpinner.setOnItemSelectedListener(this);
@@ -342,6 +346,13 @@ public class WifiConfigController2 implements TextWatcher,
mPrivacySettingsSpinner.setSelection(prefMacValue);
}
+ if (mDhcpSettingsSpinner != null) {
+ final int prefDhcpValue = WifiPrivacyPreferenceController.Companion
+ .translateSendDhcpHostnameEnabledToPrefValue(
+ config.isSendDhcpHostnameEnabled());
+ mDhcpSettingsSpinner.setSelection(prefDhcpValue);
+ }
+
if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
mIpSettingsSpinner.setSelection(STATIC_IP);
showAdvancedFields = true;
@@ -854,6 +865,12 @@ public class WifiConfigController2 implements TextWatcher,
.getSelectedItemPosition());
}
+ if (mDhcpSettingsSpinner != null) {
+ config.setSendDhcpHostnameEnabled(WifiPrivacyPreferenceController.Companion
+ .translatePrefValueToSendDhcpHostnameEnabled(mDhcpSettingsSpinner
+ .getSelectedItemPosition()));
+ }
+
return config;
}
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
index 42741e311c2..2ed2e5a96e1 100644
--- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
@@ -63,4 +63,32 @@ class WifiPrivacyPreferenceController(context: Context, preferenceKey: String) :
}
})
}
+
+ companion object {
+ private const val PREF_SEND_DHCP_HOST_NAME_ENABLE = 0
+ private const val PREF_SEND_DHCP_HOST_NAME_DISABLE = 1
+
+ /**
+ * Returns preference index value.
+ *
+ * @param isSendDhcpHostnameEnabled determines whether device name can be sent.
+ * @return index value of preference
+ */
+ fun translateSendDhcpHostnameEnabledToPrefValue(
+ isSendDhcpHostnameEnabled: Boolean
+ ): Int {
+ return if (isSendDhcpHostnameEnabled) PREF_SEND_DHCP_HOST_NAME_ENABLE
+ else PREF_SEND_DHCP_HOST_NAME_DISABLE
+ }
+
+ /**
+ * Returns whether device name can be sent.
+ *
+ * @param prefDhcpRandomized is preference index value
+ * @return is send dhcp host name enabled
+ */
+ fun translatePrefValueToSendDhcpHostnameEnabled(prefDhcpRandomized: Int): Boolean {
+ return prefDhcpRandomized == PREF_SEND_DHCP_HOST_NAME_ENABLE
+ }
+ }
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index 4fcc93daba3..7d96496282e 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -16,6 +16,7 @@
package com.android.settings.wifi;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE;
import static com.android.settings.wifi.WifiConfigController2.DEFAULT_ANONYMOUS_ID;
import static com.android.settings.wifi.WifiConfigController2.WIFI_EAP_METHOD_SIM;
@@ -56,6 +57,7 @@ import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
import com.android.wifitrackerlib.WifiEntry;
@@ -512,6 +514,42 @@ public class WifiConfigController2Test {
assertThat(config.macRandomizationSetting).isEqualTo(WifiConfiguration.RANDOMIZATION_NONE);
}
+ @Test
+ public void loadSavedDhcpValue_true() {
+ checkSavedDhcpValue(true);
+ }
+
+ @Test
+ public void loadSavedDhcpValue_false() {
+ checkSavedDhcpValue(false);
+ }
+
+ private void checkSavedDhcpValue(boolean dhcpValue) {
+ when(mWifiEntry.isSaved()).thenReturn(true);
+ final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+ when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
+ when(mockWifiConfig.isSendDhcpHostnameEnabled()).thenReturn(dhcpValue);
+ when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
+ createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
+ final Spinner dhcpSetting = mView.findViewById(R.id.dhcp_settings);
+ final int expectedPrefValue =
+ WifiPrivacyPreferenceController.Companion
+ .translateSendDhcpHostnameEnabledToPrefValue(dhcpValue);
+
+ assertThat(dhcpSetting.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(dhcpSetting.getSelectedItemPosition()).isEqualTo(expectedPrefValue);
+ }
+
+ @Test
+ public void saveDhcpValue_changedToFalse() {
+ createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
+ final Spinner privacySetting = mView.findViewById(R.id.dhcp_settings);
+ privacySetting.setSelection(DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+
+ WifiConfiguration config = mController.getConfig();
+ assertThat(config.isSendDhcpHostnameEnabled()).isEqualTo(false);
+ }
+
@Test
public void replaceTtsString_whenTargetMatched_shouldSuccess() {
createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 2ff4596d63a..d80464d5467 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -18,6 +18,8 @@ package com.android.settings.wifi;
import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_DEVICE_MAC;
import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE;
import static com.google.common.truth.Truth.assertThat;
@@ -450,6 +452,41 @@ public class WifiConfigControllerTest {
assertThat(config.macRandomizationSetting).isEqualTo(WifiConfiguration.RANDOMIZATION_NONE);
}
+ @Test
+ public void loadSavedDhcpValue_true() {
+ checkSavedDhcpValue(true);
+ }
+
+ @Test
+ public void loadSavedDhcpValue_false() {
+ checkSavedDhcpValue(false);
+ }
+
+ private void checkSavedDhcpValue(boolean dhcpValue) {
+ when(mAccessPoint.isSaved()).thenReturn(true);
+ final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+ when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
+ when(mockWifiConfig.isSendDhcpHostnameEnabled()).thenReturn(dhcpValue);
+ when(mAccessPoint.getConfig()).thenReturn(mockWifiConfig);
+ mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
+ WifiConfigUiBase.MODE_CONNECT);
+ final Spinner dhcpSetting = mView.findViewById(R.id.dhcp_settings);
+
+ assertThat(dhcpSetting.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(dhcpSetting.getSelectedItemPosition()).isEqualTo(
+ dhcpValue ? DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE :
+ DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+ }
+
+ @Test
+ public void saveDhcpValue_changedToFalse() {
+ final Spinner privacySetting = mView.findViewById(R.id.dhcp_settings);
+ privacySetting.setSelection(DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+
+ WifiConfiguration config = mController.getConfig();
+ assertThat(config.isSendDhcpHostnameEnabled()).isEqualTo(false);
+ }
+
@Test
public void replaceTtsString_whenTargetMatched_shouldSuccess() {
final CharSequence[] display = {"PEAP", "AKA1", "AKA2'"};