diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ff4096f..db2d3b2 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1707,14 +1707,14 @@
                        android:value="@string/menu_key_apps"/>
         </activity-alias>
 
-        <activity-alias android:name="com.google.android.settings.ManageFullScreenIntent"
+        <activity-alias android:name="ManageFullScreenIntent"
                         android:exported="true"
                         android:targetActivity=".spa.SpaBridgeActivity">
             <meta-data android:name="com.android.settings.spa.DESTINATION"
                        android:value="TogglePermissionAppList/UseFullScreenIntent"/>
         </activity-alias>
 
-        <activity-alias android:name="com.google.android.settings.AppManageFullScreenIntent"
+        <activity-alias android:name="AppManageFullScreenIntent"
                         android:exported="true"
                         android:targetActivity=".spa.SpaAppBridgeActivity">
             <intent-filter>
@@ -3717,7 +3717,7 @@
         <!-- Show channel-level notification settings (channel passed in as extras) -->
         <activity android:name=".notification.app.ChannelPanelActivity"
                   android:label="@string/notification_channel_title"
-                  android:theme="@style/Theme.Panel.Material"
+                  android:theme="@style/Theme.Panel"
                   android:excludeFromRecents="true"
                   android:configChanges="keyboardHidden|screenSize"
                   android:exported="true">
diff --git a/res/drawable/button_border_selected.xml b/res/drawable/button_border_selected.xml
index 1402380..0cd4aa5 100644
--- a/res/drawable/button_border_selected.xml
+++ b/res/drawable/button_border_selected.xml
@@ -15,7 +15,10 @@
   limitations under the License.
   -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
        android:shape="rectangle">
+    <solid
+        android:color="?androidprv:attr/materialColorSurfaceContainer" />
     <stroke
         android:width="2dp"
         android:color="?android:attr/colorAccent"/>
diff --git a/res/drawable/button_border_unselected.xml b/res/drawable/button_border_unselected.xml
index d0ce75b..2c2ef3d 100644
--- a/res/drawable/button_border_unselected.xml
+++ b/res/drawable/button_border_unselected.xml
@@ -18,7 +18,7 @@
        android:shape="rectangle">
     <stroke
         android:width="1dp"
-        android:color="?android:attr/colorAccent"/>
+        android:color="@color/notification_importance_button_unselected"/>
 
     <corners android:radius="@dimen/rect_button_radius" />
 </shape>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e191c42..5826e60 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1054,8 +1054,10 @@
     <string name="security_fingerprint_disclaimer_lockscreen_disabled_2">You can still use your fingerprint to authorize purchases and app access.</string>
     <!-- Text shown in fingerprint enroll when we didn't observe progress for a few seconds. [CHAR LIMIT=100] -->
     <string name="security_settings_fingerprint_enroll_lift_touch_again">Lift finger, then touch sensor again</string>
+    <!-- Dialog title during fingerprint enrollment to indicate bad sensor calibration. [CHAR LIMIT=100] -->
+    <string name="security_settings_fingerprint_bad_calibration_title">Can\u2019t use fingerprint sensor</string>
     <!-- Text shown during fingerprint enrollment to indicate bad sensor calibration. [CHAR LIMIT=100] -->
-    <string name="security_settings_fingerprint_bad_calibration">Can\u2019t use fingerprint sensor. Visit a repair provider</string>
+    <string name="security_settings_fingerprint_bad_calibration">Visit a repair provider.</string>
     <!-- Title for the section that has additional security settings. [CHAR LIMIT=60] -->
     <string name="security_advanced_settings">More security settings</string>
     <!-- String for the "More security settings" summary when a work profile is on the device. [CHAR_LIMIT=NONE] -->
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 8f13279..eeba1c7 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -227,9 +227,6 @@
         <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
     </style>
 
