Merge "[WPA3] Hide connect button for cloned networks not in range"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 09704ee..8407d1c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Maak die teks op die skerm kleiner of groter."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Maak kleiner"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Maak groter"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Voorbeeldteks"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Die Wonderlike Towenaar van Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Hoofstuk 11: Die Wonderlike Smaragstad van Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Onbeskibaar tydens vliegtuigmodus"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Dwangrekenaarmodus"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Verplig eksperimentele rekenaarmodus op sekondêre skerms"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Ignoreer gedwonge donkermodus"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ignoreer die gedwonge donkermoduskenmerk om altyd aan te wees"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privaatheid"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index dff62d6..8cb1cac 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"በማያ ገጽ ላይ ያለውን ጽሑፍ ያሳንሱ ወይም ያተልቁ።"</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"አነስ አድርግ"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"ተለቅ አድርግ"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"የናሙና ጽሑፍ"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"አስደናቂው የኦዝ ምትሃተኛ"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"ምዕራፍ 11፦ ኦዝ፣ አስደናቂዋ የኤምራልድ ከተማ"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"በአይሮፕላን ሁነታ ወቅት የማይገኝ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"የዴስክቶፕ ሁነታን አስገድድ"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"በሁለተኛ ማሳያዎች ላይ የሙከራ ዴስክቶፕ ሁነታን አስገድድ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"አስገዳጅ ጨለማን ሻር"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"አስገዳጅ ጨለማ ባህሪን ሁልጊዜ እንዲበራ የተቀመጠውን ደንብ ይሽራል"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ግላዊነት"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index aed540a..92ac06f 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -4855,6 +4855,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"غير متاح أثناء وضع الطائرة"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"فرض وضع سطح المكتب"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"فرض وضع سطح المكتب التجريبي على شاشات العرض الثانوية"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"إلغاء ميزة فرض تعتيم الشاشة"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"لإلغاء ميزة فرض تعتيم الشاشة بحيث يتم تفعيلها دائمًا"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"الخصوصية"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 9bc505e..be912be 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"এয়াৰপ্লেইন ম’ড অন থাকিলে উপলব্ধ নহয়"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"বলপূৰ্বক ডেস্কটপ ম’ড"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"দ্বিতীয় ডিছপ্লে’ত পৰীক্ষামূলক ডেস্কটপ ম’ড বলপূৰ্বকভাৱে প্ৰয়োগ কৰক"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"বলপূর্বকভাৱে গাঢ় ৰঙৰ থীম ব্যৱহাৰ কৰা সুবিধাটো অ\'ভাৰৰাইড কৰক"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"বলপূর্বকভাৱে গাঢ় ৰঙৰ থীম ব্যৱহাৰ কৰা সুবিধাটো সদায় অন হৈ থাকিবলৈ অ\'ভাৰৰাইড কৰে"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"গোপনীয়তা"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 59e1a07..126b2ba 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Təyyarə rejimində əlçatan deyil"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Masaüstü rejiminə keçin"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"İkinci displeylərdə eksperimental masaüstü rejimə keçin"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Qaranlıq rejimini ləğv edir"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Qaranlıq rejiminin həmişə aktiv olmasını ləğv edir"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Məxfilik"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 1bca73a..7ccddab 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -52,8 +52,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Omogućava da tekst na ekranu bude manji ili veći."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Umanji"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Uvećaj"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Primer teksta"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Čarobnjak iz Oza"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Poglavlje 11: Čudesni Smaragdni grad Oza"</string>
@@ -4605,6 +4604,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nedostupno tokom režima rada u avionu"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Nametni režim računara"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Nametni eksperimentalni režim računara na sekundarnim ekranima"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Zameni funkciju nametanja tamne teme"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Menja funkciju nametanja tamne teme tako da bude uvek uključena"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatnost"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 96c5924..449b0df 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -4691,6 +4691,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Недаступна ў рэжыме палёту"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Прымусова ўключаць рэжым працоўнага стала"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Прымусова ўключаць эксперыментальны рэжым працоўнага стала на дадатковых экранах"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Перавызначэнне ўключэння цёмнай тэмы"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Змяняе наладу прымусовага ўключэння цёмнай тэмы на \"Заўсёды ўключана\""</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Прыватнасць"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index e7d5d9a..3497e3b 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Намаляване или уголемяване на текста на екрана."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Намаляване на размера"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Увеличаване на размера"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Примерен текст"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Вълшебникът от Оз"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Глава 11: Удивителният изумруден град на Оз"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Не е налице в самолетен режим"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Принудително задаване на настолен режим"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Принудително задаване на експерименталния настолен режим на алтернативни дисплеи"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Отмяна на налагането на тъмен режим"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Отменя постоянното включено състояние на функцията за налагане на тъмен режим"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Поверителност"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 0e41c1a..045c03e 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"বিমান মোডে উপলভ্য নয়"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ফোর্স ডেস্কটপ মোড"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"সেকেন্ডারি ডিসপ্লেতে ফোর্স এক্সপেরিমেন্টাল ডেস্কটপ মোড চালু করা আছে"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ফোর্স-ডার্ক ফিচার ওভাররাইড করুন"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ফোর্স-ডার্ক ফিচার চালু রাখার জন্য ওভাররাইড করা হয়"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"গোপনীয়তা"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index ecf7a55..c10f39a 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -52,8 +52,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Smanjite ili povećajte tekst na ekranu."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Napravi manji"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Napravi veći"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Uzorak teksta"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Čarobnjak iz Oza"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Poglavlje 11: Smaragdni grad Oz"</string>
@@ -4605,6 +4604,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nije dostupno dok je aktiviran način rada u avionu"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Nametni način rada na računaru"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Nametanje eksperimentalnog načina rada na računaru na sekundarnim ekranima"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Nadjačaj nametanje tamne teme"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Nadjačava funkciju nametanja tamne teme tako da je uvijek uključena"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatnost"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 70fdb0f..4b62add 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"No disponible en mode d\'avió"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Força el mode d\'escriptori"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Força el mode d\'escriptori experimental en pantalles secundàries"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Substitueix forçar el mode fosc"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Substitueix la funció forçar el mode fosc perquè estigui sempre activada"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privadesa"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 24ee782..8f28ae8 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -53,8 +53,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Umožňuje zvětšit nebo zmenšit text na obrazovce."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Zmenšit"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Zvětšit"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Příliš žluťoučký kůň úpěl ďábelské ódy."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Ukázkový text"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Čaroděj ze země Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Kapitola 11: Smaragdové město v zemi Oz"</string>
@@ -4688,6 +4687,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"V režimu Letadlo nedostupné"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Vynutit režim počítače"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Vynutit na sekundárních displejích experimentální režim počítače"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Přepsat vynucení tmavého režimu"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Přepíše vynucení stálého zapnutí tmavého režimu"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Ochrana soukromí"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 4a29a76..014e5ef 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Gør teksten på skærmen mindre eller større."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Formindsk"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Forstør"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Eksempeltekst"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Den vidunderlige troldmand fra Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Kapitel 11: Den vidunderlige smaragdby i Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Der er ingen forbindelse i flytilstand"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Gennemtving skrivebordstilstand"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Gennemtving eksperimentel skrivebordstilstand på sekundære skærme"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Tilsidesæt force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Tilsidesætter funktionen force-dark og anvender Altid aktiveret"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatliv"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f897477..fb0fad9 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Im Flugmodus nicht verfügbar"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Desktop-Modus erzwingen"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Experiementellen Desktop-Modus auf sekundären Bildschirmen erzwingen"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Erzwingen des dunklen Modus außer Kraft setzen"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Apps werden nicht gezwungen, den dunklen Modus zu verwenden"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Datenschutz"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 54c7d9a..3988bb1 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Κάντε το κείμενο στην οθόνη μικρότερο ή μεγαλύτερο."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Να γίνουν μικρότερα"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Να γίνουν μεγαλύτερα"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Δείγμα κειμένου"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Ο Θαυμάσιος Μάγος του Οζ"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Κεφάλαιο 11: Η Θαυμάσια Πόλη Έμεραλντ του Οζ"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Μη διαθέσιμο κατά τη λειτουργία πτήσης"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Αναγκαστική λειτουργία επιτραπέζιου υπολογιστή"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Αναγκαστική πειραματική λειτουργία επιτραπέζιου υπολογιστή σε δευτερεύουσες οθόνες"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Παράκαμψη αναγκ. χρήσης σκούρου θέματος"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Παρακάμπτει τη λειτουργία σκούρου θέματος προκειμένου να είναι πάντα ενεργή"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Απόρρητο"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 53ae032..5afc364 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Make the text on screen smaller or larger."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Make smaller"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Make larger"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Sample text"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Chapter 11: The Wonderful Emerald City of Oz"</string>
@@ -4522,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Unavailable during airplane mode"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Force desktop mode"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Force experimental desktop mode on secondary displays"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Enable free-form sizecompat"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Allows sizecompat apps to be in free form"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Override force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overrides the force-dark feature to be always on"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 333e928..331a256 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Make the text on screen smaller or larger."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Make smaller"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Make larger"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Sample text"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Chapter 11: The Wonderful Emerald City of Oz"</string>
@@ -4522,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Unavailable during airplane mode"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Force desktop mode"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Force experimental desktop mode on secondary displays"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Enable free-form sizecompat"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Allows sizecompat apps to be in free form"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Override force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overrides the force-dark feature to be always on"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 53ae032..5afc364 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Make the text on screen smaller or larger."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Make smaller"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Make larger"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Sample text"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Chapter 11: The Wonderful Emerald City of Oz"</string>
@@ -4522,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Unavailable during airplane mode"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Force desktop mode"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Force experimental desktop mode on secondary displays"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Enable free-form sizecompat"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Allows sizecompat apps to be in free form"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Override force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overrides the force-dark feature to be always on"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index afdfd62..47df8c6 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Make the text on screen smaller or larger."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Make smaller"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Make larger"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Sample text"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Chapter 11: The Wonderful Emerald City of Oz"</string>
@@ -4522,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Unavailable during airplane mode"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Force desktop mode"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Force experimental desktop mode on secondary displays"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Enable free-form sizecompat"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Allows sizecompat apps to be in free form"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Override force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overrides the force-dark feature to be always on"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 3ea5d85..19683ed 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -4521,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎Unavailable during airplane mode‎‏‎‎‏‎"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎Force desktop mode‎‏‎‎‏‎"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎Force experimental desktop mode on secondary displays‎‏‎‎‏‎"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎Enable freeform sizecompat‎‏‎‎‏‎"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‏‎Allows sizecompat apps to be in freeform‎‏‎‎‏‎"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎Override force-dark‎‏‎‎‏‎"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‎Overrides the force-dark feature to be always-on‎‏‎‎‏‎"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎Privacy‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6f4983d..62343e3 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Aumenta o reduce el tamaño del texto en pantalla."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Reducir el tamaño"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Aumentar el tamaño"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Texto de muestra"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"El maravilloso mago de Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capítulo 11: La maravillosa Ciudad Esmeralda de Oz"</string>
@@ -4520,6 +4519,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"No disponible en modo de avión"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forzar modo de escritorio"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forzar el modo de escritorio experimental en pantallas secundarias"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Anular forzar el modo oscuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Anula la función forzar el modo oscuro para que esté siempre activo"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidad"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 3bdda5d..5fc8723 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Aumenta o disminuye el tamaño del texto de la pantalla."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Reducir el tamaño"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Aumentar el tamaño"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Texto de ejemplo"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"El maravilloso mago de Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capítulo 11: La maravillosa Ciudad Esmeralda de Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"No están disponibles en modo avión"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forzar modo de escritorio"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forzar el modo de escritorio experimental en pantallas secundarias"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Forzar el modo oscuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Forzar el modo oscuro para que esté siempre activo"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidad"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index c1dfec3..5eed16d 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Muutke ekraanil kuvatavat tekst suuremaks või väiksemaks."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Vähendamine"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Suurendamine"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Näidistekst"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Võlur Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. peatükk: Ozi imeline smaragdlinn"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ei ole lennukirežiimis saadaval"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Töölauarežiimi jõustamine"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Katselise töölauarežiimi jõustamine teisestel ekraanidel"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Funktsiooni Sunnitud tume alistamine"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Alistab funktsiooni Sunnitud tume ja lülitab selle alaliselt sisse"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privaatsus"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index c6420e2..06e33c7 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Handitu edo txikitu pantailako testua."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Txikitu"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Handitu"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Testu-lagina"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Ozeko azti miragarria"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. kapitulua: Esmeraldazko Oz hiri harrigarria"</string>
@@ -3397,8 +3396,7 @@
     <string name="notification_assistant_title" msgid="6983941403582134437">"Jakinarazpen doigarriak"</string>
     <string name="no_notification_assistant" msgid="2533323397091834096">"Bat ere ez"</string>
     <string name="no_notification_listeners" msgid="2839354157349636000">"Ez dago jakinarazpenetarako sarbidea eskatu duen aplikaziorik."</string>
-    <!-- no translation found for notification_access_detail_switch (46386786409608330) -->
-    <skip />
+    <string name="notification_access_detail_switch" msgid="46386786409608330">"Eman jakinarazpenak atzitzeko baimena"</string>
     <string name="notification_assistant_security_warning_title" msgid="2972346436050925276">"<xliff:g id="SERVICE">%1$s</xliff:g> zerbitzuari jakinarazpenetarako sarbidea eman nahi diozu?"</string>
     <string name="notification_assistant_security_warning_summary" msgid="3119843404577399036">"<xliff:g id="NOTIFICATION_ASSISTANT_NAME">%1$s</xliff:g> aplikazioak jakinarazpen guztiak irakurri ahalko ditu eta, haien barnean, informazio pertsonala egon daiteke (adibidez, kontaktuen izenak eta jasotzen dituzun testu-mezuak). Gainera, jakinarazpen horiek aldatu edo baztertu egin ahal izango ditu, baita haietako ekintza-botoiak sakatu ere. \n\nHorrez gain, ez molestatzeko modua aktibatzeko eta desaktibatzeko aukera izango du aplikazioak, baita harekin erlazionatutako ezarpenak aldatzekoa ere."</string>
     <string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Jakinarazpenak atzitzeko baimena eman nahi diozu <xliff:g id="SERVICE">%1$s</xliff:g> zerbitzuari?"</string>
@@ -4523,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ez dago erabilgarri hegaldi moduan"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Behartu mahaigainerako modua erabiltzera"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Behartu mahaigainerako modu esperimentala erabiltzera bigarren mailako pantailetan"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Ez aplikatu gai iluna"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Gai iluna beti aktibatuta egoteko eskakizuna gainidazten du"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Pribatutasuna"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index d5600bd..3ca42f6 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"نوشتار روی صفحه‌نمایش را بزرگ‌تر یا کوچک‌تر کنید."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"کوچک‌تر کردن"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"بزرگ‌تر کردن"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"برای این آقا آبجو و کیوی سرو کنید."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"نوشتار نمونه"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"جادوگر شهر اوز"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"فصل ۱۱: شهر زمردی شگفت‌انگیز اوز"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"عدم‌دسترسی در حالت هواپیما"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"اجرای اجباری حالت دسک‌‌تاپ"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"اجرای اجباری حالت دسک‌تاپ آزمایشی در نمایشگرهای ثانوی"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"لغو اجبار حالت تاریک"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ویژگی اجبار حالت تاریک را برای همیشه روشن بودن لغو می‌کند"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"حریم خصوصی"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index e1507a0..6a29a74 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Suurenna tai pienennä tekstiä näytöllä."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Pienennä"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Suurenna"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Esimerkkiteksti"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Ihmemaa Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Luku 11: Ozin ihastuttava smaragdikaupunki"</string>
@@ -3397,8 +3396,7 @@
     <string name="notification_assistant_title" msgid="6983941403582134437">"Mukautuvat ilmoitukset"</string>
     <string name="no_notification_assistant" msgid="2533323397091834096">"–"</string>
     <string name="no_notification_listeners" msgid="2839354157349636000">"Yksikään asennettu sovellus ei ole pyytänyt ilmoituksien käyttöoikeutta."</string>
-    <!-- no translation found for notification_access_detail_switch (46386786409608330) -->
-    <skip />
+    <string name="notification_access_detail_switch" msgid="46386786409608330">"Salli pääsy ilmoituksiin"</string>
     <string name="notification_assistant_security_warning_title" msgid="2972346436050925276">"Saako <xliff:g id="SERVICE">%1$s</xliff:g> ilmoitusten käyttöoikeuden?"</string>
     <string name="notification_assistant_security_warning_summary" msgid="3119843404577399036">"<xliff:g id="NOTIFICATION_ASSISTANT_NAME">%1$s</xliff:g> voi lukea kaikki ilmoitukset ja niiden sisältämät henkilökohtaiset tiedot, kuten yhteystietojen nimet ja saamiesi viestien sisällön. Se voi myös ohittaa ilmoitukset, muokata niitä tai käyttää niiden toimintopainikkeita. \n\nTämä antaa sovellukselle myös oikeuden ottaa Älä häiritse ‑tilan käyttöön, poistaa sen käytöstä ja muokata siihen liittyviä asetuksia."</string>
     <string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Saako <xliff:g id="SERVICE">%1$s</xliff:g> ilmoituksien käyttöoikeuden?"</string>
