Merge "Unable to adjust remote session volume in Sound Setting" into rvc-dev
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 358bd83..c39095c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -785,7 +785,7 @@
     <string name="nfc_disclaimer_title" msgid="3696580694485048039">"Skakel NFC aan"</string>
     <string name="nfc_disclaimer_content" msgid="8256675597551036207">"NFC ruil data uit tussen hierdie toestel en ander nabygeleë toestelle of teikens, soos byvoorbeeld betaalterminale, toeganglesers en interaktiewe advertensies of merkers."</string>
     <string name="nfc_secure_settings_title" msgid="4906958426927741485">"Vereis toestelontsluiting vir NFC"</string>
-    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"Laat die gebruik van NFC-betalings en Publieke Vervoer net toe wanneer die skerm ontsluit is"</string>
+    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"Laat die gebruik van NFC-betalings en -oordragte net toe wanneer die skerm ontsluit is"</string>
     <string name="android_beam_settings_title" msgid="2797963824490671295">"Android Beam"</string>
     <string name="android_beam_on_summary" msgid="6067720758437490896">"Gereed om programinhoud te stuur via NFC"</string>
     <string name="android_beam_off_summary" msgid="5693961375631325042">"Af"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 9920192..5424dd7 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -853,7 +853,7 @@
     <string name="nfc_disclaimer_title" msgid="3696580694485048039">"‏تفعيل NFC"</string>
     <string name="nfc_disclaimer_content" msgid="8256675597551036207">"‏يتم من خلال تقنية الاتصال بالحقل القريب (NFC) تبادل البيانات بين هذا الجهاز والأجهزة أو الأهداف المجاورة الأخرى، مثل محطات الدفع وبرامج قراءة الوصول والعلامات أو الإعلانات التفاعلية."</string>
     <string name="nfc_secure_settings_title" msgid="4906958426927741485">"‏يجب فتح قفل الجهاز لاستخدام تقنية الاتصالات القريبة المدى (NFC)"</string>
-    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"‏السماح باستخدام \"الدفع والتقل عبر تقنية NFC\" فقط عندما تكون الشاشة مفتوحة"</string>
+    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"‏السماح باستخدام \"الدفع والتنقل عبر تقنية NFC\" فقط عندما تكون الشاشة مفتوحة"</string>
     <string name="android_beam_settings_title" msgid="2797963824490671295">"‏شعاع Android"</string>
     <string name="android_beam_on_summary" msgid="6067720758437490896">"‏جاهز لنقل محتوى التطبيق عبر الاتصالات القريبة المدى (NFC)"</string>
     <string name="android_beam_off_summary" msgid="5693961375631325042">"إيقاف"</string>
@@ -1861,7 +1861,7 @@
     <string name="lockpassword_confirm_pins_dont_match" msgid="1103699575489401030">"أرقام التعريف الشخصي غير متطابقة"</string>
     <string name="lockpassword_draw_your_pattern_again_header" msgid="1045638030120803622">"ارسم النقش مرة أخرى"</string>
     <string name="lockpassword_choose_lock_generic_header" msgid="5669348379247148696">"اختيار طريقة فتح القفل"</string>
-    <string name="lockpassword_password_set_toast" msgid="6615759749393973795">"تم تعيين كلمة المرور"</string>
+    <string name="lockpassword_password_set_toast" msgid="6615759749393973795">"تم ضبط كلمة المرور"</string>
     <string name="lockpassword_pin_set_toast" msgid="5415783847198570890">"‏تم تعيين رمز PIN"</string>
     <string name="lockpassword_pattern_set_toast" msgid="3090582314362416762">"تم تعيين النقش"</string>
     <string name="lockpassword_choose_your_password_header_for_face" msgid="5359649947642749079">"لاستخدام \"فتح القفل بالوجه\"، يجب تحديد كلمة مرور"</string>
@@ -2192,7 +2192,7 @@
     <string name="app_name_label" msgid="3809910527680143673">"التطبيق"</string>
     <string name="last_time_used_label" msgid="2639712813493534074">"آخر مرة تم استخدامه"</string>
     <string name="usage_time_label" msgid="9105343335151559883">"وقت الاستخدام"</string>
-    <string name="accessibility_settings" msgid="4713215774904704682">"سهولة الاستخدام"</string>
+    <string name="accessibility_settings" msgid="4713215774904704682">"إمكانية الوصول"</string>
     <string name="accessibility_settings_title" msgid="6739115703615065716">"إعدادات \"سهولة الاستخدام\""</string>
     <string name="accessibility_settings_summary" msgid="2195085206729325737">"أجهزة قارئ الشاشة والشاشة وعناصر التحكم التفاعلية"</string>
     <string name="vision_settings_title" msgid="8919983801864103069">"إعدادات الرؤية"</string>
@@ -4886,7 +4886,7 @@
       <item quantity="other">‏<xliff:g id="COUNT_1">%d</xliff:g> شهادة CA كحد أدنى</item>
       <item quantity="one">‏شهادة CA واحدة (<xliff:g id="COUNT_0">%d</xliff:g>) كحد أدنى</item>
     </plurals>
-    <string name="enterprise_privacy_lock_device" msgid="464054894363899866">"يمكن للمشرف قفل الجهاز وإعادة تعيين كلمة المرور"</string>
+    <string name="enterprise_privacy_lock_device" msgid="464054894363899866">"يمكن للمشرف قفل الجهاز وإعادة ضبط كلمة المرور"</string>
     <string name="enterprise_privacy_wipe_device" msgid="869589182352244591">"يمكن للمشرف حذف جميع بيانات الجهاز"</string>
     <string name="enterprise_privacy_failed_password_wipe_device" msgid="7045164901334821226">"محاولات كلمة المرور الخاطئة قبل حذف جميع بيانات الجهاز"</string>
     <string name="enterprise_privacy_failed_password_wipe_work" msgid="2537582942554484170">"محاولات كلمة المرور الخاطئة قبل حذف بيانات الملف الشخصي للعمل"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index a7023fc..0c37eab 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -785,7 +785,7 @@
     <string name="nfc_disclaimer_title" msgid="3696580694485048039">"Включване на КБП"</string>
     <string name="nfc_disclaimer_content" msgid="8256675597551036207">"Чрез КБП се обменят данни между това устройство и други в близост или целеви такива, като например терминали за плащане, четци за достъп и интерактивни реклами или маркери."</string>
     <string name="nfc_secure_settings_title" msgid="4906958426927741485">"Изискване за отключване на устройството за NFC"</string>
-    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"Разрешаване на използването на КБП за плащане и прехвърляне само при отключен екран"</string>
+    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"Разрешаване на използването на NFC за плащане и прехвърляне само при отключен екран"</string>
     <string name="android_beam_settings_title" msgid="2797963824490671295">"Android Beam"</string>
     <string name="android_beam_on_summary" msgid="6067720758437490896">"В готовност за предаване на съдържание на приложения чрез КБП"</string>
     <string name="android_beam_off_summary" msgid="5693961375631325042">"Изключено"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 1d21d6e..03f28f3 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -4812,7 +4812,7 @@
     <string name="see_more" msgid="7499355691042812723">"Ver más"</string>
     <string name="see_less" msgid="2642392725363552793">"Ver menos"</string>
     <string name="network_connection_request_dialog_title" msgid="1896186380874289434">"Conectar al dispositivo"</string>
