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

Commit 400e13cc authored by jackqdyulei's avatar jackqdyulei
Browse files

Update the mobile activity

1. Add listener to ACTION_RADIO_TECHNOLOGY_CHANGED
2. Update fragment switch by using replace
3. Remove todo for sort because list is already sorted by sim slot
4. Make actiivty accept SUB_ID from intent
5. Add icon for multi-sim support

Bug: 114749736
Test: RunSettingsRoboTests && Screenshot

Change-Id: I11c472b1479ec9243266cb2a7ef4292370ac6894
parent ed33c87c
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.UserManager;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -106,7 +107,7 @@ public class MobileNetworkFragment extends RestrictedDashboardFragment {
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID,
        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID);

        use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
+90 −46
Original line number Diff line number Diff line
@@ -17,10 +17,15 @@
package com.android.settings.network.telephony;

import android.app.ActionBar;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;

@@ -30,68 +35,83 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.CollectionUtils;
import com.android.settings.R;
import com.android.settings.core.SettingsBaseActivity;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;

public class MobileSettingsActivity extends SettingsBaseActivity {

    private static final String TAG = "MobileSettingsActivity";
    @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";
    @VisibleForTesting
    static final int SUB_ID_NULL = Integer.MIN_VALUE;

    private SubscriptionManager mSubscriptionManager;
    @VisibleForTesting
    Integer mCurSubscriptionId;
    SubscriptionManager mSubscriptionManager;
    @VisibleForTesting
    int mCurSubscriptionId;
    @VisibleForTesting
    List<SubscriptionInfo> mSubscriptionInfos;
    List<SubscriptionInfo> mSubscriptionInfos = new ArrayList<>();
    private PhoneChangeReceiver mPhoneChangeReceiver;

