diff --git a/src/com/android/settings/applications/AppLocaleUtil.java b/src/com/android/settings/applications/AppLocaleUtil.java
index 3135796..8c3671e 100644
--- a/src/com/android/settings/applications/AppLocaleUtil.java
+++ b/src/com/android/settings/applications/AppLocaleUtil.java
@@ -49,17 +49,17 @@
         boolean isDisallowedPackage = isDisallowedPackage(context, packageName);
         boolean hasLauncherEntry = hasLauncherEntry(packageName, infos);
         boolean isSignedWithPlatformKey = isSignedWithPlatformKey(context, packageName);
-        boolean isAppLocaleSupported = isAppLocaleSupported(context, packageName);
+        boolean canDisplay = !isDisallowedPackage
+                && !isSignedWithPlatformKey
+                && hasLauncherEntry
+                && isAppLocaleSupported(context, packageName);
+
         Log.i(TAG, "Can display preference - [" + packageName + "] :"
                 + " isDisallowedPackage : " + isDisallowedPackage
                 + " / isSignedWithPlatformKey : " + isSignedWithPlatformKey
                 + " / hasLauncherEntry : " + hasLauncherEntry
-                + " / isAppLocaleSupported : " + isAppLocaleSupported);
-
-        return !isDisallowedPackage
-                && !isSignedWithPlatformKey
-                && hasLauncherEntry
-                && isAppLocaleSupported;
+                + " / canDisplay : " + canDisplay);
+        return canDisplay;
     }
 
     private static boolean isDisallowedPackage(Context context, String packageName) {
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index 7842459..322b971 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -260,6 +260,9 @@
     }
 
     private int getTransitionType(Intent intent) {
+        if (intent == null) {
+            return TransitionType.TRANSITION_NONE;
+        }
         return intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE, TransitionType.TRANSITION_NONE);
     }
 }
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index 44ad411..7ba16e3 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -456,7 +456,11 @@
     }
 
     @Override
-    public void onTelephonyDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) {
+    public void onTelephonyDisplayInfoChanged(int subId,
+            TelephonyDisplayInfo telephonyDisplayInfo) {
+        if (subId != mSubsPrefCtrlInjector.getDefaultDataSubscriptionId()) {
+            return;
+        }
         mTelephonyDisplayInfo = telephonyDisplayInfo;
         update();
     }
diff --git a/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java b/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java
index 334da3c..57a012c 100644
--- a/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java
+++ b/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java
@@ -37,8 +37,9 @@
     private TelephonyManager mBaseTelephonyManager;
     private Callback mCallback;
     private Map<Integer, PhoneStateListener> mListeners;
+    private Map<Integer, TelephonyDisplayInfo> mDisplayInfos;
 
-    private TelephonyDisplayInfo mTelephonyDisplayInfo =
+    private static final TelephonyDisplayInfo mDefaultTelephonyDisplayInfo =
             new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN,
                     TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
     /**
@@ -48,19 +49,20 @@
         /**
          * Used to notify TelephonyDisplayInfo change.
          */
-        void onTelephonyDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo);
+        void onTelephonyDisplayInfoChanged(int subId, TelephonyDisplayInfo telephonyDisplayInfo);
     }
 
     public TelephonyDisplayInfoListener(Context context, Callback callback) {
         mBaseTelephonyManager = context.getSystemService(TelephonyManager.class);
         mCallback = callback;
         mListeners = new HashMap<>();
+        mDisplayInfos = new HashMap<>();
     }
     /**
      * Get TelephonyDisplayInfo.
      */
