Avoid clipboard synchronization loop
The Android device listens for clipboard changes to synchronize with the computer clipboard. However, if the change comes from scrcpy (for example via Ctrl+Shift+v), do not notify the change.
This commit is contained in:
parent
c7a33fac36
commit
ffc57512b3
1 changed files with 11 additions and 1 deletions
|
@ -13,6 +13,8 @@ import android.os.IBinder;
|
||||||
import android.view.IRotationWatcher;
|
import android.view.IRotationWatcher;
|
||||||
import android.view.InputEvent;
|
import android.view.InputEvent;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
public final class Device {
|
public final class Device {
|
||||||
|
|
||||||
public static final int POWER_MODE_OFF = SurfaceControl.POWER_MODE_OFF;
|
public static final int POWER_MODE_OFF = SurfaceControl.POWER_MODE_OFF;
|
||||||
|
@ -31,6 +33,7 @@ public final class Device {
|
||||||
private ScreenInfo screenInfo;
|
private ScreenInfo screenInfo;
|
||||||
private RotationListener rotationListener;
|
private RotationListener rotationListener;
|
||||||
private ClipboardListener clipboardListener;
|
private ClipboardListener clipboardListener;
|
||||||
|
private final AtomicBoolean isSettingClipboard = new AtomicBoolean();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logical display identifier
|
* Logical display identifier
|
||||||
|
@ -76,6 +79,10 @@ public final class Device {
|
||||||
serviceManager.getClipboardManager().addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() {
|
serviceManager.getClipboardManager().addPrimaryClipChangedListener(new IOnPrimaryClipChangedListener.Stub() {
|
||||||
@Override
|
@Override
|
||||||
public void dispatchPrimaryClipChanged() {
|
public void dispatchPrimaryClipChanged() {
|
||||||
|
if (isSettingClipboard.get()) {
|
||||||
|
// This is a notification for the change we are currently applying, ignore it
|
||||||
|
return;
|
||||||
|
}
|
||||||
synchronized (Device.this) {
|
synchronized (Device.this) {
|
||||||
if (clipboardListener != null) {
|
if (clipboardListener != null) {
|
||||||
String text = getClipboardText();
|
String text = getClipboardText();
|
||||||
|
@ -181,7 +188,10 @@ public final class Device {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean setClipboardText(String text) {
|
public boolean setClipboardText(String text) {
|
||||||
return serviceManager.getClipboardManager().setText(text);
|
isSettingClipboard.set(true);
|
||||||
|
boolean ok = serviceManager.getClipboardManager().setText(text);
|
||||||
|
isSettingClipboard.set(false);
|
||||||
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue