diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 08d3e6cc928..9f14026ebd7 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -100,7 +100,7 @@ settings:keywords="@string/keywords_sim_status" android:summary="@string/summary_placeholder" settings:isPreferenceVisible="@bool/config_show_sim_info" - settings:enableCopying="true"/> + settings:controller="com.android.settings.deviceinfo.simstatus.SimStatusPreferenceController"/> controllers = new ArrayList<>(); + String simStatusKey = SimStatusPreferenceController.KEY_SIM_STATUS; SimStatusPreferenceController defaultRecord = - new SimStatusPreferenceController(context, fragment); + new SimStatusPreferenceController(context, simStatusKey); for (int slotIndex = 0; slotIndex < defaultRecord.getSimSlotSize(); slotIndex ++) { SimStatusPreferenceController slotRecord = - new SimStatusPreferenceController(context, fragment); - slotRecord.setSimSlotStatus(slotIndex); + new SimStatusPreferenceController(context, simStatusKey + slotIndex + 1); + slotRecord.init(fragment, slotIndex); controllers.add(slotRecord); } diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java index 835f8203fb5..529d3147235 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java @@ -20,6 +20,7 @@ import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.os.UserManager; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; @@ -28,48 +29,39 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.BasePreferenceController; import com.android.settings.network.SubscriptionUtil; -import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; +import com.android.settingslib.Utils; import java.util.ArrayList; import java.util.List; -public class SimStatusPreferenceController extends - AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin { +public class SimStatusPreferenceController extends BasePreferenceController { - private static final String KEY_SIM_STATUS = "sim_status"; + public static final String KEY_SIM_STATUS = "sim_status"; private static final String KEY_PREFERENCE_CATEGORY = "device_detail_category"; private final TelephonyManager mTelephonyManager; private final SubscriptionManager mSubscriptionManager; - private final Fragment mFragment; private final List mPreferenceList = new ArrayList<>(); + private Fragment mFragment; private int mSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; - public SimStatusPreferenceController(Context context, Fragment fragment) { - super(context); + public SimStatusPreferenceController(Context context, String prefKey) { + super(context, prefKey); - mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - mSubscriptionManager = (SubscriptionManager) context.getSystemService( - Context.TELEPHONY_SUBSCRIPTION_SERVICE); - mFragment = fragment; - } - - @Override - public String getPreferenceKey() { - if (mSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX) { - return KEY_SIM_STATUS + mSlotIndex; - } - return KEY_SIM_STATUS; + mTelephonyManager = context.getSystemService(TelephonyManager.class); + mSubscriptionManager = context.getSystemService(SubscriptionManager.class); } /** - * Update the index of slot for this subscription. + * Initialize this preference controller. + * @param fragment parent fragment * @param slotIndex index of slot */ - public void setSimSlotStatus(int slotIndex) { + public void init(Fragment fragment, int slotIndex) { + mFragment = fragment; mSlotIndex = slotIndex; } @@ -90,9 +82,14 @@ public class SimStatusPreferenceController extends } @Override - public boolean isAvailable() { - return SubscriptionUtil.isSimHardwareVisible(mContext) && - super.isAvailable(); + public int getAvailabilityStatus() { + if (getSimSlotIndex() == SubscriptionManager.INVALID_SIM_SLOT_INDEX) { + return UNSUPPORTED_ON_DEVICE; + } + boolean isAvailable = SubscriptionUtil.isSimHardwareVisible(mContext) && + mContext.getSystemService(UserManager.class).isAdminUser() && + !Utils.isWifiOnly(mContext); + return isAvailable ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java index 458f7ff296d..0ca5fd262ca 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; import android.os.UserManager; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.fragment.app.Fragment; @@ -35,6 +36,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; import java.util.ArrayList; import java.util.List; @@ -81,21 +83,20 @@ 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); + mockService(Context.TELEPHONY_SERVICE, TelephonyManager.class, mTelephonyManager); - doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + mockService(Context.USER_SERVICE, UserManager.class, mUserManager); final List preferencePool = new ArrayList(); preferencePool.add(mFirstSimPreference); preferencePool.add(mSecondSimPreference); - mController = spy(new SimStatusPreferenceController(mContext, mFragment) { + mController = spy(new SimStatusPreferenceController(mContext, "sim_status") { @Override public Preference createNewPreference(Context context) { return preferencePool.remove(0); } }); - doReturn(true).when(mController).isAvailable(); + doReturn(BasePreferenceController.AVAILABLE).when(mController).getAvailabilityStatus(); when(mScreen.getContext()).thenReturn(mContext); final String categoryKey = "device_detail_category"; when(mScreen.findPreference(categoryKey)).thenReturn(mCategory); @@ -105,7 +106,7 @@ public class SimStatusPreferenceControllerTest { when(mPreference.getKey()).thenReturn(prefKey); when(mPreference.isVisible()).thenReturn(true); - mController.setSimSlotStatus(-1); + mController.init(mFragment, SubscriptionManager.INVALID_SIM_SLOT_INDEX); } @Test @@ -154,4 +155,9 @@ public class SimStatusPreferenceControllerTest { verify(mFragment).getChildFragmentManager(); } + + private void mockService(String serviceName, Class serviceClass, T service) { + when(mContext.getSystemServiceName(serviceClass)).thenReturn(serviceName); + when(mContext.getSystemService(serviceName)).thenReturn(service); + } }