diff --git a/src/com/android/settings/mobilenetwork/MobileSettingsActivity.java b/src/com/android/settings/mobilenetwork/MobileSettingsActivity.java index ba92ebf7955..4442ddfa3d9 100644 --- a/src/com/android/settings/mobilenetwork/MobileSettingsActivity.java +++ b/src/com/android/settings/mobilenetwork/MobileSettingsActivity.java @@ -23,6 +23,7 @@ import android.telephony.SubscriptionManager; import android.view.Menu; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -41,13 +42,23 @@ public class MobileSettingsActivity extends SettingsBaseActivity { @VisibleForTesting static final String MOBILE_SETTINGS_TAG = "mobile_settings:"; public static final String KEY_SUBSCRIPTION_ID = "key_subscription_id"; + public static final String KEY_CUR_SUBSCRIPTION_ID = "key_cur_subscription_id"; private SubscriptionManager mSubscriptionManager; @VisibleForTesting - int mPrevSubscriptionId; + Integer mCurSubscriptionId; @VisibleForTesting List mSubscriptionInfos; + private final SubscriptionManager.OnSubscriptionsChangedListener + mOnSubscriptionsChangeListener + = new SubscriptionManager.OnSubscriptionsChangedListener() { + @Override + public void onSubscriptionsChanged() { + updateSubscriptions(null); + } + }; + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -58,18 +69,42 @@ public class MobileSettingsActivity extends SettingsBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSubscriptionManager = getSystemService(SubscriptionManager.class); - mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(); - mPrevSubscriptionId = CollectionUtils.isEmpty(mSubscriptionInfos) - ? SubscriptionManager.INVALID_SUBSCRIPTION_ID - : mSubscriptionInfos.get(0).getSubscriptionId(); setContentView(R.layout.mobile_settings_container); + mSubscriptionManager = getSystemService(SubscriptionManager.class); + mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(); + mCurSubscriptionId = savedInstanceState != null + ? savedInstanceState.getInt(KEY_CUR_SUBSCRIPTION_ID) + : null; + + mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); + + updateSubscriptions(savedInstanceState); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + saveInstanceState(outState); + } + + @VisibleForTesting + void saveInstanceState(@NonNull Bundle outState) { + outState.putInt(KEY_CUR_SUBSCRIPTION_ID, mCurSubscriptionId); + } + + @VisibleForTesting + void updateSubscriptions(Bundle savedInstanceState) { + //TODO(b/114749736): Sort it by phoneId + mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(); + final int subId = CollectionUtils.isEmpty(mSubscriptionInfos) + ? SubscriptionManager.INVALID_SUBSCRIPTION_ID + : mSubscriptionInfos.get(0).getSubscriptionId(); updateBottomNavigationView(); if (savedInstanceState == null) { - switchFragment(new MobileNetworkFragment(), mPrevSubscriptionId); + switchFragment(new MobileNetworkFragment(), subId); } } @@ -89,24 +124,27 @@ public class MobileSettingsActivity extends SettingsBaseActivity { } navigation.setOnNavigationItemSelectedListener(item -> { switchFragment(new MobileNetworkFragment(), item.getItemId()); - mPrevSubscriptionId = item.getItemId(); return true; }); - } } @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId) { + if (mCurSubscriptionId != null && subscriptionId == mCurSubscriptionId) { + return; + } final FragmentManager fragmentManager = getSupportFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final Bundle bundle = new Bundle(); bundle.putInt(KEY_SUBSCRIPTION_ID, subscriptionId); - final Fragment hideFragment = fragmentManager.findFragmentByTag( - buildFragmentTag(mPrevSubscriptionId)); - if (hideFragment != null) { - fragmentTransaction.hide(hideFragment); + if (mCurSubscriptionId != null) { + final Fragment hideFragment = fragmentManager.findFragmentByTag( + buildFragmentTag(mCurSubscriptionId)); + if (hideFragment != null) { + fragmentTransaction.hide(hideFragment); + } } Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId)); @@ -118,6 +156,7 @@ public class MobileSettingsActivity extends SettingsBaseActivity { fragmentTransaction.show(showFragment); } fragmentTransaction.commit(); + mCurSubscriptionId = subscriptionId; } private String buildFragmentTag(int subscriptionId) { diff --git a/tests/robotests/src/com/android/settings/mobilenetwork/MobileSettingsActivityTest.java b/tests/robotests/src/com/android/settings/mobilenetwork/MobileSettingsActivityTest.java index a5a26b47e72..b18676ff006 100644 --- a/tests/robotests/src/com/android/settings/mobilenetwork/MobileSettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/mobilenetwork/MobileSettingsActivityTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.Context; +import android.os.Bundle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.view.Menu; @@ -45,6 +46,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; @@ -120,7 +122,7 @@ public class MobileSettingsActivityTest { @Test public void switchFragment_hidePreviousFragment() { - mMobileSettingsActivity.mPrevSubscriptionId = PREV_SUB_ID; + mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID; mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID); @@ -129,7 +131,7 @@ public class MobileSettingsActivityTest { @Test public void switchFragment_fragmentExist_showItWithArguments() { - mMobileSettingsActivity.mPrevSubscriptionId = PREV_SUB_ID; + mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID; mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID); @@ -137,4 +139,17 @@ public class MobileSettingsActivityTest { MobileSettingsActivity.KEY_SUBSCRIPTION_ID)).isEqualTo(CURRENT_SUB_ID); verify(mFragmentTransaction).show(mShowFragment); } + + @Test + public void onSaveInstanceState_saveCurrentSubId() { + mMobileSettingsActivity = Robolectric.buildActivity( + MobileSettingsActivity.class).get(); + mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID; + final Bundle bundle = new Bundle(); + + mMobileSettingsActivity.saveInstanceState(bundle); + + assertThat(bundle.getInt(MobileSettingsActivity.KEY_CUR_SUBSCRIPTION_ID)).isEqualTo( + PREV_SUB_ID); + } }