Merge "Fix the work profile's deep link problem" into tm-dev
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();