-    <string name="network_connection_request_dialog_summary" msgid="7693038309792726170">"La app de <xliff:g id="APPNAME">%1$s</xliff:g> quiere usar una red Wi-Fi temporal para conectarte al dispositivo"</string>
+    <string name="network_connection_request_dialog_summary" msgid="7693038309792726170">"La app de <xliff:g id="APPNAME">%1$s</xliff:g> quiere usar una red Wi-Fi temporal para conectarse a tu dispositivo"</string>
     <string name="network_connection_timeout_dialog_message" msgid="598509083077743772">"No se encontraron dispositivos. Asegúrate de que los dispositivos estén encendidos y puedan conectarse."</string>
     <string name="network_connection_timeout_dialog_ok" msgid="6022675321823723755">"Volver a intentarlo"</string>
     <string name="network_connection_errorstate_dialog_message" msgid="3360714322047603239">"Se produjo un error. La aplicación canceló la solicitud para elegir un dispositivo."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index f469e55..67d04eb 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -2551,7 +2551,7 @@
       <item quantity="other">‏%1$d אפליקציות מוגבלות</item>
       <item quantity="one">אפליקציה מוגבלת אחת</item>
     </plurals>
-    <string name="battery_header_title_alternate" msgid="8371821625994616659"><small>" "<font size="20">"<xliff:g id="UNIT">%</xliff:g>"</font></small>"<xliff:g id="NUMBER">^1</xliff:g>"</string>
+    <string name="battery_header_title_alternate" msgid="8371821625994616659"><small>" "<font size="20">"<xliff:g id="NUMBER">^1</xliff:g>"</font></small>"<xliff:g id="UNIT">%</xliff:g>"</string>
     <string name="dialog_stop_title" msgid="5972757101865665655">"לעצור את האפליקציה?"</string>
     <string name="dialog_stop_message" product="default" msgid="2063536418875183799">"הניהול של צריכת הסוללה בטלפון לא תקין, כי האפליקציה <xliff:g id="APP">%1$s</xliff:g> לא מאפשרת למכשיר להיכנס למצב שינה.\n\nכדי לפתור את הבעיה, ניתן להפסיק את פעולת האפליקציה.\n\nאם הבעיה תימשך, ייתכן שיהיה עליך להסיר את התקנת האפליקציה כדי לשפר את ביצועי הסוללה."</string>
     <string name="dialog_stop_message" product="tablet" msgid="426862716783569739">"הניהול של צריכת הסוללה בטאבלט לא תקין, כי האפליקציה <xliff:g id="APP">%1$s</xliff:g> לא מאפשרת למכשיר להיכנס למצב שינה.\n\nכדי לפתור את הבעיה, ניתן להפסיק את פעולת האפליקציה.\n\nאם הבעיה תימשך, ייתכן שיהיה עליך להסיר את התקנת האפליקציה כדי לשפר את ביצועי הסוללה."</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 5870b41..adba54b 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -1798,7 +1798,7 @@
     <string name="lockpassword_confirm_your_pin_details_frp" msgid="2128795640346033349">"Телефонот е ресетиран на фабрички поставки. За да го користите, внесете го претходниот PIN."</string>
     <string name="lockpassword_confirm_your_password_details_frp" msgid="4031863562975125016">"Телефонот е ресетиран на фабрички поставки. За да го користите, внесете ја претходната лозинка."</string>
     <string name="lockpassword_confirm_your_pattern_header_frp" msgid="5641858015891896427">"Потврдете ја шемата"</string>
-    <string name="lockpassword_confirm_your_pin_header_frp" msgid="8285647793164729982">"Потврди PIN"</string>
+    <string name="lockpassword_confirm_your_pin_header_frp" msgid="8285647793164729982">"Потврдете го PIN-от"</string>
     <string name="lockpassword_confirm_your_password_header_frp" msgid="7932240547542564033">"Потврдете ја лозинката"</string>
     <string name="lockpassword_invalid_pin" msgid="7530854476819820600">"Погрешен PIN"</string>
     <string name="lockpassword_invalid_password" msgid="1588184930542221687">"Погрешна лозинка"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 44b6e17..c5ad3de 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -785,7 +785,7 @@
     <string name="nfc_disclaimer_title" msgid="3696580694485048039">"เปิดใช้ NFC"</string>
     <string name="nfc_disclaimer_content" msgid="8256675597551036207">"NFC จะแลกเปลี่ยนข้อมูลระหว่างอุปกรณ์นี้กับอุปกรณ์อื่นที่อยู่ใกล้ๆ หรืออุปกรณ์เป้าหมาย เช่น เครื่องชำระเงิน เครื่องอ่านการเข้าถึง และโฆษณาหรือป้ายสินค้าเชิงโต้ตอบ"</string>
     <string name="nfc_secure_settings_title" msgid="4906958426927741485">"ต้องปลดล็อกอุปกรณ์เพื่อใช้งาน NFC"</string>
-    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"อนุญาตการใช้การชำระเงินผ่าน NFC และขนส่งสาธารณะเฉพาะเวลาที่ไม่ได้ล็อกหน้าจอเท่านั้น"</string>
+    <string name="nfc_secure_toggle_summary" product="default" msgid="4591286109299690373">"อนุญาตให้ใช้ขนส่งสาธารณะและการชำระเงินผ่าน NFC เฉพาะเวลาที่ไม่ได้ล็อกหน้าจอเท่านั้น"</string>
     <string name="android_beam_settings_title" msgid="2797963824490671295">"Android Beam"</string>
     <string name="android_beam_on_summary" msgid="6067720758437490896">"พร้อมที่จะส่งเนื้อหาแอปผ่านทาง NFC"</string>
     <string name="android_beam_off_summary" msgid="5693961375631325042">"ปิด"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 27b0984..e453b76 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -2200,7 +2200,7 @@
     <string name="accessibility_shortcut_edit_dialog_title_software_gesture" msgid="8078659880723370597">"Провести двома пальцями вгору"</string>
     <string name="accessibility_shortcut_edit_dialog_title_software_gesture_talkback" msgid="7422753388389160524">"Провести трьома пальцями вгору"</string>
     <string name="accessibility_shortcut_edit_dialog_title_software" msgid="4796192466943479849">"Натиснути кнопку спеціальних можливостей"</string>
-    <string name="accessibility_shortcut_edit_dialog_summary_software" msgid="5606196352833449600">"Натиснути кнопку спеціальних можливостей <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> унизу екрана.\n\nЩоб переключитися між функціями, натисніть і утримуйте кнопку спеціальних можливостей."</string>
+    <string name="accessibility_shortcut_edit_dialog_summary_software" msgid="5606196352833449600">"Натисніть кнопку спеціальних можливостей <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> унизу екрана.\n\nЩоб переключитися між функціями, натисніть і утримуйте кнопку спеціальних можливостей."</string>
     <string name="accessibility_shortcut_edit_dialog_summary_software_gesture" msgid="8292555254353761635">"Провести двома пальцями знизу вгору по екрану.\n\nЩоб переключитися між функціями, проведіть двома пальцями вгору й утримуйте екран."</string>
     <string name="accessibility_shortcut_edit_dialog_summary_software_gesture_talkback" msgid="84483464524360845">"Провести по екрану знизу вгору трьома пальцями.\n\nЩоб переключитися між функціями, проведіть по екрану знизу вгору трьома пальцями й утримуйте їх."</string>
     <string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Утримувати клавіші гучності"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4d2dc3d..5643083 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11816,6 +11816,8 @@
     <string name="network_connection_errorstate_dialog_message">Something came up. The application has cancelled the request to choose a device.</string>
     <!-- Toast message when connection is successful [CHAR LIMIT=30] -->
     <string name="network_connection_connect_successful">Connection successful</string>
+    <!-- Toast message when connection is failure [CHAR LIMIT=30] -->
+    <string name="network_connection_connect_failure">Connection failed</string>
     <!-- Neutral button for Network connection request Dialog [CHAR LIMIT=30] -->
     <string name="network_connection_request_dialog_showall">Show all</string>
     <!-- Message for Network connection searching progress Dialog. Searching for wifi ap. [CHAR LIMIT=40] -->
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index f07c66c..8a54c73 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -54,6 +54,7 @@
 import com.android.settings.Utils;
 import com.android.settings.deviceinfo.StorageWizardMoveConfirm;
 import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState.Callbacks;
 import com.android.settingslib.applications.StorageStatsSource;
 import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
@@ -321,7 +322,7 @@
                     .setButton1OnClickListener(v -> handleClearDataClick());
         }
 