-    <style name="Theme.Panel.Material" parent="Theme.Panel" >
-        <item name="android:switchStyle">@style/Switch.SettingsLib</item>
-    </style>
     <!-- Material theme for the pages containing TabLayout and ViewPager -->
     <style name="Theme.TabTheme" parent="@style/Theme.MaterialComponents.DayNight">
         <item name="colorPrimary">@*android:color/edge_effect_device_default_light</item>
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index 55745d0..d65e057 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -163,6 +163,8 @@
         switch (errMsgId) {
             case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
                 return R.string.security_settings_fingerprint_enroll_error_dialog_title;
+            case FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION:
+                return R.string.security_settings_fingerprint_bad_calibration_title;
             default:
                 return R.string
                         .security_settings_fingerprint_enroll_error_unable_to_process_dialog_title;
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 87d8c17..f7be1aa 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -354,13 +354,18 @@
                 final NfcVerboseVendorLogPreferenceController nfcVerboseLogController =
                         getDevelopmentOptionsController(
                                 NfcVerboseVendorLogPreferenceController.class);
+                final GraphicsDriverEnableAngleAsSystemDriverController enableAngleController =
+                        getDevelopmentOptionsController(
+                                GraphicsDriverEnableAngleAsSystemDriverController.class);
                 // If hardware offload isn't default value, we must reboot after disable
                 // developer options. Show a dialog for the user to confirm.
                 if ((a2dpController == null || a2dpController.isDefaultValue())
                         && (leAudioController == null || leAudioController.isDefaultValue())
                         && (nfcSnoopLogController == null || nfcSnoopLogController.isDefaultValue())
                         && (nfcVerboseLogController == null
-                        || nfcVerboseLogController.isDefaultValue())) {
+                        || nfcVerboseLogController.isDefaultValue())
+                        && (enableAngleController == null
+                        || enableAngleController.isDefaultValue())) {
                     disableDeveloperOptions();
                 } else {
                     DisableDevSettingsDialogFragment.show(this /* host */);
diff --git a/src/com/android/settings/development/DisableDevSettingsDialogFragment.java b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
index 5db2ed4..224768b 100644
--- a/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
+++ b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
@@ -45,6 +45,10 @@
     public static void show(DevelopmentSettingsDashboardFragment host) {
         final DisableDevSettingsDialogFragment dialog = new DisableDevSettingsDialogFragment();
         dialog.setTargetFragment(host, 0 /* requestCode */);
+        // We need to handle data changes and switch state based on which button user clicks,
+        // therefore we should enforce user to click one of the buttons
+        // by disallowing dialog dismiss through tapping outside of dialog bounds.
+        dialog.setCancelable(false);
         final FragmentManager manager = host.getActivity().getSupportFragmentManager();
         dialog.show(manager, TAG);
     }
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
index 1a065a9..b3af95e 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
@@ -81,6 +81,11 @@
         this(context, fragment, new Injector());
     }
 
+    private boolean isAngleSupported() {
+        return TextUtils.equals(
+                        mSystemProperties.get(PROPERTY_RO_GFX_ANGLE_SUPPORTED, ""), "true");
+    }
+
     @VisibleForTesting
     GraphicsDriverEnableAngleAsSystemDriverController(
             Context context, DevelopmentSettingsDashboardFragment fragment, Injector injector) {
@@ -118,38 +123,44 @@
                 this);
     }
 
