Set host's clipboard in a separate thread
It is not recommended to do IO in the UI thread. Bug: 219611030 Bug: 232284244 Test: boot AOSP, check if clipboard works Signed-off-by: Roman Kiryanov <rkir@google.com> Change-Id: Iaf445ae3e6e009b86ccf4d1783dffeebc165bb62 Merged-In: Iaf445ae3e6e009b86ccf4d1783dffeebc165bb62
This commit is contained in:
@@ -54,8 +54,8 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
|
|||||||
return bits;
|
return bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPipeOpened() {
|
private synchronized FileDescriptor getPipeFD() {
|
||||||
return mPipe != null;
|
return mPipe;
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized boolean openPipe() {
|
private synchronized boolean openPipe() {
|
||||||
@@ -107,14 +107,16 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendMessage(final byte[] msg) throws ErrnoException, InterruptedIOException {
|
private static void sendMessage(
|
||||||
|
final FileDescriptor fd,
|
||||||
|
final byte[] msg) throws ErrnoException, InterruptedIOException {
|
||||||
final byte[] lengthBits = new byte[4];
|
final byte[] lengthBits = new byte[4];
|
||||||
final ByteBuffer bb = ByteBuffer.wrap(lengthBits);
|
final ByteBuffer bb = ByteBuffer.wrap(lengthBits);
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN);
|
bb.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
bb.putInt(msg.length);
|
bb.putInt(msg.length);
|
||||||
|
|
||||||
Os.write(mPipe, lengthBits, 0, lengthBits.length);
|
Os.write(fd, lengthBits, 0, lengthBits.length);
|
||||||
Os.write(mPipe, msg, 0, msg.length);
|
Os.write(fd, msg, 0, msg.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
EmulatorClipboardMonitor(final Consumer<ClipData> setAndroidClipboard) {
|
EmulatorClipboardMonitor(final Consumer<ClipData> setAndroidClipboard) {
|
||||||
@@ -162,17 +164,22 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setHostClipboardImpl(final String value) {
|
private void setHostClipboardImpl(final String value) {
|
||||||
|
final FileDescriptor pipeFD = getPipeFD();
|
||||||
|
|
||||||
|
if (pipeFD != null) {
|
||||||
|
Thread t = new Thread(() -> {
|
||||||
if (LOG_CLIBOARD_ACCESS) {
|
if (LOG_CLIBOARD_ACCESS) {
|
||||||
Slog.i(TAG, "Setting the host clipboard to '" + value + "'");
|
Slog.i(TAG, "Setting the host clipboard to '" + value + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (isPipeOpened()) {
|
sendMessage(pipeFD, value.getBytes());
|
||||||
sendMessage(value.getBytes());
|
|
||||||
}
|
|
||||||
} catch (ErrnoException | InterruptedIOException e) {
|
} catch (ErrnoException | InterruptedIOException e) {
|
||||||
Slog.e(TAG, "Failed to set host clipboard " + e.getMessage());
|
Slog.e(TAG, "Failed to set host clipboard " + e.getMessage());
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user