diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 3960103eeae..d66997764f3 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -102,8 +102,7 @@ settings:keywords="@string/keywords_model_and_hardware" android:summary="@string/summary_placeholder" settings:allowDynamicSummaryInSlice="true" - settings:controller= - "com.android.settings.deviceinfo.DeviceModelPreferenceController"/> + settings:controller="com.android.settings.deviceinfo.DeviceModelPreferenceController"/> + android:summary="@string/summary_placeholder" + settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/> createPreferenceControllers( Context context) { - return buildPreferenceControllers(context, null /*activity */, + return buildPreferenceControllers(context, null /* activity */, null /* fragment */, null /* lifecycle */); } }; diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java index 66d68a629c8..96ff83c6f84 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java @@ -19,6 +19,7 @@ package com.android.settings.deviceinfo.imei; import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA; import android.content.Context; +import android.os.UserManager; import android.telephony.TelephonyManager; import androidx.annotation.VisibleForTesting; @@ -27,8 +28,9 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.Copyable; +import com.android.settingslib.Utils; import java.util.ArrayList; import java.util.List; @@ -36,39 +38,30 @@ import java.util.List; /** * Controller that manages preference for single and multi sim devices. */ -public class ImeiInfoPreferenceController extends - AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin { - - private static final String KEY_IMEI_INFO = "imei_info"; +public class ImeiInfoPreferenceController extends BasePreferenceController implements Copyable { private final boolean mIsMultiSim; private final TelephonyManager mTelephonyManager; private final List mPreferenceList = new ArrayList<>(); - private final Fragment mFragment; + private Fragment mFragment; - public ImeiInfoPreferenceController(Context context, Fragment fragment) { - super(context); - - mFragment = fragment; + public ImeiInfoPreferenceController(Context context, String key) { + super(context, key); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mIsMultiSim = mTelephonyManager.getPhoneCount() > 1; } - @Override - public String getPreferenceKey() { - return KEY_IMEI_INFO; + public void setHost(Fragment fragment) { + mFragment = fragment; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final Preference preference = screen.findPreference(getPreferenceKey()); - if (!isAvailable() || preference == null || !preference.isVisible()) { - return; - } mPreferenceList.add(preference); - updatePreference(preference, 0 /* sim slot */); + updatePreference(preference, 0 /* simSlot */); final int imeiPreferenceOrder = preference.getOrder(); // Add additional preferences for each sim in the device @@ -76,13 +69,20 @@ public class ImeiInfoPreferenceController extends simSlotNumber++) { final Preference multiSimPreference = createNewPreference(screen.getContext()); multiSimPreference.setOrder(imeiPreferenceOrder + simSlotNumber); - multiSimPreference.setKey(KEY_IMEI_INFO + simSlotNumber); + multiSimPreference.setKey(getPreferenceKey() + simSlotNumber); screen.addPreference(multiSimPreference); mPreferenceList.add(multiSimPreference); updatePreference(multiSimPreference, simSlotNumber); } } + @Override + public CharSequence getSummary() { + final int phoneType = mTelephonyManager.getPhoneType(); + return phoneType == PHONE_TYPE_CDMA ? mTelephonyManager.getMeid() + : mTelephonyManager.getImei(); + } + @Override public boolean handlePreferenceTreeClick(Preference preference) { final int simSlot = mPreferenceList.indexOf(preference); @@ -94,6 +94,22 @@ public class ImeiInfoPreferenceController extends return true; } + @Override + public int getAvailabilityStatus() { + return mContext.getSystemService(UserManager.class).isAdminUser() + && !Utils.isWifiOnly(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isSliceable() { + return true; + } + + @Override + public void copy() { + Copyable.setCopyContent(mContext, getSummary(), mContext.getText(R.string.status_imei)); + } + private void updatePreference(Preference preference, int simSlot) { final int phoneType = mTelephonyManager.getPhoneType(); if (phoneType == PHONE_TYPE_CDMA) { diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java index e56baa14cce..69bc494bb1b 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java @@ -16,9 +16,14 @@ package com.android.settings.deviceinfo.imei; +import static android.content.Context.CLIPBOARD_SERVICE; import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA; import static android.telephony.TelephonyManager.PHONE_TYPE_GSM; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -26,6 +31,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.ClipboardManager; import android.content.Context; import android.os.UserManager; import android.telephony.TelephonyManager; @@ -71,8 +77,9 @@ public class ImeiInfoPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); - mController = spy(new ImeiInfoPreferenceController(mContext, mFragment)); - doReturn(true).when(mController).isAvailable(); + mController = spy(new ImeiInfoPreferenceController(mContext, "imei_info")); + mController.setHost(mFragment); + doReturn(AVAILABLE).when(mController).getAvailabilityStatus(); when(mScreen.getContext()).thenReturn(mContext); doReturn(mSecondSimPreference).when(mController).createNewPreference(mContext); ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager); @@ -156,7 +163,7 @@ public class ImeiInfoPreferenceControllerTest { @Test public void handlePreferenceTreeClick_shouldStartDialogFragment() { when(mFragment.getChildFragmentManager()) - .thenReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)); + .thenReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)); when(mPreference.getTitle()).thenReturn("SomeTitle"); mController.displayPreference(mScreen); @@ -164,4 +171,19 @@ public class ImeiInfoPreferenceControllerTest { verify(mFragment).getChildFragmentManager(); } + + @Test + public void copy_shouldCopyImeiToClipboard() { + ReflectionHelpers.setField(mController, "mIsMultiSim", false); + final String meid = "125132215123"; + when(mTelephonyManager.getPhoneType()).thenReturn(PHONE_TYPE_CDMA); + when(mTelephonyManager.getMeid()).thenReturn(meid); + + mController.copy(); + + final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService( + CLIPBOARD_SERVICE); + final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText(); + assertThat(data.toString()).isEqualTo(meid); + } }