diff --git a/res/values/strings.xml b/res/values/strings.xml index 188ba6e78f7..23adc768536 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10343,4 +10343,7 @@ Send feedback Would you like to give us feedback on this suggestion? + + + %1$s copied to clipboard. diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java index 6f5f346f89c..462f6d99224 100644 --- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -16,6 +16,10 @@ package com.android.settings.deviceinfo; +import static android.content.Context.CLIPBOARD_SERVICE; + +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -23,6 +27,7 @@ import android.telephony.TelephonyManager; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; import android.text.TextUtils; +import android.widget.Toast; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -30,12 +35,14 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.Copyable; import com.android.settingslib.DeviceInfoUtils; import java.util.ArrayList; import java.util.List; -public class PhoneNumberPreferenceController extends BasePreferenceController { +public class PhoneNumberPreferenceController extends BasePreferenceController implements + Copyable { private final static String KEY_PHONE_NUMBER = "phone_number"; @@ -46,7 +53,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { public PhoneNumberPreferenceController(Context context, String key) { super(context, key); mTelephonyManager = mContext.getSystemService(TelephonyManager.class); - mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); + mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); } @Override @@ -91,6 +98,17 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { return true; } + @Override + public void copy() { + final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService( + CLIPBOARD_SERVICE); + clipboard.setPrimaryClip(ClipData.newPlainText("text", getFirstPhoneNumber())); + + final String toast = mContext.getString(R.string.copyable_slice_toast, + mContext.getText(R.string.status_number)); + Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); + } + private CharSequence getFirstPhoneNumber() { final List subscriptionInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); diff --git a/src/com/android/settings/slices/CopyableSlice.java b/src/com/android/settings/slices/Copyable.java similarity index 96% rename from src/com/android/settings/slices/CopyableSlice.java rename to src/com/android/settings/slices/Copyable.java index 31fc151d6ba..12159d1c0c8 100644 --- a/src/com/android/settings/slices/CopyableSlice.java +++ b/src/com/android/settings/slices/Copyable.java @@ -19,7 +19,7 @@ package com.android.settings.slices; /** * Provide the copy ability for preference controller to copy the data to the clipboard. */ -public interface CopyableSlice { +public interface Copyable { /** * Copy the key slice information to the clipboard. * It is highly recommended to show the toast to notify users when implemented this function. diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index 823c7294adc..28b2f818541 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -185,7 +185,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { final BasePreferenceController controller = getPreferenceController(context, key); - if (!(controller instanceof CopyableSlice)) { + if (!(controller instanceof Copyable)) { throw new IllegalArgumentException( "Copyable action passed for a non-copyable key:" + key); } @@ -198,7 +198,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { return; } - ((CopyableSlice) controller).copy(); + ((Copyable) controller).copy(); } /** diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index d75eaa2e1a2..b2b8310d1c8 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -94,7 +94,7 @@ public class SliceBuilderUtils { return buildUnavailableSlice(context, sliceData); } - if (controller instanceof CopyableSlice) { + if (controller instanceof Copyable) { return buildCopyableSlice(context, sliceData, controller); } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java index 8e9a48f6894..d0900972125 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.java @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo; +import static android.content.Context.CLIPBOARD_SERVICE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; @@ -24,6 +26,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.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -43,6 +46,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import java.util.ArrayList; +import java.util.List; + @RunWith(RobolectricTestRunner.class) public class PhoneNumberPreferenceControllerTest { @@ -146,4 +152,20 @@ public class PhoneNumberPreferenceControllerTest { public void isSliceable_shouldBeTrue() { assertThat(mController.isSliceable()).isTrue(); } + + @Test + public void copy_shouldCopyPhoneNumberToClipboard() { + final List list = new ArrayList<>(); + list.add(mSubscriptionInfo); + when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(list); + final String phoneNumber = "1111111111"; + doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); + + mController.copy(); + + final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService( + CLIPBOARD_SERVICE); + final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText(); + assertThat(phoneNumber.contentEquals(data)).isTrue(); + } } diff --git a/tests/robotests/src/com/android/settings/testutils/FakeCopyableController.java b/tests/robotests/src/com/android/settings/testutils/FakeCopyableController.java index ac19dd0c778..31e955c8cdf 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeCopyableController.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeCopyableController.java @@ -19,9 +19,9 @@ package com.android.settings.testutils; import android.content.Context; import com.android.settings.core.BasePreferenceController; -import com.android.settings.slices.CopyableSlice; +import com.android.settings.slices.Copyable; -public class FakeCopyableController extends BasePreferenceController implements CopyableSlice { +public class FakeCopyableController extends BasePreferenceController implements Copyable { public FakeCopyableController(Context context, String preferenceKey) { super(context, preferenceKey);