-        if (mAppsControlDisallowedBySystem) {
+        if (mAppsControlDisallowedBySystem || AppUtils.isMainlineModule(mPm, mPackageName)) {
             mButtonsPref.setButton1Enabled(false);
         }
     }
@@ -579,7 +580,7 @@
                         .setButton2OnClickListener(v -> handleClearCacheClick());
             }
         }
-        if (mAppsControlDisallowedBySystem) {
+        if (mAppsControlDisallowedBySystem || AppUtils.isMainlineModule(mPm, mPackageName)) {
             mButtonsPref.setButton1Enabled(false).setButton2Enabled(false);
         }
     }
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index 147c412..36ad2ce 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -744,7 +744,9 @@
     }
 
     private boolean isSystemModule() {
-        return mAppEntry != null && AppUtils.isSystemModule(mContext, mAppEntry.info.packageName);
+        return mAppEntry != null
+                && (AppUtils.isSystemModule(mContext, mAppEntry.info.packageName)
+                || AppUtils.isMainlineModule(mPm, mAppEntry.info.packageName));
     }
 
     /**
diff --git a/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java b/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
index 2e11953..5e99e8b 100644
--- a/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceController.java
@@ -43,7 +43,7 @@
             return DISABLED_FOR_USER;
         }
 
-        if (AppUtils.isMainlineModule(mContext, mPackageName)) {
+        if (AppUtils.isMainlineModule(mContext.getPackageManager(), mPackageName)) {
             return DISABLED_FOR_USER;
         }
 
diff --git a/src/com/android/settings/network/TetherProvisioningActivity.java b/src/com/android/settings/network/TetherProvisioningActivity.java
index 09efe48..bb61546 100644
--- a/src/com/android/settings/network/TetherProvisioningActivity.java
+++ b/src/com/android/settings/network/TetherProvisioningActivity.java
@@ -16,13 +16,19 @@
 
 package com.android.settings.network;
 
+import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE;
+import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK;
+import static android.net.TetheringConstants.EXTRA_RUN_PROVISION;
+import static android.net.TetheringManager.TETHERING_INVALID;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
+import static android.telephony.SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
 import android.app.Activity;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.TetheringConstants;
-import android.net.TetheringManager;
 import android.os.Bundle;
 import android.os.ResultReceiver;
 import android.os.UserHandle;
@@ -52,23 +58,19 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mResultReceiver = (ResultReceiver)getIntent().getParcelableExtra(
-                ConnectivityManager.EXTRA_PROVISION_CALLBACK);
+        mResultReceiver = (ResultReceiver) getIntent().getParcelableExtra(EXTRA_PROVISION_CALLBACK);
 
-        final int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
-                ConnectivityManager.TETHERING_INVALID);
+        final int tetherType = getIntent().getIntExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_INVALID);
 
-        final int tetherSubId = getIntent().getIntExtra(EXTRA_SUBID,
-                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        final int tetherSubId = getIntent().getIntExtra(EXTRA_SUBID, INVALID_SUBSCRIPTION_ID);
         final int subId = SubscriptionManager.getActiveDataSubscriptionId();
         if (tetherSubId != subId) {
             Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId);
-            mResultReceiver.send(TetheringManager.TETHER_ERROR_PROVISIONING_FAILED, null);
+            mResultReceiver.send(TETHER_ERROR_PROVISIONING_FAILED, null);
             finish();
             return;
         }
-        String[] provisionApp = getIntent().getStringArrayExtra(
-                TetheringConstants.EXTRA_RUN_PROVISION);
+        String[] provisionApp = getIntent().getStringArrayExtra(EXTRA_RUN_PROVISION);
         if (provisionApp == null || provisionApp.length < 2) {
             final Resources res = Utils.getResourcesForSubId(this, subId);
             provisionApp = res.getStringArray(
@@ -77,8 +79,8 @@
         final Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.setClassName(provisionApp[0], provisionApp[1]);
         intent.putExtra(EXTRA_TETHER_TYPE, tetherType);
-        intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
-        intent.putExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK, mResultReceiver);
+        intent.putExtra(EXTRA_SUBSCRIPTION_INDEX, subId);
+        intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver);
         if (DEBUG) {
             Log.d(TAG, "Starting provisioning app: " + provisionApp[0] + "." + provisionApp[1]);
         }
@@ -86,7 +88,7 @@
         if (getPackageManager().queryIntentActivities(intent,
                 PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
             Log.e(TAG, "Provisioning app is configured, but not available.");
-            mResultReceiver.send(TetheringManager.TETHER_ERROR_PROVISIONING_FAILED, null);
+            mResultReceiver.send(TETHER_ERROR_PROVISIONING_FAILED, null);
             finish();
             return;
         }
@@ -99,9 +101,8 @@
         super.onActivityResult(requestCode, resultCode, intent);
         if (requestCode == PROVISION_REQUEST) {
             if (DEBUG) Log.d(TAG, "Got result from app: " + resultCode);
-            int result = resultCode == Activity.RESULT_OK ?
-                    TetheringManager.TETHER_ERROR_NO_ERROR :
-                    TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
+            int result = resultCode == Activity.RESULT_OK
+                    ? TETHER_ERROR_NO_ERROR : TETHER_ERROR_PROVISIONING_FAILED;
             mResultReceiver.send(result, null);
             finish();
         }
diff --git a/src/com/android/settings/network/telephony/CellInfoUtil.java b/src/com/android/settings/network/telephony/CellInfoUtil.java
index 7412428..d7d2b18 100644
--- a/src/com/android/settings/network/telephony/CellInfoUtil.java
+++ b/src/com/android/settings/network/telephony/CellInfoUtil.java
@@ -33,6 +33,9 @@
 import android.text.TextDirectionHeuristics;
 import android.text.TextUtils;
 
+import com.android.internal.telephony.OperatorInfo;
+
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -99,6 +102,35 @@
         return cellId;
     }
 
+    /**
+     * Creates a CellInfo object from OperatorInfo. GsmCellInfo is used here only because
+     * operatorInfo does not contain technology type while CellInfo is an abstract object that
+     * requires to specify technology type. It doesn't matter which CellInfo type to use here, since
+     * we only want to wrap the operator info and PLMN to a CellInfo object.
+     */
+    public static CellInfo convertOperatorInfoToCellInfo(OperatorInfo operatorInfo) {
+        final String operatorNumeric = operatorInfo.getOperatorNumeric();
+        String mcc = null;
+        String mnc = null;
+        if (operatorNumeric != null && operatorNumeric.matches("^[0-9]{5,6}$")) {
+            mcc = operatorNumeric.substring(0, 3);
+            mnc = operatorNumeric.substring(3);
+        }
+        final CellIdentityGsm cig = new CellIdentityGsm(
+                Integer.MAX_VALUE /* lac */,
+                Integer.MAX_VALUE /* cid */,
+                Integer.MAX_VALUE /* arfcn */,
+                Integer.MAX_VALUE /* bsic */,
+                mcc,
+                mnc,
+                operatorInfo.getOperatorAlphaLong(),
+                operatorInfo.getOperatorAlphaShort(),
+                Collections.emptyList());
+
+        final CellInfoGsm ci = new CellInfoGsm();
+        ci.setCellIdentity(cig);
+        return ci;
+    }
 
     /** Convert a list of cellInfos to readable string without sensitive info. */
     public static String cellInfoListToString(List<CellInfo> cellInfos) {
diff --git a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
index 7173ccc..97894b1 100644
--- a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
+++ b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
@@ -57,6 +57,7 @@
     private List<String> mForbiddenPlmns;
     private int mLevel = LEVEL_NONE;
     private boolean mShow4GForLTE;
+    private boolean mUseNewApi;
 
     public NetworkOperatorPreference(Context context, CellInfo cellinfo,
             List<String> forbiddenPlmns, boolean show4GForLTE) {
@@ -75,6 +76,8 @@
         super(context);
         mForbiddenPlmns = forbiddenPlmns;
         mShow4GForLTE = show4GForLTE;
+        mUseNewApi = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
     }
 
     /**
@@ -215,7 +218,7 @@
     }
 
     private void updateIcon(int level) {
-        if (level < 0 || level >= NUM_SIGNAL_STRENGTH_BINS) {
+        if (!mUseNewApi || level < 0 || level >= NUM_SIGNAL_STRENGTH_BINS) {
             return;
         }
         final Context context = getContext();
diff --git a/src/com/android/settings/network/telephony/NetworkScanHelper.java b/src/com/android/settings/network/telephony/NetworkScanHelper.java
index fe5b9e1..524a737 100644
--- a/src/com/android/settings/network/telephony/NetworkScanHelper.java
+++ b/src/com/android/settings/network/telephony/NetworkScanHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.network.telephony;
 
+import android.annotation.IntDef;
 import android.telephony.AccessNetworkConstants.AccessNetworkType;
 import android.telephony.CellInfo;
 import android.telephony.NetworkScan;
@@ -25,9 +26,21 @@
 import android.telephony.TelephonyScanManager;
 import android.util.Log;
 
+import com.android.internal.telephony.CellNetworkScanResult;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
 
 /**
  * A helper class that builds the common interface and performs the network scan for two different
@@ -70,6 +83,33 @@
         void onError(int errorCode);
     }
 
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS, NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS})
+    public @interface NetworkQueryType {}
+
+    /**
+     * Performs the network scan using {@link TelephonyManager#getAvailableNetworks()}. The network
+     * scan results won't be returned to the caller until the network scan is completed.
+     *
+     * <p> This is typically used when the modem doesn't support the new network scan api
+     * {@link TelephonyManager#requestNetworkScan(
+     * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
+     */
+    public static final int NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS = 1;
+
+    /**
+     * Performs the network scan using {@link TelephonyManager#requestNetworkScan(
+     * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)} The network scan
+     * results will be returned to the caller periodically in a small time window until the network
+     * scan is completed. The complete results should be returned in the last called of
+     * {@link NetworkScanCallback#onResults(List)}.
+     *
+     * <p> This is recommended to be used if modem supports the new network scan api
+     * {@link TelephonyManager#requestNetworkScan(
+     * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}
+     */
+    public static final int NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS = 2;
+
     /** The constants below are used in the async network scan. */
     private static final boolean INCREMENTAL_RESULTS = true;
     private static final int SEARCH_PERIODICITY_SEC = 5;
@@ -83,6 +123,9 @@
 
     private NetworkScan mNetworkScanRequester;
 
+    /** Callbacks for sync network scan */
+    private ListenableFuture<List<CellInfo>> mNetworkScanFuture;
+
     public NetworkScanHelper(TelephonyManager tm, NetworkScanCallback callback, Executor executor) {
         mTelephonyManager = tm;
         mNetworkScanCallback = callback;
@@ -139,38 +182,63 @@
     }
 
     /**
-     * Request a network scan.
+     * Performs a network scan for the given type {@code type}.
+     * {@link #NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS} is recommended if modem supports
+     * {@link TelephonyManager#requestNetworkScan(
+     * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
      *
-     * Performs the network scan using {@link TelephonyManager#requestNetworkScan(
-     * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)} The network scan
-     * results will be returned to the caller periodically in a small time window until the network
-     * scan is completed. The complete results should be returned in the last called of
-     * {@link NetworkScanCallback#onResults(List)}.
+     * @param type used to tell which network scan API should be used.
      */
-    public void startNetworkScan() {
-        if (mNetworkScanRequester != null) {
-            return;
-        }
-        mNetworkScanRequester = mTelephonyManager.requestNetworkScan(
-                createNetworkScanForPreferredAccessNetworks(),
-                mExecutor,
-                mInternalNetworkScanCallback);
-        if (mNetworkScanRequester == null) {
-            onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
+    public void startNetworkScan(@NetworkQueryType int type) {
+        if (type == NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS) {
+            mNetworkScanFuture = SettableFuture.create();
+            Futures.addCallback(mNetworkScanFuture, new FutureCallback<List<CellInfo>>() {
+                @Override
+                public void onSuccess(List<CellInfo> result) {
+                    onResults(result);
+                    onComplete();
+                }
+
+                @Override
+                public void onFailure(Throwable t) {
+                    if (t instanceof CancellationException) {
+                        return;
+                    }
+                    int errCode = Integer.parseInt(t.getMessage());
+                    onError(errCode);
+                }
+            }, MoreExecutors.directExecutor());
+            mExecutor.execute(new NetworkScanSyncTask(
+                    mTelephonyManager, (SettableFuture) mNetworkScanFuture));
+        } else if (type == NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS) {
+            if (mNetworkScanRequester != null) {
+                return;
+            }
+            mNetworkScanRequester = mTelephonyManager.requestNetworkScan(
+                    createNetworkScanForPreferredAccessNetworks(),
+                    mExecutor,
+                    mInternalNetworkScanCallback);
+            if (mNetworkScanRequester == null) {
+                onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
+            }
         }
     }
 
     /**
-     * Stops the network scan.
-     *
-     * Use this method to stop an ongoing scan. When user requests a new scan, a {@link NetworkScan}
-     * object will be returned, and the user can stop the scan by calling this method.
+     * The network scan of type {@link #NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS} can't be stopped,
+     * however, the result of the current network scan won't be returned to the callback after
+     * calling this method.
      */
     public void stopNetworkQuery() {
         if (mNetworkScanRequester != null) {
             mNetworkScanRequester.stopScan();
             mNetworkScanRequester = null;
         }
+
+        if (mNetworkScanFuture != null) {
+            mNetworkScanFuture.cancel(true /* mayInterruptIfRunning */);
+            mNetworkScanFuture = null;
+        }
     }
 
     private void onResults(List<CellInfo> cellInfos) {
@@ -185,6 +253,23 @@
         mNetworkScanCallback.onError(errCode);
     }
 
+    /**
+     * Converts the status code of {@link CellNetworkScanResult} to one of the
+     * {@link NetworkScan.ScanErrorCode}.
+     * @param errCode status code from {@link CellNetworkScanResult}.
+     *
+     * @return one of the scan error code from {@link NetworkScan.ScanErrorCode}.
+     */
+    private static int convertToScanErrorCode(int errCode) {
+        switch (errCode) {
+            case CellNetworkScanResult.STATUS_RADIO_NOT_AVAILABLE:
+                return NetworkScan.ERROR_RADIO_INTERFACE_ERROR;
+            case CellNetworkScanResult.STATUS_RADIO_GENERIC_FAILURE:
+            default:
+                return NetworkScan.ERROR_MODEM_ERROR;
+        }
+    }
+
     private final class NetworkScanCallbackImpl extends TelephonyScanManager.NetworkScanCallback {
         public void onResults(List<CellInfo> results) {
             Log.d(TAG, "Async scan onResults() results = "
@@ -202,4 +287,35 @@
             NetworkScanHelper.this.onError(errCode);
         }
     }
+
+    private static final class NetworkScanSyncTask implements Runnable {
+        private final SettableFuture<List<CellInfo>> mCallback;
+        private final TelephonyManager mTelephonyManager;
+
+        NetworkScanSyncTask(
+                TelephonyManager telephonyManager, SettableFuture<List<CellInfo>> callback) {
+            mTelephonyManager = telephonyManager;
+            mCallback = callback;
+        }
+
+        @Override
+        public void run() {
+            final CellNetworkScanResult result = mTelephonyManager.getAvailableNetworks();
+            if (result.getStatus() == CellNetworkScanResult.STATUS_SUCCESS) {
+                final List<CellInfo> cellInfos = result.getOperators()
+                        .stream()
+                        .map(operatorInfo
+                                -> CellInfoUtil.convertOperatorInfoToCellInfo(operatorInfo))
+                        .collect(Collectors.toList());
+                Log.d(TAG, "Sync network scan completed, cellInfos = "
+                        + CellInfoUtil.cellInfoListToString(cellInfos));
+                mCallback.set(cellInfos);
+            } else {
+                final Throwable error = new Throwable(
+                        Integer.toString(convertToScanErrorCode(result.getStatus())));
+                mCallback.setException(error);
+                Log.d(TAG, "Sync network scan error, ex = " + error);
+            }
+        }
+    }
 }
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 7877063..3f18928 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -93,6 +93,8 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        mUseNewApi = getContext().getResources().getBoolean(
+                com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
         mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID);
 
         mPreferenceCategory = findPreference(PREF_KEY_NETWORK_OPERATORS);
@@ -464,7 +466,10 @@
         if (mNetworkScanHelper != null) {
             mRequestIdManualNetworkScan = getNewRequestId();
             mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
-            mNetworkScanHelper.startNetworkScan();
+            mNetworkScanHelper.startNetworkScan(
+                    mUseNewApi
+                            ? NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS
+                            : NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
         }
     }
 
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogActivity.java b/src/com/android/settings/wifi/NetworkRequestDialogActivity.java
index 49e167e..90a0de3 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogActivity.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogActivity.java
@@ -216,13 +216,12 @@
 
     @Override
     public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
-        if (mIsSpecifiedSsid) {
-            showSingleSsidRequestDialog(
-                    WifiInfo.sanitizeSsid(mMatchedConfig.SSID), true /* isTryAgain */);
-            return;
+        if (!isFinishing()) {
+            Toast.makeText(this, R.string.network_connection_connect_failure, Toast.LENGTH_SHORT)
+                    .show();
+            setResult(RESULT_OK);
+            finish();
         }
-
-        mDialogFragment.onUserSelectionConnectFailure(wificonfiguration);
     }
 
     // Called when user click "Connect" button. Called by
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogBaseFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogBaseFragment.java
index c17bacd..f2e24ae 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogBaseFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogBaseFragment.java
@@ -21,7 +21,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
 
 import androidx.annotation.NonNull;
@@ -91,7 +90,4 @@
 
     protected void onMatch(List<ScanResult> scanResults) {
     }
-
-    protected void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
-    }
 }
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index edaa4d9..f179df0 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -324,11 +324,6 @@
         }
     }
 
