diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-08-04 17:48:03 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-08-05 12:28:20 -0700 |
commit | 9f53119b72e6da865bcd53173d3dacd1eba01aee (patch) | |
tree | 650a4bf357a3e6ca02436773df2dd1de0d138800 /services/java/com/android/server/ClipboardService.java | |
parent | 2184abfead330a209a9c15eb80d214d0b5985ebb (diff) |
First pass at a new clipboard API.
ClipboardManager was in android.text(!!) so it needed to be moved
up to android.content to have access to the richer data types we
now need.
ClippedData is the data representation. Still needs a lot of
fleshing out to allow holding more than one data type at a time
and perhaps conversions between them. (MIME-oriented interrogation
and conversion will be done through ContentProvider, which needs
to grow an ability to report multiple MIME types and accept a
desired MIME type when a stream is being opened.)
Change-Id: Ifa51bedcd084a677813b255d171804e8496b0cb5
Diffstat (limited to 'services/java/com/android/server/ClipboardService.java')
-rw-r--r-- | services/java/com/android/server/ClipboardService.java | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java index aa8cdedcc66b..4e4fc0cbeb58 100644 --- a/services/java/com/android/server/ClipboardService.java +++ b/services/java/com/android/server/ClipboardService.java @@ -16,42 +16,77 @@ package com.android.server; -import android.text.IClipboard; +import android.content.ClippedData; +import android.content.IClipboard; +import android.content.IOnPrimaryClipChangedListener; import android.content.Context; +import android.os.RemoteCallbackList; +import android.os.RemoteException; /** * Implementation of the clipboard for copy and paste. */ public class ClipboardService extends IClipboard.Stub { - private CharSequence mClipboard = ""; + private ClippedData mPrimaryClip; + private final RemoteCallbackList<IOnPrimaryClipChangedListener> mPrimaryClipListeners + = new RemoteCallbackList<IOnPrimaryClipChangedListener>(); /** * Instantiates the clipboard. */ public ClipboardService(Context context) { } - // javadoc from interface - public void setClipboardText(CharSequence text) { + public void setPrimaryClip(ClippedData clip) { synchronized (this) { - if (text == null) { - text = ""; + if (clip != null && clip.getItemCount() <= 0) { + throw new IllegalArgumentException("No items"); } + mPrimaryClip = clip; + final int n = mPrimaryClipListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + try { + mPrimaryClipListeners.getBroadcastItem(i).dispatchPrimaryClipChanged(); + } catch (RemoteException e) { + + // The RemoteCallbackList will take care of removing + // the dead object for us. + } + } + mPrimaryClipListeners.finishBroadcast(); + } + } - mClipboard = text; + public ClippedData getPrimaryClip() { + synchronized (this) { + return mPrimaryClip; + } + } + + public boolean hasPrimaryClip() { + synchronized (this) { + return mPrimaryClip != null; } } - // javadoc from interface - public CharSequence getClipboardText() { + public void addPrimaryClipChangedListener(IOnPrimaryClipChangedListener listener) { synchronized (this) { - return mClipboard; + mPrimaryClipListeners.register(listener); + } + } + + public void removePrimaryClipChangedListener(IOnPrimaryClipChangedListener listener) { + synchronized (this) { + mPrimaryClipListeners.unregister(listener); } } - // javadoc from interface public boolean hasClipboardText() { synchronized (this) { - return mClipboard.length() > 0; + if (mPrimaryClip != null) { + CharSequence text = mPrimaryClip.getItem(0).getText(); + return text != null && text.length() > 0; + } + return false; } } } |