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:
Roman Kiryanov
2022-03-03 21:33:44 -08:00
parent 9eb8a72ac7
commit e1340d674b

View File

@@ -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();
}
} }
} }