-    public TelephonyDisplayInfo getTelephonyDisplayInfo() {
-        return mTelephonyDisplayInfo;
+    public TelephonyDisplayInfo getTelephonyDisplayInfo(int subId) {
+        return mDisplayInfos.get(subId);
     }
 
     /** Resumes listening telephony display info changes to the set of ids from the last call to
@@ -85,15 +87,17 @@
         for (int idToRemove : Sets.difference(currentIds, ids)) {
             stopListening(idToRemove);
             mListeners.remove(idToRemove);
+            mDisplayInfos.remove(idToRemove);
         }
         for (int idToAdd : Sets.difference(ids, currentIds)) {
             PhoneStateListener listener = new PhoneStateListener() {
                 @Override
                 public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) {
-                    mTelephonyDisplayInfo = telephonyDisplayInfo;
-                    mCallback.onTelephonyDisplayInfoChanged(telephonyDisplayInfo);
+                    mDisplayInfos.put(idToAdd, telephonyDisplayInfo);
+                    mCallback.onTelephonyDisplayInfoChanged(idToAdd, telephonyDisplayInfo);
                 }
             };
+            mDisplayInfos.put(idToAdd, mDefaultTelephonyDisplayInfo);
             mListeners.put(idToAdd, listener);
             startListening(idToAdd);
         }
diff --git a/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java b/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java
index d348b24..f5f18b4 100644
--- a/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java
+++ b/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java
@@ -460,13 +460,10 @@
         switchDialogMsg.append(
                 getString(R.string.sim_action_switch_sub_dialog_mep_text, displayName));
         if (isRtlMode) {
-            /* There are two lines of message in the dialog, and the RTL symbols must be added
-             * before and after each sentence, so use the line break symbol to find the position.
+            /* The RTL symbols must be added before and after each sentence.
              * (Each message are all with two line break symbols)
              */
             switchDialogMsg.insert(0, RTL_MARK)
-                    .insert(switchDialogMsg.indexOf(LINE_BREAK) - LINE_BREAK_OFFSET_ONE, RTL_MARK)
-                    .insert(switchDialogMsg.indexOf(LINE_BREAK) + LINE_BREAK_OFFSET_TWO, RTL_MARK)
                     .insert(switchDialogMsg.length(), RTL_MARK);
         }
         ConfirmDialogFragment.show(
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 58afeb0..ed8dc24 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -52,6 +52,8 @@
 import java.util.List;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Preference controller for "Auto Select Network"
@@ -70,11 +72,17 @@
     ProgressDialog mProgressDialog;
     @VisibleForTesting
     SwitchPreference mSwitchPreference;
+    private AtomicBoolean mUpdatingConfig;
+    private int mCacheOfModeStatus;
+    private AtomicLong mRecursiveUpdate;
 
     public AutoSelectPreferenceController(Context context, String key) {
         super(context, key);
         mTelephonyManager = context.getSystemService(TelephonyManager.class);
         mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        mRecursiveUpdate = new AtomicLong();
+        mUpdatingConfig = new AtomicBoolean();
+        mCacheOfModeStatus = TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN;
         mListeners = new ArrayList<>();
         mUiHandler = new Handler(Looper.getMainLooper());
         mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
@@ -88,7 +96,9 @@
             displayPreference(mPreferenceScreen);
         }
         if (mSwitchPreference != null) {
+            mRecursiveUpdate.getAndIncrement();
             updateState(mSwitchPreference);
+            mRecursiveUpdate.decrementAndGet();
         }
     }
 
@@ -118,8 +128,13 @@
 
     @Override
     public boolean isChecked() {
-        return mTelephonyManager.getNetworkSelectionMode()
-                == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
+        if (!mUpdatingConfig.get()) {
+            mCacheOfModeStatus = mTelephonyManager.getNetworkSelectionMode();
+            for (OnNetworkSelectModeListener lsn : mListeners) {
+                lsn.onNetworkSelectModeUpdated(mCacheOfModeStatus);
+            }
+        }
+        return mCacheOfModeStatus == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
     }
 
     @Override
