Merge "Fix Calls/SMS default SIM selector" into qt-dev
diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
index 02a2d58..9eb5f8c 100644
--- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
@@ -121,6 +121,11 @@
         }
         mPreference.setVisible(true);
 
+        // TODO(b/135142209) - for now we need to manually ensure we're registered as a change
+        // listener, because this might not have happened during displayPreference if
+        // getAvailabilityStatus returned CONDITIONALLY_UNAVAILABLE at the time.
+        mPreference.setOnPreferenceChangeListener(this);
+
         final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
 
         // We'll have one entry for each available subscription, plus one for a "ask me every
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
index 7dd636a..dbdad50 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
@@ -204,6 +204,28 @@
     }
 
     @Test
+    public void onPreferenceChange_prefBecomesAvailable_onPreferenceChangeCallbackNotNull() {
+        final SubscriptionInfo sub1 = createMockSub(111, "sub1");
+        final SubscriptionInfo sub2 = createMockSub(222, "sub2");
+
+        // Start with only one sub active, so the pref is not available
+        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1));
+        doReturn(sub1.getSubscriptionId()).when(mController).getDefaultSubscriptionId();
+
+        mController.displayPreference(mScreen);
+        assertThat(mController.isAvailable()).isFalse();
+
+        // Now make two subs be active - the pref should become available, and the
+        // onPreferenceChange callback should be properly wired up.
+        SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(sub1, sub2));
+        mController.onSubscriptionsChanged();
+        assertThat(mController.isAvailable()).isTrue();
+        assertThat(mListPreference.getOnPreferenceChangeListener()).isEqualTo(mController);
+        mListPreference.callChangeListener("222");
+        verify(mController).setDefaultSubscription(eq(222));
+    }
+
+    @Test
     public void onSubscriptionsChanged_twoSubscriptionsDefaultChanges_selectedEntryGetsUpdated() {
         final SubscriptionInfo sub1 = createMockSub(111, "sub1");
         final SubscriptionInfo sub2 = createMockSub(222, "sub2");