Merge "[Wi-Fi] Wrong MAC address shown in Settings."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c083852..53f96a0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2370,8 +2370,10 @@
     <string name="wifi_advanced_titlebar">Advanced Wi\u2011Fi</string>
     <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's SSID. [CHAR LIMIT=20] -->
     <string name="wifi_advanced_ssid_title">SSID</string>
-    <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's MAC address. -->
-    <string name="wifi_advanced_mac_address_title">MAC address</string>
+    <!-- Wi-Fi settings screen, advanced, title of the item to show the factory's Wi-Fi MAC address. [CHAR LIMIT=30] -->
+    <string name="wifi_advanced_factory_mac_address_title">Factory MAC address</string>
+    <!-- Wi-Fi settings screen, advanced, title of the item to show the randomized Wi-Fi MAC address. [CHAR LIMIT=30] -->
+    <string name="wifi_advanced_randomized_mac_address_title">Randomized MAC address</string>
     <!-- Title of the screen to adjust IP settings -->
     <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's current IP address. -->
     <string name="wifi_advanced_ip_address_title">IP address</string>
@@ -3137,6 +3139,8 @@
     <string name="storage_settings_summary" product="default">Unmount SD card, view available storage</string>
     <!-- About phone screen, title for IMEI for multi-sim devices -->
     <string name="imei_multi_sim">IMEI (sim slot %1$d)</string>
+    <!-- About phone screen, summary of the MAC address [CHAR LIMIT=80] -->
+    <string name="view_saved_network">To view, choose saved network</string>
     <!-- Do not translate. About phone, status item title -->
     <string name="status_imei">IMEI</string>
     <!-- Do not translate. About phone, status item title -->
@@ -3195,6 +3199,8 @@
     <string name="status_operator">Network</string>
     <!-- About phone, status item title.  The MAC address of the Wi-Fi network adapter. -->
     <string name="status_wifi_mac_address">Wi\u2011Fi MAC address</string>
+    <!-- About phone, status item title.  The Factory MAC address of the Wi-Fi network adapter. [CHAR LIMIT=30] -->
+    <string name="status_factory_wifi_mac_address">Factory Wi\u2011Fi MAC address</string>
     <!-- About phone, status item title.  The bluetooth adapter's hardware address-->
     <string name="status_bt_address">Bluetooth address</string>
     <!-- About phone, status item title.  The hardware serial number. [CHAR LIMIT=30]-->
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 6ebb1a5..ccd52ea 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -139,9 +139,18 @@
 
     <!-- Wi-Fi MAC address -->
     <Preference
-        android:key="wifi_mac_address"
+        android:key="saved_accesspoints_wifi_mac_address"
         android:order="45"
         android:title="@string/status_wifi_mac_address"
+        android:summary="@string/view_saved_network"
+        android:fragment="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings"
+        settings:enableCopying="false"/>
+
+    <!-- Factory Wi-Fi MAC address -->
+    <Preference
+        android:key="wifi_mac_address"
+        android:order="46"
+        android:title="@string/status_factory_wifi_mac_address"
         android:summary="@string/summary_placeholder"
         android:selectable="false"
         settings:enableCopying="true"/>
@@ -149,7 +158,7 @@
     <!-- Bluetooth address -->
     <Preference
         android:key="bt_address"
-        android:order="46"
+        android:order="47"
         android:title="@string/status_bt_address"
         android:summary="@string/summary_placeholder"
         android:selectable="false"
@@ -158,7 +167,7 @@
     <!-- Device up time -->
     <Preference
         android:key="up_time"
-        android:order="47"
+        android:order="48"
         android:title="@string/status_up_time"
         android:summary="@string/summary_placeholder"
         android:selectable="false"/>
diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml
index c7e16ef..1859a1e 100644
--- a/res/xml/wifi_configure_settings.xml
+++ b/res/xml/wifi_configure_settings.xml
@@ -69,12 +69,4 @@
         android:title="@string/wifi_menu_p2p"
         android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings" />
 
