From b45269eb32c27651a207d7ff6044c96055f108f3 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Wed, 16 Oct 2024 22:45:29 +0300 Subject: [PATCH] add per-connection Wi-Fi MAC address randomization option fixup! add per-connection Wi-Fi MAC address randomization option --- res/layout/wifi_network_config.xml | 2 +- res/values/evolution_arrays.xml | 20 ++++++++++++++ res/values/evolution_strings.xml | 5 ++++ res/xml/wifi_network_details_fragment2.xml | 4 +-- .../settings/wifi/WifiConfigController.java | 20 +++++++------- .../WifiDetailPreferenceController2.java | 2 +- .../wifi/details2/WifiPrivacyPageProvider.kt | 4 +-- .../WifiPrivacyPreferenceController2.java | 26 ++++++++++++++----- .../wifi/WifiConfigControllerTest.java | 12 ++++----- .../details2/WifiPrivacyPageProviderTest.kt | 12 ++++----- .../WifiPrivacyPreferenceController2Test.kt | 6 ++--- 11 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 res/values/evolution_arrays.xml diff --git a/res/layout/wifi_network_config.xml b/res/layout/wifi_network_config.xml index 2c747257b0f..aa98f4a2d62 100644 --- a/res/layout/wifi_network_config.xml +++ b/res/layout/wifi_network_config.xml @@ -713,7 +713,7 @@ android:layout_height="wrap_content" style="@style/wifi_item_spinner" android:prompt="@string/wifi_privacy_settings" - android:entries="@array/wifi_privacy_entries"/> + android:entries="@array/wifi_privacy_entries_ext"/> + + + + + + @string/wifi_per_connection_random_mac_addr + @string/wifi_per_network_random_mac_addr + @string/wifi_device_mac_addr + + + + 100 + 1 + 0 + + diff --git a/res/values/evolution_strings.xml b/res/values/evolution_strings.xml index e22c6134430..292fcffe47d 100644 --- a/res/values/evolution_strings.xml +++ b/res/values/evolution_strings.xml @@ -77,4 +77,9 @@ App volume Per-app volume control Show per-app volume button into volume dialog + + + Use per-connection randomized MAC (default) + Use per-network randomized MAC + Use device MAC diff --git a/res/xml/wifi_network_details_fragment2.xml b/res/xml/wifi_network_details_fragment2.xml index da4ea5a5e66..38e8f4b55eb 100644 --- a/res/xml/wifi_network_details_fragment2.xml +++ b/res/xml/wifi_network_details_fragment2.xml @@ -99,8 +99,8 @@ android:key="privacy" android:icon="@drawable/ic_wifi_privacy_24dp" android:title="@string/wifi_privacy_settings" - android:entries="@array/wifi_privacy_entries" - android:entryValues="@array/wifi_privacy_values"/> + android:entries="@array/wifi_privacy_entries_ext" + android:entryValues="@array/wifi_privacy_values_ext"/> diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java index 0c67c04622e..cb20ea9c77c 100644 --- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java @@ -19,6 +19,7 @@ package com.android.settings.wifi.details2; import android.content.Context; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -30,6 +31,10 @@ import com.android.settings.core.BasePreferenceController; import com.android.wifi.flags.Flags; import com.android.wifitrackerlib.WifiEntry; +import static com.android.settings.wifi.WifiConfigController.PRIVACY_PREF_INDEX_DEVICE_MAC; +import static com.android.settings.wifi.WifiConfigController.PRIVACY_PREF_INDEX_PER_CONNECTION_RANDOMIZED_MAC; +import static com.android.settings.wifi.WifiConfigController.PRIVACY_PREF_INDEX_PER_NETWORK_RANDOMIZED_MAC; + /** * A controller that controls whether the Wi-Fi network is mac randomized or not. */ @@ -95,9 +100,6 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i return mWifiEntry.getPrivacy(); } - private static final int PREF_RANDOMIZATION_PERSISTENT = 0; - private static final int PREF_RANDOMIZATION_NONE = 1; - /** * Translates a WifiEntry.Privacy value to the matching preference index value. * @@ -105,8 +107,13 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i * @return index value of preference */ public static int translateWifiEntryPrivacyToPrefValue(@WifiEntry.Privacy int privacy) { - return (privacy == WifiEntry.PRIVACY_RANDOMIZED_MAC) - ? PREF_RANDOMIZATION_PERSISTENT : PREF_RANDOMIZATION_NONE; + Log.d("WifiMacRnd", "translateMacRandomizedValueToPrefValue called from", new Throwable()); + return switch (privacy) { + case WifiEntry.PRIVACY_RANDOMIZATION_ALWAYS -> PRIVACY_PREF_INDEX_PER_CONNECTION_RANDOMIZED_MAC; + case WifiEntry.PRIVACY_RANDOMIZED_MAC -> PRIVACY_PREF_INDEX_PER_NETWORK_RANDOMIZED_MAC; + case WifiEntry.PRIVACY_DEVICE_MAC -> PRIVACY_PREF_INDEX_DEVICE_MAC; + default -> PRIVACY_PREF_INDEX_DEVICE_MAC; + }; } /** @@ -116,8 +123,13 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i * @return WifiConfiguration.MacRandomizationSetting value */ public static int translatePrefValueToWifiConfigSetting(int prefMacRandomized) { - return (prefMacRandomized == PREF_RANDOMIZATION_PERSISTENT) - ? WifiConfiguration.RANDOMIZATION_AUTO : WifiConfiguration.RANDOMIZATION_NONE; + Log.d("WifiMacRnd", "translatePrefValueToWifiConfigSetting called from", new Throwable()); + return switch (prefMacRandomized) { + case PRIVACY_PREF_INDEX_DEVICE_MAC -> WifiConfiguration.RANDOMIZATION_NONE; + case PRIVACY_PREF_INDEX_PER_NETWORK_RANDOMIZED_MAC -> WifiConfiguration.RANDOMIZATION_PERSISTENT; + case PRIVACY_PREF_INDEX_PER_CONNECTION_RANDOMIZED_MAC -> WifiConfiguration.RANDOMIZATION_ALWAYS; + default -> WifiConfiguration.RANDOMIZATION_ALWAYS; + }; } private void updateSummary(ListPreference preference, int macRandomized) { diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java index a6c1573daaf..16fe3856358 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java @@ -16,11 +16,12 @@ 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.PRIVACY_PREF_INDEX_DEVICE_MAC; +import static com.android.settings.wifi.WifiConfigController.PRIVACY_PREF_INDEX_PER_CONNECTION_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.android.settings.wifi.details2.WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; @@ -358,7 +359,7 @@ public class WifiConfigControllerTest { assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE); assertThat(privacySetting.getSelectedItemPosition()).isEqualTo( - PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC); + PRIVACY_PREF_INDEX_PER_CONNECTION_RANDOMIZED_MAC); } @Test @@ -383,8 +384,7 @@ public class WifiConfigControllerTest { assertThat(privacySetting.getVisibility()).isEqualTo(View.VISIBLE); assertThat(privacySetting.getSelectedItemPosition()).isEqualTo( - macRandomizedValue == WifiConfiguration.RANDOMIZATION_PERSISTENT - ? PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC : PRIVACY_SPINNER_INDEX_DEVICE_MAC); + translateWifiEntryPrivacyToPrefValue(macRandomizedValue)); } @Test @@ -397,7 +397,7 @@ public class WifiConfigControllerTest { @Test public void saveMacRandomizedValue_ChangedToDeviceMac_shouldGetNone() { final Spinner privacySetting = mView.findViewById(R.id.privacy_settings); - privacySetting.setSelection(PRIVACY_SPINNER_INDEX_DEVICE_MAC); + privacySetting.setSelection(PRIVACY_PREF_INDEX_DEVICE_MAC); WifiConfiguration config = mController.getConfig(); assertThat(config.macRandomizationSetting).isEqualTo(WifiConfiguration.RANDOMIZATION_NONE); diff --git a/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPageProviderTest.kt index 5c9a1a4a932..a3893a85c13 100644 --- a/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPageProviderTest.kt +++ b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPageProviderTest.kt @@ -85,7 +85,7 @@ class WifiPrivacyPageProviderTest { composeTestRule.setContent { WifiPrivacyPage(mockWifiEntry) } - val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries) + val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries_ext) for (entry in wifiPrivacyEntries) { composeTestRule.onNodeWithText( entry @@ -98,7 +98,7 @@ class WifiPrivacyPageProviderTest { composeTestRule.setContent { WifiPrivacyPage(mockWifiEntry) } - val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries) + val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries_ext) for (entry in wifiPrivacyEntries) { composeTestRule.onNodeWithText( entry @@ -111,8 +111,8 @@ class WifiPrivacyPageProviderTest { composeTestRule.setContent { WifiPrivacyPage(mockWifiEntry) } - val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries) - val wifiPrivacyValues = context.resources.getStringArray(R.array.wifi_privacy_values) + val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries_ext) + val wifiPrivacyValues = context.resources.getStringArray(R.array.wifi_privacy_values_ext) composeTestRule.onNodeWithText( wifiPrivacyEntries[wifiPrivacyValues.indexOf("0")] ).assertIsSelected() @@ -126,7 +126,7 @@ class WifiPrivacyPageProviderTest { composeTestRule.setContent { WifiPrivacyPage(mockWifiEntry) } - val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries) + val wifiPrivacyEntries = context.resources.getStringArray(R.array.wifi_privacy_entries_ext) for (entry in wifiPrivacyEntries) { composeTestRule.onNodeWithText(entry).assertIsNotEnabled() } @@ -176,4 +176,4 @@ class WifiPrivacyPageProviderTest { context.getString(R.string.wifi_privacy_send_device_name_toggle_title) ).assertIsOff() } -} \ No newline at end of file +} diff --git a/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt index 9260409af37..983d5fe1414 100644 --- a/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt +++ b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt @@ -45,11 +45,11 @@ class WifiPrivacyPreferenceController2Test { }) private var preference = ListPreference(context).apply { - setEntries(R.array.wifi_privacy_entries) - setEntryValues(R.array.wifi_privacy_values) + setEntries(R.array.wifi_privacy_entries_ext) + setEntryValues(R.array.wifi_privacy_values_ext) } - private var preferenceStrings = context.resources.getStringArray(R.array.wifi_privacy_entries) + private var preferenceStrings = context.resources.getStringArray(R.array.wifi_privacy_entries_ext) @Test fun updateState_wifiPrivacy_setCorrectValue() {