Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a478188 authored by jackqdyulei's avatar jackqdyulei
Browse files

Add network listener in MobileSettingsActivity

Listen to subscription change. If it is changed, refresh UI and build
new fragment for it.

Bug: 114749736
Test: RunSettingsRoboTests
Change-Id: I436b4d62b06230e767892bda6cf8582d4946097b
parent 36063b92
Loading
Loading
Loading
Loading
+50 −11
Original line number Diff line number Diff line
@@ -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<SubscriptionInfo> 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);

        setContentView(R.layout.mobile_settings_container);
        mSubscriptionManager = getSystemService(SubscriptionManager.class);
        mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
        mPrevSubscriptionId = CollectionUtils.isEmpty(mSubscriptionInfos)
        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();

        setContentView(R.layout.mobile_settings_container);

        updateBottomNavigationView();

        if (savedInstanceState == null) {
            switchFragment(new MobileNetworkFragment(), mPrevSubscriptionId);
            switchFragment(new MobileNetworkFragment(), subId);
        }
    }

@@ -89,25 +124,28 @@ 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);

        if (mCurSubscriptionId != null) {
            final Fragment hideFragment = fragmentManager.findFragmentByTag(
                buildFragmentTag(mPrevSubscriptionId));
                    buildFragmentTag(mCurSubscriptionId));
            if (hideFragment != null) {
                fragmentTransaction.hide(hideFragment);
            }
        }

        Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId));
        if (showFragment == null) {
@@ -118,6 +156,7 @@ public class MobileSettingsActivity extends SettingsBaseActivity {
            fragmentTransaction.show(showFragment);
        }
        fragmentTransaction.commit();
        mCurSubscriptionId = subscriptionId;
    }

    private String buildFragmentTag(int subscriptionId) {
+17 −2
Original line number Diff line number Diff line
@@ -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);
    }
}