Merge changes I4c1e118c,Id66f2971 into tm-qpr-dev am: d6819393d2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21303438

Change-Id: I4fb0a0766f12a2bf3e2a23641231411be852e8bc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Matt Casey
2023-02-15 01:40:54 +00:00
committed by Automerger Merge Worker
7 changed files with 136 additions and 66 deletions

View File

@@ -97,8 +97,9 @@ public class ClipboardListener implements
return; return;
} }
if (!isUserSetupComplete()) { if (!isUserSetupComplete() // user should not access intents from this state
// just show a toast, user should not access intents from this state || clipData == null // shouldn't happen, but just in case
|| clipData.getItemCount() == 0) {
if (shouldShowToast(clipData)) { if (shouldShowToast(clipData)) {
mUiEventLogger.log(CLIPBOARD_TOAST_SHOWN, 0, clipSource); mUiEventLogger.log(CLIPBOARD_TOAST_SHOWN, 0, clipSource);
mClipboardToast.showCopiedToast(); mClipboardToast.showCopiedToast();

View File

@@ -19,19 +19,23 @@ import android.content.ClipData
import android.content.ClipDescription.EXTRA_IS_SENSITIVE import android.content.ClipDescription.EXTRA_IS_SENSITIVE
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import android.util.Size import android.util.Size
import android.view.textclassifier.TextLinks
import com.android.systemui.R import com.android.systemui.R
import java.io.IOException import java.io.IOException
data class ClipboardModel( data class ClipboardModel(
val clipData: ClipData?, val clipData: ClipData,
val source: String, val source: String,
val type: Type = Type.OTHER, val type: Type,
val item: ClipData.Item? = null, val text: CharSequence?,
val isSensitive: Boolean = false, val textLinks: TextLinks?,
val isRemote: Boolean = false, val uri: Uri?,
val isSensitive: Boolean,
val isRemote: Boolean,
) { ) {
private var _bitmap: Bitmap? = null private var _bitmap: Bitmap? = null
@@ -41,17 +45,16 @@ data class ClipboardModel(
} }
return source == other.source && return source == other.source &&
type == other.type && type == other.type &&
item?.text == other.item?.text && text == other.text &&
item?.uri == other.item?.uri && uri == other.uri &&
isSensitive == other.isSensitive isSensitive == other.isSensitive
} }
fun loadThumbnail(context: Context): Bitmap? { fun loadThumbnail(context: Context): Bitmap? {
if (_bitmap == null && type == Type.IMAGE && item?.uri != null) { if (_bitmap == null && type == Type.IMAGE && uri != null) {
try { try {
val size = context.resources.getDimensionPixelSize(R.dimen.overlay_x_scale) val size = context.resources.getDimensionPixelSize(R.dimen.overlay_x_scale)
_bitmap = _bitmap = context.contentResolver.loadThumbnail(uri, Size(size, size * 4), null)
context.contentResolver.loadThumbnail(item.uri, Size(size, size * 4), null)
} catch (e: IOException) { } catch (e: IOException) {
Log.e(TAG, "Thumbnail loading failed!", e) Log.e(TAG, "Thumbnail loading failed!", e)
} }
@@ -66,27 +69,34 @@ data class ClipboardModel(
fun fromClipData( fun fromClipData(
context: Context, context: Context,
utils: ClipboardOverlayUtils, utils: ClipboardOverlayUtils,
clipData: ClipData?, clipData: ClipData,
source: String source: String
): ClipboardModel { ): ClipboardModel {
if (clipData == null || clipData.itemCount == 0) {
return ClipboardModel(clipData, source)
}
val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false
val item = clipData.getItemAt(0)!! val item = clipData.getItemAt(0)!!
val type = getType(context, item) val type = getType(context, item)
val remote = utils.isRemoteCopy(context, clipData, source) val remote = utils.isRemoteCopy(context, clipData, source)
return ClipboardModel(clipData, source, type, item, sensitive, remote) return ClipboardModel(
clipData,
source,
type,
item.text,
item.textLinks,
item.uri,
sensitive,
remote
)
} }
private fun getType(context: Context, item: ClipData.Item): Type { private fun getType(context: Context, item: ClipData.Item): Type {
return if (!TextUtils.isEmpty(item.text)) { return if (!TextUtils.isEmpty(item.text)) {
Type.TEXT Type.TEXT
} else if ( } else if (item.uri != null) {
item.uri != null && if (context.contentResolver.getType(item.uri)?.startsWith("image") == true) {
context.contentResolver.getType(item.uri)?.startsWith("image") == true Type.IMAGE
) { } else {
Type.IMAGE Type.URI
}
} else { } else {
Type.OTHER Type.OTHER
} }
@@ -96,6 +106,7 @@ data class ClipboardModel(
enum class Type { enum class Type {
TEXT, TEXT,
IMAGE, IMAGE,
URI,
OTHER OTHER
} }
} }

View File

@@ -309,14 +309,14 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
if ((mFeatureFlags.isEnabled(CLIPBOARD_REMOTE_BEHAVIOR) && model.isRemote()) if ((mFeatureFlags.isEnabled(CLIPBOARD_REMOTE_BEHAVIOR) && model.isRemote())
|| DeviceConfig.getBoolean( || DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_SYSTEMUI, CLIPBOARD_OVERLAY_SHOW_ACTIONS, false)) { DeviceConfig.NAMESPACE_SYSTEMUI, CLIPBOARD_OVERLAY_SHOW_ACTIONS, false)) {
if (model.getItem().getTextLinks() != null) { if (model.getTextLinks() != null) {
classifyText(model); classifyText(model);
} }
} }
if (model.isSensitive()) { if (model.isSensitive()) {
mView.showTextPreview(mContext.getString(R.string.clipboard_asterisks), true); mView.showTextPreview(mContext.getString(R.string.clipboard_asterisks), true);
} else { } else {
mView.showTextPreview(model.getItem().getText(), false); mView.showTextPreview(model.getText(), false);
} }
mView.setEditAccessibilityAction(true); mView.setEditAccessibilityAction(true);
mOnPreviewTapped = this::editText; mOnPreviewTapped = this::editText;
@@ -326,12 +326,13 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
mView.showImagePreview( mView.showImagePreview(
model.isSensitive() ? null : model.loadThumbnail(mContext)); model.isSensitive() ? null : model.loadThumbnail(mContext));
mView.setEditAccessibilityAction(true); mView.setEditAccessibilityAction(true);
mOnPreviewTapped = () -> editImage(model.getItem().getUri()); mOnPreviewTapped = () -> editImage(model.getUri());
} else { } else {
// image loading failed // image loading failed
mView.showDefaultTextPreview(); mView.showDefaultTextPreview();
} }
break; break;
case URI:
case OTHER: case OTHER:
mView.showDefaultTextPreview(); mView.showDefaultTextPreview();
break; break;
@@ -371,8 +372,8 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
private void classifyText(ClipboardModel model) { private void classifyText(ClipboardModel model) {
mBgExecutor.execute(() -> { mBgExecutor.execute(() -> {
Optional<RemoteAction> remoteAction = Optional<RemoteAction> remoteAction = mClipboardUtils.getAction(
mClipboardUtils.getAction(model.getItem(), model.getSource()); model.getText(), model.getTextLinks(), model.getSource());
if (model.equals(mClipboardModel)) { if (model.equals(mClipboardModel)) {
remoteAction.ifPresent(action -> { remoteAction.ifPresent(action -> {
mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_ACTION_SHOWN); mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_ACTION_SHOWN);
@@ -419,10 +420,10 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
accessibilityAnnouncement = mContext.getString(R.string.clipboard_text_copied); accessibilityAnnouncement = mContext.getString(R.string.clipboard_text_copied);
} else if (clipData.getItemAt(0).getUri() != null) { } else if (clipData.getItemAt(0).getUri() != null) {
if (tryShowEditableImage(clipData.getItemAt(0).getUri(), isSensitive)) { if (tryShowEditableImage(clipData.getItemAt(0).getUri(), isSensitive)) {
mOnShareTapped = () -> shareContent(clipData);
mView.showShareChip();
accessibilityAnnouncement = mContext.getString(R.string.clipboard_image_copied); accessibilityAnnouncement = mContext.getString(R.string.clipboard_image_copied);
} }
mOnShareTapped = () -> shareContent(clipData);
mView.showShareChip();
} else { } else {
mView.showDefaultTextPreview(); mView.showDefaultTextPreview();
} }

View File

@@ -65,6 +65,23 @@ class ClipboardOverlayUtils {
return false; return false;
} }
public Optional<RemoteAction> getAction(CharSequence text, TextLinks textLinks, String source) {
return getActions(text, textLinks).stream().filter(remoteAction -> {
ComponentName component = remoteAction.getActionIntent().getIntent().getComponent();
return component != null && !TextUtils.equals(source, component.getPackageName());
}).findFirst();
}
private ArrayList<RemoteAction> getActions(CharSequence text, TextLinks textLinks) {
ArrayList<RemoteAction> actions = new ArrayList<>();
for (TextLinks.TextLink link : textLinks.getLinks()) {
TextClassification classification = mTextClassifier.classifyText(
text, link.getStart(), link.getEnd(), null);
actions.addAll(classification.getActions());
}
return actions;
}
public Optional<RemoteAction> getAction(ClipData.Item item, String source) { public Optional<RemoteAction> getAction(ClipData.Item item, String source) {
return getActions(item).stream().filter(remoteAction -> { return getActions(item).stream().filter(remoteAction -> {
ComponentName component = remoteAction.getActionIntent().getIntent().getComponent(); ComponentName component = remoteAction.getActionIntent().getIntent().getComponent();

View File

@@ -51,6 +51,8 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.Spy; import org.mockito.Spy;
import java.util.ArrayList;
import javax.inject.Provider; import javax.inject.Provider;
@SmallTest @SmallTest
@@ -194,6 +196,33 @@ public class ClipboardListenerTest extends SysuiTestCase {
verifyZeroInteractions(mOverlayControllerProvider); verifyZeroInteractions(mOverlayControllerProvider);
} }
@Test
public void test_nullClipData_showsNothing() {
when(mClipboardManager.getPrimaryClip()).thenReturn(null);
mClipboardListener.start();
mClipboardListener.onPrimaryClipChanged();
verifyZeroInteractions(mUiEventLogger);
verifyZeroInteractions(mClipboardToast);
verifyZeroInteractions(mOverlayControllerProvider);
}
@Test
public void test_emptyClipData_showsToast() {
ClipDescription description = new ClipDescription("Test", new String[0]);
ClipData noItems = new ClipData(description, new ArrayList<>());
when(mClipboardManager.getPrimaryClip()).thenReturn(noItems);
mClipboardListener.start();
mClipboardListener.onPrimaryClipChanged();
verify(mUiEventLogger, times(1)).log(
ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN, 0, mSampleSource);
verify(mClipboardToast, times(1)).showCopiedToast();
verifyZeroInteractions(mOverlayControllerProvider);
}
@Test @Test
public void test_minimizedLayoutFlagOff_usesLegacy() { public void test_minimizedLayoutFlagOff_usesLegacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false); mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);

View File

@@ -52,18 +52,6 @@ class ClipboardModelTest : SysuiTestCase() {
mSampleClipData = ClipData("Test", arrayOf("text/plain"), ClipData.Item("Test Item")) mSampleClipData = ClipData("Test", arrayOf("text/plain"), ClipData.Item("Test Item"))
} }
@Test
fun test_nullClipData() {
val model = ClipboardModel.fromClipData(mContext, mClipboardUtils, null, "test source")
assertNull(model.clipData)
assertEquals("test source", model.source)
assertEquals(ClipboardModel.Type.OTHER, model.type)
assertNull(model.item)
assertFalse(model.isSensitive)
assertFalse(model.isRemote)
assertNull(model.loadThumbnail(mContext))
}
@Test @Test
fun test_textClipData() { fun test_textClipData() {
val source = "test source" val source = "test source"
@@ -71,7 +59,9 @@ class ClipboardModelTest : SysuiTestCase() {
assertEquals(mSampleClipData, model.clipData) assertEquals(mSampleClipData, model.clipData)
assertEquals(source, model.source) assertEquals(source, model.source)
assertEquals(ClipboardModel.Type.TEXT, model.type) assertEquals(ClipboardModel.Type.TEXT, model.type)
assertEquals(mSampleClipData.getItemAt(0), model.item) assertEquals(mSampleClipData.getItemAt(0).text, model.text)
assertEquals(mSampleClipData.getItemAt(0).textLinks, model.textLinks)
assertEquals(mSampleClipData.getItemAt(0).uri, model.uri)
assertFalse(model.isSensitive) assertFalse(model.isSensitive)
assertFalse(model.isRemote) assertFalse(model.isRemote)
assertNull(model.loadThumbnail(mContext)) assertNull(model.loadThumbnail(mContext))
@@ -84,7 +74,7 @@ class ClipboardModelTest : SysuiTestCase() {
b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
description.extras = b description.extras = b
val data = ClipData(description, mSampleClipData.getItemAt(0)) val data = ClipData(description, mSampleClipData.getItemAt(0))
val (_, _, _, _, sensitive) = val (_, _, _, _, _, _, sensitive) =
ClipboardModel.fromClipData(mContext, mClipboardUtils, data, "") ClipboardModel.fromClipData(mContext, mClipboardUtils, data, "")
assertTrue(sensitive) assertTrue(sensitive)
} }

View File

@@ -138,30 +138,36 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
mOverlayController.hideImmediate(); mOverlayController.hideImmediate();
} }
@Test
public void test_setClipData_nullData_legacy() {
ClipData clipData = null;
mOverlayController.setClipDataLegacy(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(0)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation();
}
@Test @Test
public void test_setClipData_invalidImageData_legacy() { public void test_setClipData_invalidImageData_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
ClipData clipData = new ClipData("", new String[]{"image/png"}, ClipData clipData = new ClipData("", new String[]{"image/png"},
new ClipData.Item(Uri.parse(""))); new ClipData.Item(Uri.parse("")));
mOverlayController.setClipDataLegacy(clipData, ""); mOverlayController.setClipDataLegacy(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview(); verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(0)).showShareChip(); verify(mClipboardOverlayView, times(1)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation();
}
@Test
public void test_setClipData_nonImageUri_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
ClipData clipData = new ClipData("", new String[]{"resource/png"},
new ClipData.Item(Uri.parse("")));
mOverlayController.setClipDataLegacy(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(1)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation(); verify(mClipboardOverlayView, times(1)).getEnterAnimation();
} }
@Test @Test
public void test_setClipData_textData_legacy() { public void test_setClipData_textData_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mOverlayController.setClipDataLegacy(mSampleClipData, ""); mOverlayController.setClipDataLegacy(mSampleClipData, "");
verify(mClipboardOverlayView, times(1)).showTextPreview("Test Item", false); verify(mClipboardOverlayView, times(1)).showTextPreview("Test Item", false);
@@ -171,6 +177,8 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_setClipData_sensitiveTextData_legacy() { public void test_setClipData_sensitiveTextData_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
ClipDescription description = mSampleClipData.getDescription(); ClipDescription description = mSampleClipData.getDescription();
PersistableBundle b = new PersistableBundle(); PersistableBundle b = new PersistableBundle();
b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true); b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
@@ -185,6 +193,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_setClipData_repeatedCalls_legacy() { public void test_setClipData_repeatedCalls_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
when(mAnimator.isRunning()).thenReturn(true); when(mAnimator.isRunning()).thenReturn(true);
mOverlayController.setClipDataLegacy(mSampleClipData, ""); mOverlayController.setClipDataLegacy(mSampleClipData, "");
@@ -195,6 +204,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_viewCallbacks_onShareTapped_legacy() { public void test_viewCallbacks_onShareTapped_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mOverlayController.setClipDataLegacy(mSampleClipData, ""); mOverlayController.setClipDataLegacy(mSampleClipData, "");
mCallbacks.onShareButtonTapped(); mCallbacks.onShareButtonTapped();
@@ -205,6 +215,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_viewCallbacks_onDismissTapped_legacy() { public void test_viewCallbacks_onDismissTapped_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mOverlayController.setClipDataLegacy(mSampleClipData, ""); mOverlayController.setClipDataLegacy(mSampleClipData, "");
mCallbacks.onDismissButtonTapped(); mCallbacks.onDismissButtonTapped();
@@ -215,6 +226,8 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_multipleDismissals_dismissesOnce_legacy() { public void test_multipleDismissals_dismissesOnce_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mCallbacks.onSwipeDismissInitiated(mAnimator); mCallbacks.onSwipeDismissInitiated(mAnimator);
mCallbacks.onDismissButtonTapped(); mCallbacks.onDismissButtonTapped();
mCallbacks.onSwipeDismissInitiated(mAnimator); mCallbacks.onSwipeDismissInitiated(mAnimator);
@@ -226,6 +239,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_remoteCopy_withFlagOn_legacy() { public void test_remoteCopy_withFlagOn_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true); mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true);
when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true); when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true);
@@ -236,6 +250,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_remoteCopy_withFlagOff_legacy() { public void test_remoteCopy_withFlagOff_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true); when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true);
mOverlayController.setClipDataLegacy(mSampleClipData, ""); mOverlayController.setClipDataLegacy(mSampleClipData, "");
@@ -245,6 +260,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_nonRemoteCopy_legacy() { public void test_nonRemoteCopy_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true); mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true);
when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(false); when(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(false);
@@ -255,6 +271,8 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_logsUseLastClipSource_legacy() { public void test_logsUseLastClipSource_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
mOverlayController.setClipDataLegacy(mSampleClipData, "first.package"); mOverlayController.setClipDataLegacy(mSampleClipData, "first.package");
mCallbacks.onDismissButtonTapped(); mCallbacks.onDismissButtonTapped();
mOverlayController.setClipDataLegacy(mSampleClipData, "second.package"); mOverlayController.setClipDataLegacy(mSampleClipData, "second.package");
@@ -267,6 +285,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
@Test @Test
public void test_logOnClipboardActionsShown_legacy() { public void test_logOnClipboardActionsShown_legacy() {
mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);
ClipData.Item item = mSampleClipData.getItemAt(0); ClipData.Item item = mSampleClipData.getItemAt(0);
item.setTextLinks(Mockito.mock(TextLinks.class)); item.setTextLinks(Mockito.mock(TextLinks.class));
mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true); mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true);
@@ -291,16 +310,6 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
} }
// start of refactored setClipData tests // start of refactored setClipData tests
@Test
public void test_setClipData_nullData() {
ClipData clipData = null;
mOverlayController.setClipData(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(0)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation();
}
@Test @Test
public void test_setClipData_invalidImageData() { public void test_setClipData_invalidImageData() {
ClipData clipData = new ClipData("", new String[]{"image/png"}, ClipData clipData = new ClipData("", new String[]{"image/png"},
@@ -309,7 +318,19 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
mOverlayController.setClipData(clipData, ""); mOverlayController.setClipData(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview(); verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(0)).showShareChip(); verify(mClipboardOverlayView, times(1)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation();
}
@Test
public void test_setClipData_nonImageUri() {
ClipData clipData = new ClipData("", new String[]{"resource/png"},
new ClipData.Item(Uri.parse("")));
mOverlayController.setClipData(clipData, "");
verify(mClipboardOverlayView, times(1)).showDefaultTextPreview();
verify(mClipboardOverlayView, times(1)).showShareChip();
verify(mClipboardOverlayView, times(1)).getEnterAnimation(); verify(mClipboardOverlayView, times(1)).getEnterAnimation();
} }
@@ -425,7 +446,7 @@ public class ClipboardOverlayControllerTest extends SysuiTestCase {
mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true); mFeatureFlags.set(CLIPBOARD_REMOTE_BEHAVIOR, true);
when(mClipboardUtils.isRemoteCopy(any(Context.class), any(ClipData.class), anyString())) when(mClipboardUtils.isRemoteCopy(any(Context.class), any(ClipData.class), anyString()))
.thenReturn(true); .thenReturn(true);
when(mClipboardUtils.getAction(any(ClipData.Item.class), anyString())) when(mClipboardUtils.getAction(any(CharSequence.class), any(TextLinks.class), anyString()))
.thenReturn(Optional.of(Mockito.mock(RemoteAction.class))); .thenReturn(Optional.of(Mockito.mock(RemoteAction.class)));
when(mClipboardOverlayView.post(any(Runnable.class))).thenAnswer(new Answer<Object>() { when(mClipboardOverlayView.post(any(Runnable.class))).thenAnswer(new Answer<Object>() {
@Override @Override