Skip to content

Commit f7d4b6d

Browse files
committed
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 <#1440> Fixes #1556 <#1556>
1 parent e8a565f commit f7d4b6d

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

server/src/main/java/com/genymobile/scrcpy/Device.java

+30-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.genymobile.scrcpy;
22

3+
import com.genymobile.scrcpy.wrappers.ClipboardManager;
34
import com.genymobile.scrcpy.wrappers.ContentProvider;
45
import com.genymobile.scrcpy.wrappers.InputManager;
56
import com.genymobile.scrcpy.wrappers.ServiceManager;
@@ -80,23 +81,28 @@ public void onRotationChanged(int rotation) {
8081

8182
if (options.getControl()) {
8283
// If control is enabled, synchronize Android clipboard to the computer automatically
83-
serviceManager.getClipboardManager().addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() {
84-
@Override
85-
public void dispatchPrimaryClipChanged() {
86-
if (isSettingClipboard.get()) {
87-
// This is a notification for the change we are currently applying, ignore it
88-
return;
89-
}
90-
synchronized (Device.this) {
91-
if (clipboardListener != null) {
92-
String text = getClipboardText();
93-
if (text != null) {
94-
clipboardListener.onClipboardTextChanged(text);
84+
ClipboardManager clipboardManager = serviceManager.getClipboardManager();
85+
if (clipboardManager != null) {
86+
clipboardManager.addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() {
87+
@Override
88+
public void dispatchPrimaryClipChanged() {
89+
if (isSettingClipboard.get()) {
90+
// This is a notification for the change we are currently applying, ignore it
91+
return;
92+
}
93+
synchronized (Device.this) {
94+
if (clipboardListener != null) {
95+
String text = getClipboardText();
96+
if (text != null) {
97+
clipboardListener.onClipboardTextChanged(text);
98+
}
9599
}
96100
}
97101
}
98-
}
99-
});
102+
});
103+
} else {
104+
Ln.w("No clipboard manager, copy-paste between device and computer will not work");
105+
}
100106
}
101107

102108
if ((displayInfoFlags & DisplayInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) == 0) {
@@ -199,16 +205,24 @@ public void collapsePanels() {
199205
}
200206

201207
public String getClipboardText() {
202-
CharSequence s = serviceManager.getClipboardManager().getText();
208+
ClipboardManager clipboardManager = serviceManager.getClipboardManager();
209+
if (clipboardManager == null) {
210+
return null;
211+
}
212+
CharSequence s = clipboardManager.getText();
203213
if (s == null) {
204214
return null;
205215
}
206216
return s.toString();
207217
}
208218

209219
public boolean setClipboardText(String text) {
220+
ClipboardManager clipboardManager = serviceManager.getClipboardManager();
221+
if (clipboardManager == null) {
222+
return false;
223+
}
210224
isSettingClipboard.set(true);
211-
boolean ok = serviceManager.getClipboardManager().setText(text);
225+
boolean ok = clipboardManager.setText(text);
212226
isSettingClipboard.set(false);
213227
return ok;
214228
}

server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,14 @@ public StatusBarManager getStatusBarManager() {
7777

7878
public ClipboardManager getClipboardManager() {
7979
if (clipboardManager == null) {
80-
clipboardManager = new ClipboardManager(getService("clipboard", "android.content.IClipboard"));
80+
IInterface clipboard = getService("clipboard", "android.content.IClipboard");
81+
if (clipboard == null) {
82+
// Some devices have no clipboard manager
83+
// <https://github.com/Genymobile/scrcpy/issues/1440>
84+
// <https://github.com/Genymobile/scrcpy/issues/1556>
85+
return null;
86+
}
87+
clipboardManager = new ClipboardManager(clipboard);
8188
}
8289
return clipboardManager;
8390
}

0 commit comments

Comments
 (0)