Loading services/core/java/com/android/server/clipboard/ClipboardService.java +43 −24 Original line number Diff line number Diff line Loading @@ -61,7 +61,6 @@ import android.widget.Toast; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemService.TargetUser; import com.android.server.UiThread; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.uri.UriGrantsManagerInternal; Loading Loading @@ -207,7 +206,7 @@ public class ClipboardService extends SystemService { new ClipData.Item(contents)); synchronized(mClipboards) { setPrimaryClipInternal(getClipboard(0), clip, android.os.Process.SYSTEM_UID); android.os.Process.SYSTEM_UID, null); } } }); Loading Loading @@ -247,6 +246,8 @@ public class ClipboardService extends SystemService { ClipData primaryClip; /** UID that set {@link #primaryClip}. */ int primaryClipUid = android.os.Process.NOBODY_UID; /** Application label of the app that set {@link #primaryClip}. */ CharSequence mPrimaryClipAppLabel; final HashSet<String> activePermissionOwners = new HashSet<String>(); Loading Loading @@ -365,7 +366,7 @@ public class ClipboardService extends SystemService { return; } checkDataOwnerLocked(clip, intendingUid); setPrimaryClipInternal(clip, intendingUid); setPrimaryClipInternal(clip, intendingUid, callingPackage); } } Loading @@ -378,7 +379,7 @@ public class ClipboardService extends SystemService { intendingUid, intendingUserId)) { return; } setPrimaryClipInternal(null, intendingUid); setPrimaryClipInternal(null, intendingUid, callingPackage); } } Loading Loading @@ -509,6 +510,11 @@ public class ClipboardService extends SystemService { } void setPrimaryClipInternal(@Nullable ClipData clip, int uid) { setPrimaryClipInternal(clip, uid, null); } private void setPrimaryClipInternal( @Nullable ClipData clip, int uid, @Nullable String sourcePackage) { // Push clipboard to host, if any if (mHostClipboardMonitor != null) { if (clip == null) { Loading @@ -522,9 +528,20 @@ public class ClipboardService extends SystemService { } } // Retrieve the app label of the source of the clip data CharSequence sourceAppLabel = null; if (clip != null && sourcePackage != null) { try { sourceAppLabel = mPm.getApplicationLabel(mPm.getApplicationInfo(sourcePackage, 0)); } catch (PackageManager.NameNotFoundException e) { // leave label as null } } // Update this user final int userId = UserHandle.getUserId(uid); setPrimaryClipInternal(getClipboard(userId), clip, uid); setPrimaryClipInternal(getClipboard(userId), clip, uid, sourceAppLabel); // Update related users List<UserInfo> related = getRelatedProfiles(userId); Loading Loading @@ -558,7 +575,8 @@ public class ClipboardService extends SystemService { final boolean canCopyIntoProfile = !hasRestriction( UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, id); if (canCopyIntoProfile) { setPrimaryClipInternal(getClipboard(id), clip, uid); setPrimaryClipInternal( getClipboard(id), clip, uid, sourceAppLabel); } } } Loading @@ -568,6 +586,11 @@ public class ClipboardService extends SystemService { void setPrimaryClipInternal(PerUserClipboard clipboard, @Nullable ClipData clip, int uid) { setPrimaryClipInternal(clipboard, clip, uid, null); } private void setPrimaryClipInternal(PerUserClipboard clipboard, @Nullable ClipData clip, int uid, @Nullable CharSequence sourceAppLabel) { revokeUris(clipboard); clipboard.activePermissionOwners.clear(); if (clip == null && clipboard.primaryClip == null) { Loading @@ -576,8 +599,10 @@ public class ClipboardService extends SystemService { clipboard.primaryClip = clip; if (clip != null) { clipboard.primaryClipUid = uid; clipboard.mPrimaryClipAppLabel = sourceAppLabel; } else { clipboard.primaryClipUid = android.os.Process.NOBODY_UID; clipboard.mPrimaryClipAppLabel = null; } if (clip != null) { final ClipDescription description = clip.getDescription(); Loading Loading @@ -861,29 +886,23 @@ public class ClipboardService extends SystemService { && mAutofillInternal.isAugmentedAutofillServiceForUser(uid, userId)) { return; } // Load the labels for the calling app and the app that set the clipboard content. final long ident = Binder.clearCallingIdentity(); try { final IPackageManager pm = AppGlobals.getPackageManager(); CharSequence callingAppLabel = mPm.getApplicationLabel( mPm.getApplicationInfo(callingPackage, 0)); String message; final CharSequence callingLabel = mPm.getApplicationLabel( pm.getApplicationInfo(callingPackage, 0, userId)); final String[] packagesForUid = pm.getPackagesForUid(clipboard.primaryClipUid); if (packagesForUid != null && packagesForUid.length > 0) { final CharSequence clipLabel = mPm.getApplicationLabel( pm.getApplicationInfo(packagesForUid[0], 0, UserHandle.getUserId(clipboard.primaryClipUid))); message = callingLabel + " pasted from " + clipLabel; if (clipboard.mPrimaryClipAppLabel != null) { message = callingAppLabel + " pasted from " + clipboard.mPrimaryClipAppLabel; } else { message = callingLabel + " pasted from clipboard"; message = callingAppLabel + " pasted from clipboard"; } Slog.i(TAG, message); Toast.makeText(getContext(), UiThread.get().getLooper(), message, Toast.LENGTH_SHORT) .show(); } catch (RemoteException e) { /* ignore */ } finally { Binder.restoreCallingIdentity(ident); Binder.withCleanCallingIdentity(() -> Toast.makeText(getContext(), UiThread.get().getLooper(), message, Toast.LENGTH_SHORT) .show()); } catch (PackageManager.NameNotFoundException e) { // do nothing } } } Loading
services/core/java/com/android/server/clipboard/ClipboardService.java +43 −24 Original line number Diff line number Diff line Loading @@ -61,7 +61,6 @@ import android.widget.Toast; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemService.TargetUser; import com.android.server.UiThread; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.uri.UriGrantsManagerInternal; Loading Loading @@ -207,7 +206,7 @@ public class ClipboardService extends SystemService { new ClipData.Item(contents)); synchronized(mClipboards) { setPrimaryClipInternal(getClipboard(0), clip, android.os.Process.SYSTEM_UID); android.os.Process.SYSTEM_UID, null); } } }); Loading Loading @@ -247,6 +246,8 @@ public class ClipboardService extends SystemService { ClipData primaryClip; /** UID that set {@link #primaryClip}. */ int primaryClipUid = android.os.Process.NOBODY_UID; /** Application label of the app that set {@link #primaryClip}. */ CharSequence mPrimaryClipAppLabel; final HashSet<String> activePermissionOwners = new HashSet<String>(); Loading Loading @@ -365,7 +366,7 @@ public class ClipboardService extends SystemService { return; } checkDataOwnerLocked(clip, intendingUid); setPrimaryClipInternal(clip, intendingUid); setPrimaryClipInternal(clip, intendingUid, callingPackage); } } Loading @@ -378,7 +379,7 @@ public class ClipboardService extends SystemService { intendingUid, intendingUserId)) { return; } setPrimaryClipInternal(null, intendingUid); setPrimaryClipInternal(null, intendingUid, callingPackage); } } Loading Loading @@ -509,6 +510,11 @@ public class ClipboardService extends SystemService { } void setPrimaryClipInternal(@Nullable ClipData clip, int uid) { setPrimaryClipInternal(clip, uid, null); } private void setPrimaryClipInternal( @Nullable ClipData clip, int uid, @Nullable String sourcePackage) { // Push clipboard to host, if any if (mHostClipboardMonitor != null) { if (clip == null) { Loading @@ -522,9 +528,20 @@ public class ClipboardService extends SystemService { } } // Retrieve the app label of the source of the clip data CharSequence sourceAppLabel = null; if (clip != null && sourcePackage != null) { try { sourceAppLabel = mPm.getApplicationLabel(mPm.getApplicationInfo(sourcePackage, 0)); } catch (PackageManager.NameNotFoundException e) { // leave label as null } } // Update this user final int userId = UserHandle.getUserId(uid); setPrimaryClipInternal(getClipboard(userId), clip, uid); setPrimaryClipInternal(getClipboard(userId), clip, uid, sourceAppLabel); // Update related users List<UserInfo> related = getRelatedProfiles(userId); Loading Loading @@ -558,7 +575,8 @@ public class ClipboardService extends SystemService { final boolean canCopyIntoProfile = !hasRestriction( UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, id); if (canCopyIntoProfile) { setPrimaryClipInternal(getClipboard(id), clip, uid); setPrimaryClipInternal( getClipboard(id), clip, uid, sourceAppLabel); } } } Loading @@ -568,6 +586,11 @@ public class ClipboardService extends SystemService { void setPrimaryClipInternal(PerUserClipboard clipboard, @Nullable ClipData clip, int uid) { setPrimaryClipInternal(clipboard, clip, uid, null); } private void setPrimaryClipInternal(PerUserClipboard clipboard, @Nullable ClipData clip, int uid, @Nullable CharSequence sourceAppLabel) { revokeUris(clipboard); clipboard.activePermissionOwners.clear(); if (clip == null && clipboard.primaryClip == null) { Loading @@ -576,8 +599,10 @@ public class ClipboardService extends SystemService { clipboard.primaryClip = clip; if (clip != null) { clipboard.primaryClipUid = uid; clipboard.mPrimaryClipAppLabel = sourceAppLabel; } else { clipboard.primaryClipUid = android.os.Process.NOBODY_UID; clipboard.mPrimaryClipAppLabel = null; } if (clip != null) { final ClipDescription description = clip.getDescription(); Loading Loading @@ -861,29 +886,23 @@ public class ClipboardService extends SystemService { && mAutofillInternal.isAugmentedAutofillServiceForUser(uid, userId)) { return; } // Load the labels for the calling app and the app that set the clipboard content. final long ident = Binder.clearCallingIdentity(); try { final IPackageManager pm = AppGlobals.getPackageManager(); CharSequence callingAppLabel = mPm.getApplicationLabel( mPm.getApplicationInfo(callingPackage, 0)); String message; final CharSequence callingLabel = mPm.getApplicationLabel( pm.getApplicationInfo(callingPackage, 0, userId)); final String[] packagesForUid = pm.getPackagesForUid(clipboard.primaryClipUid); if (packagesForUid != null && packagesForUid.length > 0) { final CharSequence clipLabel = mPm.getApplicationLabel( pm.getApplicationInfo(packagesForUid[0], 0, UserHandle.getUserId(clipboard.primaryClipUid))); message = callingLabel + " pasted from " + clipLabel; if (clipboard.mPrimaryClipAppLabel != null) { message = callingAppLabel + " pasted from " + clipboard.mPrimaryClipAppLabel; } else { message = callingLabel + " pasted from clipboard"; message = callingAppLabel + " pasted from clipboard"; } Slog.i(TAG, message); Toast.makeText(getContext(), UiThread.get().getLooper(), message, Toast.LENGTH_SHORT) .show(); } catch (RemoteException e) { /* ignore */ } finally { Binder.restoreCallingIdentity(ident); Binder.withCleanCallingIdentity(() -> Toast.makeText(getContext(), UiThread.get().getLooper(), message, Toast.LENGTH_SHORT) .show()); } catch (PackageManager.NameNotFoundException e) { // do nothing } } }