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:
parent
e8a565f9ea
commit
f7d4b6d0db
2 changed files with 38 additions and 17 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue