1 package com.freerdp.freerdpcore.utils;
2 
3 import android.annotation.TargetApi;
4 import android.content.ClipData;
5 import android.content.ClipboardManager;
6 import android.content.Context;
7 import android.os.Build.VERSION;
8 import android.os.Build.VERSION_CODES;
9 
10 public abstract class ClipboardManagerProxy
11 {
12 
getClipboardManager(Context ctx)13 	public static ClipboardManagerProxy getClipboardManager(Context ctx)
14 	{
15 		if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB)
16 			return new PreHCClipboardManager(ctx);
17 		else
18 			return new HCClipboardManager(ctx);
19 	}
20 
setClipboardData(String data)21 	public abstract void setClipboardData(String data);
22 
addClipboardChangedListener(OnClipboardChangedListener listener)23 	public abstract void addClipboardChangedListener(OnClipboardChangedListener listener);
24 
removeClipboardboardChangedListener(OnClipboardChangedListener listener)25 	public abstract void removeClipboardboardChangedListener(OnClipboardChangedListener listener);
26 
27 	public static interface OnClipboardChangedListener {
onClipboardChanged(String data)28 		void onClipboardChanged(String data);
29 	}
30 
31 	private static class PreHCClipboardManager extends ClipboardManagerProxy
32 	{
33 
PreHCClipboardManager(Context ctx)34 		public PreHCClipboardManager(Context ctx)
35 		{
36 		}
37 
setClipboardData(String data)38 		@Override public void setClipboardData(String data)
39 		{
40 		}
41 
addClipboardChangedListener(OnClipboardChangedListener listener)42 		@Override public void addClipboardChangedListener(OnClipboardChangedListener listener)
43 		{
44 		}
45 
46 		@Override
removeClipboardboardChangedListener(OnClipboardChangedListener listener)47 		public void removeClipboardboardChangedListener(OnClipboardChangedListener listener)
48 		{
49 		}
50 	}
51 
52 	@TargetApi(11)
53 	private static class HCClipboardManager
54 	    extends ClipboardManagerProxy implements ClipboardManager.OnPrimaryClipChangedListener
55 	{
56 		private ClipboardManager mClipboardManager;
57 		private OnClipboardChangedListener mListener;
58 
HCClipboardManager(Context ctx)59 		public HCClipboardManager(Context ctx)
60 		{
61 			mClipboardManager = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
62 		}
63 
setClipboardData(String data)64 		@Override public void setClipboardData(String data)
65 		{
66 			mClipboardManager.setPrimaryClip(
67 			    ClipData.newPlainText("rdp-clipboard", data == null ? "" : data));
68 		}
69 
onPrimaryClipChanged()70 		@Override public void onPrimaryClipChanged()
71 		{
72 			ClipData clip = mClipboardManager.getPrimaryClip();
73 			String data = null;
74 
75 			if (clip != null && clip.getItemCount() > 0)
76 			{
77 				CharSequence cs = clip.getItemAt(0).getText();
78 				if (cs != null)
79 					data = cs.toString();
80 			}
81 			if (mListener != null)
82 			{
83 				mListener.onClipboardChanged(data);
84 			}
85 		}
86 
addClipboardChangedListener(OnClipboardChangedListener listener)87 		@Override public void addClipboardChangedListener(OnClipboardChangedListener listener)
88 		{
89 			mListener = listener;
90 			mClipboardManager.addPrimaryClipChangedListener(this);
91 		}
92 
93 		@Override
removeClipboardboardChangedListener(OnClipboardChangedListener listener)94 		public void removeClipboardboardChangedListener(OnClipboardChangedListener listener)
95 		{
96 			mListener = null;
97 			mClipboardManager.removePrimaryClipChangedListener(this);
98 		}
99 	}
100 }
101