[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
This commit is contained in:
Bonian Chen
2022-11-29 12:20:20 +00:00
parent c5bd302514
commit bfacd938f6
3 changed files with 76 additions and 18 deletions

View File

@@ -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));

View File

@@ -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);
}

View File

@@ -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();
}