@@ -4523,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ei käytettävissä lentokonetilassa"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Pakota työpöytätila"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Pakota kokeellinen työpöytätila toissijaisille näytöille."</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Ohita SmartDarkin pakottaminen päälle"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ohittaa toiminnon, joka pakottaa SmartDark-ominaisuuden aina päälle"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Tietosuoja"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 8727516..2eaee73 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Données cellulaires non accessibles en mode Vol"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forcer le mode bureau"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forcer le mode bureau expérimental sur les écrans secondaires"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Forcer l\'activation de SmartDark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Forcer la fonctionnalité SmartDark à rester active"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Confidentialité"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 8a3feaa..ddb64d5 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Agrandissez ou réduisez la taille du texte affiché."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Réduire"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Agrandir"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Exemple de texte"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Le Magicien d\'Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Chapitre 11 : La merveilleuse cité d\'émeraude"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Non disponibles en mode Avion"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forcer l\'activation du mode bureau"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forcer l\'activation du mode bureau expérimental sur les écrans secondaires"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Forcer l\'activation de Smart Dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Force la fonctionnalité Smart Dark à être toujours activée"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Confidentialité"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 93b2203..c12fbe3 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Non dispoñibles no modo avión"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forzar modo de escritorio"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forza o modo de escritorio experimental en pantallas secundarias"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Anular Forzar modo escuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Anula a función Forzar modo escuro para que estea sempre activo"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidade"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 8810653..2ebf342 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"એરપ્લેન મોડ દરમિયાન ઉપલબ્ધ નથી"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ફરજિયાત ડેસ્કટૉપ મોડ ચાલુ કરો"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ગૌણ ડિસ્પ્લે પર ફરજિયાત પ્રયોગાત્મક ડેસ્કટૉપ મોડ ચાલુ કરો"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ફરજિયાત ઘેરા મોડની સુવિધાને ઓવરરાઇડ કરો"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"હંમેશાં ચાલુ રાખવા માટે ફરજિયાત ઘેરા મોડની સુવિધાને ઓવરરાઇડ કરે છે"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"પ્રાઇવસી"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index b950b90..b128309 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"हवाई जहाज़ मोड के दौरान उपलब्ध नहीं"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"डेस्कटॉप मोड चालू करें"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"दूसरी स्क्रीन पर प्रयोग के लिए डेस्कटॉप मोड चालू करें"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"फ़ोर्स-डार्क सुविधा को ओवरराइड करें"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"फ़ोर्स-डार्क सुविधा को हमेशा चालू रहने के लिए ओवरराइड करती है"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"निजता"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 7261b6f..5a8c1fc 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -52,8 +52,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Smanjite ili povećajte tekst na zaslonu."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Smanji"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Povećaj"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Primjer teksta"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Čarobnjak iz Oza"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. poglavlje: Čudesni Smaragdni Grad čarobnjaka Oza"</string>
@@ -4605,6 +4604,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nije dostupno u načinu rada u zrakoplovu"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Nametni način rada na računalu"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Nametanje eksperimentalnog načina rada na računalu na sekundarnim zaslonima"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Nadjačaj nametanje tamne teme"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Nadjačava značajku nametanja tamne teme tako da je uvijek uključena"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatnost"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index c0b6ddd..a3c60c4 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Kicsinyítheti vagy nagyíthatja a képernyőn megjelenő szöveget."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Kisebb"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Nagyobb"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Árvíztűrő tükörfúrógép"</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Mintaszöveg"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Óz, a csodák csodája"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. fejezet: A csodálatos Smaragdváros"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Repülős üzemmódban nem áll rendelkezésre"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Asztali mód kényszerítése"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Kísérleti asztali mód kényszerítése a másodlagos kijelzőkön"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"A kényszerített sötétítés felülírása"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"A kényszerített sötétítés funkció felülírása mindig bekapcsolt állapotra"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Adatvédelem"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 380cf04..0f49c13 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Փոփոխեք տեքստի չափը։"</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Փոքրացնել"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Մեծացնել"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Տեքստի նմուշ"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Օզի կախարդը"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Գլուխ 11. Օզի հրաշալի Զմրուխտե քաղաքը"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Անհասանելի է ավիառեժիմում"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Աշխատասեղանի ռեժիմի հարկադրված միացում"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Աշխատասեղանի փորձնական ռեժիմի հարկադրված միացում լրացուցիչ էկրանների վրա"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Չեղարկել մուգ ռեժիմի պարտադիր միացումը"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Չեղարկում է մուգ ռեժիմի պարտադիր միացման գործառույթը"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Գաղտնիություն"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b9d7bb2..c26af80 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Buat teks di layar jadi lebih kecil atau lebih besar."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Buat lebih kecil"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Buat lebih besar"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Teks contoh"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Penyihir Oz yang Menakjubkan"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Bab 11: Oz, Kota Zamrud yang Menakjubkan"</string>
@@ -4522,6 +4521,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Tidak tersedia selama mode pesawat"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Paksa mode desktop"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Paksa mode desktop eksperimental di tampilan sekunder"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Aktifkan sizecompat format bebas"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Mengizinkan aplikasi sizecompat dalam format bebas"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Aktifkan paksa SmartDark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Memaksa fitur SmartDark agar selalu aktif"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privasi"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 0ff3fd5..ba79b9f 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Stækkaðu eða minnkaðu texta á skjá."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Minnka"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Stækka"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Textadæmi"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Galdrakarlinn í Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. kafli: Smaragðsborgin dásamlega í Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ekki tiltækt í flugstillingu"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Þvinga skjáborðsstillingu"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Þvinga tilraunaskjáborðsstillingu á öðrum skjá"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Hnekkja dökku"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Kemur í veg fyrir að alltaf sé kveikt á dökkum eiginleika"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Persónuvernd"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8f866ea..d7bf5b7 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Ingrandisci o riduci il testo sullo schermo."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Rimpicciolisci"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Ingrandisci"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Testo di esempio"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Il meraviglioso mago di Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capitolo 11: La splendida Città di smeraldo di Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Non disponibili in modalità aereo"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forza la modalità desktop"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forza la modalità desktop sperimentale su display secondari"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Esegui override modalità Buio forzata"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Esegue l\'override della funzionalità di modalità Buio forzata in modo che sia sempre attiva"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 429d4af..a31cc4e 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -4691,6 +4691,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"לא זמין במצב טיסה"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"אילוץ מצב שולחן עבודה"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"אילוץ מצב שולחן עבודה ניסיוני במסכים משניים"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"‏שינוי התכונה SmartDark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"‏התכונה SmartDark תפעל כל הזמן"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"פרטיות"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index e7acffb..947a6e5 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"機内モードの間は使用できません"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"デスクトップ モードに強制的に切り替え"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"セカンダリ ディスプレイで試験運用版デスクトップ モードに強制的に切り替えます"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"フォースダークのオーバーライド"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"フォースダーク機能をオーバーライドして常に ON にする"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"プライバシー"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 5febb94..2468aee 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"თვითმფრინავის რეჟიმში მიუწვდომელია"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"დესკტოპის რეჟიმის იძულებით გააქტიურება"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"დესკტოპის ექსპერიმენტული რეჟიმის იძულებით გააქტიურება მეორეულ ეკრანებზე"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"გამუქების იძულების უგულებელყოფა"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"უგულებელყოფს გამუქების ყოველთვის იძულების ფუნქციას"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"კონფიდენციალურობა"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index eae4aca..a754715 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ұшақ режимінде қолжетімді емес."</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Жұмыс үстелінің режимін мәжбүрлі қосу"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Қосымша дисплейлерде эксперименттік жұмыс үстелі режимін мәжбүрлі қосу"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Қараңғылауға жол бермеу"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Қараңғы тақырыпты мәжбүрлеп қойғанда, \"Әрдайым қосулы\" мәніне өзгертеді"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Құпиялылық"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index e7561d0..3ba1ac4 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"មិន​អាច​ប្រើបាន​ទេ ពេលប្រើ​មុខងារ​ពេល​ជិះ​យន្តហោះ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"បង្ខំ​មុខងារ​អេក្រង់ដើម"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"បង្ខំ​មុខងារ​អេក្រង់​ដើម​សាកល្បង​នៅលើ​អេក្រង់​ទី​ពីរ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"លុបពីលើ​មុខងារបង្ខំ​ឱ្យងងឹត"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"លុបពីលើ​មុខងារ​បង្ខំឱ្យងងឹត​ឱ្យបើកជានិច្ច"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ឯកជនភាព"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6744ee2..b941add 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್‌ನಲ್ಲಿರುವಾಗ ಲಭ್ಯವಿರುವುದಿಲ್ಲ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೋಡ್ ಅನ್ನು ಒತ್ತಾಯ ಮಾಡಿ"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ಸೆಕೆಂಡರಿ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾಯೋಗಿಕ ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೋಡ್ ಅನ್ನು ಒತ್ತಾಯ ಮಾಡಿ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ಫೋರ್ಸ್-ಡಾರ್ಕ್ ವೈಶಿಷ್ಟ್ಯ ಬಲಗೊಳಿಸಲು ಸೆಟ್ಟಿಂಗ್ ಅತಿಕ್ರಮಿಸಿ"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ಫೋರ್ಸ್-ಡಾರ್ಕ್ ವೈಶಿಷ್ಟ್ಯವು ಆನ್ ಆಗಿರುವಂತೆ ಒತ್ತಾಯಿಸುತ್ತದೆ"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ಗೌಪ್ಯತೆ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 9d3d37f..1876905 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"비행기 모드에서는 사용할 수 없음"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"데스크톱 모드 강제 사용"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"보조 디스플레이에서 실험적 데스크톱 모드 강제 사용"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"강제로 어둡게 재정의"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"강제로 어둡게 기능을 항상 사용하도록 재정의"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"개인정보 보호"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index c6e2038..f49f2f2 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Учак режиминде жеткиликсиз"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Иш такта режимин күйгүзүү"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Тажрыйбалык иш такта режимин көмөкчү экрандарда иштетүү"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Түнкү режимди мажбурлап иштетүү функциясын өзгөртүп коюу"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Түнкү режимди мажбурлап иштетүү функциясы ар дайым күйүк болгондой кылып өзгөртүп коёт"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Купуялык"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 9c6c832..4c3c4e1 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ບໍ່ສາມາດໃຊ້ໄດ້ໃນໂໝດຢູ່ໃນຍົນ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ບັງຄັບໂໝດເດັສທັອບ"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ບັງຄັບໂໝດເດັສທັອບແບບທົດລອງໃຊ້ຢູ່ໜ້າຈໍທີສອງ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ຍົກເລີກການບັງຄັບໃຫ້ໃຊ້ແບບມືດ"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ຍົກເລີກຄຸນສົມບັດການບັງຄັບໃຫ້ໃຊ້ແບບມືດຕະຫຼອດ"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ຄວາມເປັນສ່ວນຕົວ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d8db1ae..fdd6131 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -4688,6 +4688,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nepasiekiama lėktuvo režimu"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Priverstinai įjungti darbalaukio režimą"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Priverstinai įjungti eksperimentinį darbalaukio režimą antriniuose ekranuose"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Nepaisyti priverst. tamsaus rež. įgalin."</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Nepaisoma priverstinio tamsaus režimo funkcijos įgalinimo, kad ji visada būtų įjungta"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatumas"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f7eae5e..01b857a 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -4606,6 +4606,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nav pieejami lidojuma režīmā"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Veikt piespiedu darbvirsmas režīma atvēršanu"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Veikt piespiedu eksperimentālā darbvirsmas režīma atvēršanu sekundārajos displejos"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Tumšā režīma piespiedu ieslēgšanas ignorēšana"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ignorē tumšā režīma iestatījumu Vienmēr ieslēgts"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Konfidencialitāte"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index fd97993..62ecfbe 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Намалете го или зголемете го текстот на екранот."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Намали"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Зголеми"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Примерок на текст"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Чудесниот волшебник од Оз"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Поглавје 11: Чудесниот смарагден град Оз"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Недостапен во авионски режим"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Наметни режим на работна површина"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Наметнете го експерименталниот режим на работна површина на секундарните екрани"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Отфрли го наметнувањето темен режим"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ја отфрла функцијата за наметнување темен режим за да биде постојано вклучена"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Приватност"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index aac60c2..084178f 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ഫ്ലൈറ്റ് മോഡിൽ ലഭ്യമല്ല"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ഡെസ്ക്ടോപ്പ് മോഡിലേക്ക് നിർബന്ധിച്ച് വരുത്തുക"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ദ്വിതീയ ഡിസ്‌പ്ലേകളിൽ, പരീക്ഷണാത്മക ഡെസ്ക്ടോപ്പ് മോഡിലേക്ക് നിർബന്ധിച്ച് വരുത്തുക"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"നിർബന്ധിത ഇരുണ്ട മോഡ് അസാധുവാക്കുക"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"എപ്പോഴും ഓണാക്കിയിരിക്കുന്ന നിർബന്ധിത ഇരുണ്ട മോഡ് ഫീച്ചർ അസാധുവാക്കുക"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"സ്വകാര്യത"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 22554ca..9b8f4ee 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Дэлгэц дээрх текстийг томруулах, жижигрүүлэх."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Жижигрүүлэх"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Томруулах"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Жишээ текст"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Озын Гайхамшигт шидтэн"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Бүлэг 11: Озын Гайхамшигт Маргад эрдэнийн хот"</string>
@@ -4520,6 +4519,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Нислэгийн горимд боломжгүй"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Дэлгэцийн горимыг хүчлэх"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Дэлгэцийн туршилтын горимыг хоёрдогч дэлгэцэд хүчлэх"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Хүчээр бүдгэрүүлэхийг дарах"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Хүчээр бүдэгрүүлэх онцлогийг байнга асаалттай байхаар дардаг"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Нууцлал"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index b62f799..66c85ef 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"विमान मोड सुरू असताना उपलब्ध नाही"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"डेस्कटॉप मोडची सक्ती करा"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"दुसऱ्या डिस्प्लेवर प्रायोगिक डेस्कटॉप मोडला सक्ती करा"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"फोर्स डार्क ओव्हरराइड करते"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"फोर्स डार्क वैशिष्ट्य नेहमी सुरू ठेवण्यास ओव्हरराइड करते"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"गोपनीयता"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 52c5a42..aca3cff 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Tidak tersedia semasa dalam mod pesawat"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Paksa mod desktop"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Paksa mod desktop percubaan pada paparan kedua"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Batalkan paksa gelap"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Membatalkan ciri paksa gelap supaya sentiasa hidup"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privasi"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 6744af6..1681486 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"လေယာဉ်ပျံမုဒ် ပြုလုပ်ထားစဉ် သုံး၍မရပါ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ဒက်စ်တော့ပုံစံ မဖြစ်မနေ ပြောင်းခြင်း"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ဒုတိယ မျက်နှာပြင်ပြသမှုများတွင် ဒက်စ်တော့ပုံစံ မဖြစ်မနေ စမ်းသပ်ရန်"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"မဖြစ်မနေအမှောင်ချခြင်းကို အစားထိုးခြင်း"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"မဖြစ်မနေအမှောင်ချခြင်း ဝန်ဆောင်မှု အမြဲဖွင့်ရန် အစားထိုးထားသည်"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ကန့်သတ်ဆက်တင်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8e91992..12adea2 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Utilgjengelig i flymodus"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Tvungen skrivebordsmodus"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Tvungen eksperimentell skrivebordsmodus på sekundære skjermer"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Overstyr tving mørk"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overstyrer tving mørk-funksjonen til å være alltid på"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Personvern"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index e7c8cab..5dec65f 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"हवाइजहाज मोडमा हुँदा मोबाइल डेटा उपलब्ध हुँदैन"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"डेस्कटप मोडमा बल गर्नुहोस्"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"सहायक प्रदर्शनहरूमा प्रयोगात्मक डेस्कटप मोडमा जोड दिनुहोस्‌"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"force-dark ओभरराइड गर्नुहोस्"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"force-dark सुविधा सधैँ सक्रिय हुन बल गर्छ"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"गोपनीयता"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 942d66c..7f2240f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Maak de tekst op het scherm kleiner of groter."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Verkleinen"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Vergroten"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Voorbeeldtekst"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"De tovenaar van Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Hoofdstuk 11: De prachtige Smaragden Stad van Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Niet beschikbaar in de vliegtuigmodus"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Desktopmodus afdwingen"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Experimentele desktopmodus afdwingen op secundaire displays"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Gedwongen donker maken negeren"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Overschrijft de functie voor gedwongen donker maken zodat deze altijd aan is"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 8bf5559..01a5376 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ଏୟାରପ୍ଲେନ୍‌ ମୋଡ୍‌ ସମୟରେ ଉପଲବ୍ଧ ନୁହେଁ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ଫୋର୍ସ ଡେସ୍କଟପ୍‍ ମୋଡ୍‍"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ଦ୍ବିତୀୟ ପ୍ରଦର୍ଶନରେ ଫୋର୍ସ ପରୀକ୍ଷାମୂଳକ ମୋଡ୍‍"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ଫୋର୍ସ୍-ଡାର୍କ୍ ଓଭର୍‍ରାଇଡ୍ କରନ୍ତୁ"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ଫୋର୍ସ-ଡାର୍କ ଫିଚର୍‍ ସଦାବେଳେ ଚାଲୁ ରହିବା ଓଭର୍‍ରାଇଡ୍ କରିଥାଏ"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ଗୋପନୀୟତା"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index f373100..e3cbb41 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਦੀ ਲਿਖਤ ਨੂੰ ਛੋਟਾ ਜਾਂ ਵੱਡਾ ਕਰੋ।"</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"ਛੋਟਾ ਕਰੋ"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"ਵੱਡਾ ਕਰੋ"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"ਨਮੂਨਾ ਲਿਖਤ"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"ਔਜ਼ ਦਾ ਨਿਰਾਲਾ ਵਿਜ਼ਾਰਡ"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"ਪਾਠ 11: ਔਜ਼ ਦਾ ਹੀਰਿਆਂ-ਪੰਨਿਆਂ ਵਾਲਾ ਨਿਰਾਲਾ ਸ਼ਹਿਰ"</string>
@@ -3376,8 +3375,7 @@
     <string name="notification_channel_summary_low" msgid="4842529455460294865">"ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਦੇ ਫੋਕਸ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ"</string>
     <string name="notification_channel_summary_default" msgid="2919219975379032181">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ"</string>
     <string name="notification_channel_summary_high" msgid="3411637309360617621">"ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰਨ \'ਤੇ, ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ \'ਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੈਨਰ ਵਜੋਂ ਦਿਖਾਓ"</string>
-    <!-- no translation found for notification_switch_label (6022236996552304892) -->
-    <skip />
+    <string name="notification_switch_label" msgid="6022236996552304892">"ਸਾਰੀਆਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਸੂਚਨਾਵਾਂ"</string>
     <string name="default_notification_assistant" msgid="243718059890346442">"ਅਨੁਕੂਲ ਸੂਚਨਾਵਾਂ"</string>
     <plurals name="notifications_sent_daily" formatted="false" msgid="1479283620504341566">
       <item quantity="one">ਹਰ ਰੋਜ਼ ~<xliff:g id="NUMBER_1">%d</xliff:g> ਸੂਚਨਾ</item>
@@ -3398,8 +3396,7 @@
     <string name="notification_assistant_title" msgid="6983941403582134437">"ਅਨੁਕੂਲ ਸੂਚਨਾਵਾਂ"</string>
     <string name="no_notification_assistant" msgid="2533323397091834096">"ਕੋਈ ਨਹੀਂ"</string>
     <string name="no_notification_listeners" msgid="2839354157349636000">"ਕਿਸੇ ਵੀ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਨੇ ਸੂਚਨਾ ਪਹੁੰਚ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਹੈ।"</string>
-    <!-- no translation found for notification_access_detail_switch (46386786409608330) -->
-    <skip />
+    <string name="notification_access_detail_switch" msgid="46386786409608330">"ਸੂਚਨਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
     <string name="notification_assistant_security_warning_title" msgid="2972346436050925276">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਨੂੰ ਸੂਚਨਾ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?"</string>
     <string name="notification_assistant_security_warning_summary" msgid="3119843404577399036">"<xliff:g id="NOTIFICATION_ASSISTANT_NAME">%1$s</xliff:g> ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਪੜ੍ਹ ਸਕੇਗੀ ਜਿਸ ਵਿੱਚ ਸੰਪਰਕ ਨਾਮ ਅਤੇ ਤੁਹਾਨੂੰ ਪ੍ਰਾਪਤ ਹੋਣ ਵਾਲੇ ਲਿਖਤ ਸੁਨੇਹਿਆਂ ਵਰਗੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ। ਇਹ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਣ ਜਾਂ ਖਾਰਜ ਕਰਨ ਜਾਂ ਉਸ ਵਿੱਚ ਸ਼ਾਮਲ ਕਾਰਵਾਈ ਬਟਨਾਂ ਨੂੰ ਟ੍ਰਿਗਰ ਵੀ ਕਰ ਸਕੇਗੀ। \n\nਇਹ ਐਪ ਨੂੰ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਬੰਦ ਜਾਂ ਚਾਲੂ ਕਰਨ ਅਤੇ ਸੰਬੰਧਿਤ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਣ ਦੀ ਸਮਰੱਥਾ ਵੀ ਦੇਵੇਗੀ।"</string>
     <string name="notification_listener_security_warning_title" msgid="5791700876622858363">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਲਈ ਸੂਚਨਾ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
@@ -4524,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਚਾਲੂ ਹੋਣ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ਜ਼ਬਰਦਸਤੀ ਡੈਸਕਟਾਪ ਮੋਡ ਵਿੱਚ ਲਿਆਓ"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਜ਼ਬਰਦਸਤੀ ਪ੍ਰਯੋਗਮਈ ਡੈਸਕਟਾਪ ਮੋਡ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ਜ਼ਬਰਦਸਤੀ ਗੂੜ੍ਹਾ ਮੋਡ ਓਵਰਰਾਈਡ ਕਰੋ"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ਜ਼ਬਰਦਸਤੀ ਨਾਲ ਗੂੜ੍ਹਾ ਮੋਡ ਲਾਗੂ ਕਰਨ ਵਾਲੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਹਮੇਸ਼ਾਂ-ਚਾਲੂ ਰੱਖਣ ਲਈ ਓਵਰਰਾਈਡ ਕਰਦੀ ਹੈ"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ਪਰਦੇਦਾਰੀ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 54e72e2..c096adf3 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -4689,6 +4689,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Niedostępne w trybie samolotowym"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Wymuś tryb pulpitu"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Wymuś eksperymentalny tryb pulpitu na dodatkowych ekranach"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Zastąp wymuszanie trybu ciemnego"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Zastępuje ustawienie zawsze włączonej funkcji wymuszania trybu ciemnego"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Prywatność"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index d445f84..581023b 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Tornar o texto na tela menor ou maior."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Tornar menor"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Tornar maior"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Texto de amostra"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"O Mágico de Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capítulo 11: A maravilhosa Cidade das Esmeraldas de Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Indisponível no modo avião"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forçar modo de área de trabalho"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forçar o modo de área de trabalho experimental em telas secundárias"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Modificar o recurso forçar modo escuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Modificar o recurso de forçar modo escuro para que fique sempre ativado"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidade"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index e134799..3e136ae 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Aumente ou diminua o texto no ecrã."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Diminuir"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Aumentar"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Exemplo de texto"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"O Maravilhoso Feiticeiro de Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capítulo 11: A Maravilhosa Cidade Esmeralda de Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Não disponível durante o modo de avião"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forçar modo de ambiente de trabalho"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forçar modo de ambiente de trabalho experimental em ecrãs secundários"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Substituir forçar o modo escuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Substitui a funcionalidade de forçar a ativação permanente do modo escuro"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidade"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index d445f84..581023b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Tornar o texto na tela menor ou maior."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Tornar menor"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Tornar maior"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Texto de amostra"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"O Mágico de Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Capítulo 11: A maravilhosa Cidade das Esmeraldas de Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Indisponível no modo avião"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forçar modo de área de trabalho"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forçar o modo de área de trabalho experimental em telas secundárias"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Modificar o recurso forçar modo escuro"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Modificar o recurso de forçar modo escuro para que fique sempre ativado"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacidade"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index e33896e..2162c15 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -4606,6 +4606,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nu sunt disponibile în modul Avion"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Forțați modul desktop"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Forțați modul desktop experimental pe ecrane secundare"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Modificați funcția Force-Dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Modifică funcția Force-Dark să fie activată mereu"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Confidențialitate"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 82c1da1..32d79c2 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -4688,6 +4688,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Мобильный Интернет недоступен в режиме полета."</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Принудительное включение режима рабочего стола"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Принудительное включение экспериментального режима рабочего стола на дополнительных экранах"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Переопределение включения тёмной темы"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Изменение настройки принудительного включения тёмной темы на \"Всегда включено\""</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Конфиденциальность"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 5d81082..4e15d24 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"තිරය මත පෙළ වඩාත් කුඩා හෝ විශාල කරන්න."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"වඩා කුඩා කරන්න"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"වඩා විශාල කරන්න"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"ආදර්ශ පෙළ"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11වන පරිච්ඡේදය: The Wonderful Emerald City of Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ගුවන් යානා ප්‍රකාරයේදී නොලැබේ"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"වැඩතල ප්‍රකාරය බල කරන්න"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ද්විතීයික සංදර්ශන කෙරෙහි අත්හදා බැලීමේ වැඩතල ප්‍රකාරය බල කරන්න"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"force-dark ප්‍රතික්ෂේප කරන්න"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"force-dark විශේෂාංගය සැම විට ක්‍රියාත්මකව තිබීමට ප්‍රතික්ෂේප කරයි"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"රහස්‍යතාව"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index be992ca..130168a 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -4688,6 +4688,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nedostupné v režime v lietadle"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Vynútiť režim pracovnej plochy"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Vynútenie experimentálneho režimu pracovnej plochy na sekundárnych obrazovkách"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Presadiť tmavý režim"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Presadí, aby bol tmavý režim vždy zapnutý"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Ochrana súkromia"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 460ab3d..867ff6d 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -53,8 +53,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Pomanjšava ali povečava besedila na zaslonu"</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Pomanjšanje"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Povečanje"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Vzorčno besedilo"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Čudoviti čarovnik iz Oza"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11. poglavje: Čudovito Smaragdno mesto"</string>
@@ -4688,6 +4687,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ni na voljo v načinu za letalo"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Vsili namizni način"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Vsili poskusni namizni način na sekundarnih zaslonih"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Preglasi vsiljenje temnega načina"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Preglasi vsiljenje vedno vklopljenega temnega načina"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Zasebnost"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 283a918..d2239bb 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Bëje tekstin në ekran më të vogël ose më të madh."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Zvogëlo"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Zmadho"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Teksti shembull"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Magjistari i mrekullueshëm i Ozit"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Kapitulli 11: Qyteti i mrekullueshëm i smeraldtë i Ozit"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Nuk ofrohen në modalitetin e aeroplanit"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Detyro \"modalitetin e desktopit\""</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Detyro \"modalitetin e desktopit\" eksperimental në ekrane dytësore"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Anulo detyrimin e errësimit"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Anulon funksionin e detyrimit të errësimit që të jetë gjithmonë aktiv"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privatësia"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 2b42b2d..7ecb8fa 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -52,8 +52,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Омогућава да текст на екрану буде мањи или већи."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Умањи"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Увећај"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Пример текста"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Чаробњак из Оза"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Поглавље 11: Чудесни Смарагдни град Оза"</string>
@@ -4605,6 +4604,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Недоступно током режима рада у авиону"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Наметни режим рачунара"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Наметни експериментални режим рачунара на секундарним екранима"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Замени функцију наметања тамне теме"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Мења функцију наметања тамне теме тако да буде увек укључена"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Приватност"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index f6d73bd..68870f0 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Gör texten på skärmen större eller mindre."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Förminska"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Förstora"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Exempeltext"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Den fantastiska trollkarlen från Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Kapitel 11: Den underbara Smaragdstaden i Oz"</string>
@@ -4522,6 +4521,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ej tillgängligt i flygplansläge"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Tvinga fram skrivbordsläge"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Tvinga fram experimentellt skrivbordsläge på sekundära skärmar"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Åsidosätter tvingat mörkt läge"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Åsidosätter funktionen som tvingar mörkt läge att alltid vara aktiverat"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Sekretess"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 7572ec9..42f145c 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Haipatikani ukitumia hali ya ndegeni"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Lazimisha hali ya eneo-kazi"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Lazimisha hali ya jaribio la eneo-kazi kwenye maonyesho yasiyo ya msingi"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Badilisha ulazimishaji wa mandhari meusi"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Hubatilisha mipangilio ya kipengele cha kulazimisha mandhari meusi ili kiwake kila wakati"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Faragha"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index c255a66..eb3a91a 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"விமானப் பயன்முறையின்போது கிடைக்காது"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"கட்டாய டெஸ்க்டாப் பயன்முறை"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"இரண்டாம்நிலை திரைகளில் \'கட்டாயப் பரிசோதனை டெஸ்க்டாப்\' பயன்முறை"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"force-dark அம்சத்தை மேலெழுதுதல்"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"எப்போதும் இயக்கத்தில் இருக்குமாறு force-dark அம்சத்தை மேலெழுதுகிறது"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"தனியுரிமை"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 5f763d6..6cc86be 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -4526,6 +4526,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"విమానం మోడ్‌లో సేవ అందుబాటులో ఉండదు"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ఫోర్స్ డెస్క్‌టాప్ మోడ్"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ద్వితీయ ప్రదర్శనల్లో ఫోర్స్ ప్రయోగాత్మక డెస్క్‌టాప్ మోడ్"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ఫోర్స్‌-డార్క్‌ను అధిగ‌మించ‌డం"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ఫోర్స్‌-డార్క్ ఫీచ‌ర్‌ను అధిగ‌మించ‌డం ఎల్ల‌ప్పుడూ ఆన్‌లో ఉండాలి"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"గోప్యత"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 7a5938e..1b63234 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ใช้ขณะที่เปิดโหมดบนเครื่องบินไม่ได้"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"บังคับใช้โหมดเดสก์ท็อป"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"บังคับใช้โหมดเดสก์ท็อปแบบทดลองในจอแสดงผลรอง"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"ลบล้างฟีเจอร์บังคับใช้โหมดมืด"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"ลบล้างฟีเจอร์บังคับใช้โหมดมืดให้เปิดตลอดเวลา"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"ความเป็นส่วนตัว"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index c116359..61df992 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Hindi available sa airplane mode"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Force desktop mode"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Force experimental desktop mode sa mga pangalawang display"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"I-override ang force-dark"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ino-override ang force-dark feature para maging palaging naka-on"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Privacy"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ffe1a88..fc02800 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Uçak modunda kullanılamaz"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Masaüstü modunu zorunlu kıl"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"İkincil ekranlarda deneysel masaüstü modunu zorunlu kıl"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Zorunlu koyu rengi geçersiz kıl"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Zorunlu koyu renk özelliğini geçersiz kılma her zaman açık"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Gizlilik"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 6e57214..cbe50c8 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -53,8 +53,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Збільшуйте або зменшуйте текст на екрані."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Зменшити"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Збільшити"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Зразок тексту"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Чарівник країни Оз"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Глава 11. Дивовижне Смарагдове місто країни Оз"</string>
@@ -3495,8 +3494,7 @@
     <string name="notification_assistant_title" msgid="6983941403582134437">"Адаптивні сповіщення"</string>
     <string name="no_notification_assistant" msgid="2533323397091834096">"Немає"</string>
     <string name="no_notification_listeners" msgid="2839354157349636000">"Установлені додатки не запитували доступу до сповіщень."</string>
