From 22b827db555f954dd0db96a502b02f5fe9b3ee1a Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Wed, 12 Jun 2019 15:33:33 -0700 Subject: [PATCH] Fix Calls/SMS default SIM selector In cases where a SIM is initially disabled, even after you turn it on the ListPreference's for selecting the default SIM for Calls and SMS weren't working because the preference change listener wasn't getting registered. This CL fixes that for these controllers by always registering a change listener whenever we make the preference visible. Fixes: 134472294 Bug: 135142209 Test: make RunSettingsRoboTests Change-Id: Ia9362b7f26309bdbd6c5e8140fb606b28e2b34d8 --- .../DefaultSubscriptionController.java | 5 +++++ .../DefaultSubscriptionControllerTest.java | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+) 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");