-    @Override
-    public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
-        // Do nothing when selection is failed, let user could try again easily.
-    }
-
     @VisibleForTesting
     final class FilterWifiTracker {
         private final List<String> mAccessPointKeys;
diff --git a/src/com/android/settings/wifi/tether/HotspotOffReceiver.java b/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
deleted file mode 100644
index fcbf888..0000000
--- a/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
+++ /dev/null
@@ -1,55 +0,0 @@
-
-package com.android.settings.wifi.tether;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiManager;
-import android.util.Log;
-
-/**
- * This receiver catches when quick settings turns off the hotspot, so we can
- * cancel the alarm in that case.  All other cancels are handled in tethersettings.
- */
-public class HotspotOffReceiver extends BroadcastReceiver {
-
-    private static final String TAG = "HotspotOffReceiver";
-    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
-    private Context mContext;
-    private boolean mRegistered;
-
-    public HotspotOffReceiver(Context context) {
-        mContext = context;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {
-            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
-            if (wifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED) {
-                if (DEBUG) Log.d(TAG, "TetherService.cancelRecheckAlarmIfNecessary called");
-                // The hotspot has been turned off, we don't need to recheck tethering.
-                TetherService.cancelRecheckAlarmIfNecessary(
-                        context, ConnectivityManager.TETHERING_WIFI);
-            }
-        }
-    }
-
-    public void register() {
-        if (!mRegistered) {
-            mContext.registerReceiver(this,
-                new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION));
-            mRegistered = true;
-        }
-    }
-
-    public void unregister() {
-        if (mRegistered) {
-            mContext.unregisterReceiver(this);
-            mRegistered = false;
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/tether/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java
index e01a246..72ea1a9 100644
--- a/src/com/android/settings/wifi/tether/TetherService.java
+++ b/src/com/android/settings/wifi/tether/TetherService.java
@@ -16,15 +16,24 @@
 
 package com.android.settings.wifi.tether;
 
+import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE;
+import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK;
+import static android.net.TetheringConstants.EXTRA_REM_TETHER_TYPE;
+import static android.net.TetheringConstants.EXTRA_RUN_PROVISION;
+import static android.net.TetheringManager.TETHERING_BLUETOOTH;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
+import static android.net.TetheringManager.TETHERING_INVALID;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
+import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE;
+import static android.telephony.SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
 import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
 import android.app.Service;
 import android.app.usage.UsageStatsManager;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothPan;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothProfile.ServiceListener;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -33,10 +42,9 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
 import android.os.IBinder;
 import android.os.ResultReceiver;
-import android.os.SystemClock;
 import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -74,7 +82,6 @@
     private TetherServiceWrapper mWrapper;
     private ArrayList<Integer> mCurrentTethers;
     private ArrayMap<Integer, List<ResultReceiver>> mPendingCallbacks;
-    private HotspotOffReceiver mHotspotReceiver;
 
     @Override
     public IBinder onBind(Intent intent) {
@@ -93,18 +100,16 @@
         mCurrentTethers = stringToTethers(prefs.getString(KEY_TETHERS, ""));
         mCurrentTypeIndex = 0;
         mPendingCallbacks = new ArrayMap<>(3);
-        mPendingCallbacks.put(ConnectivityManager.TETHERING_WIFI, new ArrayList<ResultReceiver>());
-        mPendingCallbacks.put(ConnectivityManager.TETHERING_USB, new ArrayList<ResultReceiver>());
-        mPendingCallbacks.put(
-                ConnectivityManager.TETHERING_BLUETOOTH, new ArrayList<ResultReceiver>());
-        mHotspotReceiver = new HotspotOffReceiver(this);
+        mPendingCallbacks.put(TETHERING_WIFI, new ArrayList<ResultReceiver>());
+        mPendingCallbacks.put(TETHERING_USB, new ArrayList<ResultReceiver>());
+        mPendingCallbacks.put(TETHERING_BLUETOOTH, new ArrayList<ResultReceiver>());
+        mPendingCallbacks.put(TETHERING_ETHERNET, new ArrayList<ResultReceiver>());
     }
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         if (intent.hasExtra(EXTRA_SUBID)) {
-            final int tetherSubId = intent.getIntExtra(EXTRA_SUBID,
-                    SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+            final int tetherSubId = intent.getIntExtra(EXTRA_SUBID, INVALID_SUBSCRIPTION_ID);
             final int subId = getTetherServiceWrapper().getActiveDataSubscriptionId();
             if (tetherSubId != subId) {
                 Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId);
@@ -114,18 +119,16 @@
                 return START_NOT_STICKY;
             }
         }
-        if (intent.hasExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE)) {
-            int type = intent.getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
-                    ConnectivityManager.TETHERING_INVALID);
-            ResultReceiver callback =
-                    intent.getParcelableExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK);
+        if (intent.hasExtra(EXTRA_ADD_TETHER_TYPE)) {
+            int type = intent.getIntExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_INVALID);
+            ResultReceiver callback = intent.getParcelableExtra(EXTRA_PROVISION_CALLBACK);
             if (callback != null) {
                 List<ResultReceiver> callbacksForType = mPendingCallbacks.get(type);
                 if (callbacksForType != null) {
                     callbacksForType.add(callback);
                 } else {
                     // Invalid tether type. Just ignore this request and report failure.
-                    callback.send(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE, null);
+                    callback.send(TETHER_ERROR_UNKNOWN_IFACE, null);
                     stopSelf();
                     return START_NOT_STICKY;
                 }
@@ -137,30 +140,20 @@
             }
         }
 