-    <!-- no translation found for notification_access_detail_switch (46386786409608330) -->
-    <skip />
+    <string name="notification_access_detail_switch" msgid="46386786409608330">"Надати доступ до сповіщень"</string>
     <string name="notification_assistant_security_warning_title" msgid="2972346436050925276">"Надати додатку <xliff:g id="SERVICE">%1$s</xliff:g> доступ до сповіщень?"</string>
     <string name="notification_assistant_security_warning_summary" msgid="3119843404577399036">"<xliff:g id="NOTIFICATION_ASSISTANT_NAME">%1$s</xliff:g> зможе переглядати всі сповіщення, зокрема з особистою інформацією, як-от іменами контактів і текстами отриманих повідомлень. Він також зможе змінювати й відхиляти сповіщення та активувати в них командні кнопки. \n\nДодаток зможе вмикати й вимикати режим \"Не турбувати\" та змінювати пов’язані з ним налаштування."</string>
     <string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Надати додатку <xliff:g id="SERVICE">%1$s</xliff:g> доступ для сповіщень?"</string>
@@ -4689,6 +4687,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Недоступно, коли ввімкнено режим польоту"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Примусово застосувати режим робочого столу"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Примусово застосувати експериментальний режим робочого столу на додаткових екранах"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Замінити примусовий темний режим"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Не дозволяє постійний примусовий темний режим"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Конфіденційність"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 918dda8..b357042 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"ہوائی جہاز وضع کے دوران غیر دستیاب"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"ڈیسک ٹاپ موڈ فورس کریں"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"ثانوی ڈسپلیز پر تجرباتی ڈیسک ٹاپ موڈ فورس کریں"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"‏force-dark کو اوور رائیڈ کریں"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"‏force-dark کی خصوصیت کو ہمیشہ زبردستی آن رکھنے کے لیے اوور رائیڈ کرتی ہے"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"رازداری"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index f6862c6..ad2b2c6 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Ekrandagi matnni kattalashtirish yoki kichiklashtirish."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Kichiklashtirish"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Kattalashtirish"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Namunaviy matn"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"Oz mamlakati sehrgari"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"11-bob: Oz mamlakatining zumrad shahri"</string>
@@ -4536,6 +4535,8 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Parvoz rejimida ishlamaydi"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Desktop rejimini majburiy ochish"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Ikkilamchi displeylarda tajribaviy desktop rejimini majburiy ochish"</string>
+    <string name="enable_sizecompat_freeform" msgid="3799755160777404309">"Oʻzgarmas hajmli ilovalarning erkin shakl olishi"</string>
+    <string name="enable_sizecompat_freeform_summary" msgid="1484050174538201499">"Oʻzgarmas hajmli ilovalarning erkin shaklda ochilishiga ruxsat beradi"</string>
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Tungi mavzuni yoqish ustidan yozadi"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Tungi mavzuni majburiy yoqish sozlamasini “Doimo yoniq” sifatida sozlaydi."</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Maxfiylik"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7354940..4d3a549 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -4522,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Không sử dụng được khi ở chế độ trên máy bay"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Buộc chạy chế độ máy tính"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Buộc chạy chế độ máy tính thử nghiệm trên màn hình phụ"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Ghi đè tính năng buộc tối"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ghi đè tính năng buộc tối để luôn bật"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Quyền riêng tư"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b20670d..0558544 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"在飞行模式下不可用"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"强制使用桌面模式"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"在辅助显示屏上强制使用实验桌面模式"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"覆盖“强制启用 SmartDark 功能”的设置"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"覆盖“强制 SmartDark 功能始终开启”的设置"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"隐私权"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 3062134..944e461 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -4524,6 +4524,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"飛行模式啟用期間無法使用"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"強制執行桌面模式"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"在次要顯示屏強制執行實驗版桌面模式"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"蓋過強制深色模式"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"蓋過永遠啟用強制深色模式的設定"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"私隱"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index d7df3ef..656d202 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -4523,6 +4523,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"飛航模式開啟時無法使用"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"強制使用桌面模式"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"在次要顯示器上強制使用桌面模式實驗性功能"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"覆寫強制使用深色模式的功能"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"覆寫強制使用深色模式的功能,讓系統一律開啟這個模式"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"隱私"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 3e48c99..567440a 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -51,8 +51,7 @@
     <string name="font_size_summary" msgid="1296835853522566260">"Yenza umbhalo okusikrini ube mncane noma mkhulu."</string>
     <string name="font_size_make_smaller_desc" msgid="4978038055549590140">"Yenza kube kuncane"</string>
     <string name="font_size_make_larger_desc" msgid="5583046033381722247">"Yenza kube kukhulu"</string>
-    <!-- no translation found for font_size_preview_text (5578792111916168343) -->
-    <skip />
+    <string name="font_size_preview_text" msgid="5578792111916168343">"Servez à ce monsieur une bière et des kiwis."</string>
     <string name="font_size_preview_text_headline" msgid="1173103737980511652">"Isampuli yombhalo"</string>
     <string name="font_size_preview_text_title" msgid="6363561029914452382">"I-The Wonderful Wizard of Oz"</string>
     <string name="font_size_preview_text_subtitle" msgid="5806349524325544614">"Isahluko 11: The Wonderful Emerald City of Oz"</string>
@@ -3398,8 +3397,7 @@
     <string name="notification_assistant_title" msgid="6983941403582134437">"Izaziso eziguqukayo"</string>
     <string name="no_notification_assistant" msgid="2533323397091834096">"Lutho"</string>
     <string name="no_notification_listeners" msgid="2839354157349636000">"Azikho izinhlelo zokusebenza ezicele ukufinyelela kwesaziso."</string>
-    <!-- no translation found for notification_access_detail_switch (46386786409608330) -->
-    <skip />
+    <string name="notification_access_detail_switch" msgid="46386786409608330">"Vumela ukufinyelela kwesaziso"</string>
     <string name="notification_assistant_security_warning_title" msgid="2972346436050925276">"Vumela ukufinyelela kwesaziso kwe-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
     <string name="notification_assistant_security_warning_summary" msgid="3119843404577399036">"<xliff:g id="NOTIFICATION_ASSISTANT_NAME">%1$s</xliff:g> uzokwazi ukufunda zonke izaziso, kufaka phakathi ulwazi lomuntu siqu njengamagama okuxhumana nemibhalo yemilayezo oyitholayo. Futhi izokwazi ukushintsha noma ukulahla izaziso noma ukucupha izinkinobho zesenzo eziqukethwe. \n\nLokhu kuzonika uhlelo lokusebenza amandla okuvula nokuvala okuthi ungaphazamisi futhi kushintshe izilungiselelo eziphathelene."</string>
     <string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Vumela ukufinyelela kwe-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -4524,6 +4522,10 @@
     <string name="mobile_data_ap_mode_disabled" msgid="6067959496888990983">"Ayitholakali ngesikhathi semodi yendiza"</string>
     <string name="force_desktop_mode" msgid="1336913605091334238">"Phoqelela imodi yedeskithophu"</string>
     <string name="force_desktop_mode_summary" msgid="4587416867846930479">"Phoqelela imodi yedeskithophu yokuhlola esibukisweni sesibili"</string>
+    <!-- no translation found for enable_sizecompat_freeform (3799755160777404309) -->
+    <skip />
+    <!-- no translation found for enable_sizecompat_freeform_summary (1484050174538201499) -->
+    <skip />
     <string name="hwui_force_dark_title" msgid="4256904905631994219">"Bhala ngaphezulu isici sokuphoqelela okumnyama"</string>
     <string name="hwui_force_dark_summary" msgid="6515748781487952769">"Ibhala ngaphezulu isici sokuphoqelela okumnyama ukuthi ihlale sivulekile"</string>
     <string name="privacy_dashboard_title" msgid="6845403825611829558">"Ubumfihlo"</string>
diff --git a/res/xml/wifi_display_saved_access_points2.xml b/res/xml/wifi_display_saved_access_points2.xml
new file mode 100644
index 0000000..02c732a
--- /dev/null
+++ b/res/xml/wifi_display_saved_access_points2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="saved_access_points"
+    android:title="@string/wifi_saved_access_points_label">
+
+    <PreferenceCategory
+        android:key="subscribed_access_points_category"
+        android:title="@string/wifi_subscribed_access_points_tab"
+        settings:controller="com.android.settings.wifi.savedaccesspoints2.SubscribedAccessPointsPreferenceController2"/>
+
+    <PreferenceCategory
+        android:key="saved_access_points_category"
+        android:title="@string/wifi_saved_access_points_tab"
+        settings:controller="com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsPreferenceController2"/>
+
+</PreferenceScreen>
diff --git a/res/xml/wifi_settings2.xml b/res/xml/wifi_settings2.xml
new file mode 100644
index 0000000..8cd3857
--- /dev/null
+++ b/res/xml/wifi_settings2.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:settings="http://schemas.android.com/apk/res-auto"
+        android:title="@string/wifi_settings"
+        settings:keywords="@string/keywords_wifi">
+
+    <com.android.settings.wifi.LinkablePreference
+        android:key="wifi_status_message"/>
+
+    <PreferenceCategory
+        android:key="connected_access_point"
+        android:layout="@layout/preference_category_no_label"/>
+
+    <PreferenceCategory
+        android:key="access_points"
+        android:layout="@layout/preference_category_no_label"/>
+
+    <Preference
+        android:key="configure_settings"
+        android:title="@string/wifi_configure_settings_preference_title"
+        settings:allowDividerAbove="true"
+        android:fragment="com.android.settings.wifi.ConfigureWifiSettings"/>
+
+    <Preference
+        android:key="saved_networks"
+        android:title="@string/wifi_saved_access_points_label"
+        android:fragment="com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2"/>
+
+    <com.android.settings.datausage.DataUsagePreference
+        android:key="wifi_data_usage"
+        android:title="@string/wifi_data_usage"/>
+</PreferenceScreen>
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 0934ba9..98c6b87 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -146,6 +146,7 @@
 import com.android.settings.wifi.calling.WifiCallingSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
+import com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2;
 import com.android.settings.wifi.tether.WifiTetherSettings;
 
 public class SettingsGateway {
@@ -161,6 +162,7 @@
             WifiSettings2.class.getName(),
             ConfigureWifiSettings.class.getName(),
             SavedAccessPointsWifiSettings.class.getName(),
+            SavedAccessPointsWifiSettings2.class.getName(),
             TetherSettings.class.getName(),
             WifiP2pSettings.class.getName(),
             WifiTetherSettings.class.getName(),
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java
index d1051fe..3cd4ca3 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java
@@ -201,7 +201,8 @@
     }
 
     @WorkerThread
-    private static List<BatteryTip> refreshBatteryTips(Context context) {
+    @VisibleForTesting
+    static List<BatteryTip> refreshBatteryTips(Context context) {
         final BatteryStatsHelperLoader statsLoader = new BatteryStatsHelperLoader(context);
         final BatteryStatsHelper statsHelper = statsLoader.loadInBackground();
         final BatteryTipLoader loader = new BatteryTipLoader(context, statsHelper);
diff --git a/src/com/android/settings/panel/WifiPanel.java b/src/com/android/settings/panel/WifiPanel.java
index 36ee117..0efa804 100644
--- a/src/com/android/settings/panel/WifiPanel.java
+++ b/src/com/android/settings/panel/WifiPanel.java
@@ -20,12 +20,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.util.FeatureFlagUtils;
 
 import com.android.settings.R;
 import com.android.settings.SubSettings;
 import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.SliceBuilderUtils;
 import com.android.settings.wifi.WifiSettings;
+import com.android.settings.wifi.WifiSettings2;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -61,11 +63,20 @@
     public Intent getSeeMoreIntent() {
         final String screenTitle =
                 mContext.getText(R.string.wifi_settings).toString();
-        final Intent intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
-                WifiSettings.class.getName(),
-                null /* key */,
-                screenTitle,
-                SettingsEnums.WIFI);
+        Intent intent;
+        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+            intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
+                    WifiSettings2.class.getName(),
+                    null /* key */,
+                    screenTitle,
+                    SettingsEnums.WIFI);
+        } else {
+            intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
+                    WifiSettings.class.getName(),
+                    null /* key */,
+                    screenTitle,
+                    SettingsEnums.WIFI);
+        }
         intent.setClassName(mContext.getPackageName(), SubSettings.class.getName());
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         return intent;
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 0ba2a94..a3435e6 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -44,6 +44,7 @@
 import android.text.SpannableString;
 import android.text.TextUtils;
 import android.text.TextWatcher;
+import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
@@ -70,6 +71,7 @@
 import com.android.settings.ProxySelector;
 import com.android.settings.R;
 import com.android.settings.wifi.details.WifiPrivacyPreferenceController;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
 import com.android.settings.wifi.dpp.WifiDppUtils;
 import com.android.settingslib.Utils;
 import com.android.settingslib.utils.ThreadUtils;
@@ -289,9 +291,14 @@
                         ? HIDDEN_NETWORK
                         : NOT_HIDDEN_NETWORK);
 
-                final int prefMacValue =
-                        WifiPrivacyPreferenceController.translateMacRandomizedValueToPrefValue(
-                                config.macRandomizationSetting);
+                int prefMacValue;
+                if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+                    prefMacValue = WifiPrivacyPreferenceController2
+                            .translateMacRandomizedValueToPrefValue(config.macRandomizationSetting);
+                } else {
+                    prefMacValue = WifiPrivacyPreferenceController
+                            .translateMacRandomizedValueToPrefValue(config.macRandomizationSetting);
+                }
                 mPrivacySettingsSpinner.setSelection(prefMacValue);
 
                 if (config.getIpAssignment() == IpAssignment.STATIC) {
@@ -843,9 +850,14 @@
         }
 
         if (mPrivacySettingsSpinner != null) {
-            final int macValue =
-                    WifiPrivacyPreferenceController.translatePrefValueToMacRandomizedValue(
-                            mPrivacySettingsSpinner.getSelectedItemPosition());
+            int macValue;
+            if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+                macValue = WifiPrivacyPreferenceController2.translatePrefValueToMacRandomizedValue(
+                        mPrivacySettingsSpinner.getSelectedItemPosition());
+            } else {
+                macValue = WifiPrivacyPreferenceController.translatePrefValueToMacRandomizedValue(
+                        mPrivacySettingsSpinner.getSelectedItemPosition());
+            }
             config.macRandomizationSetting = macValue;
         }
 
diff --git a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
index 36c4455..2c6feac 100644
--- a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.util.FeatureFlagUtils;
 
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceScreen;
@@ -25,6 +26,7 @@
 import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.wifi.AccessPoint;
@@ -128,17 +130,31 @@
             mPreference.refresh();
             mPreference.setOrder(order);
 
-            mPreference.setOnPreferenceClickListener(pref -> {
-                Bundle args = new Bundle();
-                mPreference.getAccessPoint().saveWifiState(args);
-                new SubSettingLauncher(mPrefContext)
-                        .setTitleRes(R.string.pref_title_network_details)
-                        .setDestination(WifiNetworkDetailsFragment.class.getName())
-                        .setArguments(args)
-                        .setSourceMetricsCategory(mMetricsCategory)
-                        .launch();
-                return true;
-            });
+            if (FeatureFlagUtils.isEnabled(mPrefContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+                mPreference.setOnPreferenceClickListener(pref -> {
+                    Bundle args = new Bundle();
+                    mPreference.getAccessPoint().saveWifiState(args);
+                    new SubSettingLauncher(mPrefContext)
+                            .setTitleRes(R.string.pref_title_network_details)
+                            .setDestination(WifiNetworkDetailsFragment2.class.getName())
+                            .setArguments(args)
+                            .setSourceMetricsCategory(mMetricsCategory)
+                            .launch();
+                    return true;
+                });
+            } else {
+                mPreference.setOnPreferenceClickListener(pref -> {
+                    Bundle args = new Bundle();
+                    mPreference.getAccessPoint().saveWifiState(args);
+                    new SubSettingLauncher(mPrefContext)
+                            .setTitleRes(R.string.pref_title_network_details)
+                            .setDestination(WifiNetworkDetailsFragment.class.getName())
+                            .setArguments(args)
+                            .setSourceMetricsCategory(mMetricsCategory)
+                            .launch();
+                    return true;
+                });
+            }
             mPreferenceGroup.addPreference(mPreference);
         }
     }
diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java
index a590a0f..adfc7ec 100644
--- a/src/com/android/settings/wifi/WifiPickerActivity.java
+++ b/src/com/android/settings/wifi/WifiPickerActivity.java
@@ -16,6 +16,7 @@
 package com.android.settings.wifi;
 
 import android.content.Intent;
+import android.util.FeatureFlagUtils;
 
 import androidx.preference.PreferenceFragmentCompat;
 