-    <Preference
-        android:key="mac_address"
-        android:title="@string/wifi_advanced_mac_address_title" />
-
-    <Preference
-        android:key="current_ip_address"
-        android:title="@string/wifi_advanced_ip_address_title" />
-
 </PreferenceScreen>
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index d45f9bc..7ec1f0e 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -87,7 +87,7 @@
                 settings:enableCopying="true"/>
         <Preference
                 android:key="mac_address"
-                android:title="@string/wifi_advanced_mac_address_title"
+                android:title="@string/wifi_advanced_randomized_mac_address_title"
                 android:selectable="false"
                 settings:enableCopying="true"/>
         <Preference
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 41c845b..3009ae7 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -20,8 +20,6 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 
 import com.android.settings.R;
@@ -39,7 +37,6 @@
 
     private static final String TAG = "ConfigureWifiSettings";
 
-    public static final String KEY_IP_ADDRESS = "current_ip_address";
     public static final int WIFI_WAKEUP_REQUEST_CODE = 600;
 
     private WifiWakeupPreferenceController mWifiWakeupPreferenceController;
@@ -73,8 +70,6 @@
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new WifiInfoPreferenceController(context, getSettingsLifecycle(),
-                wifiManager));
         controllers.add(new WifiP2pPreferenceController(context, getSettingsLifecycle(),
                 wifiManager));
         return controllers;
@@ -107,24 +102,6 @@
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.wifi_configure_settings) {
-
-                @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    List<String> keys = super.getNonIndexableKeys(context);
-
-                    // If connected to WiFi, this IP address will be the same as the Status IP.
-                    // Or, if there is no connection they will say unavailable.
-                    ConnectivityManager cm = (ConnectivityManager)
-                            context.getSystemService(Context.CONNECTIVITY_SERVICE);
-                    NetworkInfo info = cm.getActiveNetworkInfo();
-                    if (info == null
-                            || info.getType() == ConnectivityManager.TYPE_WIFI) {
-                        keys.add(KEY_IP_ADDRESS);
-                    }
-
-                    return keys;
-                }
-
                 protected boolean isPageSearchEnabled(Context context) {
                     return context.getResources()
                             .getBoolean(R.bool.config_show_wifi_settings);
diff --git a/src/com/android/settings/wifi/WifiInfoPreferenceController.java b/src/com/android/settings/wifi/WifiInfoPreferenceController.java
deleted file mode 100644
index 2a8c7b5..0000000
--- a/src/com/android/settings/wifi/WifiInfoPreferenceController.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.wifi;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import androidx.core.text.BidiFormatter;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-/**
- * {@link PreferenceControllerMixin} that updates MAC/IP address.
- */
-public class WifiInfoPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
-
-    private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address";
-    private static final String KEY_MAC_ADDRESS = "mac_address";
-
-    private final IntentFilter mFilter;
-    private final WifiManager mWifiManager;
-
-    private Preference mWifiMacAddressPref;
-    private Preference mWifiIpAddressPref;
-
-    public WifiInfoPreferenceController(Context context, Lifecycle lifecycle,
-            WifiManager wifiManager) {
-        super(context);
-        mWifiManager = wifiManager;
-        mFilter = new IntentFilter();
-        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
-        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-
-        lifecycle.addObserver(this);
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        // Returns null because this controller contains more than 1 preference.
-        return null;
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mWifiMacAddressPref = screen.findPreference(KEY_MAC_ADDRESS);
-        mWifiMacAddressPref.setSelectable(false);
-        mWifiIpAddressPref = screen.findPreference(KEY_CURRENT_IP_ADDRESS);
-        mWifiIpAddressPref.setSelectable(false);
-    }
-
-    @Override
-    public void onResume() {
-        mContext.registerReceiver(mReceiver, mFilter);
-        updateWifiInfo();
-    }
-
-    @Override
-    public void onPause() {
-        mContext.unregisterReceiver(mReceiver);
-    }
-
-    public void updateWifiInfo() {
-        if (mWifiMacAddressPref != null) {
-            final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-            final boolean macRandomizationSupported = mContext.getResources().getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported);
-            final String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
-
-            if (macRandomizationSupported && WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
-                mWifiMacAddressPref.setSummary(R.string.wifi_status_mac_randomized);
-            } else if (TextUtils.isEmpty(macAddress)
-                    || WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
-                mWifiMacAddressPref.setSummary(R.string.status_unavailable);
-            } else {
-                mWifiMacAddressPref.setSummary(macAddress);
-            }
-        }
-        if (mWifiIpAddressPref != null) {
-            final String ipAddress = Utils.getWifiIpAddresses(mContext);
-            mWifiIpAddressPref.setSummary(ipAddress == null
-                    ? mContext.getString(R.string.status_unavailable)
-                    : BidiFormatter.getInstance().unicodeWrap(ipAddress));
-        }
-    }
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) ||
-                    action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
-                updateWifiInfo();
-            }
-        }
-    };
-}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index a915766..3ed561b 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -687,6 +687,9 @@
         } else {
             mMacAddressPref.setSummary(macAddress);
         }
