Do not crash on missing clipboard manager

Some devices have no clipboard manager.

In that case, do not try to enable clipboard synchronization to avoid
a crash.

Fixes #1440 <https://github.com/Genymobile/scrcpy/issues/1440>
Fixes #1556 <https://github.com/Genymobile/scrcpy/issues/1556>
This commit is contained in:
Romain Vimont 2020-07-03 08:50:52 +02:00
parent e8a565f9ea
commit f7d4b6d0db
2 changed files with 38 additions and 17 deletions

View file

@ -1,5 +1,6 @@
package com.genymobile.scrcpy; package com.genymobile.scrcpy;
import com.genymobile.scrcpy.wrappers.ClipboardManager;
import com.genymobile.scrcpy.wrappers.ContentProvider; import com.genymobile.scrcpy.wrappers.ContentProvider;
import com.genymobile.scrcpy.wrappers.InputManager; import com.genymobile.scrcpy.wrappers.InputManager;
import com.genymobile.scrcpy.wrappers.ServiceManager; import com.genymobile.scrcpy.wrappers.ServiceManager;
@ -80,23 +81,28 @@ public final class Device {
if (options.getControl()) { if (options.getControl()) {
// If control is enabled, synchronize Android clipboard to the computer automatically // If control is enabled, synchronize Android clipboard to the computer automatically
serviceManager.getClipboardManager().addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() { ClipboardManager clipboardManager = serviceManager.getClipboardManager();
@Override if (clipboardManager != null) {
public void dispatchPrimaryClipChanged() { clipboardManager.addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() {
if (isSettingClipboard.get()) { @Override
// This is a notification for the change we are currently applying, ignore it public void dispatchPrimaryClipChanged() {
return; if (isSettingClipboard.get()) {
} // This is a notification for the change we are currently applying, ignore it
synchronized (Device.this) { return;
if (clipboardListener != null) { }
String text = getClipboardText(); synchronized (Device.this) {
if (text != null) { if (clipboardListener != null) {
clipboardListener.onClipboardTextChanged(text); String text = getClipboardText();
if (text != null) {
clipboardListener.onClipboardTextChanged(text);
}
} }
} }
} }
} });
}); } else {
Ln.w("No clipboard manager, copy-paste between device and computer will not work");
}
} }
if ((displayInfoFlags & DisplayInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) == 0) { if ((displayInfoFlags & DisplayInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) == 0) {
@ -199,7 +205,11 @@ public final class Device {
} }
public String getClipboardText() { public String getClipboardText() {
CharSequence s = serviceManager.getClipboardManager().getText(); ClipboardManager clipboardManager = serviceManager.getClipboardManager();
if (clipboardManager == null) {
return null;
}
CharSequence s = clipboardManager.getText();
if (s == null) { if (s == null) {
return null; return null;
} }
@ -207,8 +217,12 @@ public final class Device {
} }
public boolean setClipboardText(String text) { public boolean setClipboardText(String text) {
ClipboardManager clipboardManager = serviceManager.getClipboardManager();
if (clipboardManager == null) {
return false;
}
isSettingClipboard.set(true); isSettingClipboard.set(true);
boolean ok = serviceManager.getClipboardManager().setText(text); boolean ok = clipboardManager.setText(text);
isSettingClipboard.set(false); isSettingClipboard.set(false);
return ok; return ok;
} }

View file

@ -77,7 +77,14 @@ public final class ServiceManager {
public ClipboardManager getClipboardManager() { public ClipboardManager getClipboardManager() {
if (clipboardManager == null) { if (clipboardManager == null) {
clipboardManager = new ClipboardManager(getService("clipboard", "android.content.IClipboard")); IInterface clipboard = getService("clipboard", "android.content.IClipboard");
if (clipboard == null) {
// Some devices have no clipboard manager
// <https://github.com/Genymobile/scrcpy/issues/1440>
// <https://github.com/Genymobile/scrcpy/issues/1556>
return null;
}
clipboardManager = new ClipboardManager(clipboard);
} }
return clipboardManager; return clipboardManager;
} }