    private final SubscriptionManager.OnSubscriptionsChangedListener
            mOnSubscriptionsChangeListener
            = new SubscriptionManager.OnSubscriptionsChangedListener() {
        @Override
        public void onSubscriptionsChanged() {
            if (!Objects.equals(mSubscriptionInfos,
                    mSubscriptionManager.getActiveSubscriptionInfoList())) {
                updateSubscriptions(null);
            }
    };

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //TODO(b/114749736): update fragment by new intent, or at least make sure this page shows
        // current tab for sim card
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //TODO(b/114749736): add phone change receiver here: ACTION_RADIO_TECHNOLOGY_CHANGED

        setContentView(R.layout.mobile_settings_container);
        setActionBar(findViewById(R.id.mobile_action_bar));
        mPhoneChangeReceiver = new PhoneChangeReceiver();
        mSubscriptionManager = getSystemService(SubscriptionManager.class);
        mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
        mCurSubscriptionId = savedInstanceState != null
                ? savedInstanceState.getInt(KEY_CUR_SUBSCRIPTION_ID)
                : null;

        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
                ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
                : SUB_ID_NULL;

        final ActionBar actionBar = getActionBar();
        if (actionBar != null) {
            // android.R.id.home will be triggered in onOptionsItemSelected()
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        updateSubscriptions(savedInstanceState);
    }

    @Override
    protected void onStart() {
        super.onStart();
        final IntentFilter intentFilter = new IntentFilter(
                TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
        registerReceiver(mPhoneChangeReceiver, intentFilter);
        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(mPhoneChangeReceiver);
        mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
@@ -100,24 +120,42 @@ public class MobileSettingsActivity extends SettingsBaseActivity {

    @VisibleForTesting
    void saveInstanceState(@NonNull Bundle outState) {
        outState.putInt(KEY_CUR_SUBSCRIPTION_ID, mCurSubscriptionId);
        outState.putInt(Settings.EXTRA_SUB_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(), subId);
            switchFragment(new MobileNetworkFragment(), getSubscriptionId());
        }
    }

    /**
     * Get the current subId to display. First check whether intent has {@link
     * Settings#EXTRA_SUB_ID}. If not, just display first one in list
     * since it is already sorted by sim slot.
     */
    @VisibleForTesting
    int getSubscriptionId() {
        final Intent intent = getIntent();
        if (intent != null) {
            final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
            if (subId != SUB_ID_NULL && mSubscriptionManager.isActiveSubscriptionId(subId)) {
                return subId;
            }
        }

        if (CollectionUtils.isEmpty(mSubscriptionInfos)) {
            return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
        }

        return mSubscriptionInfos.get(0).getSubscriptionId();
    }

    @VisibleForTesting
    void updateBottomNavigationView() {
        final BottomNavigationView navigation = findViewById(R.id.bottom_nav);
@@ -130,7 +168,8 @@ public class MobileSettingsActivity extends SettingsBaseActivity {
            for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) {
                final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i);
                menu.add(0, subscriptionInfo.getSubscriptionId(), i,
                        subscriptionInfo.getDisplayName());
                        subscriptionInfo.getDisplayName())
                        .setIcon(R.drawable.ic_settings_sim);
            }
            navigation.setOnNavigationItemSelectedListener(item -> {
                switchFragment(new MobileNetworkFragment(), item.getItemId());
@@ -141,30 +180,23 @@ public class MobileSettingsActivity extends SettingsBaseActivity {

    @VisibleForTesting
    void switchFragment(Fragment fragment, int subscriptionId) {
        if (mCurSubscriptionId != null && subscriptionId == mCurSubscriptionId) {
        switchFragment(fragment, subscriptionId, false /* forceUpdate */);
    }

    @VisibleForTesting
    void switchFragment(Fragment fragment, int subscriptionId, boolean forceUpdate) {
        if (mCurSubscriptionId != SUB_ID_NULL && subscriptionId == mCurSubscriptionId
                && !forceUpdate) {
            return;
        }
        final FragmentManager fragmentManager = getSupportFragmentManager();
        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        final Bundle bundle = new Bundle();
        bundle.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
        bundle.putInt(Settings.EXTRA_SUB_ID, subscriptionId);

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

        Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId));
        if (showFragment == null) {
        fragment.setArguments(bundle);
            fragmentTransaction.add(R.id.main_content, fragment, buildFragmentTag(subscriptionId));
        } else {
            showFragment.setArguments(bundle);
            fragmentTransaction.show(showFragment);
        }
        fragmentTransaction.replace(R.id.main_content, fragment,
                buildFragmentTag(subscriptionId));
        fragmentTransaction.commit();
        mCurSubscriptionId = subscriptionId;
    }
@@ -172,4 +204,16 @@ public class MobileSettingsActivity extends SettingsBaseActivity {
    private String buildFragmentTag(int subscriptionId) {
        return MOBILE_SETTINGS_TAG + subscriptionId;
    }

    private class PhoneChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // When the radio changes (ex: CDMA->GSM), refresh the fragment.
            // This is very rare to happen.
            if (mCurSubscriptionId != SUB_ID_NULL) {
                switchFragment(new MobileNetworkFragment(), mCurSubscriptionId,
                        true /* forceUpdate */);
            }
        }
    }
}
 No newline at end of file
+2 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity;
@@ -93,7 +94,7 @@ public class NetworkSelectSettings extends DashboardFragment {

        mUseNewApi = getContext().getResources().getBoolean(
                com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
        mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID);

        mConnectedPreferenceCategory =
                (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
+2 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.network.telephony.gsm;
import android.content.Context;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -96,7 +97,7 @@ public class AutoSelectPreferenceController extends TogglePreferenceController {
                    == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
        } else {
            final Bundle bundle = new Bundle();
            bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
            bundle.putInt(Settings.EXTRA_SUB_ID, mSubId);
            new SubSettingLauncher(mContext)
                    .setDestination(NetworkSelectSettings.class.getName())
                    .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.network.telephony.gsm;

import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -84,7 +85,7 @@ public class OpenNetworkSelectPagePreferenceController extends BasePreferenceCon
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
            final Bundle bundle = new Bundle();
            bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
            bundle.putInt(Settings.EXTRA_SUB_ID, mSubId);
            new SubSettingLauncher(mContext)
                    .setDestination(NetworkSelectSettings.class.getName())
                    .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
Loading