-    @Override
-    public void updateState(Preference preference) {
-        // set switch on if "persist.graphics.egl" is "angle" and angle is built in /vendor
-        // set switch off otherwise.
+    /** Return the default value of "persist.graphics.egl" */
+    public boolean isDefaultValue() {
+        if (!isAngleSupported()) {
+            return true;
+        }
+
         final String currentGlesDriver =
                 mSystemProperties.get(PROPERTY_PERSISTENT_GRAPHICS_EGL, "");
-        final boolean isAngle = TextUtils.equals(ANGLE_DRIVER_SUFFIX, currentGlesDriver);
-        final boolean isAngleSupported =
-                TextUtils.equals(
-                        mSystemProperties.get(PROPERTY_RO_GFX_ANGLE_SUPPORTED, ""), "true");
-        ((SwitchPreference) mPreference).setChecked(isAngle && isAngleSupported);
-        ((SwitchPreference) mPreference).setEnabled(isAngleSupported);
+        // default value of "persist.graphics.egl" is ""
+        return TextUtils.isEmpty(currentGlesDriver);
     }
 
     @Override
-    protected void onDeveloperOptionsSwitchEnabled() {
-        // only enable the switch if ro.gfx.angle.supported is true
-        // we use ro.gfx.angle.supported to indicate if ANGLE libs are installed under /vendor
-        final boolean isAngleSupported =
-                TextUtils.equals(
-                        mSystemProperties.get(PROPERTY_RO_GFX_ANGLE_SUPPORTED, ""), "true");
-        ((SwitchPreference) mPreference).setEnabled(isAngleSupported);
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (isAngleSupported()) {
+            // set switch on if "persist.graphics.egl" is "angle" and angle is built in /vendor
+            // set switch off otherwise.
+            final String currentGlesDriver =
+                    mSystemProperties.get(PROPERTY_PERSISTENT_GRAPHICS_EGL, "");
+            final boolean isAngle = TextUtils.equals(ANGLE_DRIVER_SUFFIX, currentGlesDriver);
+            ((SwitchPreference) mPreference).setChecked(isAngle);
+        } else {
+            mPreference.setEnabled(false);
+            ((SwitchPreference) mPreference).setChecked(false);
+        }
     }
 
     @Override
     protected void onDeveloperOptionsSwitchDisabled() {
-        // 1) set the persist.graphics.egl empty string
-        GraphicsEnvironment.getInstance().toggleAngleAsSystemDriver(false);
-        // 2) reset the switch
-        ((SwitchPreference) mPreference).setChecked(false);
-        // 3) disable switch
-        ((SwitchPreference) mPreference).setEnabled(false);
+        // 1) disable the switch
+        super.onDeveloperOptionsSwitchDisabled();
+        if (isAngleSupported()) {
+            // 2) set the persist.graphics.egl empty string
+            GraphicsEnvironment.getInstance().toggleAngleAsSystemDriver(false);
+            // 3) reset the switch
+            ((SwitchPreference) mPreference).setChecked(false);
+        }
     }
 
     void toggleSwitchBack() {
diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
index 9efaf63..092207b 100644
--- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java
+++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
@@ -29,6 +29,8 @@
 import android.widget.FrameLayout;
 import android.widget.ListView;
 
+import androidx.core.view.ViewCompat;
+
 import com.android.internal.app.LocalePickerWithRegion;
 import com.android.internal.app.LocaleStore;
 import com.android.settings.R;
@@ -105,12 +107,16 @@
     @Override
     public boolean onMenuItemActionCollapse(MenuItem item) {
         mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
+        ViewCompat.setNestedScrollingEnabled(mAppLocaleDetails.getListView(), true);
+        ViewCompat.setNestedScrollingEnabled(mLocalePickerWithRegion.getListView(), true);
         return true;
     }
 
     @Override
     public boolean onMenuItemActionExpand(MenuItem item) {
         mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
+        ViewCompat.setNestedScrollingEnabled(mAppLocaleDetails.getListView(), false);
+        ViewCompat.setNestedScrollingEnabled(mLocalePickerWithRegion.getListView(), false);
         return true;
     }
 
@@ -171,4 +177,4 @@
 
         return false;
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java
index e55ba26..7d88821 100644
--- a/src/com/android/settings/network/MobileNetworkRepository.java
+++ b/src/com/android/settings/network/MobileNetworkRepository.java
@@ -88,7 +88,7 @@
     private List<MobileNetworkInfoEntity> mMobileNetworkInfoEntityList = new ArrayList<>();
     private Context mContext;
     private AirplaneModeObserver mAirplaneModeObserver;
-    private Uri mAirplaneModeSettingUri;
+    private DataRoamingObserver mDataRoamingObserver;
     private MetricsFeatureProvider mMetricsFeatureProvider;
     private Map<Integer, MobileDataContentObserver> mDataContentObserverMap = new HashMap<>();
     private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
@@ -127,10 +127,13 @@
         mUiccInfoDao = mMobileNetworkDatabase.mUiccInfoDao();
         mMobileNetworkInfoDao = mMobileNetworkDatabase.mMobileNetworkInfoDao();
         mAirplaneModeObserver = new AirplaneModeObserver(new Handler(Looper.getMainLooper()));
-        mAirplaneModeSettingUri = Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON);
+        mDataRoamingObserver = new DataRoamingObserver(new Handler(Looper.getMainLooper()));
     }
 
     private class AirplaneModeObserver extends ContentObserver {
+        private Uri mAirplaneModeSettingUri =
+                Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON);
+
         AirplaneModeObserver(Handler handler) {
             super(handler);
         }
@@ -155,6 +158,46 @@
         }
     }
 
