Fix flicker in SIM card page

Before fix, the DefaultSubscriptionController will set an empty summary
before data is ready.

Not set the summary before data is ready to fix.

Also fix the ignored tests.

Fix: 277301125
Test: Manual on Mobile Settings
Test: Unit test
Change-Id: I07d964b9f9ce21f8f168cb775eea188e48172c5d
This commit is contained in:
Chaohui Wang
2023-05-08 18:37:16 +08:00
parent ab8a130674
commit 2901125674
2 changed files with 78 additions and 58 deletions

View File

@@ -112,6 +112,8 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey()); mPreference = screen.findPreference(getPreferenceKey());
// Set a summary placeholder to reduce flicker.
mPreference.setSummaryProvider(pref -> mContext.getString(R.string.summary_placeholder));
updateEntries(); updateEntries();
} }
@@ -120,7 +122,7 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere
// Currently, cannot use ListPreference.setSummary() when the summary contains user // Currently, cannot use ListPreference.setSummary() when the summary contains user
// generated string, because ListPreference.getSummary() is using String.format() to format // generated string, because ListPreference.getSummary() is using String.format() to format
// the summary when the summary is set by ListPreference.setSummary(). // the summary when the summary is set by ListPreference.setSummary().
if (preference != null) { if (preference != null && !mSubInfoEntityList.isEmpty()) {
preference.setSummaryProvider(pref -> getSummary()); preference.setSummaryProvider(pref -> getSummary());
} }
} }
@@ -146,6 +148,7 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere
final ArrayList<CharSequence> displayNames = new ArrayList<>(); final ArrayList<CharSequence> displayNames = new ArrayList<>();
final ArrayList<CharSequence> subscriptionIds = new ArrayList<>(); final ArrayList<CharSequence> subscriptionIds = new ArrayList<>();
List<SubscriptionInfoEntity> list = getSubscriptionInfoList(); List<SubscriptionInfoEntity> list = getSubscriptionInfoList();
if (list.isEmpty()) return;
if (list.size() == 1) { if (list.size() == 1) {
mPreference.setEnabled(false); mPreference.setEnabled(false);

View File

@@ -47,7 +47,6 @@ import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
@@ -128,14 +127,12 @@ public class DefaultSubscriptionControllerTest {
SubscriptionUtil.setActiveSubscriptionsForTesting(null); SubscriptionUtil.setActiveSubscriptionsForTesting(null);
} }
private SubscriptionInfoEntity setupSubscriptionInfoEntity(String subId, int slotId, private SubscriptionInfoEntity setupSubscriptionInfoEntity(
int carrierId, String displayName, String mcc, String mnc, String countryIso, String subId, String displayName, String mcc, String mnc, String countryIso) {
int cardId, boolean isValid, boolean isActive, boolean isAvailable) { return new SubscriptionInfoEntity(subId, 1, 1, displayName, displayName, 0, mcc, mnc,
return new SubscriptionInfoEntity(subId, slotId, carrierId, countryIso, false, 1, TelephonyManager.DEFAULT_PORT_INDEX, false, null,
displayName, displayName, 0, mcc, mnc, countryIso, false, cardId, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, displayName, false, "1234567890",
TelephonyManager.DEFAULT_PORT_INDEX, false, null, true, false, true, true, true, true, false);
SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, displayName, false,
"1234567890", true, false, isValid, true, isActive, isAvailable, false);
} }
@Test @Test
@@ -146,16 +143,45 @@ public class DefaultSubscriptionControllerTest {
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
} }
@Test
public void getSummary_singleSub() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_COUNTRY_ISO_1);
mSubscriptionInfoEntityList.add(mSubInfo1);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mController.displayPreference(mScreen);
mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mListPreference.getSummary().toString()).isEqualTo(SUB_ID_1);
}
@Test
public void getSummary_twoSubs() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_COUNTRY_ISO_2);
mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mController.displayPreference(mScreen);
mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mListPreference.getSummary().toString()).isEqualTo(SUB_ID_1);
}
@Test @Test
public void onPreferenceChange_prefChangedToSub2_callbackCalledCorrectly() { public void onPreferenceChange_prefChangedToSub2_callbackCalledCorrectly() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mListPreference.setValue("222"); mListPreference.setValue("222");
@@ -165,14 +191,14 @@ public class DefaultSubscriptionControllerTest {
@Test @Test
public void onPreferenceChange_prefChangedToAlwaysAsk_callbackCalledCorrectly() { public void onPreferenceChange_prefChangedToAlwaysAsk_callbackCalledCorrectly() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mListPreference.setValue(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); mListPreference.setValue(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
@@ -185,14 +211,14 @@ public class DefaultSubscriptionControllerTest {
@Test @Test
public void onPreferenceChange_prefBecomesAvailable_onPreferenceChangeCallbackNotNull() { public void onPreferenceChange_prefBecomesAvailable_onPreferenceChangeCallbackNotNull() {
// Start with only one sub active, so the pref is not available // Start with only one sub active, so the pref is not available
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
@@ -206,13 +232,12 @@ public class DefaultSubscriptionControllerTest {
assertThat(mController.getDefaultSubscriptionId()).isEqualTo(2); assertThat(mController.getDefaultSubscriptionId()).isEqualTo(2);
} }
@Ignore
@Test @Test
public void onSubscriptionsChanged_twoSubscriptionsDefaultChanges_selectedEntryGetsUpdated() { public void onSubscriptionsChanged_twoSubscriptionsDefaultChanges_selectedEntryGetsUpdated() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
@@ -225,19 +250,19 @@ public class DefaultSubscriptionControllerTest {
mController.setDefaultSubscription(Integer.parseInt(mSubInfo2.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo2.subId));
mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mListPreference.getEntry()).isEqualTo(DISPLAY_NAME_2); assertThat(mListPreference.getEntry()).isEqualTo(DISPLAY_NAME_2);
assertThat(mListPreference.getValue()).isEqualTo(mSubInfo2); assertThat(mListPreference.getValue()).isEqualTo(mSubInfo2.subId);
} }
@Test @Test
public void onSubscriptionsChanged_goFromTwoSubscriptionsToOne_prefDisappears() { public void onSubscriptionsChanged_goFromTwoSubscriptionsToOne_prefDisappears() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
@@ -246,7 +271,6 @@ public class DefaultSubscriptionControllerTest {
assertThat(mListPreference.isEnabled()).isTrue(); assertThat(mListPreference.isEnabled()).isTrue();
mSubscriptionInfoEntityList.remove(mSubInfo2); mSubscriptionInfoEntityList.remove(mSubInfo2);
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList);
mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
@@ -257,20 +281,19 @@ public class DefaultSubscriptionControllerTest {
@Test @Test
@UiThreadTest @UiThreadTest
public void onSubscriptionsChanged_goFromOneSubscriptionToTwo_prefAppears() { public void onSubscriptionsChanged_goFromOneSubscriptionToTwo_prefAppears() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
assertThat(mListPreference.isVisible()).isTrue(); assertThat(mListPreference.isVisible()).isTrue();
assertThat(mListPreference.isEnabled()).isFalse(); assertThat(mListPreference.isEnabled()).isFalse();
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
mController.setSubscriptionInfoList(mSubscriptionInfoEntityList);
mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList); mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
@@ -278,15 +301,14 @@ public class DefaultSubscriptionControllerTest {
assertThat(mListPreference.isEnabled()).isTrue(); assertThat(mListPreference.isEnabled()).isTrue();
} }
@Ignore
@Test @Test
public void onSubscriptionsChanged_goFromTwoToThreeSubscriptions_listGetsUpdated() { public void onSubscriptionsChanged_goFromTwoToThreeSubscriptions_listGetsUpdated() {
mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, 1, 1, DISPLAY_NAME_1, SUB_MCC_1, mSubInfo1 = setupSubscriptionInfoEntity(SUB_ID_1, DISPLAY_NAME_1, SUB_MCC_1, SUB_MNC_1,
SUB_MNC_1, SUB_COUNTRY_ISO_1, 1, true, true, true); SUB_COUNTRY_ISO_1);
mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, 1, 1, DISPLAY_NAME_2, SUB_MCC_2, mSubInfo2 = setupSubscriptionInfoEntity(SUB_ID_2, DISPLAY_NAME_2, SUB_MCC_2, SUB_MNC_2,
SUB_MNC_2, SUB_COUNTRY_ISO_2, 1, true, true, true); SUB_COUNTRY_ISO_2);
mSubInfo3 = setupSubscriptionInfoEntity(SUB_ID_3, 1, 1, DISPLAY_NAME_3, SUB_MCC_3, mSubInfo3 = setupSubscriptionInfoEntity(SUB_ID_3, DISPLAY_NAME_3, SUB_MCC_3, SUB_MNC_3,
SUB_MNC_3, SUB_COUNTRY_ISO_3, 1, true, true, true); SUB_COUNTRY_ISO_3);
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId)); mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1); mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2); mSubscriptionInfoEntityList.add(mSubInfo2);
@@ -322,9 +344,8 @@ public class DefaultSubscriptionControllerTest {
return sub; return sub;
} }
private class TestDefaultSubscriptionController extends DefaultSubscriptionController { private static class TestDefaultSubscriptionController extends DefaultSubscriptionController {
int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private List<SubscriptionInfoEntity> mSubscriptionInfoEntity;
TestDefaultSubscriptionController(Context context, String preferenceKey, TestDefaultSubscriptionController(Context context, String preferenceKey,
Lifecycle lifecycle, LifecycleOwner lifecycleOwner) { Lifecycle lifecycle, LifecycleOwner lifecycleOwner) {
@@ -342,12 +363,8 @@ public class DefaultSubscriptionControllerTest {
} }
@Override @Override
protected List<SubscriptionInfoEntity> getSubscriptionInfoList() { public CharSequence getSummary() {
return mSubscriptionInfoEntity; return String.valueOf(mSubId);
}
public void setSubscriptionInfoList(List<SubscriptionInfoEntity> list) {
mSubscriptionInfoEntity = list;
} }
} }
} }