diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/ClipboardManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/ClipboardManager.java index e25b6e9..55c23eb 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/ClipboardManager.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/ClipboardManager.java @@ -22,10 +22,11 @@ public class ClipboardManager { private Method getGetPrimaryClipMethod() throws NoSuchMethodException { if (getPrimaryClipMethod == null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - getPrimaryClipMethod = manager.getClass().getMethod("getPrimaryClip", String.class); - } else { - getPrimaryClipMethod = manager.getClass().getMethod("getPrimaryClip", String.class, int.class); + for (Method method : manager.getClass().getMethods()) { + if (method.getName().equals("getPrimaryClip")) { + getPrimaryClipMethod = method; + break; + } } } return getPrimaryClipMethod; @@ -33,29 +34,50 @@ public class ClipboardManager { private Method getSetPrimaryClipMethod() throws NoSuchMethodException { if (setPrimaryClipMethod == null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - setPrimaryClipMethod = manager.getClass().getMethod("setPrimaryClip", ClipData.class, String.class); - } else { - setPrimaryClipMethod = manager.getClass().getMethod("setPrimaryClip", ClipData.class, String.class, int.class); + for (Method method : manager.getClass().getMethods()) { + if (method.getName().equals("setPrimaryClip")) { + setPrimaryClipMethod = method; + break; + } } } return setPrimaryClipMethod; } - private static ClipData getPrimaryClip(Method method, IInterface manager) throws InvocationTargetException, IllegalAccessException { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - return (ClipData) method.invoke(manager, ServiceManager.PACKAGE_NAME); + private Method getAddPrimaryClipChangedListener() throws NoSuchMethodException { + if (addPrimaryClipChangedListener == null) { + for (Method method : manager.getClass().getMethods()) { + if (method.getName().equals("addPrimaryClipChangedListener")) { + addPrimaryClipChangedListener = method; + break; + } + } } - return (ClipData) method.invoke(manager, ServiceManager.PACKAGE_NAME, ServiceManager.USER_ID); + return addPrimaryClipChangedListener; } - private static void setPrimaryClip(Method method, IInterface manager, ClipData clipData) - throws InvocationTargetException, IllegalAccessException { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - method.invoke(manager, clipData, ServiceManager.PACKAGE_NAME); - } else { - method.invoke(manager, clipData, ServiceManager.PACKAGE_NAME, ServiceManager.USER_ID); + private static ClipData getPrimaryClip(Method method, IInterface manager) throws InvocationTargetException, IllegalAccessException { + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length == 1 && parameterTypes[0] == String.class) { + return (ClipData) method.invoke(manager, ServiceManager.PACKAGE_NAME); } + if (parameterTypes.length == 2 && parameterTypes[0] == String.class && parameterTypes[1] == int.class) { + return (ClipData) method.invoke(manager, ServiceManager.PACKAGE_NAME, ServiceManager.USER_ID); + } + return (ClipData) method.invoke(manager, ServiceManager.PACKAGE_NAME, null, ServiceManager.USER_ID); + } + + private static void setPrimaryClip(Method method, IInterface manager, ClipData clipData) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length == 2 && parameterTypes[0] == ClipData.class && parameterTypes[1] == String.class) { + method.invoke(manager, clipData, ServiceManager.PACKAGE_NAME); + return; + } + if (parameterTypes.length == 3 && parameterTypes[0] == ClipData.class && parameterTypes[1] == String.class && parameterTypes[2] == int.class) { + method.invoke(manager, clipData, ServiceManager.PACKAGE_NAME, ServiceManager.USER_ID); + return; + } + method.invoke(manager, clipData, ServiceManager.PACKAGE_NAME, null, ServiceManager.USER_ID); } public CharSequence getText() { @@ -84,26 +106,17 @@ public class ClipboardManager { } } - private static void addPrimaryClipChangedListener(Method method, IInterface manager, IOnPrimaryClipChangedListener listener) - throws InvocationTargetException, IllegalAccessException { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + private static void addPrimaryClipChangedListener(Method method, IInterface manager, IOnPrimaryClipChangedListener listener) throws InvocationTargetException, IllegalAccessException { + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length == 2 && parameterTypes[0] == IOnPrimaryClipChangedListener.class && parameterTypes[1] == String.class) { method.invoke(manager, listener, ServiceManager.PACKAGE_NAME); - } else { + return; + } + if (parameterTypes.length == 3 && parameterTypes[0] == IOnPrimaryClipChangedListener.class && parameterTypes[1] == String.class && parameterTypes[2] == int.class) { method.invoke(manager, listener, ServiceManager.PACKAGE_NAME, ServiceManager.USER_ID); + return; } - } - - private Method getAddPrimaryClipChangedListener() throws NoSuchMethodException { - if (addPrimaryClipChangedListener == null) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - addPrimaryClipChangedListener = manager.getClass() - .getMethod("addPrimaryClipChangedListener", IOnPrimaryClipChangedListener.class, String.class); - } else { - addPrimaryClipChangedListener = manager.getClass() - .getMethod("addPrimaryClipChangedListener", IOnPrimaryClipChangedListener.class, String.class, int.class); - } - } - return addPrimaryClipChangedListener; + method.invoke(manager, listener, ServiceManager.PACKAGE_NAME, null, ServiceManager.USER_ID); } public boolean addPrimaryClipChangedListener(IOnPrimaryClipChangedListener listener) {