+    private class DataRoamingObserver extends ContentObserver {
+        private int mRegSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        private String mBaseField = Settings.Global.DATA_ROAMING;
+
+        DataRoamingObserver(Handler handler) {
+            super(handler);
+        }
+
+        public void register(Context context, int subId) {
+            mRegSubId = subId;
+            String lastField = mBaseField;
+            createTelephonyManagerBySubId(subId);
+            TelephonyManager tm = mTelephonyManagerMap.get(subId);
+            if (tm.getSimCount() != 1) {
+                lastField += subId;
+            }
+            context.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(lastField), false, this);
+        }
+
+        public void unRegister(Context context) {
+            context.getContentResolver().unregisterContentObserver(this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            TelephonyManager tm = mTelephonyManagerMap.get(mRegSubId);
+            if (tm == null) {
+                return;
+            }
+            sExecutor.execute(() -> {
+                insertMobileNetworkInfo(mContext, mRegSubId, tm);
+            });
+            boolean isDataRoamingEnabled = tm.isDataRoamingEnabled();
+            for (MobileNetworkCallback callback : sCallbacks) {
+                callback.onDataRoamingChanged(mRegSubId, isDataRoamingEnabled);
+            }
+        }
+    }
+
     /**
      * Register all callbacks and listener.
      *
@@ -180,6 +223,7 @@
         if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             addRegisterBySubId(subId);
             createTelephonyManagerBySubId(subId);
+            mDataRoamingObserver.register(mContext, subId);
         }
     }
 
@@ -251,6 +295,7 @@
         if (sCallbacks.isEmpty()) {
             mSubscriptionManager.removeOnSubscriptionsChangedListener(this);
             mAirplaneModeObserver.unRegister(mContext);
+            mDataRoamingObserver.unRegister(mContext);
             mDataContentObserverMap.forEach((id, observer) -> {
                 observer.unRegister(mContext);
             });
@@ -388,7 +433,6 @@
         mActiveSubInfoEntityList = availableSubInfoEntityList.stream()
                 .filter(SubscriptionInfoEntity::isActiveSubscription)
                 .filter(SubscriptionInfoEntity::isSubscriptionVisible)
-                .sorted((e1, e2) -> Integer.compare(e1.simSlotIndex, e2.simSlotIndex))
                 .collect(Collectors.toList());
         if (DEBUG) {
             Log.d(TAG, "onActiveSubInfoChanged, activeSubInfoEntityList = "
@@ -709,6 +753,12 @@
         default void onAirplaneModeChanged(boolean enabled) {
         }
 
+        /**
+         * Notify clients data roaming changed of subscription.
+         */
+        default void onDataRoamingChanged(int subId, boolean enabled) {
+        }
+
         default void onCallStateChanged(int state) {
         }
     }
diff --git a/src/com/android/settings/network/MobileNetworkSummaryController.java b/src/com/android/settings/network/MobileNetworkSummaryController.java
index 1474836..f924636 100644
--- a/src/com/android/settings/network/MobileNetworkSummaryController.java
+++ b/src/com/android/settings/network/MobileNetworkSummaryController.java
@@ -134,7 +134,6 @@
             return mContext.getString(R.string.mobile_network_tap_to_activate, displayName);
         } else {
             return mSubInfoEntityList.stream()
-                    .sorted((e1, e2) -> Integer.compare(e1.simSlotIndex, e2.simSlotIndex))
                     .map(SubscriptionInfoEntity::getUniqueDisplayName)
                     .collect(Collectors.joining(", "));
         }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 83d2117..d6d9df4 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -52,7 +52,6 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
 import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
-import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
 import com.android.settingslib.search.SearchIndexable;
 import com.android.settingslib.utils.ThreadUtils;
 
@@ -441,8 +440,10 @@
                 /** suppress full page if user is not admin */
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return SubscriptionUtil.isSimHardwareVisible(context) &&
-                            context.getSystemService(UserManager.class).isAdminUser();
+                    boolean isAirplaneOff = Settings.Global.getInt(context.getContentResolver(),
+                            Settings.Global.AIRPLANE_MODE_ON, 0) == 0;
+                    return isAirplaneOff && SubscriptionUtil.isSimHardwareVisible(context)
+                            && context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
 
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index b26e783..ebc3ea6 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -228,10 +228,10 @@
 
     @Override
     public void onStop() {
-        super.onStop();
         if (mWaitingForNumberOfScanResults <= 0) {
             stopNetworkQuery();
         }
+        super.onStop();
     }
 
     @Override
diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
index feeed91..bdfeace 100644
--- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
@@ -21,6 +21,7 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.util.Log;
 
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
@@ -34,6 +35,7 @@
  */
 public class PreferredNetworkModePreferenceController extends TelephonyBasePreferenceController
         implements ListPreference.OnPreferenceChangeListener {
+    private static final String TAG = "PrefNetworkModeCtrl";
 
     private CarrierConfigCache mCarrierConfigCache;
     private TelephonyManager mTelephonyManager;
@@ -99,6 +101,10 @@
     }
 
     private int getPreferredNetworkMode() {
+        if (mTelephonyManager == null) {
+            Log.w(TAG, "TelephonyManager is null");
+            return TelephonyManagerConstants.NETWORK_MODE_UNKNOWN;
+        }
         return MobileNetworkUtils.getNetworkTypeFromRaf(
                 (int) mTelephonyManager.getAllowedNetworkTypesForReason(
                         TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
diff --git a/src/com/android/settings/network/telephony/RoamingPreferenceController.java b/src/com/android/settings/network/telephony/RoamingPreferenceController.java
index ff5da52..fb8cd51 100644
--- a/src/com/android/settings/network/telephony/RoamingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/RoamingPreferenceController.java
@@ -21,28 +21,23 @@
 
 import android.content.Context;
 import android.os.PersistableBundle;
-import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.FragmentManager;
 import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.OnLifecycleEvent;
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.FragmentManager;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settings.network.GlobalSettingsChangeListener;
 import com.android.settings.network.MobileNetworkRepository;
 import com.android.settingslib.RestrictedSwitchPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
-import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
-import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -52,7 +47,6 @@
  */
 public class RoamingPreferenceController extends TelephonyTogglePreferenceController implements
         LifecycleObserver, MobileNetworkRepository.MobileNetworkCallback {
-
     private static final String TAG = "RoamingController";
     private static final String DIALOG_TAG = "MobileDataDialog";
 
@@ -63,15 +57,6 @@
     protected LifecycleOwner mLifecycleOwner;
     private List<MobileNetworkInfoEntity> mMobileNetworkInfoEntityList = new ArrayList<>();
 
-    /**
-     * There're 2 listeners both activated at the same time.
-     * For project that access DATA_ROAMING, only first listener is functional.
-     * For project that access "DATA_ROAMING + subId", first listener will be stopped when receiving
-     * any onChange from second listener.
-     */
-    private GlobalSettingsChangeListener mListener;
-    private GlobalSettingsChangeListener mListenerForSubId;
-
     @VisibleForTesting
     FragmentManager mFragmentManager;
     MobileNetworkInfoEntity mMobileNetworkInfoEntity;
@@ -102,34 +87,11 @@
     public void onStart() {
         mMobileNetworkRepository.addRegister(mLifecycleOwner, this, mSubId);
         mMobileNetworkRepository.updateEntity();
-        if (mListener == null) {
-            mListener = new GlobalSettingsChangeListener(mContext,
-                    Settings.Global.DATA_ROAMING) {
-                public void onChanged(String field) {
-                    updateState(mSwitchPreference);
-                }
-            };
-        }
-        stopMonitorSubIdSpecific();
-
-        if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            return;
-        }
-
-        mListenerForSubId = new GlobalSettingsChangeListener(mContext,
-                Settings.Global.DATA_ROAMING + mSubId) {
-            public void onChanged(String field) {
-                stopMonitor();
-                updateState(mSwitchPreference);
-            }
-        };
     }
 
     @OnLifecycleEvent(ON_STOP)
     public void onStop() {
         mMobileNetworkRepository.removeRegister(this);
-        stopMonitor();
-        stopMonitorSubIdSpecific();
     }
 
     @Override
@@ -219,20 +181,6 @@
         dialogFragment.show(mFragmentManager, DIALOG_TAG);
     }
 
-    private void stopMonitor() {
-        if (mListener != null) {
-            mListener.close();
-            mListener = null;
-        }
-    }
-
-    private void stopMonitorSubIdSpecific() {
-        if (mListenerForSubId != null) {
-            mListenerForSubId.close();
-            mListenerForSubId = null;
-        }
-    }
-
     @VisibleForTesting
     public void setMobileNetworkInfoEntity(MobileNetworkInfoEntity mobileNetworkInfoEntity) {
         mMobileNetworkInfoEntity = mobileNetworkInfoEntity;
@@ -251,4 +199,13 @@
             }
         });
     }
+
+    @Override
+    public void onDataRoamingChanged(int subId, boolean enabled) {
+        if (subId != mSubId) {
+            Log.d(TAG, "onDataRoamingChanged - wrong subId : " + subId + " / " + enabled);
+            return;
+        }
+        update();
+    }
 }
diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index ed21b6f..cd80998 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -28,6 +28,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.print.PrintJob;
 import android.print.PrintJobId;
 import android.print.PrintJobInfo;
@@ -45,6 +46,7 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.loader.app.LoaderManager.LoaderCallbacks;
 import androidx.loader.content.AsyncTaskLoader;
 import androidx.loader.content.Loader;
@@ -92,6 +94,22 @@
     private PrintServicesController mPrintServicesController;
 
     private Button mAddNewServiceButton;