-        if (intent.hasExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE)) {
+        if (intent.hasExtra(EXTRA_REM_TETHER_TYPE)) {
             if (!mInProvisionCheck) {
-                int type = intent.getIntExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE,
-                        ConnectivityManager.TETHERING_INVALID);
+                int type = intent.getIntExtra(EXTRA_REM_TETHER_TYPE, TETHERING_INVALID);
                 int index = mCurrentTethers.indexOf(type);
                 if (DEBUG) Log.d(TAG, "Removing tether " + type + ", index " + index);
                 if (index >= 0) {
                     removeTypeAtIndex(index);
                 }
-                cancelAlarmIfNecessary();
             } else {
-                if (DEBUG) Log.d(TAG, "Don't cancel alarm during provisioning");
+                if (DEBUG) Log.d(TAG, "Don't remove tether type during provisioning");
             }
         }
 
-        // Only set the alarm if we have one tether, meaning the one just added,
-        // to avoid setting it when it was already set previously for another
-        // type.
-        if (intent.getBooleanExtra(ConnectivityManager.EXTRA_SET_ALARM, false)
-                && mCurrentTethers.size() == 1) {
-            scheduleAlarm();
-        }
-
-        if (intent.getBooleanExtra(ConnectivityManager.EXTRA_RUN_PROVISION, false)) {
+        if (intent.getBooleanExtra(EXTRA_RUN_PROVISION, false)) {
             startProvisioning(mCurrentTypeIndex);
         } else if (!mInProvisionCheck) {
             // If we aren't running any provisioning, no reason to stay alive.
@@ -182,16 +175,11 @@
         SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
         prefs.edit().putString(KEY_TETHERS, tethersToString(mCurrentTethers)).commit();
 
-        unregisterReceivers();
+        unregisterReceiver(mReceiver);
         if (DEBUG) Log.d(TAG, "Destroying TetherService");
         super.onDestroy();
     }
 
-    private void unregisterReceivers() {
-        unregisterReceiver(mReceiver);
-        mHotspotReceiver.unregister();
-    }
-
     private void removeTypeAtIndex(int index) {
         mCurrentTethers.remove(index);
         // If we are currently in the middle of a check, we may need to adjust the
@@ -202,11 +190,6 @@
         }
     }
 
