Implement the Copyable interface to ImeiInfoPreferenceController

Copy the IMEI to clipboard for Copyable.

Change-Id: I3e13bfad8158e4cb4f9fda854661341d4c334e46
Fixes: 73769888
Test: manual and robotests
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 3960103..d669977 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"/>
 
     <!-- IMEI -->
     <Preference
@@ -111,7 +110,8 @@
         android:order="22"
         android:title="@string/status_imei"
         settings:keywords="@string/keywords_imei_info"
-        android:summary="@string/summary_placeholder"/>
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/>
 
     <!-- Android version -->
     <Preference
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index 19b6975..e836d1f 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -79,8 +79,9 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        use(FirmwareVersionPreferenceController.class).setHost(this /*parent*/);
+        use(FirmwareVersionPreferenceController.class).setHost(this /* parent */);
         use(DeviceModelPreferenceController.class).setHost(this /* parent */);
+        use(ImeiInfoPreferenceController.class).setHost(this /* parent */);
         mBuildNumberPreferenceController = use(BuildNumberPreferenceController.class);
         mBuildNumberPreferenceController.setHost(this /* parent */);
     }
@@ -121,7 +122,6 @@
         }
         controllers.add(deviceNamePreferenceController);
         controllers.add(new SimStatusPreferenceController(context, fragment));
-        controllers.add(new ImeiInfoPreferenceController(context, fragment));
         controllers.add(new IpAddressPreferenceController(context, lifecycle));
         controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
         controllers.add(new BluetoothAddressPreferenceController(context, lifecycle));
@@ -197,7 +197,7 @@
                 @Override
                 public List<AbstractPreferenceController> 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 66d68a6..96ff83c 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
@@ -19,6 +19,7 @@
 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.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 @@
 /**
  * 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<Preference> 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,7 +69,7 @@
                 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);
@@ -84,6 +77,13 @@
     }
 
     @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);
         if (simSlot == -1) {
@@ -94,6 +94,22 @@
         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 e56baa1..69bc494 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.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 @@
         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 @@
     @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 @@
 
         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);
+    }
 }