+    @VisibleForTesting
+    boolean mIsUiRestricted;
+
+    public PrintSettingsFragment() {
+        super(UserManager.DISALLOW_PRINTING);
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.print_settings;
+    }
 
     @Override
     public int getMetricsCategory() {
@@ -107,12 +125,19 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         View root = super.onCreateView(inflater, container, savedInstanceState);
-        addPreferencesFromResource(R.xml.print_settings);
+        mIsUiRestricted = isUiRestricted();
+        setupPreferences();
+        return root;
+    }
 
-        mActivePrintJobsCategory = (PreferenceCategory) findPreference(
-                PRINT_JOBS_CATEGORY);
-        mPrintServicesCategory = (PreferenceCategory) findPreference(
-                PRINT_SERVICES_CATEGORY);
+    @VisibleForTesting
+    void setupPreferences() {
+        if (mIsUiRestricted) {
+            return;
+        }
+
+        mActivePrintJobsCategory = (PreferenceCategory) findPreference(PRINT_JOBS_CATEGORY);
+        mPrintServicesCategory = (PreferenceCategory) findPreference(PRINT_SERVICES_CATEGORY);
         getPreferenceScreen().removePreference(mActivePrintJobsCategory);
 
         mPrintJobsController = new PrintJobsController();
@@ -120,20 +145,20 @@
 
         mPrintServicesController = new PrintServicesController();
         getLoaderManager().initLoader(LOADER_ID_PRINT_SERVICES, null, mPrintServicesController);
-
-        return root;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        setHasOptionsMenu(true);
-        startSubSettingsIfNeeded();
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+        setupEmptyViews();
+    }
+
+    @VisibleForTesting
+    void setupEmptyViews() {
+        if (mIsUiRestricted) {
+            return;
+        }
+
         ViewGroup contentRoot = (ViewGroup) getListView().getParent();
         View emptyView = getActivity().getLayoutInflater().inflate(
                 R.layout.empty_print_state, contentRoot, false);
@@ -153,6 +178,23 @@
     }
 
     @Override
+    public void onStart() {
+        super.onStart();
+        startSettings();
+    }
+
+    @VisibleForTesting
+    void startSettings() {
+        if (mIsUiRestricted) {
+            getPreferenceScreen().removeAll();
+            return;
+        }
+
+        setHasOptionsMenu(true);
+        startSubSettingsIfNeeded();
+    }
+
+    @Override
     protected String getIntentActionString() {
         return Settings.ACTION_PRINT_SETTINGS;
     }
diff --git a/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java b/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java
index e41e1da..63b83f1 100644
--- a/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java
+++ b/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java
@@ -27,13 +27,17 @@
 import android.widget.Spinner;
 
 import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.dashboard.RestrictedDashboardFragment;
 import com.android.settings.dashboard.profileselector.UserAdapter;
 
 /**
  * Base fragment class for per profile settings.
  */
