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

Commit bfacd938 authored by Bonian Chen's avatar Bonian Chen
Browse files

[Settings] Code refactor

Create PreferenceController for each of the Preference presented on
screen, which allows SettingsFragment better control the behavior of
Preference.

Bug: 260540995
Test: auto and local test
Change-Id: Iadd9c10fb353d6304d61e65687a505c71a53179a
parent c5bd3025
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -103,7 +103,17 @@ public class MyDeviceInfoFragment extends DashboardFragment
    private static List<AbstractPreferenceController> buildPreferenceControllers(
            Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        controllers.add(new SimStatusPreferenceController(context, fragment));

        SimStatusPreferenceController defaultRecord =
            new SimStatusPreferenceController(context, fragment);

        for (int slotIndex = 0; slotIndex < defaultRecord.getSimSlotSize(); slotIndex ++) {
            SimStatusPreferenceController slotRecord =
                new SimStatusPreferenceController(context, fragment);
            slotRecord.setSimSlotStatus(slotIndex);
            controllers.add(slotRecord);
        }

        controllers.add(new IpAddressPreferenceController(context, lifecycle));
        controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
        controllers.add(new BluetoothAddressPreferenceController(context, lifecycle));
+36 −6
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ public class SimStatusPreferenceController extends
    private final Fragment mFragment;
    private final List<Preference> mPreferenceList = new ArrayList<>();

    private int mSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;

    public SimStatusPreferenceController(Context context, Fragment fragment) {
        super(context);

@@ -57,9 +59,36 @@ public class SimStatusPreferenceController extends

    @Override
    public String getPreferenceKey() {
        if (mSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
            return KEY_SIM_STATUS + mSlotIndex;
        }
        return KEY_SIM_STATUS;
    }

    /**
     * Update the index of slot for this subscription.
     * @param slotIndex index of slot
     */
    public void setSimSlotStatus(int slotIndex) {
        mSlotIndex = slotIndex;
    }

    /**
     * Get number of subscription slots.
     * @return number of slots
     */
    public int getSimSlotSize() {
        return isAvailable() ? mTelephonyManager.getPhoneCount() : 0;
    }

    /**
     * Get the index of slot for this subscription.
     * @return index of slot
     */
    public int getSimSlotIndex() {
        return mSlotIndex;
    }

    @Override
    public boolean isAvailable() {
        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
@@ -72,22 +101,23 @@ public class SimStatusPreferenceController extends
        if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
            return;
        }
        final Preference preference = screen.findPreference(getPreferenceKey());
        final Preference preference = screen.findPreference(KEY_SIM_STATUS);
        if (!isAvailable() || preference == null || !preference.isVisible()) {
            return;
        }
        final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY);

        mPreferenceList.add(preference);

        final int simStatusOrder = preference.getOrder();
        screen.removePreference(preference);
        preference.setVisible(false);

        // Add additional preferences for each sim in the device
        for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount();
        for (int simSlotNumber = 0; simSlotNumber < mTelephonyManager.getPhoneCount();
                simSlotNumber++) {
            final Preference multiSimPreference = createNewPreference(screen.getContext());
            multiSimPreference.setCopyingEnabled(true);
            multiSimPreference.setOrder(simStatusOrder + simSlotNumber);
            multiSimPreference.setKey(KEY_SIM_STATUS + simSlotNumber);
            multiSimPreference.setOrder(simStatusOrder + simSlotNumber + 1);
            multiSimPreference.setKey(KEY_SIM_STATUS + simSlotNumber + 1);
            category.addPreference(multiSimPreference);
            mPreferenceList.add(multiSimPreference);
        }
+29 −11
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.UserManager;
import android.content.res.Resources;
import android.os.UserManager;
import android.telephony.TelephonyManager;

import androidx.fragment.app.Fragment;
@@ -36,6 +36,9 @@ import androidx.preference.PreferenceScreen;

import com.android.settings.R;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -44,7 +47,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
public class SimStatusPreferenceControllerTest {
@@ -52,6 +54,8 @@ public class SimStatusPreferenceControllerTest {
    @Mock
    private Preference mPreference;
    @Mock
    private Preference mFirstSimPreference;
    @Mock
    private Preference mSecondSimPreference;
    @Mock
    private PreferenceScreen mScreen;
@@ -77,18 +81,31 @@ public class SimStatusPreferenceControllerTest {
        when(mContext.getResources()).thenReturn(mResources);
        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);

        doReturn(mTelephonyManager).when(mContext)
                .getSystemService(Context.TELEPHONY_SERVICE);

        doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
        mController = spy(new SimStatusPreferenceController(mContext, mFragment));
        final List<Preference> preferencePool = new ArrayList<Preference>();
        preferencePool.add(mFirstSimPreference);
        preferencePool.add(mSecondSimPreference);

        mController = spy(new SimStatusPreferenceController(mContext, mFragment) {
            @Override
            public Preference createNewPreference(Context context) {
                return preferencePool.remove(0);
            }
        });
        doReturn(true).when(mController).isAvailable();
        when(mScreen.getContext()).thenReturn(mContext);
        final String categoryKey = "device_detail_category";
        when(mScreen.findPreference(categoryKey)).thenReturn(mCategory);
        doReturn(mSecondSimPreference).when(mController).createNewPreference(mContext);
        ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
        final String baseEntryKey = "sim_status";
        when(mScreen.findPreference(baseEntryKey)).thenReturn(mPreference);
        final String prefKey = mController.getPreferenceKey();
        when(mPreference.getKey()).thenReturn(prefKey);
        when(mPreference.isVisible()).thenReturn(true);

        mController.setSimSlotStatus(-1);
    }

    @Test
@@ -107,8 +124,8 @@ public class SimStatusPreferenceControllerTest {

        mController.updateState(mPreference);

        verify(mPreference).setTitle(mContext.getString(R.string.sim_status_title));
        verify(mPreference).setSummary(anyString());
        verify(mFirstSimPreference).setTitle(mContext.getString(R.string.sim_status_title));
        verify(mFirstSimPreference).setSummary(anyString());
    }

    @Test
@@ -118,11 +135,11 @@ public class SimStatusPreferenceControllerTest {

        mController.updateState(mPreference);

        verify(mPreference).setTitle(
        verify(mFirstSimPreference).setTitle(
                mContext.getString(R.string.sim_status_title_sim_slot, 1 /* sim slot */));
        verify(mSecondSimPreference).setTitle(
                mContext.getString(R.string.sim_status_title_sim_slot, 2 /* sim slot */));
        verify(mPreference).setSummary(anyString());
        verify(mFirstSimPreference).setSummary(anyString());
        verify(mSecondSimPreference).setSummary(anyString());
    }

@@ -130,9 +147,10 @@ public class SimStatusPreferenceControllerTest {
    public void handlePreferenceTreeClick_shouldStartDialogFragment() {
        when(mFragment.getChildFragmentManager()).thenReturn(
                mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS));
        when(mTelephonyManager.getPhoneCount()).thenReturn(2);
        mController.displayPreference(mScreen);

        mController.handlePreferenceTreeClick(mPreference);
        mController.handlePreferenceTreeClick(mFirstSimPreference);

        verify(mFragment).getChildFragmentManager();
    }