-    @VisibleForTesting
-    void setHotspotOffReceiver(HotspotOffReceiver receiver) {
-        mHotspotReceiver = receiver;
-    }
-
     private ArrayList<Integer> stringToTethers(String tethersStr) {
         ArrayList<Integer> ret = new ArrayList<Integer>();
         if (TextUtils.isEmpty(tethersStr)) return ret;
@@ -231,32 +214,9 @@
         return buffer.toString();
     }
 
-    private void disableWifiTethering() {
-        ConnectivityManager cm =
-                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
-        cm.stopTethering(ConnectivityManager.TETHERING_WIFI);
-    }
-
-    private void disableUsbTethering() {
-        ConnectivityManager cm =
-                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
-        cm.setUsbTethering(false);
-    }
-
-    private void disableBtTethering() {
-        final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if (adapter != null) {
-            adapter.getProfileProxy(this, new ServiceListener() {
-                @Override
-                public void onServiceDisconnected(int profile) { }
-
-                @Override
-                public void onServiceConnected(int profile, BluetoothProfile proxy) {
-                    ((BluetoothPan) proxy).setBluetoothTethering(false);
-                    adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
-                }
-            }, BluetoothProfile.PAN);
-        }
+    private void disableTethering(final int tetheringType) {
+        final TetheringManager tm = (TetheringManager) getSystemService(Context.TETHERING_SERVICE);
+        tm.stopTethering(tetheringType);
     }
 
     private void startProvisioning(int index) {
@@ -279,7 +239,7 @@
         Intent intent = new Intent(provisionAction);
         int type = mCurrentTethers.get(index);
         intent.putExtra(TETHER_CHOICE, type);
-        intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
+        intent.putExtra(EXTRA_SUBSCRIPTION_INDEX, subId);
         intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND
                 | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
 
@@ -304,55 +264,13 @@
         }
     }
 