-public abstract class ProfileSettingsPreferenceFragment extends SettingsPreferenceFragment {
+public abstract class ProfileSettingsPreferenceFragment extends RestrictedDashboardFragment {
+
+    public ProfileSettingsPreferenceFragment(String restrictionKey) {
+        super(restrictionKey);
+    }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 4ce59b9..88d601a 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -84,8 +84,10 @@
     WifiTetherSSIDPreferenceController mSSIDPreferenceController;
     @VisibleForTesting
     WifiTetherPasswordPreferenceController mPasswordPreferenceController;
-    private WifiTetherSecurityPreferenceController mSecurityPreferenceController;
-    private WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController;
+    @VisibleForTesting
+    WifiTetherSecurityPreferenceController mSecurityPreferenceController;
+    @VisibleForTesting
+    WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController;
     @VisibleForTesting
     WifiTetherAutoOffPreferenceController mWifiTetherAutoOffPreferenceController;
 
@@ -276,15 +278,16 @@
     SoftApConfiguration buildNewConfig() {
         SoftApConfiguration currentConfig = mWifiTetherViewModel.getSoftApConfiguration();
         SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder(currentConfig);
-        int securityType = (mWifiTetherViewModel.isSpeedFeatureAvailable())
-                ? currentConfig.getSecurityType()
-                : mSecurityPreferenceController.getSecurityType();
         configBuilder.setSsid(mSSIDPreferenceController.getSSID());
-        if (securityType != SoftApConfiguration.SECURITY_TYPE_OPEN) {
-            configBuilder.setPassphrase(
-                    mPasswordPreferenceController.getPasswordValidated(securityType),
-                    securityType);
-        }
+        int securityType =
+                mWifiTetherViewModel.isSpeedFeatureAvailable()
+                        ? currentConfig.getSecurityType()
+                        : mSecurityPreferenceController.getSecurityType();
+        String passphrase =
+                securityType == SoftApConfiguration.SECURITY_TYPE_OPEN
+                        ? null
+                        : mPasswordPreferenceController.getPasswordValidated(securityType);
+        configBuilder.setPassphrase(passphrase, securityType);
         if (!mWifiTetherViewModel.isSpeedFeatureAvailable()) {
             mMaxCompatibilityPrefController.setupMaximizeCompatibility(configBuilder);
         }
diff --git a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
index de380c4..9210b87 100644
--- a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
@@ -141,6 +141,7 @@
 
     @Test
     public void onDeveloperOptionSwitchDisabled_shouldDisableAngleAsSystemDriver() {
+        ShadowSystemProperties.override(PROPERTY_RO_GFX_ANGLE_SUPPORTED, "true");
         mController.onDeveloperOptionsSwitchDisabled();
         final String systemEGLDriver = SystemProperties.get(PROPERTY_PERSISTENT_GRAPHICS_EGL);
         assertThat(systemEGLDriver).isEqualTo("");
@@ -148,12 +149,14 @@
 
     @Test
     public void onDeveloperOptionSwitchDisabled_preferenceShouldNotBeChecked() {
+        ShadowSystemProperties.override(PROPERTY_RO_GFX_ANGLE_SUPPORTED, "true");
         mController.onDeveloperOptionsSwitchDisabled();
         verify(mPreference).setChecked(false);
     }
 
     @Test
     public void onDeveloperOptionsSwitchDisabled_preferenceShouldNotBeEnabled() {
+        ShadowSystemProperties.override(PROPERTY_RO_GFX_ANGLE_SUPPORTED, "true");
         mController.onDeveloperOptionsSwitchDisabled();
         verify(mPreference).setEnabled(false);
     }
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index fe663ab..5005f4c 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.wifi.tether;
 
+import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_OPEN;
 import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA3_SAE;
 import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
@@ -125,9 +126,13 @@
     @Mock
     private WifiTetherSSIDPreferenceController mSSIDPreferenceController;
     @Mock
+    private WifiTetherSecurityPreferenceController mSecurityPreferenceController;
+    @Mock
     private WifiTetherPasswordPreferenceController mPasswordPreferenceController;
     @Mock
     private WifiTetherAutoOffPreferenceController mWifiTetherAutoOffPreferenceController;
+    @Mock
+    private WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController;
 
     private WifiTetherSettings mSettings;
 
@@ -156,10 +161,13 @@
         mSettings.mMainSwitchBar = mMainSwitchBar;
         mSettings.mSSIDPreferenceController = mSSIDPreferenceController;
         when(mSSIDPreferenceController.getSSID()).thenReturn(SSID);
+        mSettings.mSecurityPreferenceController = mSecurityPreferenceController;
+        when(mSecurityPreferenceController.getSecurityType()).thenReturn(SECURITY_TYPE_WPA3_SAE);
         mSettings.mPasswordPreferenceController = mPasswordPreferenceController;
         when(mPasswordPreferenceController.getPasswordValidated(anyInt())).thenReturn(PASSWORD);
         mSettings.mWifiTetherAutoOffPreferenceController = mWifiTetherAutoOffPreferenceController;
         when(mWifiTetherAutoOffPreferenceController.isEnabled()).thenReturn(true);
+        mSettings.mMaxCompatibilityPrefController = mMaxCompatibilityPrefController;
         mSettings.mWifiTetherViewModel = mWifiTetherViewModel;
         when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SECURITY)).thenReturn(mWifiHotspotSecurity);
         when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SPEED)).thenReturn(mWifiHotspotSpeed);
@@ -360,6 +368,23 @@
     }
 
     @Test
