FreeRDP
Loading...
Searching...
No Matches
ClipboardManagerProxy.java
1/*
2 Android Clipboard Manager Proxy
3
4 Copyright 2013 Thincast Technologies GmbH
5 Copyright 2013 Martin Fleisz <martin.fleisz@thincast.com>
6 Copyright 2026 Ibrahim Sevinc <ibrahim.sevinc.mail@gmail.com>
7
8 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
9 If a copy of the MPL was not distributed with this file, You can obtain one at
10 http://mozilla.org/MPL/2.0/.
11 */
12
13package com.freerdp.freerdpcore.utils;
14
15import android.content.ClipData;
16import android.content.ClipboardManager;
17import android.content.Context;
18import android.net.Uri;
19
20import java.io.ByteArrayOutputStream;
21import java.io.IOException;
22import java.io.InputStream;
23
24public abstract class ClipboardManagerProxy
25{
26 public static ClipboardManagerProxy getClipboardManager(Context ctx)
27 {
28 return new HCClipboardManager(ctx);
29 }
30
31 public abstract void setClipboardData(String data);
32
33 public abstract void setClipboardImage(byte[] pngData);
34
35 public abstract void addClipboardChangedListener(OnClipboardChangedListener listener);
36
37 public abstract void removeClipboardboardChangedListener(OnClipboardChangedListener listener);
38
39 public abstract void getPrimaryClipManually();
40
42 {
43 void onClipboardChanged(String data);
44
45 void onClipboardImageChanged(byte[] data, String mimeType);
46 }
47
48 private static class HCClipboardManager
49 extends ClipboardManagerProxy implements ClipboardManager.OnPrimaryClipChangedListener
50 {
51 private final Context mContext;
52 private final ClipboardManager mClipboardManager;
53 private OnClipboardChangedListener mListener;
54
55 public HCClipboardManager(Context ctx)
56 {
57 mContext = ctx;
58 mClipboardManager = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
59 }
60
61 @Override public void setClipboardData(String data)
62 {
63 mClipboardManager.setPrimaryClip(
64 ClipData.newPlainText("rdp-clipboard", data == null ? "" : data));
65 }
66
67 @Override public void setClipboardImage(byte[] pngData)
68 {
69 ClipboardImageProvider.setImageData(pngData);
70 ClipData clip = new ClipData("rdp-clipboard", new String[] { "image/png" },
71 new ClipData.Item(ClipboardImageProvider.CONTENT_URI));
72 mClipboardManager.setPrimaryClip(clip);
73 }
74
75 @Override public void onPrimaryClipChanged()
76 {
77 ClipData clip = mClipboardManager.getPrimaryClip();
78 if (clip == null || clip.getItemCount() == 0)
79 return;
80
81 ClipData.Item item = clip.getItemAt(0);
82
83 CharSequence cs = item.getText();
84 if (cs != null)
85 {
86 if (mListener != null)
87 mListener.onClipboardChanged(cs.toString());
88 return;
89 }
90
91 Uri uri = item.getUri();
92 if (uri != null)
93 {
94 String mimeType = mContext.getContentResolver().getType(uri);
95 if (mimeType != null && mimeType.startsWith("image/"))
96 {
97 try (InputStream is = mContext.getContentResolver().openInputStream(uri))
98 {
99 if (is != null)
100 {
101 ByteArrayOutputStream baos = new ByteArrayOutputStream();
102 byte[] buf = new byte[8192];
103 int n;
104 while ((n = is.read(buf)) != -1)
105 baos.write(buf, 0, n);
106 if (mListener != null)
107 mListener.onClipboardImageChanged(baos.toByteArray(), mimeType);
108 }
109 }
110 catch (IOException e)
111 {
112 // not an accessible image
113 }
114 }
115 }
116 }
117
118 @Override public void addClipboardChangedListener(OnClipboardChangedListener listener)
119 {
120 mListener = listener;
121 mClipboardManager.addPrimaryClipChangedListener(this);
122 }
123
124 @Override
125 public void removeClipboardboardChangedListener(OnClipboardChangedListener listener)
126 {
127 mListener = null;
128 mClipboardManager.removePrimaryClipChangedListener(this);
129 }
130
131 @Override public void getPrimaryClipManually()
132 {
133 onPrimaryClipChanged();
134 }
135 }
136}