@@ -24,6 +25,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
+import com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2;
 
 public class WifiPickerActivity extends SettingsActivity implements ButtonBarHandler {
 
@@ -39,9 +41,18 @@
 
     @Override
     protected boolean isValidFragment(String fragmentName) {
+        boolean isSavedAccessPointsWifiSettings;
+        if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+            isSavedAccessPointsWifiSettings =
+                    SavedAccessPointsWifiSettings2.class.getName().equals(fragmentName);
+        } else {
+            isSavedAccessPointsWifiSettings =
+                    SavedAccessPointsWifiSettings.class.getName().equals(fragmentName);
+        }
+
         if (WifiSettings.class.getName().equals(fragmentName)
                 || WifiP2pSettings.class.getName().equals(fragmentName)
-                || SavedAccessPointsWifiSettings.class.getName().equals(fragmentName)) {
+                || isSavedAccessPointsWifiSettings) {
             return true;
         }
         return false;
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 28b668f..a5b380e 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -68,6 +68,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SwitchBarController;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
 import com.android.settings.wifi.dpp.WifiDppUtils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -954,12 +955,21 @@
                         ? accessPoint.getTitle()
                         : context.getText(R.string.pref_title_network_details);
 
-        new SubSettingLauncher(getContext())
-                .setTitleText(title)
-                .setDestination(WifiNetworkDetailsFragment.class.getName())
-                .setArguments(pref.getExtras())
-                .setSourceMetricsCategory(getMetricsCategory())
-                .launch();
+        if (FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+            new SubSettingLauncher(getContext())
+                    .setTitleText(title)
+                    .setDestination(WifiNetworkDetailsFragment2.class.getName())
+                    .setArguments(pref.getExtras())
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
+        } else {
+            new SubSettingLauncher(getContext())
+                    .setTitleText(title)
+                    .setDestination(WifiNetworkDetailsFragment.class.getName())
+                    .setArguments(pref.getExtras())
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
+        }
     }
 
     private Network getCurrentWifiNetwork() {
diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java
index 2d26cc4..f2cd1cf 100644
--- a/src/com/android/settings/wifi/WifiSettings2.java
+++ b/src/com/android/settings/wifi/WifiSettings2.java
@@ -190,7 +190,7 @@
     }
 
     private void addPreferences() {
-        addPreferencesFromResource(R.xml.wifi_settings);
+        addPreferencesFromResource(R.xml.wifi_settings2);
 
         mConnectedWifiEntryPreferenceCategory = findPreference(PREF_KEY_CONNECTED_ACCESS_POINTS);
         mWifiEntryPreferenceCategory = findPreference(PREF_KEY_ACCESS_POINTS);
diff --git a/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java
new file mode 100644
index 0000000..de831b7
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.util.Log;
+
+import androidx.preference.Preference;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.wifi.dpp.WifiDppUtils;
+import com.android.settingslib.wifi.AccessPoint;
+
+/**
+ * {@link BasePreferenceController} that launches Wi-Fi Easy Connect configurator flow
+ */
+public class AddDevicePreferenceController2 extends BasePreferenceController {
+
+    private static final String TAG = "AddDevicePreferenceController2";
+
+    private static final String KEY_ADD_DEVICE = "add_device_to_network";
+
+    private AccessPoint mAccessPoint;
+    private WifiManager mWifiManager;
+
+    public AddDevicePreferenceController2(Context context) {
+        super(context, KEY_ADD_DEVICE);
+
+        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+    }
+
+    /**
+     * Initiate with an {@link AccessPoint}.
+     */
+    public AddDevicePreferenceController2 init(AccessPoint accessPoint) {
+        mAccessPoint = accessPoint;
+
+        return this;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (WifiDppUtils.isSupportConfiguratorQrCodeScanner(mContext, mAccessPoint)) {
+            return AVAILABLE;
+        } else {
+            return CONDITIONALLY_UNAVAILABLE;
+        }
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (KEY_ADD_DEVICE.equals(preference.getKey())) {
+            WifiDppUtils.showLockScreen(mContext, () -> launchWifiDppConfiguratorQrCodeScanner());
+            return true; /* click is handled */
+        }
+
+        return false; /* click is not handled */
+    }
+
+    private void launchWifiDppConfiguratorQrCodeScanner() {
+        final Intent intent = WifiDppUtils.getConfiguratorQrCodeScannerIntentOrNull(mContext,
+                mWifiManager, mAccessPoint);
+
+        if (intent == null) {
+            Log.e(TAG, "Launch Wi-Fi QR code scanner with a wrong Wi-Fi network!");
+        } else {
+            mContext.startActivity(intent);
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
new file mode 100644
index 0000000..1d6e457
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -0,0 +1,1207 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.settings.SettingsEnums;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.NetworkUtils;
+import android.net.RouteInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.core.text.BidiFormatter;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.FeatureFlags;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.datausage.WifiDataUsageSummaryPreferenceController;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wifi.WifiDialog.WifiDialogListener;
+import com.android.settings.wifi.WifiUtils;
+import com.android.settings.wifi.dpp.WifiDppUtils;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+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;
+import com.android.settingslib.widget.ActionButtonsPreference;
+import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.WifiTracker;
+import com.android.settingslib.wifi.WifiTrackerFactory;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.time.Duration;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * Controller for logic pertaining to displaying Wifi information for the
+ * {@link WifiNetworkDetailsFragment}.
+ */
+public class WifiDetailPreferenceController2 extends AbstractPreferenceController
+        implements PreferenceControllerMixin, WifiDialogListener, LifecycleObserver, OnPause,
+        OnResume {
+
+    private static final String TAG = "WifiDetailsPrefCtrl2";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    @VisibleForTesting
+    static final String KEY_HEADER = "connection_header";
+    @VisibleForTesting
+    static final String KEY_DATA_USAGE_HEADER = "status_header";
+    @VisibleForTesting
+    static final String KEY_BUTTONS_PREF = "buttons";
+    @VisibleForTesting
+    static final String KEY_SIGNAL_STRENGTH_PREF = "signal_strength";
+    @VisibleForTesting
+    static final String KEY_TX_LINK_SPEED = "tx_link_speed";
+    @VisibleForTesting
+    static final String KEY_RX_LINK_SPEED = "rx_link_speed";
+    @VisibleForTesting
+    static final String KEY_FREQUENCY_PREF = "frequency";
+    @VisibleForTesting
+    static final String KEY_SECURITY_PREF = "security";
+    @VisibleForTesting
+    static final String KEY_SSID_PREF = "ssid";
+    @VisibleForTesting
+    static final String KEY_MAC_ADDRESS_PREF = "mac_address";
+    @VisibleForTesting
+    static final String KEY_IP_ADDRESS_PREF = "ip_address";
+    @VisibleForTesting
+    static final String KEY_GATEWAY_PREF = "gateway";
+    @VisibleForTesting
+    static final String KEY_SUBNET_MASK_PREF = "subnet_mask";
+    @VisibleForTesting
+    static final String KEY_DNS_PREF = "dns";
+    @VisibleForTesting
+    static final String KEY_IPV6_CATEGORY = "ipv6_category";
+    @VisibleForTesting
+    static final String KEY_IPV6_ADDRESSES_PREF = "ipv6_addresses";
+
+    private static final int STATE_NONE = 1;
+    private static final int STATE_ENABLE_WIFI = 2;
+    private static final int STATE_ENABLE_WIFI_FAILED = 3;
+    private static final int STATE_CONNECTING = 4;
+    private static final int STATE_CONNECTED = 5;
+    private static final int STATE_FAILED = 6;
+    private static final int STATE_NOT_IN_RANGE = 7;
+    private static final int STATE_DISCONNECTED = 8;
+    private static final long TIMEOUT = Duration.ofSeconds(10).toMillis();
+
+    // Be static to avoid too much object not be reset.
+    @VisibleForTesting
+    static CountDownTimer sTimer;
+
+    private AccessPoint mAccessPoint;
+    private final ConnectivityManager mConnectivityManager;
+    private final PreferenceFragmentCompat mFragment;
+    private final Handler mHandler;
+    private LinkProperties mLinkProperties;
+    private Network mNetwork;
+    private NetworkInfo mNetworkInfo;
+    private NetworkCapabilities mNetworkCapabilities;
+    private int mRssiSignalLevel = -1;
+    private String[] mSignalStr;
+    private WifiConfiguration mWifiConfig;
+    private WifiInfo mWifiInfo;
+    private final WifiManager mWifiManager;
+    private final WifiTracker mWifiTracker;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private boolean mIsOutOfRange;
+    private boolean mIsEphemeral;
+    private boolean mConnected;
+    private int mConnectingState;
+    private WifiManager.ActionListener mConnectListener;
+
+    // UI elements - in order of appearance
+    private ActionButtonsPreference mButtonsPref;
+    private EntityHeaderController mEntityHeaderController;
+    private Preference mSignalStrengthPref;
+    private Preference mTxLinkSpeedPref;
+    private Preference mRxLinkSpeedPref;
+    private Preference mFrequencyPref;
+    private Preference mSecurityPref;
+    private Preference mSsidPref;
+    private Preference mMacAddressPref;
+    private Preference mIpAddressPref;
+    private Preference mGatewayPref;
+    private Preference mSubnetPref;
+    private Preference mDnsPref;
+    private PreferenceCategory mIpv6Category;
+    private Preference mIpv6AddressPref;
+    private Lifecycle mLifecycle;
+    Preference mDataUsageSummaryPref;
+    WifiDataUsageSummaryPreferenceController mSummaryHeaderController;
+
+    private final IconInjector mIconInjector;
+    private final IntentFilter mFilter;
+
+    // Passpoint information - cache it in case of losing these information after
+    // updateAccessPointFromScannedList(). For R2, we should update these data from
+    // WifiManager#getPasspointConfigurations() after users manage the passpoint profile.
+    private boolean mIsExpired;
+    private boolean mIsPasspointConfigurationR1;
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            switch (intent.getAction()) {
+                case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
+                    if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
+                            false /* defaultValue */)) {
+                        // only one network changed
+                        WifiConfiguration wifiConfiguration = intent
+                                .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
+                        if (mAccessPoint.matches(wifiConfiguration)) {
+                            mWifiConfig = wifiConfiguration;
+                        }
+                    }
+                    // fall through
+                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
+                case WifiManager.RSSI_CHANGED_ACTION:
+                    refreshPage();
+                    break;
+            }
+        }
+    };
+
+    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
+            .clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
+
+    // Must be run on the UI thread since it directly manipulates UI state.
+    private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+        @Override
+        public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+            if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
+                mLinkProperties = lp;
+                refreshIpLayerInfo();
+            }
+        }
+
+        private boolean hasCapabilityChanged(NetworkCapabilities nc, int cap) {
+            // If this is the first time we get NetworkCapabilities, report that something changed.
+            if (mNetworkCapabilities == null) return true;
+
+            // nc can never be null, see ConnectivityService#callCallbackForRequest.
+            return mNetworkCapabilities.hasCapability(cap) != nc.hasCapability(cap);
+        }
+
+        private boolean hasPrivateDnsStatusChanged(NetworkCapabilities nc) {
+            // If this is the first time that WifiDetailPreferenceController2 gets
+            // NetworkCapabilities, report that something has changed and assign nc to
+            // mNetworkCapabilities in onCapabilitiesChanged. Note that the NetworkCapabilities
+            // from onCapabilitiesChanged() will never be null, so calling
+            // mNetworkCapabilities.isPrivateDnsBroken() would be safe next time.
+            if (mNetworkCapabilities == null) {
+                return true;
+            }
+
+            return mNetworkCapabilities.isPrivateDnsBroken() != nc.isPrivateDnsBroken();
+        }
+
+        @Override
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+            // If the network just validated or lost Internet access or detected partial internet
+            // connectivity or private dns was broken, refresh network state. Don't do this on
+            // every NetworkCapabilities change because refreshEntityHeader sends IPCs to the
+            // system server from the UI thread, which can cause jank.
+            if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
+                if (hasPrivateDnsStatusChanged(nc)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
+                    mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
+                    refreshEntityHeader();
+                }
+                mNetworkCapabilities = nc;
+                refreshButtons();
+                refreshIpLayerInfo();
+            }
+        }
+
+        @Override
+        public void onLost(Network network) {
+            // Ephemeral network not a saved network, leave detail page once disconnected
+            if (mIsEphemeral && network.equals(mNetwork)) {
+                exitActivity();
+            }
+        }
+    };
+
+    @VisibleForTesting
+    final WifiTracker.WifiListener mWifiListener = new WifiTracker.WifiListener() {
+        /** Called when the state of Wifi has changed. */
+        public void onWifiStateChanged(int state) {
+            Log.d(TAG, "onWifiStateChanged(" + state + ")");
+            if (mConnectingState == STATE_ENABLE_WIFI && state == WifiManager.WIFI_STATE_ENABLED) {
+                updateConnectingState(STATE_CONNECTING);
+            } else if (mConnectingState != STATE_NONE && state == WifiManager.WIFI_STATE_DISABLED) {
+                // update as disconnected once Wi-Fi disabled since may not received
+                // onConnectedChanged for this case.
+                updateConnectingState(STATE_DISCONNECTED);
+            }
+        }
+
+        /** Called when the connection state of wifi has changed. */
+        public void onConnectedChanged() {
+            refreshPage();
+        }
+
+        /**
+         * Called to indicate the list of AccessPoints has been updated and
+         * {@link WifiTracker#getAccessPoints()} should be called to get the updated list.
+         */
+        public void onAccessPointsChanged() {
+            refreshPage();
+        }
+    };
+
+    /**
+     * To get an instance of {@link WifiDetailPreferenceController2}
+     */
+    public static WifiDetailPreferenceController2 newInstance(
+            AccessPoint accessPoint,
+            ConnectivityManager connectivityManager,
+            Context context,
+            PreferenceFragmentCompat fragment,
+            Handler handler,
+            Lifecycle lifecycle,
+            WifiManager wifiManager,
+            MetricsFeatureProvider metricsFeatureProvider) {
+        return new WifiDetailPreferenceController2(
+                accessPoint, connectivityManager, context, fragment, handler, lifecycle,
+                wifiManager, metricsFeatureProvider, new IconInjector(context));
+    }
+
+    @VisibleForTesting
+        /* package */ WifiDetailPreferenceController2(
+            AccessPoint accessPoint,
+            ConnectivityManager connectivityManager,
+            Context context,
+            PreferenceFragmentCompat fragment,
+            Handler handler,
+            Lifecycle lifecycle,
+            WifiManager wifiManager,
+            MetricsFeatureProvider metricsFeatureProvider,
+            IconInjector injector) {
+        super(context);
+
+        mAccessPoint = accessPoint;
+        mConnectivityManager = connectivityManager;
+        mFragment = fragment;
+        mHandler = handler;
+        mSignalStr = context.getResources().getStringArray(R.array.wifi_signal);
+        mWifiConfig = accessPoint.getConfig();
+        mWifiManager = wifiManager;
+        mMetricsFeatureProvider = metricsFeatureProvider;
+        mIconInjector = injector;
+
+        mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+
+        mLifecycle = lifecycle;
+        lifecycle.addObserver(this);
+
+        mWifiTracker = WifiTrackerFactory.create(
+                mFragment.getActivity(),
+                mWifiListener,
+                mLifecycle,
+                true /*includeSaved*/,
+                true /*includeScans*/);
+        mConnected = mAccessPoint.isActive();
+        // When lost the network connection, WifiInfo/NetworkInfo will be clear. So causes we
+        // could not check if the AccessPoint is ephemeral. Need to cache it in first.
+        mIsEphemeral = mAccessPoint.isEphemeral();
+        mConnectingState = STATE_NONE;
+        mConnectListener = new WifiManager.ActionListener() {
+            @Override
+            public void onSuccess() {
+                // Do nothing
+            }
+
+            @Override
+            public void onFailure(int reason) {
+                updateConnectingState(STATE_FAILED);
+            }
+        };
+
+        mIsExpired = mAccessPoint.isExpired();
+        mIsPasspointConfigurationR1 = mAccessPoint.isPasspointConfigurationR1();
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        // Returns null since this controller contains more than one Preference
+        return null;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        setupEntityHeader(screen);
+
+        mButtonsPref = ((ActionButtonsPreference) screen.findPreference(KEY_BUTTONS_PREF))
+                .setButton1Text(R.string.forget)
+                .setButton1Icon(R.drawable.ic_settings_delete)
+                .setButton1OnClickListener(view -> forgetNetwork())
+                .setButton2Text(R.string.wifi_sign_in_button_text)
+                .setButton2Icon(R.drawable.ic_settings_sign_in)
+                .setButton2OnClickListener(view -> signIntoNetwork())
+                .setButton3Text(R.string.wifi_connect)
+                .setButton3Icon(R.drawable.ic_settings_wireless)
+                .setButton3OnClickListener(view -> connectNetwork())
+                .setButton3Enabled(true)
+                .setButton4Text(R.string.share)
+                .setButton4Icon(R.drawable.ic_qrcode_24dp)
+                .setButton4OnClickListener(view -> shareNetwork());
+
+        if (isPasspointConfigurationR1Expired()) {
+            // Hide Connect button.
+            mButtonsPref.setButton3Visible(false);
+        }
+
+        mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
+        mTxLinkSpeedPref = screen.findPreference(KEY_TX_LINK_SPEED);
+        mRxLinkSpeedPref = screen.findPreference(KEY_RX_LINK_SPEED);
+        mFrequencyPref = screen.findPreference(KEY_FREQUENCY_PREF);
+        mSecurityPref = screen.findPreference(KEY_SECURITY_PREF);
+
+        mSsidPref = screen.findPreference(KEY_SSID_PREF);
+        mMacAddressPref = screen.findPreference(KEY_MAC_ADDRESS_PREF);
+        mIpAddressPref = screen.findPreference(KEY_IP_ADDRESS_PREF);
+        mGatewayPref = screen.findPreference(KEY_GATEWAY_PREF);
+        mSubnetPref = screen.findPreference(KEY_SUBNET_MASK_PREF);
+        mDnsPref = screen.findPreference(KEY_DNS_PREF);
+
+        mIpv6Category = screen.findPreference(KEY_IPV6_CATEGORY);
+        mIpv6AddressPref = screen.findPreference(KEY_IPV6_ADDRESSES_PREF);
+
+        mSecurityPref.setSummary(mAccessPoint.getSecurityString(/* concise */ false));
+    }
+
+    private void setupEntityHeader(PreferenceScreen screen) {
+        LayoutPreference headerPref = screen.findPreference(KEY_HEADER);
+
+        if (usingDataUsageHeader(mContext)) {
+            headerPref.setVisible(false);
+            mDataUsageSummaryPref = screen.findPreference(KEY_DATA_USAGE_HEADER);
+            mDataUsageSummaryPref.setVisible(true);
+            mSummaryHeaderController =
+                new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
+                        mLifecycle, (PreferenceFragmentCompat) mFragment, mAccessPoint.getSsid());
+            return;
+        }
+
+        mEntityHeaderController =
+                EntityHeaderController.newInstance(
+                        mFragment.getActivity(), mFragment,
+                        headerPref.findViewById(R.id.entity_header));
+
+        ImageView iconView = headerPref.findViewById(R.id.entity_header_icon);
+
+        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+
+        mEntityHeaderController.setLabel(mAccessPoint.getTitle());
+    }
+
+    private void refreshEntityHeader() {
+        if (usingDataUsageHeader(mContext)) {
+            mSummaryHeaderController.updateState(mDataUsageSummaryPref);
+        } else {
+            String summary;
+            if (isPasspointConfigurationR1Expired()) {
+                // Not able to get summary from AccessPoint because we may lost
+                // PasspointConfiguration information after updateAccessPointFromScannedList().
+                summary = mContext.getResources().getString(
+                        com.android.settingslib.R.string.wifi_passpoint_expired);
+            } else {
+                summary = mAccessPoint.getSettingsSummary(true /* convertSavedAsDisconnected */);
+            }
+
+            mEntityHeaderController
+                    .setSummary(summary)
+                    .setRecyclerView(mFragment.getListView(), mLifecycle)
+                    .done(mFragment.getActivity(), true /* rebind */);
+        }
+    }
+
+    private void updateNetworkInfo() {
+        mNetwork = mWifiManager.getCurrentNetwork();
+        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
+    }
+
+    @Override
+    public void onResume() {
+        // Ensure mNetwork is set before any callbacks above are delivered, since our
+        // NetworkCallback only looks at changes to mNetwork.
+        updateNetworkInfo();
+        refreshPage();
+        mContext.registerReceiver(mReceiver, mFilter);
+        mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
+                mHandler);
+    }
+
+    @Override
+    public void onPause() {
+        mNetwork = null;
+        mLinkProperties = null;
+        mNetworkCapabilities = null;
+        mNetworkInfo = null;
+        mWifiInfo = null;
+        mContext.unregisterReceiver(mReceiver);
+        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+    }
+
+    private void refreshPage() {
+        if (!updateAccessPoint()) {
+            return;
+        }
+
+        Log.d(TAG, "Update UI!");
+
+        // refresh header
+        refreshEntityHeader();
+
+        // refresh Buttons
+        refreshButtons();
+
+        // Update Connection Header icon and Signal Strength Preference
+        refreshRssiViews();
+        // Frequency Pref
+        refreshFrequency();
+        // Transmit Link Speed Pref
+        refreshTxSpeed();
+        // Receive Link Speed Pref
+        refreshRxSpeed();
+        // IP related information
+        refreshIpLayerInfo();
+        // SSID Pref
+        refreshSsid();
+        // MAC Address Pref
+        refreshMacAddress();
+    }
+
+    @VisibleForTesting
+    boolean updateAccessPoint() {
+        boolean changed = false;
+        // remember mIsOutOfRange as old before updated
+        boolean oldState = mIsOutOfRange;
+        updateAccessPointFromScannedList();
+
+        if (mAccessPoint.isActive()) {
+            updateNetworkInfo();
+            mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
+            mWifiInfo = mWifiManager.getConnectionInfo();
+            if (mNetwork == null || mNetworkInfo == null || mWifiInfo == null) {
+                // Once connected, can't get mNetwork immediately, return false and wait for
+                // next time to update UI. also reset {@code mIsOutOfRange}
+                mIsOutOfRange = oldState;
+                return false;
+            }
+            changed |= mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
+        }
+
+        // signal level changed
+        changed |= mRssiSignalLevel != mAccessPoint.getLevel();
+        // In/Out of range changed
+        changed |= oldState != mIsOutOfRange;
+        // connect state changed
+        if (mConnected != mAccessPoint.isActive()) {
+            mConnected = mAccessPoint.isActive();
+            changed = true;
+            updateConnectingState(mAccessPoint.isActive() ? STATE_CONNECTED : STATE_DISCONNECTED);
+        }
+
+        return changed;
+    }
+
+    private void updateAccessPointFromScannedList() {
+        mIsOutOfRange = true;
+
+        for (AccessPoint ap : mWifiTracker.getAccessPoints()) {
+            if (mAccessPoint.matches(ap)) {
+                mAccessPoint = ap;
+                mWifiConfig = ap.getConfig();
+                mIsOutOfRange = !mAccessPoint.isReachable();
+                return;
+            }
+        }
+    }
+
+    private void exitActivity() {
+        if (DEBUG) {
+            Log.d(TAG, "Exiting the WifiNetworkDetailsPage");
+        }
+        mFragment.getActivity().finish();
+    }
+
+    private void refreshRssiViews() {
+        int signalLevel = mAccessPoint.getLevel();
+
+        // Disappears signal view if not in range. e.g. for saved networks.
+        if (mIsOutOfRange) {
+            mSignalStrengthPref.setVisible(false);
+            mRssiSignalLevel = -1;
+            return;
+        }
+
+        if (mRssiSignalLevel == signalLevel) {
+            return;
+        }
+        mRssiSignalLevel = signalLevel;
+        Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
+
+        if (mEntityHeaderController != null) {
+            mEntityHeaderController
+                    .setIcon(redrawIconForHeader(wifiIcon)).done(mFragment.getActivity(),
+                            true /* rebind */);
+        }
+
+        Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
+        wifiIconDark.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal));
+        mSignalStrengthPref.setIcon(wifiIconDark);
+
+        mSignalStrengthPref.setSummary(mSignalStr[mRssiSignalLevel]);
+        mSignalStrengthPref.setVisible(true);
+    }
+
+    private Drawable redrawIconForHeader(Drawable original) {
+        final int iconSize = mContext.getResources().getDimensionPixelSize(
+                R.dimen.wifi_detail_page_header_image_size);
+        final int actualWidth = original.getMinimumWidth();
+        final int actualHeight = original.getMinimumHeight();
+
+        if ((actualWidth == iconSize && actualHeight == iconSize)
+                || !VectorDrawable.class.isInstance(original)) {
+            return original;
+        }
+
+        // clear tint list to make sure can set 87% black after enlarge
+        original.setTintList(null);
+
+        // enlarge icon size
+        final Bitmap bitmap = Utils.createBitmap(original,
+                iconSize /*width*/,
+                iconSize /*height*/);
+        Drawable newIcon = new BitmapDrawable(null /*resource*/, bitmap);
+
+        // config color for 87% black after enlarge
+        newIcon.setTintList(Utils.getColorAttr(mContext, android.R.attr.textColorPrimary));
+
+        return newIcon;
+    }
+
+    private void refreshFrequency() {
+        if (mWifiInfo == null) {
+            mFrequencyPref.setVisible(false);
+            return;
+        }
+
+        final int frequency = mWifiInfo.getFrequency();
+        String band = null;
+        if (frequency >= AccessPoint.LOWER_FREQ_24GHZ
+                && frequency < AccessPoint.HIGHER_FREQ_24GHZ) {
+            band = mContext.getResources().getString(R.string.wifi_band_24ghz);
+        } else if (frequency >= AccessPoint.LOWER_FREQ_5GHZ
+                && frequency < AccessPoint.HIGHER_FREQ_5GHZ) {
+            band = mContext.getResources().getString(R.string.wifi_band_5ghz);
+        } else {
+            Log.e(TAG, "Unexpected frequency " + frequency);
+            // Connecting state is unstable, make it disappeared if unexpected
+            if (mConnectingState == STATE_CONNECTING) {
+                mFrequencyPref.setVisible(false);
+            }
+            return;
+        }
+        mFrequencyPref.setSummary(band);
+        mFrequencyPref.setVisible(true);
+    }
+
+    private void refreshTxSpeed() {
+        if (mWifiInfo == null) {
+            mTxLinkSpeedPref.setVisible(false);
+            return;
+        }
+
+        int txLinkSpeedMbps = mWifiInfo.getTxLinkSpeedMbps();
+        mTxLinkSpeedPref.setVisible(txLinkSpeedMbps >= 0);
+        mTxLinkSpeedPref.setSummary(mContext.getString(
+                R.string.tx_link_speed, mWifiInfo.getTxLinkSpeedMbps()));
+    }
+
+    private void refreshRxSpeed() {
+        if (mWifiInfo == null) {
+            mRxLinkSpeedPref.setVisible(false);
+            return;
+        }
+
+        int rxLinkSpeedMbps = mWifiInfo.getRxLinkSpeedMbps();
+        mRxLinkSpeedPref.setVisible(rxLinkSpeedMbps >= 0);
+        mRxLinkSpeedPref.setSummary(mContext.getString(
+                R.string.rx_link_speed, mWifiInfo.getRxLinkSpeedMbps()));
+    }
+
+    private void refreshSsid() {
+        if (mAccessPoint.isPasspoint() || mAccessPoint.isOsuProvider()) {
+            mSsidPref.setVisible(true);
+            mSsidPref.setSummary(mAccessPoint.getSsidStr());
+        } else {
+            mSsidPref.setVisible(false);
+        }
+    }
+
+    private void refreshMacAddress() {
+        String macAddress = getMacAddress();
+        if (macAddress == null) {
+            mMacAddressPref.setVisible(false);
+            return;
+        }
+
+        mMacAddressPref.setVisible(true);
+        if (macAddress.equals(WifiInfo.DEFAULT_MAC_ADDRESS)) {
+            mMacAddressPref.setSummary(R.string.device_info_not_available);
+        } else {
+            mMacAddressPref.setSummary(macAddress);
+        }
+
+        // MAC Address Pref Title
+        refreshMacTitle();
+    }
+
+    private String getMacAddress() {
+        if (mWifiInfo != null) {
+            // get MAC address from connected network information
+            return mWifiInfo.getMacAddress();
+        }
+
+        // return randomized MAC address
+        if (mWifiConfig != null && mWifiConfig.macRandomizationSetting
+                == WifiConfiguration.RANDOMIZATION_PERSISTENT) {
+            return mWifiConfig.getRandomizedMacAddress().toString();
+        }
+
+        // return device MAC address
+        final String[] macAddresses = mWifiManager.getFactoryMacAddresses();
+        if (macAddresses != null && macAddresses.length > 0) {
+            return macAddresses[0];
+        }
+
+        Log.e(TAG, "Can't get device MAC address!");
+        return null;
+    }
+
+    private void updatePreference(Preference pref, String detailText) {
+        if (!TextUtils.isEmpty(detailText)) {
+            pref.setSummary(detailText);
+            pref.setVisible(true);
+        } else {
+            pref.setVisible(false);
+        }
+    }
+
+    private void refreshButtons() {
+        // Ephemeral network won't be removed permanently, but be putted in blacklist.
+        mButtonsPref.setButton1Text(
+                mIsEphemeral ? R.string.wifi_disconnect_button_text : R.string.forget);
+
+        boolean canForgetNetwork = canForgetNetwork();
+        boolean canSignIntoNetwork = canSignIntoNetwork();
+        boolean canConnectNetwork = canConnectNetwork() && !isPasspointConfigurationR1Expired();
+        boolean canShareNetwork = canShareNetwork();
+
+        mButtonsPref.setButton1Visible(canForgetNetwork);
+        mButtonsPref.setButton2Visible(canSignIntoNetwork);
+        mButtonsPref.setButton3Visible(canConnectNetwork);
+        mButtonsPref.setButton4Visible(canShareNetwork);
+        mButtonsPref.setVisible(canForgetNetwork
+                || canSignIntoNetwork
+                || canConnectNetwork
+                || canShareNetwork);
+    }
+
+    private boolean canConnectNetwork() {
+        // Display connect button for disconnected AP even not in the range.
+        return !mAccessPoint.isActive();
+    }
+
+    private boolean isPasspointConfigurationR1Expired() {
+        return mIsPasspointConfigurationR1 && mIsExpired;
+    }
+
+    private void refreshIpLayerInfo() {
+        // Hide IP layer info if not a connected network.
+        if (!mAccessPoint.isActive() || mNetwork == null || mLinkProperties == null) {
+            mIpAddressPref.setVisible(false);
+            mSubnetPref.setVisible(false);
+            mGatewayPref.setVisible(false);
+            mDnsPref.setVisible(false);
+            mIpv6Category.setVisible(false);
+            return;
+        }
+
+        // Find IPv4 and IPv6 addresses.
+        String ipv4Address = null;
+        String subnet = null;
+        StringJoiner ipv6Addresses = new StringJoiner("\n");
+
+        for (LinkAddress addr : mLinkProperties.getLinkAddresses()) {
+            if (addr.getAddress() instanceof Inet4Address) {
+                ipv4Address = addr.getAddress().getHostAddress();
+                subnet = ipv4PrefixLengthToSubnetMask(addr.getPrefixLength());
+            } else if (addr.getAddress() instanceof Inet6Address) {
+                ipv6Addresses.add(addr.getAddress().getHostAddress());
+            }
+        }
+
+        // Find IPv4 default gateway.
+        String gateway = null;
+        for (RouteInfo routeInfo : mLinkProperties.getRoutes()) {
+            if (routeInfo.isIPv4Default() && routeInfo.hasGateway()) {
+                gateway = routeInfo.getGateway().getHostAddress();
+                break;
+            }
+        }
+
+        // Find all (IPv4 and IPv6) DNS addresses.
+        String dnsServers = mLinkProperties.getDnsServers().stream()
+                .map(InetAddress::getHostAddress)
+                .collect(Collectors.joining("\n"));
+
+        // Update UI.
+        updatePreference(mIpAddressPref, ipv4Address);
+        updatePreference(mSubnetPref, subnet);
+        updatePreference(mGatewayPref, gateway);
+        updatePreference(mDnsPref, dnsServers);
+
+        if (ipv6Addresses.length() > 0) {
+            mIpv6AddressPref.setSummary(
+                    BidiFormatter.getInstance().unicodeWrap(ipv6Addresses.toString()));
+            mIpv6Category.setVisible(true);
+        } else {
+            mIpv6Category.setVisible(false);
+        }
+    }
+
+    private static String ipv4PrefixLengthToSubnetMask(int prefixLength) {
+        try {
+            InetAddress all = InetAddress.getByAddress(
+                    new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255});
+            return NetworkUtils.getNetworkPart(all, prefixLength).getHostAddress();
+        } catch (UnknownHostException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Returns whether the network represented by this preference can be forgotten.
+     */
+    private boolean canForgetNetwork() {
+        return (mWifiInfo != null && mWifiInfo.isEphemeral()) || canModifyNetwork()
+                || mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig();
+    }
+
+    /**
+     * Returns whether the network represented by this preference can be modified.
+     */
+    public boolean canModifyNetwork() {
+        return mWifiConfig != null && !WifiUtils.isNetworkLockedDown(mContext, mWifiConfig);
+    }
+
+    /**
+     * Returns whether the user can sign into the network represented by this preference.
+     */
+    private boolean canSignIntoNetwork() {
+        return mAccessPoint.isActive() && WifiUtils.canSignIntoNetwork(mNetworkCapabilities);
+    }
+
+    /**
+     * Returns whether the user can share the network represented by this preference with QR code.
+     */
+    private boolean canShareNetwork() {
+        return mAccessPoint.getConfig() != null
+                && WifiDppUtils.isSupportConfiguratorQrCodeGenerator(mContext, mAccessPoint);
+    }
+
+    /**
+     * Forgets the wifi network associated with this preference.
+     */
+    private void forgetNetwork() {
+        if (mWifiInfo != null && mWifiInfo.isEphemeral()) {
+            mWifiManager.disableEphemeralNetwork(mWifiInfo.getSSID());
+        } else if (mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()) {
+            // Post a dialog to confirm if user really want to forget the passpoint network.
+            showConfirmForgetDialog();
+            return;
+        } else if (mWifiConfig != null) {
+            mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
+        }
+
+        mMetricsFeatureProvider.action(
+                mFragment.getActivity(), SettingsEnums.ACTION_WIFI_FORGET);
+        mFragment.getActivity().finish();
+    }
+
+    @VisibleForTesting
+    protected void showConfirmForgetDialog() {
+        final AlertDialog dialog = new AlertDialog.Builder(mContext)
+                .setPositiveButton(R.string.forget, ((dialog1, which) -> {
+                    try {
+                        mWifiManager.removePasspointConfiguration(mAccessPoint.getPasspointFqdn());
+                    } catch (RuntimeException e) {
+                        Log.e(TAG, "Failed to remove Passpoint configuration for "
+                                + mAccessPoint.getPasspointFqdn());
+                    }
+                    mMetricsFeatureProvider.action(
+                            mFragment.getActivity(), SettingsEnums.ACTION_WIFI_FORGET);
+                    mFragment.getActivity().finish();
+                }))
+                .setNegativeButton(R.string.cancel, null /* listener */)
+                .setTitle(R.string.wifi_forget_dialog_title)
+                .setMessage(R.string.forget_passpoint_dialog_message)
+                .create();
+        dialog.show();
+    }
+
+    /**
+     * Show QR code to share the network represented by this preference.
+     */
+    private void launchWifiDppConfiguratorActivity() {
+        final Intent intent = WifiDppUtils.getConfiguratorQrCodeGeneratorIntentOrNull(mContext,
+                mWifiManager, mAccessPoint);
+
+        if (intent == null) {
+            Log.e(TAG, "Launch Wi-Fi DPP QR code generator with a wrong Wi-Fi network!");
+        } else {
+            mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    SettingsEnums.ACTION_SETTINGS_SHARE_WIFI_QR_CODE,
+                    SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR,
+                    /* key */ null,
+                    /* value */ Integer.MIN_VALUE);
+
+            mContext.startActivity(intent);
+        }
+    }
+
+    /**
+     * Share the wifi network with QR code.
+     */
+    private void shareNetwork() {
+        WifiDppUtils.showLockScreen(mContext, () -> launchWifiDppConfiguratorActivity());
+    }
+
+    /**
+     * Sign in to the captive portal found on this wifi network associated with this preference.
+     */
+    private void signIntoNetwork() {
+        mMetricsFeatureProvider.action(
+                mFragment.getActivity(), SettingsEnums.ACTION_WIFI_SIGNIN);
+        mConnectivityManager.startCaptivePortalApp(mNetwork);
+    }
+
+    @Override
+    public void onSubmit(WifiDialog dialog) {
+        if (dialog.getController() != null) {
+            mWifiManager.save(dialog.getController().getConfig(), new WifiManager.ActionListener() {
+                @Override
+                public void onSuccess() {
+                }
+
+                @Override
+                public void onFailure(int reason) {
+                    Activity activity = mFragment.getActivity();
+                    if (activity != null) {
+                        Toast.makeText(activity,
+                                R.string.wifi_failed_save_message,
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * Wrapper for testing compatibility.
+     */
+    @VisibleForTesting
+    static class IconInjector {
+        private final Context mContext;
+
+        IconInjector(Context context) {
+            mContext = context;
+        }
+
+        public Drawable getIcon(int level) {
+            return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
+        }
+    }
+
+    private boolean usingDataUsageHeader(Context context) {
+        return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_DATAUSAGE_HEADER);
+    }
+
+    @VisibleForTesting
+    void connectNetwork() {
+        final Activity activity = mFragment.getActivity();
+        // error handling, connected/saved network should have mWifiConfig.
+        if (mWifiConfig == null) {
+            Toast.makeText(activity,
+                    R.string.wifi_failed_connect_message,
+                    Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        // init state before connect
+        mConnectingState = STATE_NONE;
+
+        if (mWifiManager.isWifiEnabled()) {
+            updateConnectingState(STATE_CONNECTING);
+        } else {
+            // Enable Wi-Fi automatically to connect AP
+            updateConnectingState(STATE_ENABLE_WIFI);
+        }
+    }
+
+    private void updateConnectingState(int state) {
+        final Activity activity = mFragment.getActivity();
+        Log.d(TAG, "updateConnectingState from " + mConnectingState + " to " + state);
+        switch (mConnectingState) {
+            case STATE_NONE:
+            case STATE_ENABLE_WIFI:
+                if (state == STATE_ENABLE_WIFI) {
+                    Log.d(TAG, "Turn on Wi-Fi automatically!");
+                    updateConnectedButton(STATE_ENABLE_WIFI);
+                    Toast.makeText(activity,
+                            R.string.wifi_turned_on_message,
+                            Toast.LENGTH_SHORT).show();
+                    mWifiManager.setWifiEnabled(true);
+                    // start timer for error handling
+                    startTimer();
+                } else if (state == STATE_CONNECTING) {
+                    Log.d(TAG, "connecting...");
+                    updateConnectedButton(STATE_CONNECTING);
+                    if (mAccessPoint.isPasspoint()) {
+                        mWifiManager.connect(mWifiConfig, mConnectListener);
+                    } else {
+                        mWifiManager.connect(mWifiConfig.networkId, mConnectListener);
+                    }
+                    // start timer for error handling since framework didn't call back if failed
+                    startTimer();
+                } else if (state == STATE_ENABLE_WIFI_FAILED) {
+                    Log.e(TAG, "Wi-Fi failed to enable network!");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_failed_connect_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_ENABLE_WIFI_FAILED);
+                }
+                // Do not break here for disconnected event.
+            case STATE_CONNECTED:
+                if (state == STATE_DISCONNECTED) {
+                    Log.d(TAG, "disconnected");
+                    // reset state
+                    state = STATE_NONE;
+                    updateConnectedButton(STATE_DISCONNECTED);
+                    refreshPage();
+                    // clear for getting MAC Address from saved configuration
+                    mWifiInfo = null;
+                }
+                break;
+            case STATE_CONNECTING:
+                if (state == STATE_CONNECTED) {
+                    Log.d(TAG, "connected");
+                    stopTimer();
+                    updateConnectedButton(STATE_CONNECTED);
+                    Toast.makeText(activity,
+                            mContext.getString(R.string.wifi_connected_to_message,
+                                    mAccessPoint.getTitle()),
+                            Toast.LENGTH_SHORT).show();
+
+                    refreshPage();
+                } else if (state == STATE_NOT_IN_RANGE) {
+                    Log.d(TAG, "AP not in range");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_not_in_range_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_NOT_IN_RANGE);
+                } else if (state == STATE_FAILED) {
+                    Log.d(TAG, "failed");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_failed_connect_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_FAILED);
+                }
+                break;
+            default:
+                Log.e(TAG, "Invalid state : " + mConnectingState);
+                // don't update invalid state
+                return;
+        }
+
+        mConnectingState = state;
+    }
+
+    private void updateConnectedButton(int state) {
+        switch (state) {
+            case STATE_ENABLE_WIFI:
+            case STATE_CONNECTING:
+                mButtonsPref.setButton3Text(R.string.wifi_connecting)
+                        .setButton3Enabled(false);
+                break;
+            case STATE_CONNECTED:
+                // init button state and set as invisible
+                mButtonsPref.setButton3Text(R.string.wifi_connect)
+                        .setButton3Icon(R.drawable.ic_settings_wireless)
+                        .setButton3Enabled(true)
+                        .setButton3Visible(false);
+                break;
+            case STATE_DISCONNECTED:
+            case STATE_NOT_IN_RANGE:
+            case STATE_FAILED:
+            case STATE_ENABLE_WIFI_FAILED:
+                if (isPasspointConfigurationR1Expired()) {
+                    // Hide Connect button.
+                    mButtonsPref.setButton3Visible(false);
+                } else {
+                    mButtonsPref.setButton3Text(R.string.wifi_connect)
+                            .setButton3Icon(R.drawable.ic_settings_wireless)
+                            .setButton3Enabled(true)
+                            .setButton3Visible(true);
+                }
+                break;
+            default:
+                Log.e(TAG, "Invalid connect button state : " + state);
+                break;
+        }
+    }
+
+    private void startTimer() {
+        if (sTimer != null) {
+            stopTimer();
+        }
+
+        sTimer = new CountDownTimer(TIMEOUT, TIMEOUT + 1) {
+            @Override
+            public void onTick(long millisUntilFinished) {
+                // Do nothing
+            }
+            @Override
+            public void onFinish() {
+                if (mFragment == null || mFragment.getActivity() == null) {
+                    Log.d(TAG, "Ignore timeout since activity not exist!");
+                    return;
+                }
+                Log.e(TAG, "Timeout for state:" + mConnectingState);
+                if (mConnectingState == STATE_ENABLE_WIFI) {
+                    updateConnectingState(STATE_ENABLE_WIFI_FAILED);
+                } else if (mConnectingState == STATE_CONNECTING) {
+                    updateAccessPointFromScannedList();
+                    if (mIsOutOfRange) {
+                        updateConnectingState(STATE_NOT_IN_RANGE);
+                    } else {
+                        updateConnectingState(STATE_FAILED);
+                    }
+                }
+            }
+        };
+        sTimer.start();
+    }
+
+    private void stopTimer() {
+        if (sTimer == null) return;
+
+        sTimer.cancel();
+        sTimer = 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_device_mac_address_title);
+
+    }
+}
diff --git a/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java
new file mode 100644
index 0000000..99967dc
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import android.app.backup.BackupManager;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.DropDownPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+/**
+ * {@link AbstractPreferenceController} that controls whether the wifi network is metered or not
+ */
+public class WifiMeteredPreferenceController2 extends BasePreferenceController implements
+        Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener {
+
+    private static final String KEY_WIFI_METERED = "metered";
+    private WifiConfiguration mWifiConfiguration;
+    private WifiManager mWifiManager;
+    private Preference mPreference;
+
+    public WifiMeteredPreferenceController2(Context context, WifiConfiguration wifiConfiguration) {
+        super(context, KEY_WIFI_METERED);
+        mWifiConfiguration = wifiConfiguration;
+        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final DropDownPreference dropDownPreference = (DropDownPreference) preference;
+        final int meteredOverride = getMeteredOverride();
+        dropDownPreference.setValue(Integer.toString(meteredOverride));
+        updateSummary(dropDownPreference, meteredOverride);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (mWifiConfiguration != null) {
+            mWifiConfiguration.meteredOverride = Integer.parseInt((String) newValue);
+        }
+        mWifiManager.updateNetwork(mWifiConfiguration);
+        // Stage the backup of the SettingsProvider package which backs this up
+        BackupManager.dataChanged("com.android.providers.settings");
+        updateSummary((DropDownPreference) preference, getMeteredOverride());
+        return true;
+    }
+
+    @VisibleForTesting
+    int getMeteredOverride() {
+        if (mWifiConfiguration != null) {
+            // Wrap the meteredOverride since robolectric cannot recognize it
+            return mWifiConfiguration.meteredOverride;
+        }
+        return WifiConfiguration.METERED_OVERRIDE_NONE;
+    }
+
+    private void updateSummary(DropDownPreference preference, int meteredOverride) {
+        preference.setSummary(preference.getEntries()[meteredOverride]);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void onSubmit(WifiDialog dialog) {
+        if (dialog.getController() != null) {
+            final WifiConfiguration newConfig = dialog.getController().getConfig();
+            if (newConfig == null || mWifiConfiguration == null) {
+                return;
+            }
+
+            if (newConfig.meteredOverride != mWifiConfiguration.meteredOverride) {
+                mWifiConfiguration = newConfig;
+                onPreferenceChange(mPreference, String.valueOf(newConfig.meteredOverride));
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
new file mode 100644
index 0000000..5eb4b28
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import static com.android.settings.wifi.WifiSettings.WIFI_DIALOG_ID;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.wifi.WifiConfigUiBase;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Detail page for the currently connected wifi network.
+ *
+ * <p>The AccessPoint should be saved to the intent Extras when launching this class via
+ * {@link AccessPoint#saveWifiState(Bundle)} in order to properly render this page.
+ */
+public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
+        WifiDialog.WifiDialogListener {
+
+    private static final String TAG = "WifiNetworkDetailsFrg2";
+
+    private AccessPoint mAccessPoint;
+    private WifiDetailPreferenceController2 mWifiDetailPreferenceController2;
+    private List<WifiDialog.WifiDialogListener> mWifiDialogListeners = new ArrayList<>();
+
+    @Override
+    public void onAttach(Context context) {
+        mAccessPoint = new AccessPoint(context, getArguments());
+        super.onAttach(context);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.WIFI_NETWORK_DETAILS;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_network_details_fragment;
+    }
+
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == WIFI_DIALOG_ID) {
+            return SettingsEnums.DIALOG_WIFI_AP_EDIT;
+        }
+        return 0;
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        if (getActivity() == null || mWifiDetailPreferenceController2 == null
+                || mAccessPoint == null) {
+            return null;
+        }
+        return WifiDialog.createModal(getActivity(), this, mAccessPoint,
+                WifiConfigUiBase.MODE_MODIFY);
+    }
+
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
+        item.setIcon(com.android.internal.R.drawable.ic_mode_edit);
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem menuItem) {
+        switch (menuItem.getItemId()) {
+            case Menu.FIRST:
+                if (!mWifiDetailPreferenceController2.canModifyNetwork()) {
+                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
+                            RestrictedLockUtilsInternal.getDeviceOwner(getContext()));
+                } else {
+                    showDialog(WIFI_DIALOG_ID);
+                }
+                return true;
+            default:
+                return super.onOptionsItemSelected(menuItem);
+        }
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        final ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
+
+        mWifiDetailPreferenceController2 = WifiDetailPreferenceController2.newInstance(
+                mAccessPoint,
+                cm,
+                context,
+                this,
+                new Handler(Looper.getMainLooper()),  // UI thread.
+                getSettingsLifecycle(),
+                context.getSystemService(WifiManager.class),
+                mMetricsFeatureProvider);
+
+        controllers.add(mWifiDetailPreferenceController2);
+        controllers.add(new AddDevicePreferenceController2(context).init(mAccessPoint));
+
+        final WifiMeteredPreferenceController2 meteredPreferenceController2 =
+                new WifiMeteredPreferenceController2(context, mAccessPoint.getConfig());
+        controllers.add(meteredPreferenceController2);
+
+        final WifiPrivacyPreferenceController2 privacyController2 =
+                new WifiPrivacyPreferenceController2(context);
+        privacyController2.setWifiConfiguration(mAccessPoint.getConfig());
+        privacyController2.setIsEphemeral(mAccessPoint.isEphemeral());
+        privacyController2.setIsPasspoint(
+                mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig());
+        controllers.add(privacyController2);
+
+        // Sets callback listener for wifi dialog.
+        mWifiDialogListeners.add(mWifiDetailPreferenceController2);
+        mWifiDialogListeners.add(privacyController2);
+        mWifiDialogListeners.add(meteredPreferenceController2);
+
+        return controllers;
+    }
+
+    @Override
+    public void onSubmit(WifiDialog dialog) {
+        for (WifiDialog.WifiDialogListener listener : mWifiDialogListeners) {
+            listener.onSubmit(dialog);
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
new file mode 100644
index 0000000..d85b607
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.DropDownPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+/**
+ * {@link AbstractPreferenceController} that controls whether the wifi network is mac randomized
+ * or not
+ */
+public class WifiPrivacyPreferenceController2 extends BasePreferenceController implements
+        Preference.OnPreferenceChangeListener, WifiDialog.WifiDialogListener {
+
+    private static final String KEY_WIFI_PRIVACY = "privacy";
+    private WifiConfiguration mWifiConfiguration;
+    private WifiManager mWifiManager;
+    private boolean mIsEphemeral = false;
+    private boolean mIsPasspoint = false;
+    private Preference mPreference;
+
+    public WifiPrivacyPreferenceController2(Context context) {
+        super(context, KEY_WIFI_PRIVACY);
+        mWifiConfiguration = null;
+        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+    }
+
+    public void setWifiConfiguration(WifiConfiguration wifiConfiguration) {
+        mWifiConfiguration = wifiConfiguration;
+    }
+
+    public void setIsEphemeral(boolean isEphemeral) {
+        mIsEphemeral = isEphemeral;
+    }
+
+    public void setIsPasspoint(boolean isPasspoint) {
+        mIsPasspoint = isPasspoint;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mWifiManager.isConnectedMacRandomizationSupported()
+                ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final DropDownPreference dropDownPreference = (DropDownPreference) preference;
+        final int randomizationLevel = getRandomizationValue();
+        dropDownPreference.setValue(Integer.toString(randomizationLevel));
+        updateSummary(dropDownPreference, randomizationLevel);
+
+        // Makes preference not selectable, when this is a ephemeral network.
+        if (mIsEphemeral || mIsPasspoint) {
+            preference.setSelectable(false);
+            dropDownPreference.setSummary(R.string.wifi_privacy_settings_ephemeral_summary);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (mWifiConfiguration != null) {
+            mWifiConfiguration.macRandomizationSetting = Integer.parseInt((String) newValue);
+            mWifiManager.updateNetwork(mWifiConfiguration);
+
+            // To activate changing, we need to reconnect network. WiFi will auto connect to
+            // current network after disconnect(). Only needed when this is connected network.
+            final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+            if (wifiInfo != null && wifiInfo.getNetworkId() == mWifiConfiguration.networkId) {
+                mWifiManager.disconnect();
+            }
+        }
+        updateSummary((DropDownPreference) preference, Integer.parseInt((String) newValue));
+        return true;
+    }
+
+    @VisibleForTesting
+    int getRandomizationValue() {
+        if (mWifiConfiguration != null) {
+            return mWifiConfiguration.macRandomizationSetting;
+        }
+        return WifiConfiguration.RANDOMIZATION_PERSISTENT;
+    }
+
+    private static final int PREF_RANDOMIZATION_PERSISTENT = 0;
+    private static final int PREF_RANDOMIZATION_NONE = 1;
+
+    /**
+     * Returns preference index value.
+     *
+     * @param macRandomized is mac randomized value
+     * @return index value of preference
+     */
+    public static int translateMacRandomizedValueToPrefValue(int macRandomized) {
+        return (macRandomized == WifiConfiguration.RANDOMIZATION_PERSISTENT)
+            ? PREF_RANDOMIZATION_PERSISTENT : PREF_RANDOMIZATION_NONE;
+    }
+
+    /**
+     * Returns mac randomized value.
+     *
+     * @param prefMacRandomized is preference index value
+     * @return mac randomized value
+     */
+    public static int translatePrefValueToMacRandomizedValue(int prefMacRandomized) {
+        return (prefMacRandomized == PREF_RANDOMIZATION_PERSISTENT)
+            ? WifiConfiguration.RANDOMIZATION_PERSISTENT : WifiConfiguration.RANDOMIZATION_NONE;
+    }
+
+    private void updateSummary(DropDownPreference preference, int macRandomized) {
+        // Translates value here to set RANDOMIZATION_PERSISTENT as first item in UI for better UX.
+        final int prefMacRandomized = translateMacRandomizedValueToPrefValue(macRandomized);
+        preference.setSummary(preference.getEntries()[prefMacRandomized]);
+    }
+
+    @Override
+    public void onSubmit(WifiDialog dialog) {
+        if (dialog.getController() != null) {
+            final WifiConfiguration newConfig = dialog.getController().getConfig();
+            if (newConfig == null || mWifiConfiguration == null) {
+                return;
+            }
+
+            if (newConfig.macRandomizationSetting != mWifiConfiguration.macRandomizationSetting) {
+                mWifiConfiguration = newConfig;
+                onPreferenceChange(mPreference, String.valueOf(newConfig.macRandomizationSetting));
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 3975170..8544a53 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -152,7 +152,7 @@
                 } else {
                     updateSearchMenu(false);
                 }
-            } else if (WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION.equals(action)) {
+            } else if (WifiP2pManager.ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED.equals(action)) {
                 if (mWifiP2pManager != null) {
                     mWifiP2pManager.requestPersistentGroupInfo(mChannel, WifiP2pSettings.this);
                 }
@@ -339,7 +339,7 @@
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);
-        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION);
+        mIntentFilter.addAction(WifiP2pManager.ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED);
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
 
         getActivity().registerReceiver(mReceiver, mIntentFilter);
diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java
new file mode 100644
index 0000000..3b735fa
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 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.savedaccesspoints2;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.wifi.WifiEntryPreference;
+import com.android.wifitrackerlib.WifiEntry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller that manages a PreferenceGroup, which contains a list of saved access points.
+ */
+public class SavedAccessPointsPreferenceController2 extends BasePreferenceController implements
+        Preference.OnPreferenceClickListener {
+
+    private PreferenceGroup mPreferenceGroup;
+    private SavedAccessPointsWifiSettings2 mHost;
+    @VisibleForTesting
+    List<WifiEntry> mWifiEntries = new ArrayList<>();
+
+    public SavedAccessPointsPreferenceController2(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    /**
+     * Set {@link SavedAccessPointsWifiSettings2} for click callback action.
+     */
+    public SavedAccessPointsPreferenceController2 setHost(SavedAccessPointsWifiSettings2 host) {
+        mHost = host;
+        return this;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mWifiEntries.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        mPreferenceGroup = screen.findPreference(getPreferenceKey());
+        updatePreference();
+        super.displayPreference(screen);
+    }
+
+    void displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries) {
+        if (wifiEntries == null || wifiEntries.isEmpty()) {
+            mWifiEntries.clear();
+        } else {
+            mWifiEntries = wifiEntries;
+        }
+
+        displayPreference(screen);
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        if (mHost != null) {
+            mHost.showWifiPage(preference.getKey(), preference.getTitle());
+        }
+        return false;
+    }
+
+    private void updatePreference() {
+        mPreferenceGroup.removeAll();
+        for (WifiEntry wifiEntry : mWifiEntries) {
+            final WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry);
+            preference.setKey(wifiEntry.getKey());
+            preference.setOnPreferenceClickListener(this);
+
+            mPreferenceGroup.addPreference(preference);
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java
new file mode 100644
index 0000000..e094051
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 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.savedaccesspoints2;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkScoreManager;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+import android.os.SimpleClock;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.wifi.WifiSettings;
+import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
+import com.android.wifitrackerlib.SavedNetworkTracker;
+
+import java.time.Clock;
+import java.time.ZoneOffset;
+
+/**
+ * UI to manage saved networks/access points.
+ */
+public class SavedAccessPointsWifiSettings2 extends DashboardFragment
+        implements SavedNetworkTracker.SavedNetworkTrackerCallback {
+
+    private static final String TAG = "SavedAccessPoints2";
+
+    // Key of a Bundle to save/restore the selected WifiEntry
+    static final String KEY_KEY = "key_key";
+
+    // Max age of tracked WifiEntries
+    private static final long MAX_SCAN_AGE_MILLIS = 15_000;
+    // Interval between initiating SavedNetworkTracker scans
+    private static final long SCAN_INTERVAL_MILLIS = 10_000;
+
+    private SavedNetworkTracker mSavedNetworkTracker;
+    private HandlerThread mWorkerThread;
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.WIFI_SAVED_ACCESS_POINTS;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_display_saved_access_points2;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(SavedAccessPointsPreferenceController2.class).setHost(this);
+        use(SubscribedAccessPointsPreferenceController2.class).setHost(this);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Context context = getContext();
+        mWorkerThread = new HandlerThread(TAG
+                + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+                Process.THREAD_PRIORITY_BACKGROUND);
+        mWorkerThread.start();
+        final Clock elapsedRealtimeClock = new SimpleClock(ZoneOffset.UTC) {
+            @Override
+            public long millis() {
+                return SystemClock.elapsedRealtime();
+            }
+        };
+        mSavedNetworkTracker = new SavedNetworkTracker(getSettingsLifecycle(), context,
+                context.getSystemService(WifiManager.class),
+                context.getSystemService(ConnectivityManager.class),
+                context.getSystemService(NetworkScoreManager.class),
+                new Handler(Looper.getMainLooper()),
+                mWorkerThread.getThreadHandler(),
+                elapsedRealtimeClock,
+                MAX_SCAN_AGE_MILLIS,
+                SCAN_INTERVAL_MILLIS,
+                this);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        onSavedWifiEntriesChanged();
+        onSubscriptionWifiEntriesChanged();
+    }
+
+    @Override
+    public void onDestroy() {
+        mWorkerThread.quit();
+
+        super.onDestroy();
+    }
+
+    /**
+     * Shows {@link WifiNetworkDetailsFragment2} for assigned key of {@link WifiEntry}.
+     */
+    public void showWifiPage(@NonNull String key, CharSequence title) {
+        removeDialog(WifiSettings.WIFI_DIALOG_ID);
+
+        if (TextUtils.isEmpty(key)) {
+            Log.e(TAG, "Not able to show WifiEntry of an empty key");
+            return;
+        }
+
+        final Bundle bundle = new Bundle();
+        bundle.putString(KEY_KEY, key);
+
+        new SubSettingLauncher(getContext())
+                .setTitleText(title)
+                .setDestination(WifiNetworkDetailsFragment2.class.getName())
+                .setArguments(bundle)
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
+    }
+
+    @Override
+    public void onWifiStateChanged() {
+        // Do nothing.
+    }
+
+    @Override
+    public void onSavedWifiEntriesChanged() {
+        final PreferenceScreen screen = getPreferenceScreen();
+        use(SavedAccessPointsPreferenceController2.class)
+                .displayPreference(screen, mSavedNetworkTracker.getSavedWifiEntries());
+    }
+
+    @Override
+    public void onSubscriptionWifiEntriesChanged() {
+        final PreferenceScreen screen = getPreferenceScreen();
+        use(SubscribedAccessPointsPreferenceController2.class)
+                .displayPreference(screen, mSavedNetworkTracker.getSubscriptionWifiEntries());
+    }
+}
diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SubscribedAccessPointsPreferenceController2.java b/src/com/android/settings/wifi/savedaccesspoints2/SubscribedAccessPointsPreferenceController2.java
new file mode 100644
index 0000000..8898458
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints2/SubscribedAccessPointsPreferenceController2.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 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.savedaccesspoints2;
+
+import android.content.Context;
+
+/**
+ * Controller that manages a PreferenceGroup, which contains a list of subscribed access points.
+ */
+public class SubscribedAccessPointsPreferenceController2 extends
+        SavedAccessPointsPreferenceController2 {
+
+    public SubscribedAccessPointsPreferenceController2(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+}
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index e5c8de5..97ac9c5 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -38,6 +38,7 @@
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.drawable.IconCompat;
@@ -54,8 +55,10 @@
 import com.android.settings.slices.SliceBuilderUtils;
 import com.android.settings.wifi.WifiDialogActivity;
 import com.android.settings.wifi.WifiSettings;
+import com.android.settings.wifi.WifiSettings2;
 import com.android.settings.wifi.WifiUtils;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
 import com.android.settingslib.wifi.AccessPoint;
 
 import java.util.Arrays;
@@ -247,13 +250,24 @@
         accessPoint.saveWifiState(extras);
 
         if (accessPoint.isActive()) {
-            final Intent intent = new SubSettingLauncher(mContext)
-                    .setTitleRes(R.string.pref_title_network_details)
-                    .setDestination(WifiNetworkDetailsFragment.class.getName())
-                    .setArguments(extras)
-                    .setSourceMetricsCategory(SettingsEnums.WIFI)
-                    .toIntent();
-            return getActivityAction(requestCode, intent, icon, title);
+            Intent intent;
+            if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+                intent = new SubSettingLauncher(mContext)
+                        .setTitleRes(R.string.pref_title_network_details)
+                        .setDestination(WifiNetworkDetailsFragment2.class.getName())
+                        .setArguments(extras)
+                        .setSourceMetricsCategory(SettingsEnums.WIFI)
+                        .toIntent();
+                return getActivityAction(requestCode, intent, icon, title);
+            } else {
+                intent = new SubSettingLauncher(mContext)
+                        .setTitleRes(R.string.pref_title_network_details)
+                        .setDestination(WifiNetworkDetailsFragment.class.getName())
+                        .setArguments(extras)
+                        .setSourceMetricsCategory(SettingsEnums.WIFI)
+                        .toIntent();
+                return getActivityAction(requestCode, intent, icon, title);
+            }
         } else if (WifiUtils.getConnectingType(accessPoint) != WifiUtils.CONNECT_TYPE_OTHERS) {
             final Intent intent = new Intent(mContext, ConnectToWifiHandler.class)
                     .putExtra(WifiDialogActivity.KEY_ACCESS_POINT_STATE, extras);
@@ -317,11 +331,21 @@
     public Intent getIntent() {
         final String screenTitle = mContext.getText(R.string.wifi_settings).toString();
         final Uri contentUri = new Uri.Builder().appendPath(KEY_WIFI).build();
-        final Intent intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
+
+        Intent intent;
+        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
+            intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
+                WifiSettings2.class.getName(), KEY_WIFI, screenTitle,
+                SettingsEnums.DIALOG_WIFI_AP_EDIT)
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(contentUri);
+        } else {
+            intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
                 WifiSettings.class.getName(), KEY_WIFI, screenTitle,
                 SettingsEnums.DIALOG_WIFI_AP_EDIT)
                 .setClassName(mContext.getPackageName(), SubSettings.class.getName())
                 .setData(contentUri);
+        }
 
         return intent;
     }
diff --git a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
index 675108d..c29807b 100644
--- a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
+++ b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
@@ -11,4 +11,5 @@
 com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController
 com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController
 com.android.settings.security.VisiblePatternProfilePreferenceController
-com.android.settings.wifi.details.WifiMeteredPreferenceController
\ No newline at end of file
+com.android.settings.wifi.details.WifiMeteredPreferenceController
+com.android.settings.wifi.details2.WifiMeteredPreferenceController2
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
index 6ef0018..df41b706 100644
--- a/tests/robotests/assets/grandfather_not_implementing_index_provider
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -87,4 +87,6 @@
 com.android.settings.wifi.p2p.WifiP2pSettings
 com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings
 com.android.settings.wifi.WifiInfo
-com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails
\ No newline at end of file
+com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails
+com.android.settings.wifi.details2.WifiNetworkDetailsFragment2
+com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index 4543114..80a3a11 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -28,7 +28,9 @@
 import android.app.Activity;
 import android.content.ClipboardManager;
 import android.content.Context;
+import android.content.pm.UserInfo;
 import android.os.Process;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
 
@@ -120,7 +122,7 @@
     @Test
     public void handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref() {
         mShadowUserManager.setIsAdminUser(false);
-        mShadowUserManager.setIsDemoUser(true);
+        mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
     }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java
index dcfba42..8fad638 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java
@@ -81,13 +81,13 @@
     }
 
     @Test
-    public void updateBatteryTipAvailabilityCache_hasImportantTip_shouldReturnTrue() {
+    public void refreshBatteryTips_hasImportantTip_shouldReturnTrue() {
         final List<BatteryTip> tips = new ArrayList<>();
         tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, ""));
         tips.add(new EarlyWarningTip(BatteryTip.StateType.NEW, false));
         ShadowBatteryTipLoader.setBatteryTips(tips);
 
-        BatteryFixSlice.updateBatteryTipAvailabilityCache(mContext);
+        BatteryFixSlice.refreshBatteryTips(mContext);
 
         assertThat(BatteryFixSlice.isBatteryTipAvailableFromCache(mContext)).isTrue();
     }
@@ -99,7 +99,7 @@
         tips.add(new EarlyWarningTip(BatteryTip.StateType.HANDLED, false));
         ShadowBatteryTipLoader.setBatteryTips(tips);
 
-        BatteryFixSlice.updateBatteryTipAvailabilityCache(mContext);
+        BatteryFixSlice.refreshBatteryTips(mContext);
         final Slice slice = mSlice.getSlice();
 
         assertThat(SliceMetadata.from(mContext, slice).isErrorSlice()).isTrue();
@@ -115,7 +115,7 @@
         tips.add(new EarlyWarningTip(BatteryTip.StateType.NEW, false));
         // Create fake cache data
         ShadowBatteryTipLoader.setBatteryTips(tips);
-        BatteryFixSlice.updateBatteryTipAvailabilityCache(mContext);
+        BatteryFixSlice.refreshBatteryTips(mContext);
         // Create fake background worker data
         BatteryFixSlice.BatteryTipWorker batteryTipWorker = mock(
                 BatteryFixSlice.BatteryTipWorker.class);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
index c4f1948..426983d 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
@@ -42,6 +42,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -130,6 +131,7 @@
     }
 
     @Test
+    @Ignore
     public void updateBottomNavigationViewV2_twoSubscription_shouldNotCrash() {
         mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
 
@@ -139,6 +141,7 @@
     }
 
     @Test
+    @Ignore
     public void switchFragment_switchBetweenTwoSubscriptions() {
         mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
 
@@ -154,6 +157,7 @@
     }
 
     @Test
+    @Ignore
     public void switchFragment_subscriptionsUpdate_notifyByIntent() {
         mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
 
@@ -181,6 +185,7 @@
     }
 
     @Test
+    @Ignore
     public void onSaveInstanceState_saveCurrentSubId() {
         mSubscriptionManager.setActiveSubscriptionInfos(mSubscriptionInfo1, mSubscriptionInfo2);
 
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
index d251480..f2a932e 100644
--- a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
@@ -18,6 +18,8 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
 import android.provider.Settings;
 
 import com.android.settings.testutils.shadow.ShadowUserManager;
@@ -81,7 +83,7 @@
         Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
 
         // Indicate the user is a demo user.
-        mShadowUserManager.setIsDemoUser(true);
+        mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
 
         assertThat(mController.isAvailable()).isTrue();
     }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowThreadUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowThreadUtils.java
index 61ce13d..4f0767c 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowThreadUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowThreadUtils.java
@@ -16,16 +16,12 @@
 
 package com.android.settings.testutils.shadow;
 
-import android.util.Log;
-
 import com.android.settingslib.utils.ThreadUtils;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 
-import java.util.concurrent.Callable;
-
 @Implements(ThreadUtils.class)
 public class ShadowThreadUtils {
 
@@ -43,15 +39,6 @@
     }
 
     @Implementation
-    protected static void postOnBackgroundThread(Callable callable) {
-        try {
-            callable.call();
-        } catch (Exception e) {
-            Log.e(TAG, e.getMessage(), e);
-        }
-    }
-
-    @Implementation
     protected static void postOnMainThread(Runnable runnable) {
         runnable.run();
     }
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
new file mode 100644
index 0000000..8d15224
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
@@ -0,0 +1,1905 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.MacAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.RouteInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
+import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.ActionButtonsPreference;
+import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.WifiTracker;
+import com.android.settingslib.wifi.WifiTrackerFactory;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InOrder;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowToast;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDevicePolicyManager.class, ShadowEntityHeaderController.class})
+public class WifiDetailPreferenceController2Test {
+
+    private static final int LEVEL = 1;
+    private static final int RSSI = -55;
+    private static final int TX_LINK_SPEED = 123;
+    private static final int RX_LINK_SPEED = 54;
+    private static final String SSID = "ssid";
+    private static final String MAC_ADDRESS = "01:23:45:67:89:ab";
+    private static final String RANDOMIZED_MAC_ADDRESS = "RANDOMIZED_MAC_ADDRESS";
+    private static final String FACTORY_MAC_ADDRESS = "FACTORY_MAC_ADDRESS";
+    private static final String SECURITY = "None";
+    private static final String FQDN = "fqdn";
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceScreen mMockScreen;
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private FragmentActivity mMockActivity;
+    @Mock
+    private ConnectivityManager mMockConnectivityManager;
+    @Mock
+    private Network mMockNetwork;
+    @Mock
+    private NetworkInfo mMockNetworkInfo;
+    @Mock
+    private WifiConfiguration mMockWifiConfig;
+    @Mock
+    private WifiInfo mMockWifiInfo;
+    @Mock
+    private WifiNetworkDetailsFragment2 mMockFragment;
+    @Mock
+    private WifiManager mMockWifiManager;
+    @Mock
+    private WifiTracker mMockWifiTracker;
+    @Mock
+    private MetricsFeatureProvider mMockMetricsFeatureProvider;
+    @Mock
+    private WifiDetailPreferenceController2.IconInjector mMockIconInjector;
+    @Mock
+    private MacAddress mMockMacAddress;
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private EntityHeaderController mMockHeaderController;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private LayoutPreference mMockHeaderLayoutPreference;
+    @Mock
+    private ImageView mMockHeaderIcon;
+
+    @Mock
+    private ActionButtonsPreference mMockButtonsPref;
+    @Mock
+    private Preference mMockSignalStrengthPref;
+    @Mock
+    private Preference mMockTxLinkSpeedPref;
+    @Mock
+    private Preference mMockRxLinkSpeedPref;
+    @Mock
+    private Preference mMockFrequencyPref;
+    @Mock
+    private Preference mMockSecurityPref;
+    @Mock
+    private Preference mMockSsidPref;
+    @Mock
+    private Preference mMockMacAddressPref;
+    @Mock
+    private Preference mMockIpAddressPref;
+    @Mock
+    private Preference mMockGatewayPref;
+    @Mock
+    private Preference mMockSubnetPref;
+    @Mock
+    private Preference mMockDnsPref;
+    @Mock
+    private PreferenceCategory mMockIpv6Category;
+    @Mock
+    private Preference mMockIpv6AddressesPref;
+    @Mock
+    private PackageManager mMockPackageManager;
+
+    @Captor
+    private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
+    @Captor
+    private ArgumentCaptor<View.OnClickListener> mForgetClickListener;
+
+    private Context mContext;
+    private Lifecycle mLifecycle;
+    private LifecycleOwner mLifecycleOwner;
+    private LinkProperties mLinkProperties;
+    private WifiDetailPreferenceController2 mController;
+
+    // This class exists so that these values can be made static final. They can't be static final
+    // members of the test class, because any attempt to call IpPrefix or RouteInfo constructors
+    // during static initialization of the test class results in NoSuchMethorError being thrown
+    // when the test is run.
+    private static class Constants {
+        static final int IPV4_PREFIXLEN = 25;
+        static final LinkAddress IPV4_ADDR;
+        static final Inet4Address IPV4_GATEWAY;
+        static final RouteInfo IPV4_DEFAULT;
+        static final RouteInfo IPV4_SUBNET;
+        static final LinkAddress IPV6_LINKLOCAL;
+        static final LinkAddress IPV6_GLOBAL1;
+        static final LinkAddress IPV6_GLOBAL2;
+        static final InetAddress IPV4_DNS1;
+        static final InetAddress IPV4_DNS2;
+        static final InetAddress IPV6_DNS;
+
+        private static LinkAddress ipv6LinkAddress(String addr) throws UnknownHostException {
+            return new LinkAddress(InetAddress.getByName(addr), 64);
+        }
+
+        private static LinkAddress ipv4LinkAddress(String addr, int prefixlen)
+                throws UnknownHostException {
+            return new LinkAddress(InetAddress.getByName(addr), prefixlen);
+        }
+
+        static {
+            try {
+                // We create our test constants in these roundabout ways because the robolectric
+                // shadows don't contain NetworkUtils.parseNumericAddress and other utility methods,
+                // so the easy ways to do things fail with NoSuchMethodError.
+                IPV4_ADDR = ipv4LinkAddress("192.0.2.2", IPV4_PREFIXLEN);
+                IPV4_GATEWAY = (Inet4Address) InetAddress.getByName("192.0.2.127");
+
+                final Inet4Address any4 = (Inet4Address) InetAddress.getByName("0.0.0.0");
+                IpPrefix subnet = new IpPrefix(IPV4_ADDR.getAddress(), IPV4_PREFIXLEN);
+                IPV4_SUBNET = new RouteInfo(subnet, any4);
+                IPV4_DEFAULT = new RouteInfo(new IpPrefix(any4, 0), IPV4_GATEWAY);
+
+                IPV6_LINKLOCAL = ipv6LinkAddress("fe80::211:25ff:fef8:7cb2%1");
+                IPV6_GLOBAL1 = ipv6LinkAddress("2001:db8:1::211:25ff:fef8:7cb2");
+                IPV6_GLOBAL2 = ipv6LinkAddress("2001:db8:1::3dfe:8902:f98f:739d");
+
+                IPV4_DNS1 = InetAddress.getByName("8.8.8.8");
+                IPV4_DNS2 = InetAddress.getByName("8.8.4.4");
+                IPV6_DNS = InetAddress.getByName("2001:4860:4860::64");
+            } catch (UnknownHostException e) {
+                throw new RuntimeException("Invalid hardcoded IP addresss: " + e);
+            }
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+
+        when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+        when(mMockAccessPoint.getConfig()).thenReturn(mMockWifiConfig);
+        when(mMockAccessPoint.getLevel()).thenReturn(LEVEL);
+        when(mMockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
+        when(mMockAccessPoint.getSsidStr()).thenReturn(SSID);
+        when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
+                .thenReturn(mMockNetworkInfo);
+        doNothing().when(mMockConnectivityManager).registerNetworkCallback(
+                nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class));
+        mMockButtonsPref = createMock();
+        when(mMockButtonsPref.setButton1OnClickListener(mForgetClickListener.capture()))
+                .thenReturn(mMockButtonsPref);
+
+        when(mMockWifiInfo.getTxLinkSpeedMbps()).thenReturn(TX_LINK_SPEED);
+        when(mMockWifiInfo.getRxLinkSpeedMbps()).thenReturn(RX_LINK_SPEED);
+        when(mMockWifiInfo.getRssi()).thenReturn(RSSI);
+        when(mMockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS);
+        when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo);
+
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(mMockNetwork);
+        mLinkProperties = new LinkProperties();
+        when(mMockConnectivityManager.getLinkProperties(mMockNetwork)).thenReturn(mLinkProperties);
+
+        when(mMockFragment.getActivity()).thenReturn(mMockActivity);
+
+        ShadowEntityHeaderController.setUseMock(mMockHeaderController);
+        // builder pattern
+        when(mMockHeaderController.setRecyclerView(mMockFragment.getListView(), mLifecycle))
+                .thenReturn(mMockHeaderController);
+        when(mMockHeaderController.setSummary(anyString())).thenReturn(mMockHeaderController);
+        when(mMockIconInjector.getIcon(anyInt())).thenReturn(new ColorDrawable());
+
+        setupMockedPreferenceScreen();
+    }
+
+    private void setUpForConnectedNetwork() {
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        ArrayList list = new ArrayList<>();
+        list.add(mMockAccessPoint);
+        when(mMockWifiTracker.getAccessPoints()).thenReturn(list);
+        WifiTrackerFactory.setTestingWifiTracker(mMockWifiTracker);
+        when(mMockAccessPoint.matches(any(AccessPoint.class))).thenReturn(true);
+        when(mMockAccessPoint.isReachable()).thenReturn(true);
+
+        mController = newWifiDetailPreferenceController2();
+    }
+
+    private void setUpForDisconnectedNetwork() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+        ArrayList list = new ArrayList<>();
+        list.add(mMockAccessPoint);
+        when(mMockWifiTracker.getAccessPoints()).thenReturn(list);
+        WifiTrackerFactory.setTestingWifiTracker(mMockWifiTracker);
+        when(mMockAccessPoint.matches(any(AccessPoint.class))).thenReturn(true);
+        when(mMockAccessPoint.isReachable()).thenReturn(true);
+
+        mController = newWifiDetailPreferenceController2();
+    }
+
+    private void setUpForNotInRangeNetwork() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+        ArrayList list = new ArrayList<>();
+        list.add(mMockAccessPoint);
+        when(mMockWifiTracker.getAccessPoints()).thenReturn(list);
+        WifiTrackerFactory.setTestingWifiTracker(mMockWifiTracker);
+        when(mMockAccessPoint.matches(any(AccessPoint.class))).thenReturn(false);
+        when(mMockAccessPoint.isReachable()).thenReturn(false);
+
+        mController = newWifiDetailPreferenceController2();
+    }
+
+    private WifiDetailPreferenceController2 newWifiDetailPreferenceController2() {
+        return new WifiDetailPreferenceController2(
+                mMockAccessPoint,
+                mMockConnectivityManager,
+                mContext,
+                mMockFragment,
+                null,  // Handler
+                mLifecycle,
+                mMockWifiManager,
+                mMockMetricsFeatureProvider,
+                mMockIconInjector);
+    }
+
+    private void setupMockedPreferenceScreen() {
+        when(mMockScreen.getPreferenceManager().getContext()).thenReturn(mContext);
+
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_HEADER))
+                .thenReturn(mMockHeaderLayoutPreference);
+        when(mMockHeaderLayoutPreference.findViewById(R.id.entity_header_icon))
+                .thenReturn(mMockHeaderIcon);
+
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_BUTTONS_PREF))
+                .thenReturn(mMockButtonsPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_SIGNAL_STRENGTH_PREF))
+                .thenReturn(mMockSignalStrengthPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_TX_LINK_SPEED))
+                .thenReturn(mMockTxLinkSpeedPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_RX_LINK_SPEED))
+                .thenReturn(mMockRxLinkSpeedPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_FREQUENCY_PREF))
+                .thenReturn(mMockFrequencyPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_SECURITY_PREF))
+                .thenReturn(mMockSecurityPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_SSID_PREF))
+                .thenReturn(mMockSsidPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_MAC_ADDRESS_PREF))
+                .thenReturn(mMockMacAddressPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_IP_ADDRESS_PREF))
+                .thenReturn(mMockIpAddressPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_GATEWAY_PREF))
+                .thenReturn(mMockGatewayPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_SUBNET_MASK_PREF))
+                .thenReturn(mMockSubnetPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_DNS_PREF))
+                .thenReturn(mMockDnsPref);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_IPV6_CATEGORY))
+                .thenReturn(mMockIpv6Category);
+        when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_IPV6_ADDRESSES_PREF))
+                .thenReturn(mMockIpv6AddressesPref);
+    }
+
+    private void displayAndResume() {
+        mController.displayPreference(mMockScreen);
+        mController.onResume();
+    }
+
+    @Test
+    public void isAvailable_shouldAlwaysReturnTrue() {
+        setUpForConnectedNetwork();
+        mController.displayPreference(mMockScreen);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void securityPreference_stringShouldBeSet() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        verify(mMockSecurityPref).setSummary(SECURITY);
+    }
+
+    @Test
+    public void latestWifiInfo_shouldBeFetchedInDisplayPreferenceForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockWifiManager, times(1)).getConnectionInfo();
+    }
+
+    @Test
+    public void latestWifiInfo_shouldNotBeFetchedInDisplayPreferenceForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockWifiManager, never()).getConnectionInfo();
+    }
+
+    @Test
+    public void latestWifiInfo_shouldNotBeFetchedInDisplayPreferenceForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockWifiManager, never()).getConnectionInfo();
+    }
+
+    @Test
+    public void latestNetworkInfo_shouldBeFetchedInDisplayPreferenceForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
+    }
+
+    @Test
+    public void latestNetworkInfo_shouldNotBeFetchedInDisplayPreferenceForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, never()).getNetworkInfo(any(Network.class));
+    }
+
+    @Test
+    public void latestNetworkInfo_shouldNotBeFetchedInDisplayPreferenceForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, never()).getNetworkInfo(any(Network.class));
+    }
+
+    @Test
+    public void networkCallback_shouldBeRegisteredOnResume() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).registerNetworkCallback(
+                nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class));
+    }
+
+    @Test
+    public void networkCallback_shouldBeUnregisteredOnPause() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+        mController.onPause();
+
+        verify(mMockConnectivityManager, times(1))
+                .unregisterNetworkCallback(mCallbackCaptor.getValue());
+    }
+
+    @Test
+    public void entityHeader_shouldHaveIconSetForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        Drawable expectedIcon = mMockIconInjector.getIcon(LEVEL);
+
+        displayAndResume();
+
+        verify(mMockHeaderController).setIcon(expectedIcon);
+    }
+
+    @Test
+    public void entityHeader_shouldHaveIconSetForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        Drawable expectedIcon = mMockIconInjector.getIcon(LEVEL);
+
+        displayAndResume();
+
+        verify(mMockHeaderController).setIcon(expectedIcon);
+    }
+
+    @Test
+    public void entityHeader_shouldNotHaveIconSetForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockHeaderController, never()).setIcon(any(Drawable.class));
+    }
+
+    @Test
+    public void entityHeader_shouldHaveLabelSetToTitle() {
+        setUpForConnectedNetwork();
+        String label = "title";
+        when(mMockAccessPoint.getTitle()).thenReturn(label);
+
+        displayAndResume();
+
+        verify(mMockHeaderController).setLabel(label);
+    }
+
+    @Test
+    public void entityHeader_shouldHaveSummarySet() {
+        setUpForConnectedNetwork();
+        String summary = "summary";
+        when(mMockAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                .thenReturn(summary);
+
+        displayAndResume();
+
+        verify(mMockHeaderController).setSummary(summary);
+    }
+
+    @Test
+    public void entityHeader_shouldConvertSavedAsDisconnected() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockAccessPoint, times(1)).getSettingsSummary(true /*convertSavedAsDisconnected*/);
+    }
+
+    @Test
+    public void signalStrengthPref_shouldHaveIconSetForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref).setIcon(any(Drawable.class));
+    }
+
+    @Test
+    public void signalStrengthPref_shouldHaveIconSetForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref).setIcon(any(Drawable.class));
+    }
+
+    @Test
+    public void signalStrengthPref_shouldNotHaveIconSetForOutOfRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref, never()).setIcon(any(Drawable.class));
+    }
+
+    @Test
+    public void signalStrengthPref_shouldHaveDetailTextSetForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        String expectedStrength =
+                mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL];
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref).setSummary(expectedStrength);
+    }
+
+    @Test
+    public void signalStrengthPref_shouldHaveDetailTextSetForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        String expectedStrength =
+                mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL];
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref).setSummary(expectedStrength);
+    }
+
+    @Test
+    public void signalStrengthPref_shouldNotHaveDetailTextSetForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockSignalStrengthPref, never()).setSummary(any(String.class));
+    }
+
+    @Test
+    public void linkSpeedPref_shouldNotShowIfNotSet() {
+        setUpForConnectedNetwork();
+        when(mMockWifiInfo.getTxLinkSpeedMbps()).thenReturn(WifiInfo.LINK_SPEED_UNKNOWN);
+
+        displayAndResume();
+
+        verify(mMockTxLinkSpeedPref).setVisible(false);
+    }
+
+    @Test
+    public void linkSpeedPref_shouldVisibleForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        String expectedLinkSpeed = mContext.getString(R.string.tx_link_speed, TX_LINK_SPEED);
+
+        displayAndResume();
+
+        verify(mMockTxLinkSpeedPref).setVisible(true);
+        verify(mMockTxLinkSpeedPref).setSummary(expectedLinkSpeed);
+    }
+
+    @Test
+    public void linkSpeedPref_shouldInvisibleForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockTxLinkSpeedPref).setVisible(false);
+        verify(mMockTxLinkSpeedPref, never()).setSummary(any(String.class));
+    }
+
+    @Test
+    public void linkSpeedPref_shouldInvisibleForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockTxLinkSpeedPref).setVisible(false);
+        verify(mMockTxLinkSpeedPref, never()).setSummary(any(String.class));
+    }
+
+    @Test
+    public void rxLinkSpeedPref_shouldNotShowIfNotSet() {
+        setUpForConnectedNetwork();
+        when(mMockWifiInfo.getRxLinkSpeedMbps()).thenReturn(WifiInfo.LINK_SPEED_UNKNOWN);
+
+        displayAndResume();
+
+        verify(mMockRxLinkSpeedPref).setVisible(false);
+    }
+
+    @Test
+    public void rxLinkSpeedPref_shouldVisibleForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        String expectedLinkSpeed = mContext.getString(R.string.rx_link_speed, RX_LINK_SPEED);
+
+        displayAndResume();
+
+        verify(mMockRxLinkSpeedPref).setVisible(true);
+        verify(mMockRxLinkSpeedPref).setSummary(expectedLinkSpeed);
+    }
+
+    @Test
+    public void rxLinkSpeedPref_shouldInvisibleForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockRxLinkSpeedPref).setVisible(false);
+        verify(mMockRxLinkSpeedPref, never()).setSummary(any(String.class));
+    }
+
+    @Test
+    public void rxLinkSpeedPref_shouldInvisibleForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        verify(mMockRxLinkSpeedPref).setVisible(false);
+        verify(mMockRxLinkSpeedPref, never()).setSummary(any(String.class));
+    }
+
+    @Test
+    public void ssidPref_shouldHaveDetailTextSetForPasspointR1() {
+        setUpForConnectedNetwork();
+        when(mMockAccessPoint.isPasspoint()).thenReturn(true);
+        when(mMockAccessPoint.isOsuProvider()).thenReturn(false);
+
+        displayAndResume();
+
+        verify(mMockSsidPref, times(1)).setSummary(SSID);
+        verify(mMockSsidPref, times(1)).setVisible(true);
+    }
+
+    @Test
+    public void ssidPref_shouldHaveDetailTextSetForPasspointR2() {
+        setUpForConnectedNetwork();
+        when(mMockAccessPoint.isPasspoint()).thenReturn(false);
+        when(mMockAccessPoint.isOsuProvider()).thenReturn(true);
+
+        displayAndResume();
+
+        verify(mMockSsidPref, times(1)).setSummary(SSID);
+        verify(mMockSsidPref, times(1)).setVisible(true);
+    }
+
+    @Test
+    public void ssidPref_shouldNotShowIfNotPasspoint() {
+        setUpForConnectedNetwork();
+        when(mMockAccessPoint.isPasspoint()).thenReturn(false);
+        when(mMockAccessPoint.isOsuProvider()).thenReturn(false);
+
+        displayAndResume();
+
+        verify(mMockSsidPref).setVisible(false);
+    }
+
+    @Test
+    public void macAddressPref_shouldVisibleForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockMacAddressPref).setVisible(true);
+        verify(mMockMacAddressPref).setSummary(MAC_ADDRESS);
+    }
+
+    @Test
+    public void macAddressPref_shouldVisibleAsRandomizedForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        mMockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_PERSISTENT;
+        when(mMockWifiConfig.getRandomizedMacAddress()).thenReturn(mMockMacAddress);
+        when(mMockMacAddress.toString()).thenReturn(RANDOMIZED_MAC_ADDRESS);
+
+        displayAndResume();
+
+        verify(mMockMacAddressPref).setVisible(true);
+        verify(mMockMacAddressPref).setSummary(RANDOMIZED_MAC_ADDRESS);
+    }
+
+    @Test
+    public void macAddressPref_shouldVisibleAsFactoryForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        mMockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
+        when(mMockWifiManager.getFactoryMacAddresses())
+                .thenReturn(new String[]{FACTORY_MAC_ADDRESS});
+
+        displayAndResume();
+
+        verify(mMockMacAddressPref).setVisible(true);
+        verify(mMockMacAddressPref).setSummary(FACTORY_MAC_ADDRESS);
+    }
+
+    @Test
+    public void ipAddressPref_shouldHaveDetailTextSetForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        mLinkProperties.addLinkAddress(Constants.IPV4_ADDR);
+
+        displayAndResume();
+
+        verify(mMockIpAddressPref).setSummary(Constants.IPV4_ADDR.getAddress().getHostAddress());
+        verify(mMockIpAddressPref).setVisible(true);
+    }
+
+    @Test
+    public void ipAddressPref_shouldInvisibleForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockIpAddressPref).setVisible(false);
+    }
+
+    @Test
+    public void gatewayAndSubnet_shouldHaveDetailTextSetForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        mLinkProperties.addLinkAddress(Constants.IPV4_ADDR);
+        mLinkProperties.addRoute(Constants.IPV4_DEFAULT);
+        mLinkProperties.addRoute(Constants.IPV4_SUBNET);
+
+        displayAndResume();
+
+        verify(mMockSubnetPref).setSummary("255.255.255.128");
+        verify(mMockGatewayPref).setSummary("192.0.2.127");
+        verify(mMockSubnetPref).setVisible(true);
+    }
+
+    @Test
+    public void gatewayAndSubnet_shouldInvisibleSetForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockSubnetPref).setVisible(false);
+    }
+
+    @Test
+    public void dnsServersPref_shouldHaveDetailTextSetForConnectedNetwork()
+            throws UnknownHostException {
+        setUpForConnectedNetwork();
+        mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[] {8, 8, 4, 4}));
+        mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[] {8, 8, 8, 8}));
+        mLinkProperties.addDnsServer(Constants.IPV6_DNS);
+
+        displayAndResume();
+
+        verify(mMockDnsPref).setSummary(
+                "8.8.4.4\n" + "8.8.8.8\n" + Constants.IPV6_DNS.getHostAddress());
+        verify(mMockDnsPref).setVisible(true);
+    }
+
+    @Test
+    public void dnsServersPref_shouldInvisibleSetForDisconnectedNetwork()
+            throws UnknownHostException {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockDnsPref).setVisible(false);
+    }
+
+    @Test
+    public void noCurrentNetwork_shouldNotFinishActivityForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(null);
+
+        displayAndResume();
+
+        verify(mMockActivity, never()).finish();
+    }
+
+    @Test
+    public void noLinkProperties_allIpDetailsHidden() {
+        setUpForConnectedNetwork();
+        when(mMockConnectivityManager.getLinkProperties(mMockNetwork)).thenReturn(null);
+        reset(mMockIpv6Category, mMockIpAddressPref, mMockSubnetPref, mMockGatewayPref,
+                mMockDnsPref);
+
+        displayAndResume();
+
+        verify(mMockIpv6Category).setVisible(false);
+        verify(mMockIpAddressPref).setVisible(false);
+        verify(mMockSubnetPref).setVisible(false);
+        verify(mMockGatewayPref).setVisible(false);
+        verify(mMockDnsPref).setVisible(false);
+        verify(mMockIpv6Category, never()).setVisible(true);
+        verify(mMockIpAddressPref, never()).setVisible(true);
+        verify(mMockSubnetPref, never()).setVisible(true);
+        verify(mMockGatewayPref, never()).setVisible(true);
+        verify(mMockDnsPref, never()).setVisible(true);
+    }
+
+    @Test
+    public void disconnectedNetwork_allIpDetailsHidden() {
+        setUpForDisconnectedNetwork();
+        reset(mMockIpv6Category, mMockIpAddressPref, mMockSubnetPref, mMockGatewayPref,
+                mMockDnsPref);
+
+        displayAndResume();
+
+        verify(mMockIpv6Category).setVisible(false);
+        verify(mMockIpAddressPref).setVisible(false);
+        verify(mMockSubnetPref).setVisible(false);
+        verify(mMockGatewayPref).setVisible(false);
+        verify(mMockDnsPref).setVisible(false);
+        verify(mMockIpv6Category, never()).setVisible(true);
+        verify(mMockIpAddressPref, never()).setVisible(true);
+        verify(mMockSubnetPref, never()).setVisible(true);
+        verify(mMockGatewayPref, never()).setVisible(true);
+        verify(mMockDnsPref, never()).setVisible(true);
+    }
+
+    // Convenience method to convert a LinkAddress to a string without a prefix length.
+    private String asString(LinkAddress l) {
+        return l.getAddress().getHostAddress();
+    }
+
+    // Pretend that the NetworkCallback was triggered with a new copy of lp. We need to create a
+    // new copy because the code only updates if !mLinkProperties.equals(lp).
+    private void updateLinkProperties(LinkProperties lp) {
+        mCallbackCaptor.getValue().onLinkPropertiesChanged(mMockNetwork, new LinkProperties(lp));
+    }
+
+    private void updateNetworkCapabilities(NetworkCapabilities nc) {
+        mCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, new NetworkCapabilities(nc));
+    }
+
+    private NetworkCapabilities makeNetworkCapabilities() {
+        NetworkCapabilities nc = new NetworkCapabilities();
+        nc.clearAll();
+        nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
+        return nc;
+    }
+
+    private void verifyDisplayedIpv6Addresses(InOrder inOrder, LinkAddress... addresses) {
+        String text = Arrays.stream(addresses)
+                .map(address -> asString(address))
+                .collect(Collectors.joining("\n"));
+        inOrder.verify(mMockIpv6AddressesPref).setSummary(text);
+    }
+
+    @Test
+    public void onLinkPropertiesChanged_updatesFields() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        InOrder inOrder = inOrder(mMockIpAddressPref, mMockGatewayPref, mMockSubnetPref,
+                mMockDnsPref, mMockIpv6Category, mMockIpv6AddressesPref);
+
+        LinkProperties lp = new LinkProperties();
+
+        lp.addLinkAddress(Constants.IPV6_LINKLOCAL);
+        updateLinkProperties(lp);
+        verifyDisplayedIpv6Addresses(inOrder, Constants.IPV6_LINKLOCAL);
+        inOrder.verify(mMockIpv6Category).setVisible(true);
+
+        lp.addRoute(Constants.IPV4_DEFAULT);
+        updateLinkProperties(lp);
+        inOrder.verify(mMockGatewayPref).setSummary(Constants.IPV4_GATEWAY.getHostAddress());
+        inOrder.verify(mMockGatewayPref).setVisible(true);
+
+        lp.addLinkAddress(Constants.IPV4_ADDR);
+        lp.addRoute(Constants.IPV4_SUBNET);
+        updateLinkProperties(lp);
+        inOrder.verify(mMockIpAddressPref).setSummary(asString(Constants.IPV4_ADDR));
+        inOrder.verify(mMockIpAddressPref).setVisible(true);
+        inOrder.verify(mMockSubnetPref).setSummary("255.255.255.128");
+        inOrder.verify(mMockSubnetPref).setVisible(true);
+
+        lp.addLinkAddress(Constants.IPV6_GLOBAL1);
+        lp.addLinkAddress(Constants.IPV6_GLOBAL2);
+        updateLinkProperties(lp);
+        verifyDisplayedIpv6Addresses(inOrder,
+                Constants.IPV6_LINKLOCAL,
+                Constants.IPV6_GLOBAL1,
+                Constants.IPV6_GLOBAL2);
+
+        lp.removeLinkAddress(Constants.IPV6_GLOBAL1);
+        updateLinkProperties(lp);
+        verifyDisplayedIpv6Addresses(inOrder,
+                Constants.IPV6_LINKLOCAL,
+                Constants.IPV6_GLOBAL2);
+
+        lp.addDnsServer(Constants.IPV6_DNS);
+        updateLinkProperties(lp);
+        inOrder.verify(mMockDnsPref).setSummary(Constants.IPV6_DNS.getHostAddress());
+        inOrder.verify(mMockDnsPref).setVisible(true);
+
+        lp.addDnsServer(Constants.IPV4_DNS1);
+        lp.addDnsServer(Constants.IPV4_DNS2);
+        updateLinkProperties(lp);
+        inOrder.verify(mMockDnsPref).setSummary(
+                Constants.IPV6_DNS.getHostAddress() + "\n"
+                        + Constants.IPV4_DNS1.getHostAddress() + "\n"
+                        + Constants.IPV4_DNS2.getHostAddress());
+        inOrder.verify(mMockDnsPref).setVisible(true);
+    }
+
+    @Test
+    public void onCapabilitiesChanged_callsRefreshIfNecessary() {
+        setUpForConnectedNetwork();
+        NetworkCapabilities nc = makeNetworkCapabilities();
+        when(mMockConnectivityManager.getNetworkCapabilities(mMockNetwork))
+                .thenReturn(new NetworkCapabilities(nc));
+
+        String summary = "Connected, no Internet";
+        when(mMockAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                .thenReturn(summary);
+
+        InOrder inOrder = inOrder(mMockHeaderController);
+        displayAndResume();
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+
+        // Check that an irrelevant capability update does not update the access point summary, as
+        // doing so could cause unnecessary jank...
+        summary = "Connected";
+        when(mMockAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                .thenReturn(summary);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController, never()).setSummary(any(CharSequence.class));
+
+        // ... but that if the network validates, then we do refresh.
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+
+        summary = "Connected, no Internet";
+        when(mMockAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                .thenReturn(summary);
+
+        // Another irrelevant update won't cause the UI to refresh...
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController, never()).setSummary(any(CharSequence.class));
+
+        // ... but if the network is no longer validated, then we display "connected, no Internet".
+        nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+
+        // UI will be refreshed when private DNS is broken.
+        summary = "Private DNS server cannot be accessed";
+        when(mMockAccessPoint.getSettingsSummary(true /* convertSavedAsDisconnected */))
+                .thenReturn(summary);
+        nc.setPrivateDnsBroken(true);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+
+        // UI will be refreshed when device connects to a partial connectivity network.
+        summary = "Limited connection";
+        when(mMockAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                .thenReturn(summary);
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+
+        // Although UI will be refreshed when network become validated. The Settings should
+        // continue to display "Limited connection" if network still provides partial connectivity.
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockHeaderController).setSummary(summary);
+    }
+
+    @Test
+    public void canForgetNetwork_shouldInvisibleIfWithoutConfiguration() {
+        setUpForConnectedNetwork();
+        when(mMockAccessPoint.getConfig()).thenReturn(null);
+        mController = newWifiDetailPreferenceController2();
+
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton1Visible(false);
+    }
+
+    @Test
+    public void canForgetNetwork_ephemeral() {
+        setUpForConnectedNetwork();
+        when(mMockWifiInfo.isEphemeral()).thenReturn(true);
+        when(mMockAccessPoint.getConfig()).thenReturn(null);
+
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton1Visible(true);
+    }
+
+    @Test
+    public void canForgetNetwork_saved() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton1Visible(true);
+    }
+
+    @Test
+    public void canForgetNetwork_lockedDown() {
+        setUpForConnectedNetwork();
+        lockDownNetwork();
+
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton1Visible(false);
+    }
+
+    @Test
+    public void canShareNetwork_shouldInvisibleIfWithoutConfiguration() {
+        setUpForConnectedNetwork();
+        when(mMockAccessPoint.getConfig()).thenReturn(null);
+
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton4Visible(false);
+    }
+
+    @Test
+    public void canModifyNetwork_saved() {
+        setUpForConnectedNetwork();
+        assertThat(mController.canModifyNetwork()).isTrue();
+    }
+
+    @Test
+    public void canModifyNetwork_lockedDown() {
+        setUpForConnectedNetwork();
+        lockDownNetwork();
+
+        assertThat(mController.canModifyNetwork()).isFalse();
+    }
+
+    /**
+     * Pretends that current network is locked down by device owner.
+     */
+    private void lockDownNetwork() {
+        final int doUserId = 123;
+        final int doUid = 1234;
+        String doPackage = "some.package";
+
+        mMockWifiConfig.creatorUid = doUid;
+        ComponentName doComponent = new ComponentName(doPackage, "some.Class");
+        try {
+            when(mMockPackageManager.getPackageUidAsUser(Matchers.anyString(), Matchers.anyInt()))
+                    .thenReturn(doUid);
+        } catch (PackageManager.NameNotFoundException e) {
+            //do nothing
+        }
+        ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser(doComponent);
+        ShadowDevicePolicyManager.getShadow().setDeviceOwnerUserId(doUserId);
+
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 1);
+    }
+
+    @Test
+    public void forgetNetwork_ephemeral() {
+        setUpForConnectedNetwork();
+        String ssid = "ssid";
+        when(mMockWifiInfo.isEphemeral()).thenReturn(true);
+        when(mMockWifiInfo.getSSID()).thenReturn(ssid);
+
+        displayAndResume();
+        mForgetClickListener.getValue().onClick(null);
+
+        verify(mMockWifiManager).disableEphemeralNetwork(ssid);
+        verify(mMockMetricsFeatureProvider)
+                .action(mMockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
+    }
+
+    @Test
+    public void forgetNetwork_saved() {
+        setUpForConnectedNetwork();
+        mMockWifiConfig.networkId = 5;
+
+        mController.displayPreference(mMockScreen);
+        mForgetClickListener.getValue().onClick(null);
+
+        verify(mMockWifiManager).forget(mMockWifiConfig.networkId, null);
+        verify(mMockMetricsFeatureProvider)
+                .action(mMockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
+    }
+
+    @Test
+    public void forgetNetwork_shouldShowDialog() {
+        setUpForConnectedNetwork();
+        final WifiDetailPreferenceController2 spyController = spy(mController);
+
+        mMockWifiConfig.networkId = 5;
+        when(mMockAccessPoint.isPasspoint()).thenReturn(true);
+        when(mMockAccessPoint.getPasspointFqdn()).thenReturn(FQDN);
+        spyController.displayPreference(mMockScreen);
+
+        mForgetClickListener.getValue().onClick(null);
+
+        verify(mMockWifiManager, times(0)).removePasspointConfiguration(FQDN);
+        verify(mMockMetricsFeatureProvider, times(0))
+                .action(mMockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
+        verify(spyController).showConfirmForgetDialog();
+    }
+
+    @Test
+    public void networkStateChangedIntent_shouldRefetchInfo() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(1)).getConnectionInfo();
+
+        mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+
+        verify(mMockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(2)).getConnectionInfo();
+    }
+
+    @Test
+    public void networkStateChangedIntent_shouldRefetchInfoForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(1)).getConnectionInfo();
+
+        mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+
+        verify(mMockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(2)).getConnectionInfo();
+    }
+
+    @Test
+    public void rssiChangedIntent_shouldRefetchInfo() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(1)).getConnectionInfo();
+
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        verify(mMockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(2)).getConnectionInfo();
+    }
+
+    @Test
+    public void rssiChangedIntent_shouldRefetchInfoForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        verify(mMockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(1)).getConnectionInfo();
+
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        verify(mMockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
+        verify(mMockWifiManager, times(2)).getConnectionInfo();
+    }
+
+    @Test
+    public void networkDisconnectedState_shouldNotFinishActivityForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        when(mMockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null);
+        mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+
+        verify(mMockActivity, never()).finish();
+    }
+
+    @Test
+    public void networkOnLost_shouldNotFinishActivityForConnectedNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        mCallbackCaptor.getValue().onLost(mMockNetwork);
+
+        verify(mMockActivity, never()).finish();
+    }
+
+    @Test
+    public void ipv6AddressPref_shouldHaveHostAddressTextSet() {
+        setUpForConnectedNetwork();
+        mLinkProperties.addLinkAddress(Constants.IPV6_LINKLOCAL);
+        mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL1);
+        mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL2);
+
+        displayAndResume();
+
+        String expectedAddresses = String.join("\n",
+                asString(Constants.IPV6_LINKLOCAL),
+                asString(Constants.IPV6_GLOBAL1),
+                asString(Constants.IPV6_GLOBAL2));
+
+        verify(mMockIpv6AddressesPref).setSummary(expectedAddresses);
+    }
+
+    @Test
+    public void ipv6AddressPref_shouldNotBeSelectable() {
+        setUpForConnectedNetwork();
+        mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL2);
+
+        displayAndResume();
+
+        assertThat(mMockIpv6AddressesPref.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void captivePortal_shouldShowSignInButton() {
+        setUpForConnectedNetwork();
+
+        InOrder inOrder = inOrder(mMockButtonsPref);
+
+        displayAndResume();
+
+        inOrder.verify(mMockButtonsPref).setButton2Visible(false);
+
+        NetworkCapabilities nc = makeNetworkCapabilities();
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockButtonsPref).setButton2Visible(false);
+
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockButtonsPref).setButton2Visible(true);
+
+        nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mMockButtonsPref).setButton2Visible(false);
+    }
+
+    @Test
+    public void testSignInButton_shouldStartCaptivePortalApp() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class);
+        verify(mMockButtonsPref).setButton2OnClickListener(captor.capture());
+        captor.getValue().onClick(null);
+        verify(mMockConnectivityManager).startCaptivePortalApp(mMockNetwork);
+        verify(mMockMetricsFeatureProvider)
+                .action(mMockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_SIGNIN);
+    }
+
+    @Test
+    public void testSignInButton_shouldHideSignInButtonForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        NetworkCapabilities nc = makeNetworkCapabilities();
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+        when(mMockConnectivityManager.getNetworkCapabilities(mMockNetwork))
+                .thenReturn(new NetworkCapabilities(nc));
+
+        // verify onResume
+        displayAndResume();
+
+        verify(mMockButtonsPref, never()).setButton2Visible(true);
+        verify(mMockButtonsPref).setButton2Visible(false);
+
+        // verify onCapabilitiesChanged
+        updateNetworkCapabilities(nc);
+
+        verify(mMockButtonsPref, never()).setButton2Visible(true);
+        verify(mMockButtonsPref).setButton2Visible(false);
+    }
+
+    @Test
+    public void testConnectButton_shouldInvisibleForConnectNetwork() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockButtonsPref, times(1)).setButton3Visible(false);
+    }
+
+    @Test
+    public void testConnectButton_shouldVisibleForDisconnectNetwork() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
+    }
+
+    private void setUpForToast() {
+        Resources res = mContext.getResources();
+        when(mMockActivity.getResources()).thenReturn(res);
+    }
+
+    @Test
+    public void testConnectButton_clickConnect_displayAsSuccess() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        String label = "title";
+        when(mMockAccessPoint.getTitle()).thenReturn(label);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as connected
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        mController.updateAccessPoint();
+
+        // check connect button invisible, be init as default state and toast success message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(false);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_connected_to_message, label));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectButFailed_displayFailMessage() {
+        setUpForDisconnectedNetwork();
+        ArgumentCaptor<WifiManager.ActionListener> connectListenerCaptor =
+                ArgumentCaptor.forClass(WifiManager.ActionListener.class);
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mMockWifiManager, times(1)).connect(anyInt(), connectListenerCaptor.capture());
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as failed
+        connectListenerCaptor.getValue().onFailure(-1);
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_failed_connect_message));
+    }
+
+    private void verifyConnectBtnSetUpAsVisible(InOrder inOrder) {
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+    }
+
+    private void verifyConnectBtnSetUpAsConnecting(InOrder inOrder) {
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connecting);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(false);
+    }
+
+    private void verifyConnectBtnBeInitAsDefault(InOrder inOrder) {
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(true);
+    }
+
+    @Test
+    public void testConnectButton_clickConnectButTimeout_displayFailMessage() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as failed
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_failed_connect_message));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectButTimeout_displayNotInRangeMessage() {
+        setUpForNotInRangeNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as failed
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_not_in_range_message));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectWhenWiFiDisabled_displaySuccessMessage() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(false); // wifi disabled
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        String label = "title";
+        when(mMockAccessPoint.getTitle()).thenReturn(label);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check turn on Wi-Fi, display button as connecting and toast turn on Wi-Fi message
+        verify(mMockWifiManager, times(1)).setWifiEnabled(true);
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_turned_on_message));
+
+        // notify Wi-Fi enabled
+        mController.mWifiListener.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLED);
+
+        // check had connect network and icon display as expected
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as connected
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        mController.updateAccessPoint();
+
+        // check connect button invisible, be init as default state and toast success message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(false);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_connected_to_message, label));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectWhenWiFiDisabled_failedToConnectWiFi() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(false); // wifi disabled
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check turn on Wi-Fi, display button as connecting and toast turn on Wi-Fi message
+        verify(mMockWifiManager, times(1)).setWifiEnabled(true);
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_turned_on_message));
+
+        // notify Wi-Fi enabled
+        mController.mWifiListener.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLED);
+
+        // check had connect network and icon display as expected
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as failed
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_failed_connect_message));
+    }
+
+    @Test
+    public void
+            testConnectButton_clickConnectWhenWiFiDisabled_failedToConnectWifiBecauseNotInRange() {
+        setUpForNotInRangeNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(false); // wifi disabled
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check turn on Wi-Fi, display button as connecting and toast turn on Wi-Fi message
+        verify(mMockWifiManager, times(1)).setWifiEnabled(true);
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_turned_on_message));
+
+        // notify Wi-Fi enabled
+        mController.mWifiListener.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLED);
+
+        // check had connect network and icon display as expected
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // update as failed
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_not_in_range_message));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectWhenWiFiDisabled_failedToEnableWifi() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(false); // wifi disabled
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check turn on Wi-Fi, display button as connecting and toast turn on Wi-Fi message
+        verify(mMockWifiManager, times(1)).setWifiEnabled(true);
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_turned_on_message));
+
+        // notify turn on Wi-Fi failed
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        verifyConnectBtnBeInitAsDefault(inOrder);
+        inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_failed_connect_message));
+    }
+
+    @Test
+    public void testConnectButton_clickConnectAndBackKey_ignoreTimeoutEvent() {
+        setUpForDisconnectedNetwork();
+        when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mMockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // leave detail page
+        when(mMockFragment.getActivity()).thenReturn(null);
+
+        // timeout happened
+        mController.sTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        inOrder.verify(mMockButtonsPref, never()).setButton3Text(R.string.wifi_connect);
+        inOrder.verify(mMockButtonsPref, never()).setButton3Icon(R.drawable.ic_settings_wireless);
+        inOrder.verify(mMockButtonsPref, never()).setButton3Enabled(true);
+        inOrder.verify(mMockButtonsPref, never()).setButton3Visible(true);
+        assertThat(ShadowToast.shownToastCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void updateAccessPoint_returnFalseForNothingChanged() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isFalse();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForSignalLevelChanged() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        // Level changed
+        when(mMockAccessPoint.getLevel()).thenReturn(LEVEL + 1);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForChangeAsNotInRange() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        // change as not in range
+        when(mMockAccessPoint.matches(any(AccessPoint.class))).thenReturn(false);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForChangeAsInRange() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        // change as in range
+        when(mMockAccessPoint.matches(any(AccessPoint.class))).thenReturn(true);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForChangeAsConnected() {
+        setUpForDisconnectedNetwork();
+
+        displayAndResume();
+
+        // change as connected
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForChangeAsDisconnected() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        // change as disconnected
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void updateAccessPoint_returnTrueForAccessPointUpdated() {
+        setUpForConnectedNetwork();
+
+        displayAndResume();
+
+        // change as disconnected
+        when(mMockAccessPoint.update(mMockWifiConfig, mMockWifiInfo, mMockNetworkInfo))
+                .thenReturn(true);
+        boolean changed = mController.updateAccessPoint();
+
+        assertThat(changed).isTrue();
+    }
+
+    @Test
+    public void testRefreshRssiViews_shouldNotUpdateIfLevelIsSameForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        verify(mMockAccessPoint, times(3)).getLevel();
+        verify(mMockIconInjector, times(1)).getIcon(anyInt());
+    }
+
+    @Test
+    public void testRefreshRssiViews_shouldUpdateOnLevelChangeForConnectedNetwork() {
+        setUpForConnectedNetwork();
+        displayAndResume();
+
+        when(mMockAccessPoint.getLevel()).thenReturn(0);
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        verify(mMockAccessPoint, times(4)).getLevel();
+        verify(mMockIconInjector, times(2)).getIcon(anyInt());
+    }
+
+    @Test
+    public void testRefreshRssiViews_shouldNotUpdateForNotInRangeNetwork() {
+        setUpForNotInRangeNetwork();
+
+        displayAndResume();
+
+        when(mMockAccessPoint.getLevel()).thenReturn(0);
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        verify(mMockSignalStrengthPref, times(2)).setVisible(false);
+    }
+
+    @Test
+    public void testRedrawIconForHeader_shouldEnlarge() {
+        setUpForConnectedNetwork();
+        ArgumentCaptor<BitmapDrawable> drawableCaptor =
+                ArgumentCaptor.forClass(BitmapDrawable.class);
+        Drawable original = mContext.getDrawable(Utils.getWifiIconResource(LEVEL)).mutate();
+        when(mMockIconInjector.getIcon(anyInt())).thenReturn(original);
+
+        displayAndResume();
+
+        verify(mMockHeaderController, times(1)).setIcon(drawableCaptor.capture());
+
+        int expectedSize = mContext.getResources().getDimensionPixelSize(
+                R.dimen.wifi_detail_page_header_image_size);
+        BitmapDrawable icon = drawableCaptor.getValue();
+        assertThat(icon.getMinimumWidth()).isEqualTo(expectedSize);
+        assertThat(icon.getMinimumHeight()).isEqualTo(expectedSize);
+    }
+
+    @Test
+    public void testRedrawIconForHeader_shouldEnlargeForDisconnectedNetwork() {
+        setUpForDisconnectedNetwork();
+        ArgumentCaptor<BitmapDrawable> drawableCaptor =
+                ArgumentCaptor.forClass(BitmapDrawable.class);
+        Drawable original = mContext.getDrawable(Utils.getWifiIconResource(LEVEL)).mutate();
+        when(mMockIconInjector.getIcon(anyInt())).thenReturn(original);
+
+        displayAndResume();
+
+        verify(mMockHeaderController, times(1)).setIcon(drawableCaptor.capture());
+
+        int expectedSize = mContext.getResources().getDimensionPixelSize(
+                R.dimen.wifi_detail_page_header_image_size);
+        BitmapDrawable icon = drawableCaptor.getValue();
+        assertThat(icon.getMinimumWidth()).isEqualTo(expectedSize);
+        assertThat(icon.getMinimumHeight()).isEqualTo(expectedSize);
+    }
+
+    @Test
+    public void testRedrawIconForHeader_shouldNotEnlargeIfNotVectorDrawable() {
+        setUpForConnectedNetwork();
+        ArgumentCaptor<ColorDrawable> drawableCaptor =
+                ArgumentCaptor.forClass(ColorDrawable.class);
+
+        displayAndResume();
+
+        verify(mMockHeaderController, times(1)).setIcon(drawableCaptor.capture());
+        ColorDrawable icon = drawableCaptor.getValue();
+        assertThat(icon).isNotNull();
+    }
+
+    @Test
+    public void checkMacTitle_whenPrivacyRandomizedMac_shouldBeRandom() {
+        setUpForDisconnectedNetwork();
+        mMockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_PERSISTENT;
+        when(mMockWifiConfig.getRandomizedMacAddress()).thenReturn(mMockMacAddress);
+        when(mMockMacAddress.toString()).thenReturn(RANDOMIZED_MAC_ADDRESS);
+
+        displayAndResume();
+
+        verify(mMockMacAddressPref).setTitle(R.string.wifi_advanced_randomized_mac_address_title);
+    }
+
+    @Test
+    public void checkMacTitle_whenPrivacyDeviceMac_shouldBeFactory() {
+        setUpForDisconnectedNetwork();
+        mMockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
+        when(mMockWifiConfig.getRandomizedMacAddress()).thenReturn(mMockMacAddress);
+        when(mMockWifiManager.getFactoryMacAddresses())
+                .thenReturn(new String[]{FACTORY_MAC_ADDRESS});
+
+        displayAndResume();
+
+        verify(mMockMacAddressPref).setTitle(R.string.wifi_advanced_device_mac_address_title);
+    }
+
+    @Test
+    @Ignore
+    public void entityHeader_expiredPasspointR1_shouldHandleExpiration() {
+        setUpForDisconnectedNetwork();
+        when(mMockAccessPoint.isPasspoint()).thenReturn(true);
+        when(mMockAccessPoint.isPasspointConfigurationR1()).thenReturn(true);
+        when(mMockAccessPoint.isExpired()).thenReturn(true);
+        String expireSummary = mContext.getResources().getString(
+                com.android.settingslib.R.string.wifi_passpoint_expired);
+
+        displayAndResume();
+
+        verify(mMockButtonsPref).setButton3Visible(false);
+        verify(mMockHeaderController).setSummary(expireSummary);
+    }
+
+    private ActionButtonsPreference createMock() {
+        final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
+        when(pref.setButton1Text(anyInt())).thenReturn(pref);
+        when(pref.setButton1Icon(anyInt())).thenReturn(pref);
+        when(pref.setButton1Enabled(anyBoolean())).thenReturn(pref);
+        when(pref.setButton1Visible(anyBoolean())).thenReturn(pref);
+        when(pref.setButton1OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
+
+        when(pref.setButton2Text(anyInt())).thenReturn(pref);
+        when(pref.setButton2Icon(anyInt())).thenReturn(pref);
+        when(pref.setButton2Enabled(anyBoolean())).thenReturn(pref);
+        when(pref.setButton2Visible(anyBoolean())).thenReturn(pref);
+        when(pref.setButton2OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
+
+        when(pref.setButton3Text(anyInt())).thenReturn(pref);
+        when(pref.setButton3Icon(anyInt())).thenReturn(pref);
+        when(pref.setButton3Enabled(anyBoolean())).thenReturn(pref);
+        when(pref.setButton3Visible(anyBoolean())).thenReturn(pref);
+        when(pref.setButton3OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
+
+        when(pref.setButton4Text(anyInt())).thenReturn(pref);
+        when(pref.setButton4Icon(anyInt())).thenReturn(pref);
+        when(pref.setButton4Enabled(anyBoolean())).thenReturn(pref);
+        when(pref.setButton4Visible(anyBoolean())).thenReturn(pref);
+        when(pref.setButton4OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
+
+        return pref;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2Test.java
new file mode 100644
index 0000000..517c96a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2Test.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.preference.DropDownPreference;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiMeteredPreferenceController2Test {
+
+    private static final int METERED_OVERRIDE_NONE = 0;
+    private static final int METERED_OVERRIDE_METERED = 1;
+    private static final int METERED_OVERRIDE_NOT_METERED = 2;
+
+    @Mock
+    private WifiConfiguration mWifiConfiguration;
+
+    private WifiMeteredPreferenceController2 mPreferenceController;
+    private Context mContext;
+    private DropDownPreference mDropDownPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreferenceController = spy(
+                new WifiMeteredPreferenceController2(mContext, mWifiConfiguration));
+        mDropDownPreference = new DropDownPreference(mContext);
+        mDropDownPreference.setEntries(R.array.wifi_metered_entries);
+        mDropDownPreference.setEntryValues(R.array.wifi_metered_values);
+    }
+
+    @Test
+    public void testUpdateState_wifiMetered_setCorrectValue() {
+        doReturn(METERED_OVERRIDE_METERED).when(mPreferenceController).getMeteredOverride();
+
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.getEntry()).isEqualTo("Treat as metered");
+    }
+
+    @Test
+    public void testUpdateState_wifiNotMetered_setCorrectValue() {
+        doReturn(METERED_OVERRIDE_NOT_METERED).when(mPreferenceController).getMeteredOverride();
+
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.getEntry()).isEqualTo("Treat as unmetered");
+    }
+
+    @Test
+    public void testUpdateState_wifiAuto_setCorrectValue() {
+        doReturn(METERED_OVERRIDE_NONE).when(mPreferenceController).getMeteredOverride();
+
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.getEntry()).isEqualTo("Detect automatically");
+    }
+
+    @Test
+    public void testController_resilientToNullConfig() {
+        mPreferenceController = spy(new WifiMeteredPreferenceController2(mContext, null));
+
+        mPreferenceController.getMeteredOverride();
+        mPreferenceController.onPreferenceChange(mDropDownPreference, 1);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java
new file mode 100644
index 0000000..91cc01e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 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.details2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.preference.DropDownPreference;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiPrivacyPreferenceController2Test {
+
+    private static final int PRIVACY_RANDOMIZED = WifiConfiguration.RANDOMIZATION_PERSISTENT;
+    private static final int PRIVACY_TRUSTED = WifiConfiguration.RANDOMIZATION_NONE;
+
+    @Mock
+    private WifiConfiguration mWifiConfiguration;
+
+    private WifiPrivacyPreferenceController2 mPreferenceController;
+    private Context mContext;
+    private DropDownPreference mDropDownPreference;
+    private String[] mPerferenceStrings;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        WifiPrivacyPreferenceController2 preferenceController =
+                new WifiPrivacyPreferenceController2(mContext);
+        preferenceController.setWifiConfiguration(mWifiConfiguration);
+        mPreferenceController = spy(preferenceController);
+        mDropDownPreference = new DropDownPreference(mContext);
+        mDropDownPreference.setEntries(R.array.wifi_privacy_entries);
+        mDropDownPreference.setEntryValues(R.array.wifi_privacy_values);
+
+        mPerferenceStrings = mContext.getResources().getStringArray(R.array.wifi_privacy_entries);
+    }
+
+    @Test
+    public void testUpdateState_wifiPrivacy_setCorrectValue() {
+        doReturn(PRIVACY_TRUSTED).when(mPreferenceController).getRandomizationValue();
+
+        mPreferenceController.updateState(mDropDownPreference);
+
+        int prefValue = mPreferenceController.translateMacRandomizedValueToPrefValue(
+                PRIVACY_TRUSTED);
+        assertThat(mDropDownPreference.getEntry()).isEqualTo(mPerferenceStrings[prefValue]);
+    }
+
+    @Test
+    public void testUpdateState_wifiNotMetered_setCorrectValue() {
+        doReturn(PRIVACY_RANDOMIZED).when(mPreferenceController).getRandomizationValue();
+
+        mPreferenceController.updateState(mDropDownPreference);
+
+        int prefValue = mPreferenceController.translateMacRandomizedValueToPrefValue(
+                PRIVACY_RANDOMIZED);
+        assertThat(mDropDownPreference.getEntry()).isEqualTo(mPerferenceStrings[prefValue]);
+    }
+
+    @Test
+    public void testController_resilientToNullConfig() {
+        mPreferenceController = spy(new WifiPrivacyPreferenceController2(mContext));
+
+        mPreferenceController.getRandomizationValue();
+        mPreferenceController.onPreferenceChange(mDropDownPreference, "1");
+    }
+
+    @Test
+    public void testUpdateState_isNotEphemeralNetwork_shouldBeSelectable() {
+        mPreferenceController.setIsEphemeral(false);
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.isSelectable()).isTrue();
+    }
+
+    @Test
+    public void testUpdateState_isEphemeralNetwork_shouldNotSelectable() {
+        mPreferenceController.setIsEphemeral(true);
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void testUpdateState_isNotPasspointNetwork_shouldBeSelectable() {
+        mPreferenceController.setIsPasspoint(false);
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.isSelectable()).isTrue();
+    }
+
+    @Test
+    public void testUpdateState_isPasspointNetwork_shouldNotSelectable() {
+        mPreferenceController.setIsPasspoint(true);
+        mPreferenceController.updateState(mDropDownPreference);
+
+        assertThat(mDropDownPreference.isSelectable()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java
new file mode 100644
index 0000000..f50021b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2019 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.savedaccesspoints2;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settingslib.wifi.WifiEntryPreference;
+import com.android.wifitrackerlib.WifiEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class SavedAccessPointsPreferenceController2Test {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    @Mock
+    private PreferenceCategory mPreferenceCategory;
+
+    private Context mContext;
+    private SavedAccessPointsWifiSettings2 mSettings;
+    private SavedAccessPointsPreferenceController2 mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mSettings = spy(new SavedAccessPointsWifiSettings2());
+        mController = spy(new SavedAccessPointsPreferenceController2(mContext, "test_key"));
+        mController.setHost(mSettings);
+
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreferenceCategory);
+        when(mPreferenceCategory.getContext()).thenReturn(mContext);
+    }
+
+    @Test
+    public void getAvailability_noSavedAccessPoint_shouldNotAvailable() {
+        mController.mWifiEntries = new ArrayList<>();
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailability_oneSavedAccessPoint_shouldAvailable() {
+        final WifiEntry mockWifiEntry = mock(WifiEntry.class);
+        mController.mWifiEntries = Arrays.asList(mockWifiEntry);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void displayPreference_oneAccessPoint_shouldListIt() {
+        final String title = "ssid_title";
+        final WifiEntry mockWifiEntry = mock(WifiEntry.class);
+        when(mockWifiEntry.getTitle()).thenReturn(title);
+        final ArgumentCaptor<WifiEntryPreference> captor =
+                ArgumentCaptor.forClass(WifiEntryPreference.class);
+
+        mController.displayPreference(mPreferenceScreen, Arrays.asList(mockWifiEntry));
+
+        verify(mPreferenceCategory).addPreference(captor.capture());
+
+        final List<WifiEntryPreference> prefs = captor.getAllValues();
+        assertThat(prefs.size()).isEqualTo(1);
+        assertThat(prefs.get(0).getTitle()).isEqualTo(title);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
new file mode 100644
index 0000000..ab1b51c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 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.savedaccesspoints2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class SavedAccessPointsWifiSettings2Test {
+
+    @Mock
+    private SubscribedAccessPointsPreferenceController2 mSubscribedApController;
+    @Mock
+    private SavedAccessPointsPreferenceController2 mSavedApController;
+
+    private TestFragment mSettings;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mSettings = spy(new TestFragment());
+
+        doReturn(mSubscribedApController).when(mSettings)
+                .use(SubscribedAccessPointsPreferenceController2.class);
+        doReturn(mSavedApController).when(mSettings)
+                .use(SavedAccessPointsPreferenceController2.class);
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mSettings.getMetricsCategory()).isEqualTo(MetricsEvent.WIFI_SAVED_ACCESS_POINTS);
+        assertThat(mSettings.getPreferenceScreenResId())
+                .isEqualTo(R.xml.wifi_display_saved_access_points2);
+    }
+
+    public static class TestFragment extends SavedAccessPointsWifiSettings2 {
+
+        public <T extends AbstractPreferenceController> T use(Class<T> clazz) {
+            return super.use(clazz);
+        }
+    }
+}