+    public void buildNewConfig_securityTypeChangeToOpen_setSecurityTypeCorrectly() {
+        SoftApConfiguration currentConfig = new SoftApConfiguration.Builder()
+                .setPassphrase(PASSWORD, SECURITY_TYPE_WPA3_SAE)
+                .setBand(BAND_2GHZ_5GHZ_6GHZ)
+                .build();
+        when(mWifiTetherViewModel.getSoftApConfiguration()).thenReturn(currentConfig);
+        when(mWifiTetherViewModel.isSpeedFeatureAvailable()).thenReturn(false);
+        doNothing().when(mMaxCompatibilityPrefController)
+                .setupMaximizeCompatibility(any(SoftApConfiguration.Builder.class));
+
+        when(mSecurityPreferenceController.getSecurityType()).thenReturn(SECURITY_TYPE_OPEN);
+        SoftApConfiguration newConfig = mSettings.buildNewConfig();
+
+        assertThat(newConfig.getSecurityType()).isEqualTo(SECURITY_TYPE_OPEN);
+    }
+
+    @Test
     public void onRestartingChanged_restartingFalse_setLoadingFalse() {
         doNothing().when(mSettings).setLoading(anyBoolean(), anyBoolean());
 
diff --git a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
index c23292a..ae35431 100644
--- a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
+++ b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
@@ -57,7 +57,7 @@
     private GraphicsDriverEnableAngleAsSystemDriverController mController;
 
     // Signal to wait for SystemProperty values changed
-    private class PropertyChangeSignal {
+    private static class PropertyChangeSignal {
         private CountDownLatch mCountDownLatch;
 
         private Runnable mCountDownJob;
@@ -217,23 +217,7 @@
     }
 
     @Test
-    public void onDeveloperOptionSwitchEnabled_angleSupported_PreferenceShouldEnabled() {
-        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
-                .thenReturn("true");
-        mController.onDeveloperOptionsSwitchEnabled();
-        assertThat(mPreference.isEnabled()).isTrue();
-    }
-
-    @Test
-    public void onDeveloperOptionSwitchEnabled_angleNotSupported_PrefenceShouldDisabled() {
-        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
-                .thenReturn("false");
-        mController.onDeveloperOptionsSwitchEnabled();
-        assertThat(mPreference.isEnabled()).isFalse();
-    }
-
-    @Test
-    public void onDeveloperOptionSwitchDisabled_angleIsNotSystemGLESDriver() {
+    public void onDeveloperOptionSwitchDisabled_angleShouldNotBeSystemGLESDriver() {
         // Add a callback when SystemProperty changes.
         // This allows the thread to wait until
         // GpuService::toggleAngleAsSystemDriver() updates the persist.graphics.egl.
@@ -242,6 +226,8 @@
 
         // Test that onDeveloperOptionSwitchDisabled,
         // persist.graphics.egl updates to ""
+        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
+                .thenReturn("true");
         mController.onDeveloperOptionsSwitchDisabled();
         propertyChangeSignal1.wait(100);
         final String systemEGLDriver = SystemProperties.get(PROPERTY_PERSISTENT_GRAPHICS_EGL);
@@ -253,12 +239,16 @@
 
     @Test
     public void onDeveloperOptionSwitchDisabled_PreferenceShouldNotBeChecked() {
+        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
+                .thenReturn("true");
         mController.onDeveloperOptionsSwitchDisabled();
         assertThat(mPreference.isChecked()).isFalse();
     }
 
     @Test
     public void onDeveloperOptionSwitchDisabled_PreferenceShouldDisabled() {
+        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
+                .thenReturn("true");
         mController.onDeveloperOptionsSwitchDisabled();
         assertThat(mPreference.isEnabled()).isFalse();
     }
diff --git a/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java b/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java
new file mode 100644
index 0000000..c52c5bc
--- /dev/null
+++ b/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2023 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.print;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.os.Looper;
+import android.view.View;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class PrintSettingsFragmentTest {
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+
+    private PrintSettingsFragment mFragment;
+    private PreferenceManager mPreferenceManager;
+    private PreferenceScreen mPreferenceScreen;
+
+    @Before
+    public void setUp() {
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+        mPreferenceManager = new PreferenceManager(mContext);
+        mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            mFragment = spy(new PrintSettingsFragment());
+            doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
+        });
+    }
+
+    @Test
+    public void setupPreferences_uiIsRestricted_doNotAddPreferences() {
+        mFragment.mIsUiRestricted = true;
+
+        mFragment.setupPreferences();
+
+        verify(mFragment, never()).findPreference(any(CharSequence.class));
+    }
+
+    @Test
+    public void setupEmptyViews_uiIsRestricted_doNotSetEmptyView() {
+        mFragment.mIsUiRestricted = true;
+
+        mFragment.setupEmptyViews();
+
+        verify(mFragment, never()).setEmptyView(any(View.class));
+    }
+
+    @Test
+    public void startSettings_uiIsRestricted_removeAllPreferences() {
+        mFragment.mIsUiRestricted = true;
+
+        mFragment.startSettings();
+
+        assertThat(mPreferenceScreen.getPreferenceCount()).isEqualTo(0);
+        verify(mFragment, never()).setHasOptionsMenu(true);
+    }
+}