+
+        // MAC Address Pref Title
+        refreshMacTitle();
     }
 
     private String getMacAddress() {
@@ -1141,4 +1144,24 @@
         mTimer.cancel();
         mTimer = null;
     }
+
+    private void refreshMacTitle() {
+        if (mWifiConfig == null) {
+            return;
+        }
+
+        // For saved Passpoint network, framework doesn't have the field to keep the MAC choice
+        // persistently, so Passpoint network will always use the default value so far, which is
+        // randomized MAC address, so don't need to modify title.
+        if (mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()) {
+            return;
+        }
+
+        mMacAddressPref.setTitle(
+                (mWifiConfig.macRandomizationSetting
+                        == WifiConfiguration.RANDOMIZATION_PERSISTENT)
+                        ? R.string.wifi_advanced_randomized_mac_address_title
+                        : R.string.wifi_advanced_factory_mac_address_title);
+
+    }
 }
diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java
index 82c6028..b8e36a4 100644
--- a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java
@@ -27,7 +27,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.utils.PreferenceGroupChildrenCache;
 import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
@@ -50,7 +49,6 @@
     private static final String TAG = "SavedAPPrefCtrl";
 
     private final WifiManager mWifiManager;
-    private final PreferenceGroupChildrenCache mChildrenCache;
 
     private final UserBadgeCache mUserBadgeCache;
     private PreferenceGroup mPreferenceGroup;
@@ -61,7 +59,6 @@
         super(context, preferenceKey);
         mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager());
         mWifiManager = context.getSystemService(WifiManager.class);
-        mChildrenCache = new PreferenceGroupChildrenCache();
     }
 
     public SavedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) {
@@ -91,8 +88,9 @@
 
     @Override
     public boolean onPreferenceClick(Preference preference) {
+        final Preference preferenceInGroup = mPreferenceGroup.findPreference(preference.getKey());
         if (mHost != null) {
-            mHost.showWifiPage((AccessPointPreference) preference);
+            mHost.showWifiPage((AccessPointPreference) preferenceInGroup);
         }
         return false;
     }
@@ -118,7 +116,7 @@
         final List<AccessPoint> accessPoints =
                 WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager);
         Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE);
-        mChildrenCache.cacheRemoveAllPrefs(mPreferenceGroup);
+        mPreferenceGroup.removeAll();
 
         final int accessPointsSize = accessPoints.size();
         for (int i = 0; i < accessPointsSize; ++i) {
@@ -130,20 +128,15 @@
             }
 
             String key = ap.getKey();
-            AccessPointPreference preference =
-                    (AccessPointPreference) mChildrenCache.getCachedPreference(key);
-            if (preference == null) {
-                preference = new AccessPointPreference(ap, prefContext, mUserBadgeCache, true);
-                preference.setKey(key);
-                preference.setIcon(null);
-                preference.setOnPreferenceClickListener(this);
-                mPreferenceGroup.addPreference(preference);
-            }
+            AccessPointPreference preference = new AccessPointPreference(ap, prefContext,
+                    mUserBadgeCache, true);
+            preference.setKey(key);
+            preference.setIcon(null);
+            preference.setOnPreferenceClickListener(this);
+            mPreferenceGroup.addPreference(preference);
             preference.setOrder(i);
         }
 
