diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java index 02a2d58c009..9eb5f8c4952 100644 --- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java +++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java @@ -121,6 +121,11 @@ public abstract class DefaultSubscriptionController extends BasePreferenceContro } 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 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 7dd636a4ab8..dbdad505d34 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java @@ -203,6 +203,28 @@ public class DefaultSubscriptionControllerTest { eq(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); } + @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");