-    @VisibleForTesting
-    void scheduleAlarm() {
-        Intent intent = new Intent(this, TetherService.class);
-        intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
-
-        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
-        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
-        int period = getResourceForActiveDataSubId().getInteger(
-                com.android.internal.R.integer.config_mobile_hotspot_provision_check_period);
-        long periodMs = period * MS_PER_HOUR;
-        long firstTime = SystemClock.elapsedRealtime() + periodMs;
-        if (DEBUG) Log.d(TAG, "Scheduling alarm at interval " + periodMs);
-        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, periodMs,
-                pendingIntent);
-        mHotspotReceiver.register();
-    }
-
-    /**
-     * Cancels the recheck alarm only if no tethering is currently active.
-     *
-     * Runs in the background, to get access to bluetooth service that takes time to bind.
-     */
-    public static void cancelRecheckAlarmIfNecessary(final Context context, int type) {
-        Intent intent = new Intent(context, TetherService.class);
-        intent.putExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE, type);
-        context.startService(intent);
-    }
-
-    @VisibleForTesting
-    void cancelAlarmIfNecessary() {
-        if (mCurrentTethers.size() != 0) {
-            if (DEBUG) Log.d(TAG, "Tethering still active, not cancelling alarm");
-            return;
-        }
-        Intent intent = new Intent(this, TetherService.class);
-        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
-        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
-        alarmManager.cancel(pendingIntent);
-        if (DEBUG) Log.d(TAG, "Tethering no longer active, canceling recheck");
-        mHotspotReceiver.unregister();
-    }
-
     private void fireCallbacksForType(int type, int result) {
         List<ResultReceiver> callbacksForType = mPendingCallbacks.get(type);
         if (callbacksForType == null) {
             return;
         }
-        int errorCode = result == RESULT_OK ? ConnectivityManager.TETHER_ERROR_NO_ERROR :
-                ConnectivityManager.TETHER_ERROR_PROVISION_FAILED;
+        int errorCode = result == RESULT_OK ? TETHER_ERROR_NO_ERROR :
+                TETHER_ERROR_PROVISIONING_FAILED;
         for (ResultReceiver callback : callbacksForType) {
           if (DEBUG) Log.d(TAG, "Firing result: " + errorCode + " to callback");
           callback.send(errorCode, null);
@@ -375,19 +293,7 @@
                 int checkType = mCurrentTethers.get(mCurrentTypeIndex);
                 mInProvisionCheck = false;
                 int result = intent.getIntExtra(EXTRA_RESULT, RESULT_DEFAULT);
-                if (result != RESULT_OK) {
-                    switch (checkType) {
-                        case ConnectivityManager.TETHERING_WIFI:
-                            disableWifiTethering();
-                            break;
-                        case ConnectivityManager.TETHERING_BLUETOOTH:
-                            disableBtTethering();
-                            break;
-                        case ConnectivityManager.TETHERING_USB:
-                            disableUsbTethering();
-                            break;
-                    }
-                }
+                if (result != RESULT_OK) disableTethering(checkType);
                 fireCallbacksForType(checkType, result);
 
                 if (++mCurrentTypeIndex >= mCurrentTethers.size()) {
diff --git a/tests/robotests/src/com/android/settings/applications/AppStorageSettingsTest.java b/tests/robotests/src/com/android/settings/applications/AppStorageSettingsTest.java
index 3517702..2027ace 100644
--- a/tests/robotests/src/com/android/settings/applications/AppStorageSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppStorageSettingsTest.java
@@ -16,9 +16,9 @@
 
 package com.android.settings.applications;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
@@ -28,6 +28,10 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ModuleInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
 import android.view.View;
 import android.widget.Button;
 
@@ -51,6 +55,8 @@
     private AppStorageSettings mSettings;
     private Button mLeftButton;
     private Button mRightButton;
+    @Mock
+    private PackageManager mPackageManager;
 
     @Before
     public void setUp() {
@@ -58,6 +64,8 @@
         mLeftButton = new Button(RuntimeEnvironment.application);
         mRightButton = new Button(RuntimeEnvironment.application);
         mSettings = spy(new AppStorageSettings());
+        mSettings.mPm = mPackageManager;
+        mSettings.mPackageName = "Package";
         mSettings.mSizeController = mSizesController;
         mButtonsPref = createMock();
         mSettings.mButtonsPref = mButtonsPref;
@@ -77,7 +85,9 @@
     }
 
     @Test
-    public void updateUiWithSize_noAppStats_shouldDisableClearButtons() {
+    public void updateUiWithSize_noAppStats_shouldDisableClearButtons()
+            throws PackageManager.NameNotFoundException {
+        mockMainlineModule(mSettings.mPackageName, false /* isMainlineModule */);
         mSettings.updateUiWithSize(null);
 
         verify(mSizesController).updateUi(nullable(Context.class));
@@ -86,12 +96,15 @@
     }
 
     @Test
-    public void updateUiWithSize_hasDataAndCache_shouldEnableClearButtons() {
+    public void updateUiWithSize_hasDataAndCache_shouldEnableClearButtons()
+            throws PackageManager.NameNotFoundException {
         final AppStorageStats stats = mock(AppStorageStats.class);
         when(stats.getCacheBytes()).thenReturn(5000L);
         when(stats.getDataBytes()).thenReturn(10000L);
         doNothing().when(mSettings).handleClearCacheClick();
         doNothing().when(mSettings).handleClearDataClick();
+        mockMainlineModule(mSettings.mPackageName, false /* isMainlineModule */);
+
 
         mSettings.updateUiWithSize(stats);
         verify(mButtonsPref).setButton1Enabled(true);
@@ -105,6 +118,22 @@
         verify(mSettings).handleClearCacheClick();
     }
 
+    @Test
+    public void updateUiWithSize_mainlineModule_shouldDisableClearButtons()
+            throws PackageManager.NameNotFoundException {
+        final AppStorageStats stats = mock(AppStorageStats.class);
+        when(stats.getCacheBytes()).thenReturn(5000L);
+        when(stats.getDataBytes()).thenReturn(10000L);
+        doNothing().when(mSettings).handleClearCacheClick();
+        doNothing().when(mSettings).handleClearDataClick();
+        mockMainlineModule(mSettings.mPackageName, true /* isMainlineModule */);
+
+
+        mSettings.updateUiWithSize(stats);
+        verify(mButtonsPref).setButton1Enabled(false);
+        verify(mButtonsPref).setButton2Enabled(false);
+    }
+
     private ActionButtonsPreference createMock() {
         final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
         when(pref.setButton1Text(anyInt())).thenReturn(pref);
@@ -121,5 +150,23 @@
 
         return pref;
     }
+
+    private void mockMainlineModule(String packageName, boolean isMainlineModule)
+            throws PackageManager.NameNotFoundException {
+        final PackageInfo packageInfo = new PackageInfo();
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.sourceDir = "apex";
+        packageInfo.applicationInfo = applicationInfo;
+
+        if (isMainlineModule) {
+            when(mPackageManager.getModuleInfo(packageName, 0 /* flags */)).thenReturn(
+                    new ModuleInfo());
+        } else {
+            when(mPackageManager.getPackageInfo(packageName, 0 /* flags */)).thenReturn(
+                    packageInfo);
+            when(mPackageManager.getModuleInfo(packageName, 0 /* flags */)).thenThrow(
+                    new PackageManager.NameNotFoundException());
+        }
+    }
 }
 
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
index c2bcd1c..a5ac209 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -543,6 +543,19 @@
         assertThat(i.getBooleanExtra(KEY_REMOVE_TASK_WHEN_FINISHING, false)).isFalse();
     }
 
+    @Test
+    @Config(shadows = ShadowAppUtils.class)
+    public void isAvailable_nonMainlineModule_isTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    @Config(shadows = ShadowAppUtils.class)
+    public void isAvailable_mainlineModule_isFalse() {
+        ShadowAppUtils.addMainlineModule(mController.mPackageName);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
     /**
      * The test fragment which implements
      * {@link ButtonActionDialogFragment.AppButtonsDialogListener}
@@ -597,16 +610,22 @@
     public static class ShadowAppUtils {
 
         public static Set<String> sSystemModules = new ArraySet<>();
+        public static Set<String> sMainlineModules = new ArraySet<>();
 
         @Resetter
         public static void reset() {
             sSystemModules.clear();
+            sMainlineModules.clear();
         }
 
         public static void addHiddenModule(String pkg) {
             sSystemModules.add(pkg);
         }
 
+        public static void addMainlineModule(String pkg) {
+            sMainlineModules.add(pkg);
+        }
+
         @Implementation
         protected static boolean isInstant(ApplicationInfo info) {
             return false;
@@ -616,5 +635,10 @@
         protected static boolean isSystemModule(Context context, String packageName) {
             return sSystemModules.contains(packageName);
         }
+
+        @Implementation
+        protected static boolean isMainlineModule(PackageManager pm, String packageName) {
+            return sMainlineModules.contains(packageName);
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
index 00bd5f8..d37a685 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInstallerInfoPreferenceControllerTest.java
@@ -99,12 +99,15 @@
     }
 
     @Test
-    public void getAvailabilityStatus_hasAppLabel_shouldReturnAvailable() {
+    public void getAvailabilityStatus_hasAppLabel_shouldReturnAvailable()
+            throws PackageManager.NameNotFoundException {
+        final String packageName = "Package1";
         when(mUserManager.isManagedProfile()).thenReturn(false);
         when(mAppInfo.loadLabel(mPackageManager)).thenReturn("Label1");
         mController = new AppInstallerInfoPreferenceController(mContext, "test_key");
-        mController.setPackageName("Package1");
+        mController.setPackageName(packageName);
         mController.setParentFragment(mFragment);
+        mockMainlineModule(packageName, false /* isMainlineModule */);
 
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.AVAILABLE);
@@ -153,12 +156,31 @@
     @Test
     public void getAvailabilityStatus_isMainlineModule_shouldReturnDisabled()
             throws PackageManager.NameNotFoundException {
+        final String packageName = "Package";
         when(mUserManager.isManagedProfile()).thenReturn(false);
         when(mAppInfo.loadLabel(mPackageManager)).thenReturn("Label");
-        mController.setPackageName("Package");
-        when(mPackageManager.getModuleInfo("Package", 0 /* flags */)).thenReturn(new ModuleInfo());
+        mController.setPackageName(packageName);
+        mockMainlineModule(packageName, true /* isMainlineModule */);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.DISABLED_FOR_USER);
     }
+
+    private void mockMainlineModule(String packageName, boolean isMainlineModule)
+            throws PackageManager.NameNotFoundException {
+        final PackageInfo packageInfo = new PackageInfo();
+        final ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.sourceDir = "apex";
+        packageInfo.applicationInfo = applicationInfo;
+
+        if (isMainlineModule) {
+            when(mPackageManager.getModuleInfo(packageName, 0 /* flags */)).thenReturn(
+                    new ModuleInfo());
+        } else {
+            when(mPackageManager.getPackageInfo(packageName, 0 /* flags */)).thenReturn(
+                    packageInfo);
+            when(mPackageManager.getModuleInfo(packageName, 0 /* flags */)).thenThrow(
+                    new PackageManager.NameNotFoundException());
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/NetworkScanHelperTest.java b/tests/robotests/src/com/android/settings/network/telephony/NetworkScanHelperTest.java
index 19ae6ff..1e7bfaf 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/NetworkScanHelperTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/NetworkScanHelperTest.java
@@ -164,7 +164,8 @@
     }
 
     private void startNetworkScan_incremental(boolean waitForCompletion) {
-        mNetworkScanHelper.startNetworkScan();
+        mNetworkScanHelper.startNetworkScan(
+                NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
         if (!waitForCompletion) {
             mNetworkScanHelper.stopNetworkQuery();
         }
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
index c744647..ecf9c68 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
@@ -126,4 +126,13 @@
 
         verify(mActivity).finish();
     }
+
+    @Test
+    public void updateAccessPointList_onUserSelectionConnectFailure_shouldFinishActivity() {
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "Test AP 3";
+        mActivity.onUserSelectionConnectFailure(config);
+
+        verify(mActivity).finish();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
deleted file mode 100644
index 61b9b5b..0000000
--- a/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.tether;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.net.wifi.WifiManager;
-
-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;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowApplication.Wrapper;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-
-@RunWith(RobolectricTestRunner.class)
-public class TetherServiceTest {
-
-    private static final int CHECK_PERIOD_HOURS = 24;
-
-    @Mock
-    private Context mContext;
-    @Mock
-    private Resources mResources;
-
-    private Context mAppContext;
-    private TetherService mService;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mAppContext = RuntimeEnvironment.application;
-        mService = spy(new TetherService());
-        ReflectionHelpers.setField(mService, "mBase", mAppContext);
-        mService.setHotspotOffReceiver(new HotspotOffReceiver(mContext));
-        doReturn(CHECK_PERIOD_HOURS).when(mResources).getInteger(
-                com.android.internal.R.integer.config_mobile_hotspot_provision_check_period);
-        doReturn(mResources).when(mService).getResourceForActiveDataSubId();
-    }
-
-    @Test
-    public void scheduleAlarm_shouldRegisterReceiver() {
-        mService.setHotspotOffReceiver(new HotspotOffReceiver(mAppContext));
-
-        mService.scheduleAlarm();
-
-        boolean found = false;
-        for (Wrapper wrapper : ShadowApplication.getInstance().getRegisteredReceivers()) {
-            if (wrapper.intentFilter.matchAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
-                found = true;
-                break;
-            }
-        }
-
-        assertThat(found).isTrue();
-    }
-
-    @Test
-    public void cancelAlarmIfNecessary_hasActiveTethers_shouldNotUnregisterReceiver() {
-        mService.scheduleAlarm();
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        tethers.add(1);
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-
-        mService.cancelAlarmIfNecessary();
-
-        verify(mContext, never()).unregisterReceiver(any(HotspotOffReceiver.class));
-    }
-
-    @Test
-    public void cancelAlarmIfNecessary_noActiveTethers_shouldUnregisterReceiver() {
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-        mService.scheduleAlarm();
-
-        mService.cancelAlarmIfNecessary();
-
-        verify(mContext).unregisterReceiver(any(HotspotOffReceiver.class));
-    }
-
-    @Test
-    public void onDestroy_shouldUnregisterReceiver() {
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-        ReflectionHelpers.setField(mService, "mBase", mContext);
-        final SharedPreferences prefs = mock(SharedPreferences .class);
-        final SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);
-        when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(prefs);
-        when(prefs.edit()).thenReturn(editor);
-        when(editor.putString(anyString(), anyString())).thenReturn(editor);
-        final HotspotOffReceiver hotspotOffReceiver = mock(HotspotOffReceiver.class);
-        mService.setHotspotOffReceiver(hotspotOffReceiver);
-
-        mService.onDestroy();
-
-        verify(hotspotOffReceiver).unregister();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
index 6891441..19f29c0 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -16,27 +16,23 @@
 
 package com.android.settings.wifi.tether;
 
-import static android.net.ConnectivityManager.EXTRA_ADD_TETHER_TYPE;
-import static android.net.ConnectivityManager.EXTRA_PROVISION_CALLBACK;
-import static android.net.ConnectivityManager.EXTRA_REM_TETHER_TYPE;
-import static android.net.ConnectivityManager.EXTRA_RUN_PROVISION;
-import static android.net.ConnectivityManager.EXTRA_SET_ALARM;
-import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
-import static android.net.ConnectivityManager.TETHERING_INVALID;
-import static android.net.ConnectivityManager.TETHERING_USB;
-import static android.net.ConnectivityManager.TETHERING_WIFI;
-import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
-import static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED;
+import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE;
+import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK;
+import static android.net.TetheringConstants.EXTRA_RUN_PROVISION;
+import static android.net.TetheringManager.TETHERING_BLUETOOTH;
+import static android.net.TetheringManager.TETHERING_INVALID;
+import static android.net.TetheringManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_WIFI;
+import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
+import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.app.usage.UsageStatsManager;
 import android.content.BroadcastReceiver;
@@ -51,7 +47,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
-import android.net.ConnectivityManager;
+import android.net.TetheringManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.ResultReceiver;
@@ -92,8 +88,7 @@
     private ProvisionReceiver mProvisionReceiver;
     private Receiver mResultReceiver;
 
-    @Mock private AlarmManager mAlarmManager;
-    @Mock private ConnectivityManager mConnectivityManager;
+    @Mock private TetheringManager mTetheringManager;
     @Mock private PackageManager mPackageManager;
     @Mock private WifiManager mWifiManager;
     @Mock private SharedPreferences mPrefs;
@@ -158,15 +153,6 @@
         super.tearDown();
     }
 
-    private void cancelAllProvisioning() {
-        int[] types = new int[]{TETHERING_BLUETOOTH, TETHERING_WIFI, TETHERING_USB};
-        for (int type : types) {
-            Intent intent = new Intent();
-            intent.putExtra(EXTRA_REM_TETHER_TYPE, type);
-            startService(intent);
-        }
-    }
-
     public void testStartForProvision() {
         runProvisioningForType(TETHERING_WIFI);
 
@@ -184,19 +170,6 @@
         assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME));
     }
 
-    public void testScheduleRechecks() {
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI);
-        intent.putExtra(EXTRA_SET_ALARM, true);
-        startService(intent);
-
-        long period = TEST_CHECK_PERIOD * MS_PER_HOUR;
-        verify(mAlarmManager).setRepeating(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
-                eq(period), mPiCaptor.capture());
-        PendingIntent pi = mPiCaptor.getValue();
-        assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName());
-    }
-
     public void testStartMultiple() {
         runProvisioningForType(TETHERING_WIFI);
 
@@ -235,9 +208,9 @@
         runProvisioningForType(TETHERING_WIFI);
 
         assertTrue(waitForProvisionRequest(TETHERING_WIFI));
-        assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISION_FAILED));
+        assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISIONING_FAILED));
 
