From 58926243e0b4b760f87e86a15915c0b2a707f3bb Mon Sep 17 00:00:00 2001 From: Nicolas Prevot Date: Thu, 14 Jul 2016 19:11:10 +0100 Subject: [PATCH] Don't append userIds for the current user's clipData uris. If the primary user has a managed profile: When setting the clipboard in the primary user: The uris of the primary user's clipboard must not have an embedded userId. BUG:28572936 Change-Id: I1eb505c4518cc16a6513b950f6c2b1232a22426d --- core/java/android/content/ClipData.java | 13 +++++++++++++ .../android/server/clipboard/ClipboardService.java | 8 ++++++++ 2 files changed, 21 insertions(+) diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java index c365e9ee95494..d9816a64db3a7 100644 --- a/core/java/android/content/ClipData.java +++ b/core/java/android/content/ClipData.java @@ -191,6 +191,14 @@ public class ClipData implements Parcelable { final Intent mIntent; Uri mUri; + /** @hide */ + public Item(Item other) { + mText = other.mText; + mHtmlText = other.mHtmlText; + mIntent = other.mIntent; + mUri = other.mUri; + } + /** * Create an Item consisting of a single block of (possibly styled) text. */ @@ -816,6 +824,11 @@ public class ClipData implements Parcelable { return mItems.get(index); } + /** @hide */ + public void setItemAt(int index, Item item) { + mItems.set(index, item); + } + /** * Prepare this {@link ClipData} to leave an app process. * diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index 1c2684642c53c..66aa40325a4f5 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -188,6 +188,14 @@ public class ClipboardService extends IClipboard.Stub { if (!canCopy) { clip = null; } else { + // We want to fix the uris of the related user's clip without changing the + // uris of the current user's clip. + // So, copy the ClipData, and then copy all the items, so that nothing + // is shared in memmory. + clip = new ClipData(clip); + for (int i = clip.getItemCount() - 1; i >= 0; i--) { + clip.setItemAt(i, new ClipData.Item(clip.getItemAt(i))); + } clip.fixUrisLight(userId); } for (int i = 0; i < size; i++) {