Merge "[Settings] Unable to display disabled SIM (part 2)"
diff --git a/src/com/android/settings/network/ActiveSubsciptionsListener.java b/src/com/android/settings/network/ActiveSubsciptionsListener.java
index d9d0bb5..3e4272d 100644
--- a/src/com/android/settings/network/ActiveSubsciptionsListener.java
+++ b/src/com/android/settings/network/ActiveSubsciptionsListener.java
@@ -25,6 +25,7 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -39,9 +40,11 @@
  * A listener for active subscription change
  */
 public abstract class ActiveSubsciptionsListener
-        extends SubscriptionManager.OnSubscriptionsChangedListener {
+        extends SubscriptionManager.OnSubscriptionsChangedListener
+        implements AutoCloseable {
 
     private static final String TAG = "ActiveSubsciptions";
+    private static final boolean DEBUG = false;
 
     /**
      * Constructor
@@ -61,6 +64,8 @@
                 CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
         mSubscriptionChangeIntentFilter.addAction(
                 TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+        mSubscriptionChangeIntentFilter.addAction(
+                TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED);
     }
 
     @VisibleForTesting
@@ -135,6 +140,13 @@
     }
 
     /**
+     * Implementation of {@code AutoCloseable}
+     */
+    public void close() {
+        stop();
+    }
+
+    /**
      * Get SubscriptionManager
      *
      * @return a SubscriptionManager
@@ -174,15 +186,17 @@
         mCachedActiveSubscriptionInfo = getSubscriptionManager().getActiveSubscriptionInfoList();
         mCacheState.compareAndSet(STATE_LISTENING, STATE_DATA_CACHED);
 
-        if ((mCachedActiveSubscriptionInfo == null)
-                || (mCachedActiveSubscriptionInfo.size() <= 0)) {
-            Log.d(TAG, "active subscriptions: " + mCachedActiveSubscriptionInfo);
-        } else {
-            final StringBuilder logString = new StringBuilder("active subscriptions:");
-            for (SubscriptionInfo subInfo : mCachedActiveSubscriptionInfo) {
-                logString.append(" " + subInfo.getSubscriptionId());
+        if (DEBUG) {
+            if ((mCachedActiveSubscriptionInfo == null)
+                    || (mCachedActiveSubscriptionInfo.size() <= 0)) {
+                Log.d(TAG, "active subscriptions: " + mCachedActiveSubscriptionInfo);
+            } else {
+                final StringBuilder logString = new StringBuilder("active subscriptions:");
+                for (SubscriptionInfo subInfo : mCachedActiveSubscriptionInfo) {
+                    logString.append(" " + subInfo.getSubscriptionId());
+                }
+                Log.d(TAG, logString.toString());
             }
-            Log.d(TAG, logString.toString());
         }
 
         return mCachedActiveSubscriptionInfo;
@@ -208,12 +222,12 @@
     }
 
     /**
-     * Get a list of accessible subscription info
+     * Get a list of all subscription info which accessible by Settings app
      *
      * @return A list of accessible subscription info
      */
     public List<SubscriptionInfo> getAccessibleSubscriptionsInfo() {
-        return getSubscriptionManager().getAccessibleSubscriptionInfoList();
+        return getSubscriptionManager().getAvailableSubscriptionInfoList();
     }
 
     /**
@@ -223,11 +237,12 @@
      * @return A subscription info which is accessible list
      */
     public SubscriptionInfo getAccessibleSubscriptionInfo(int subId) {
-        if (mCacheState.get() >= STATE_DATA_CACHED) {
-            final SubscriptionInfo activeSubInfo = getActiveSubscriptionInfo(subId);
-            if (activeSubInfo != null) {
-                return activeSubInfo;
-            }
+        // Always check if subId is part of activeSubscriptions
+        // since there's cache design within SubscriptionManager.
+        // That give us a chance to avoid from querying ContentProvider.
+        final SubscriptionInfo activeSubInfo = getActiveSubscriptionInfo(subId);
+        if (activeSubInfo != null) {
+            return activeSubInfo;
         }
 
         final List<SubscriptionInfo> subInfoList = getAccessibleSubscriptionsInfo();
diff --git a/src/com/android/settings/network/ProxySubscriptionManager.java b/src/com/android/settings/network/ProxySubscriptionManager.java
index 8f3f385..b10c727 100644
--- a/src/com/android/settings/network/ProxySubscriptionManager.java
+++ b/src/com/android/settings/network/ProxySubscriptionManager.java
@@ -140,6 +140,7 @@
 
     @OnLifecycleEvent(ON_DESTROY)
     void onDestroy() {
+        mSubsciptionsMonitor.close();
         mAirplaneModeMonitor.close();
 
         if (mLifecycle != null) {
diff --git a/tests/robotests/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java b/tests/robotests/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java
index 7f23699..4c7b55b 100644
--- a/tests/robotests/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java
+++ b/tests/robotests/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java
@@ -101,7 +101,7 @@
 
     @After
     public void cleanUp() {
-        mListener.stop();
+        mListener.close();
     }
 
     private class ActiveSubsciptionsListenerImpl extends ActiveSubsciptionsListener {