@@ -147,6 +162,10 @@
 
     @Override
     public boolean setChecked(boolean isChecked) {
+        if (mRecursiveUpdate.get() != 0) {
+            // Changing from software are allowed and changing presentation only.
+            return true;
+        }
         if (isChecked) {
             setAutomaticSelectionMode();
         } else {
@@ -171,18 +190,17 @@
         }
         return ThreadUtils.postOnBackgroundThread(() -> {
             // set network selection mode in background
+            mUpdatingConfig.set(true);
             mTelephonyManager.setNetworkSelectionModeAutomatic();
-            final int mode = mTelephonyManager.getNetworkSelectionMode();
+            mUpdatingConfig.set(false);
 
             //Update UI in UI thread
             final long durationMillis = SystemClock.elapsedRealtime() - startMillis;
             mUiHandler.postDelayed(() -> {
+                mRecursiveUpdate.getAndIncrement();
                 mSwitchPreference.setEnabled(true);
-                mSwitchPreference.setChecked(
-                        mode == TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
-                for (OnNetworkSelectModeListener lsn : mListeners) {
-                    lsn.onNetworkSelectModeChanged();
-                }
+                mSwitchPreference.setChecked(isChecked());
+                mRecursiveUpdate.decrementAndGet();
                 dismissProgressBar();
             }, Math.max(MINIMUM_DIALOG_TIME_MILLIS - durationMillis, 0));
         });
@@ -232,11 +250,11 @@
     }
 
     /**
-     * Callback when network select mode is changed
+     * Callback when network select mode might get updated
      *
      * @see TelephonyManager#getNetworkSelectionMode()
      */
     public interface OnNetworkSelectModeListener {
-        void onNetworkSelectModeChanged();
+        void onNetworkSelectModeUpdated(int mode);
     }
 }
diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
index 54f5ce1..4c5dd95 100644
--- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
@@ -48,11 +48,13 @@
     private Preference mPreference;
     private PreferenceScreen mPreferenceScreen;
     private AllowedNetworkTypesListener mAllowedNetworkTypesListener;
+    private int mCacheOfModeStatus;
 
     public OpenNetworkSelectPagePreferenceController(Context context, String key) {
         super(context, key);
         mTelephonyManager = context.getSystemService(TelephonyManager.class);
         mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        mCacheOfModeStatus = TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN;
         mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
                 context.getMainExecutor());
         mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
@@ -96,7 +98,7 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setEnabled(mTelephonyManager.getNetworkSelectionMode()
+        preference.setEnabled(mCacheOfModeStatus
                 != TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
 
         Intent intent = new Intent();
@@ -125,7 +127,10 @@
     }
 
     @Override
-    public void onNetworkSelectModeChanged() {
-        updateState(mPreference);
+    public void onNetworkSelectModeUpdated(int mode) {
+        mCacheOfModeStatus = mode;
+        if (mPreference != null) {
+            updateState(mPreference);
+        }
     }
 }
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
index 3bcfcb4..8ebd2b5 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -364,7 +364,8 @@
 
         mController.onResume();
         mController.displayPreference(mPreferenceScreen);
-        mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo);
+        mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(),
+                telephonyDisplayInfo);
 
         assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary);
     }
@@ -388,7 +389,8 @@
 
         mController.onResume();
         mController.displayPreference(mPreferenceScreen);
-        mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo);
+        mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(),
+                telephonyDisplayInfo);
 
         assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary);
     }
@@ -414,7 +416,8 @@
 
         mController.onResume();
         mController.displayPreference(mPreferenceScreen);
-        mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo);
+        mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(),
+                telephonyDisplayInfo);
 
         assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary);
     }
diff --git a/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
index f7e3111..53ae1b9 100644
--- a/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
@@ -93,15 +93,18 @@
 
         mPreference = new Preference(mContext);
         mController = new OpenNetworkSelectPagePreferenceController(mContext,
-                "open_network_select");
+                "open_network_select") {
+            @Override
+            public void updateState(Preference preference) {
+                super.updateState(mPreference);
+            }
+        };
         mController.init(mLifecycle, SUB_ID);
     }
 
     @Test
     public void updateState_modeAuto_disabled() {
-        when(mTelephonyManager.getNetworkSelectionMode()).thenReturn(
-                TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
-
+        mController.onNetworkSelectModeUpdated(TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
         mController.updateState(mPreference);
 
         assertThat(mPreference.isEnabled()).isFalse();
