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'"};