-        mChildrenCache.removeCachedPrefs(mPreferenceGroup);
-
         if (mPreferenceGroup.getPreferenceCount() < 1) {
             Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
             mPreferenceGroup.setVisible(false);
diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
index 2e3a111..d1d7885 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
@@ -2,14 +2,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
 
 import com.android.settings.testutils.XmlTestUtils;
 
@@ -54,41 +49,4 @@
         assertThat(keys).isNotNull();
         assertThat(niks).containsAllIn(keys);
     }
-
-    @Test
-    public void testNonIndexableKeys_noConnection_blocksIP() {
-        ConnectivityManager manager = mock(ConnectivityManager.class);
-        when(manager.getActiveNetworkInfo()).thenReturn(null);
-        doReturn(manager).when(mContext).getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        final List<String> niks =
-            ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
-        assertThat(niks).contains(ConfigureWifiSettings.KEY_IP_ADDRESS);
-    }
-
-    @Test
-    public void testNonIndexableKeys_wifiConnection_blocksIP() {
-        ConnectivityManager manager = mock(ConnectivityManager.class);
-        NetworkInfo info = mock(NetworkInfo.class);
-        when(info.getType()).thenReturn(ConnectivityManager.TYPE_WIFI);
-        when(manager.getActiveNetworkInfo()).thenReturn(info);
-        doReturn(manager).when(mContext).getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        final List<String> niks =
-            ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
-        assertThat(niks).contains(ConfigureWifiSettings.KEY_IP_ADDRESS);
-    }
-
-    @Test
-    public void testNonIndexableKeys_mobileConnection_blocksIP() {
-        ConnectivityManager manager = mock(ConnectivityManager.class);
-        NetworkInfo info = mock(NetworkInfo.class);
-        when(info.getType()).thenReturn(ConnectivityManager.TYPE_MOBILE);
-        when(manager.getActiveNetworkInfo()).thenReturn(info);
-        doReturn(manager).when(mContext).getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        final List<String> niks =
-            ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
-        assertThat(niks).doesNotContain(ConfigureWifiSettings.KEY_IP_ADDRESS);
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiInfoPreferenceControllerTest.java
deleted file mode 100644
index 85d7726..0000000
--- a/tests/robotests/src/com/android/settings/wifi/WifiInfoPreferenceControllerTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.wifi;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.provider.Settings;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class WifiInfoPreferenceControllerTest {
-
-    private static final String TEST_MAC_ADDRESS = "42:0a:23:43:ac:02";
-
-    @Mock
-    private Context mContext;
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private WifiManager mWifiManager;
-    @Mock
-    private PreferenceScreen mScreen;
-    @Mock
-    private Preference mIpPreference;
-    @Mock
-    private Preference mMacPreference;
-    @Mock
-    private WifiInfo mWifiInfo;
-    @Mock
-    private Resources mResources;
-
-    private Lifecycle mLifecycle;
-    private LifecycleOwner mLifecycleOwner;
-    private WifiInfoPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mLifecycleOwner = () -> mLifecycle;
-        mLifecycle = new Lifecycle(mLifecycleOwner);
-        when(mContext.getSystemService(WifiManager.class))
-                .thenReturn(mWifiManager);
-        when(mScreen.findPreference(anyString()))
-                .thenReturn(mMacPreference)
-                .thenReturn(mIpPreference);
-        when(mWifiManager.getConnectionInfo()).thenReturn(mWifiInfo);
-        when(mWifiManager.getCurrentNetwork()).thenReturn(null);
-        when(mContext.getResources()).thenReturn(mResources);
-        mController = new WifiInfoPreferenceController(mContext, mLifecycle, mWifiManager);
-    }
-
-    @Test
-    public void testIsAvailable_shouldAlwaysReturnTrue() {
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void getPreferenceKey_shouldReturnNull() {
-        assertThat(mController.getPreferenceKey()).isNull();
-    }
-
-    @Test
-    public void runThroughLifecycle_shouldInstallListenerOnResume() {
-        mLifecycle.handleLifecycleEvent(ON_RESUME);
-        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
-
-        mLifecycle.handleLifecycleEvent(ON_PAUSE);
-        verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
-    }
-
-    @Test
-    public void onResume_shouldUpdateWifiInfo() {
-        when(mWifiInfo.getMacAddress()).thenReturn(TEST_MAC_ADDRESS);
-
-        mController.displayPreference(mScreen);
-        mController.onResume();
-
-        verify(mMacPreference).setSummary(TEST_MAC_ADDRESS);
-        verify(mIpPreference).setSummary(any());
-    }
-
-    @Test
-    public void updateWifiInfo_nullWifiInfoWithMacRandomizationOff_setMacUnavailable() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(false);
-        mController.displayPreference(mScreen);
-        when(mWifiManager.getConnectionInfo()).thenReturn(null);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.status_unavailable);
-    }
-
-    @Test
-    public void updateWifiInfo_nullMacWithMacRandomizationOff_setMacUnavailable() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(false);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(null);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.status_unavailable);
-    }
-
-    @Test
-    public void updateWifiInfo_defaultMacWithMacRandomizationOff_setMacUnavailable() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(false);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(WifiInfo.DEFAULT_MAC_ADDRESS);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.status_unavailable);
-    }
-
-    @Test
-    public void updateWifiInfo_validMacWithMacRandomizationOff_setValidMac() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(false);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(TEST_MAC_ADDRESS);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(TEST_MAC_ADDRESS);
-    }
-
-    @Test
-    public void updateWifiInfo_nullWifiInfoWithMacRandomizationOn_setMacUnavailable() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(true);
-        mController.displayPreference(mScreen);
-        when(mWifiManager.getConnectionInfo()).thenReturn(null);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.status_unavailable);
-    }
-
-    @Test
-    public void updateWifiInfo_nullMacWithMacRandomizationOn_setMacUnavailable() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(true);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(null);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.status_unavailable);
-    }
-
-    @Test
-    public void updateWifiInfo_defaultMacWithMacRandomizationOn_setMacRandomized() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(true);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(WifiInfo.DEFAULT_MAC_ADDRESS);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(R.string.wifi_status_mac_randomized);
-    }
-
-    @Test
-    public void updateWifiInfo_validMacWithMacRandomizationOn_setValidMac() {
-        when(mResources.getBoolean(
-                com.android.internal.R.bool.config_wifi_connected_mac_randomization_supported))
-                .thenReturn(true);
-        mController.displayPreference(mScreen);
-        when(mWifiInfo.getMacAddress()).thenReturn(TEST_MAC_ADDRESS);
-
-        mController.updateWifiInfo();
-
-        verify(mMacPreference).setSummary(TEST_MAC_ADDRESS);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 010fb74..7f65b06 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -1845,6 +1845,31 @@
         assertThat(icon).isNotNull();
     }
 
+    @Test
+    public void checkMacTitle_whenPrivacyRandomizedMac_shouldBeRandom() {
+        setUpForDisconnectedNetwork();
+        mockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_PERSISTENT;
+        when(mockWifiConfig.getRandomizedMacAddress()).thenReturn(mockMacAddress);
+        when(mockMacAddress.toString()).thenReturn(RANDOMIZED_MAC_ADDRESS);
+
+        displayAndResume();
+
+        verify(mockMacAddressPref).setTitle(R.string.wifi_advanced_randomized_mac_address_title);
+    }
+
+    @Test
+    public void checkMacTitle_whenPrivacyDeviceMac_shouldBeFactory() {
+        setUpForDisconnectedNetwork();
+        mockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
+        when(mockWifiConfig.getRandomizedMacAddress()).thenReturn(mockMacAddress);
+        when(mockWifiManager.getFactoryMacAddresses())
+                .thenReturn(new String[]{FACTORY_MAC_ADDRESS});
+
+        displayAndResume();
+
+        verify(mockMacAddressPref).setTitle(R.string.wifi_advanced_factory_mac_address_title);
+    }
+
     private ActionButtonsPreference createMock() {
         final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
         when(pref.setButton1Text(anyInt())).thenReturn(pref);