-        verify(mConnectivityManager).stopTethering(ConnectivityManager.TETHERING_WIFI);
+        verify(mTetheringManager).stopTethering(TETHERING_WIFI);
     }
 
     public void testFailureStopsTethering_Usb() {
@@ -246,24 +219,9 @@
         runProvisioningForType(TETHERING_USB);
 
         assertTrue(waitForProvisionRequest(TETHERING_USB));
-        assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISION_FAILED));
+        assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISIONING_FAILED));
 
-        verify(mConnectivityManager).setUsbTethering(eq(false));
-    }
-
-    public void testCancelAlarm() {
-        runProvisioningForType(TETHERING_WIFI);
-
-        assertTrue(waitForProvisionRequest(TETHERING_WIFI));
-        assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR));
-
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_REM_TETHER_TYPE, TETHERING_WIFI);
-        startService(intent);
-
-        verify(mAlarmManager).cancel(mPiCaptor.capture());
-        PendingIntent pi = mPiCaptor.getValue();
-        assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName());
+        verify(mTetheringManager).stopTethering(TETHERING_USB);
     }
 
     public void testIgnoreOutdatedRequest() {
@@ -387,10 +345,8 @@
 
         @Override
         public Object getSystemService(String name) {
-            if (ALARM_SERVICE.equals(name)) {
-                return mAlarmManager;
-            } else if (CONNECTIVITY_SERVICE.equals(name)) {
-                return mConnectivityManager;
+            if (TETHERING_SERVICE.equals(name)) {
+                return mTetheringManager;
             } else if (WIFI_SERVICE.equals(name)) {
                 return mWifiManager;
             }