Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shortcut for expand notifications panel doesn't work #2551

Closed
Peter-maximus opened this issue Aug 8, 2021 · 9 comments
Closed

shortcut for expand notifications panel doesn't work #2551

Peter-maximus opened this issue Aug 8, 2021 · 9 comments

Comments

@Peter-maximus
Copy link

Peter-maximus commented Aug 8, 2021

unfortunately doesn't work on oneplus 3, Android 8.0, Windows ADB, scrcpy 1.18

[server] ERROR: Could not invoke method
java.lang.NoSuchMethodException: expandNotificationsPanel []
        at java.lang.Class.getMethod(Class.java:2068)
        at java.lang.Class.getMethod(Class.java:1690)
        at com.genymobile.scrcpy.wrappers.StatusBarManager.getExpandNotificationsPanelMethod(StatusBarManager.java:24)
        at com.genymobile.scrcpy.wrappers.StatusBarManager.expandNotificationsPanel(StatusBarManager.java:52)
        at com.genymobile.scrcpy.Device.expandNotificationPanel(Device.java:215)
        at com.genymobile.scrcpy.Controller.handleEvent(Controller.java:108)
        at com.genymobile.scrcpy.Controller.control(Controller.java:71)
        at com.genymobile.scrcpy.Server$2.run(Server.java:100)
        at java.lang.Thread.run(Thread.java:764)
@rom1v
Copy link
Collaborator

rom1v commented Aug 8, 2021

They probably customized the method in their private ROM. Could you add a log to find the existing methods if you know how to?

@Peter-maximus
Copy link
Author

i provided the output from console.
how can i create such a log?

@Peter-maximus
Copy link
Author

Any update please?

@rom1v
Copy link
Collaborator

rom1v commented Sep 10, 2021

Take this file, replace it in the v1.19:

scrcpy-server sha256:d770434cc519d7fe26efe247788200a07c7c2c4bd087c8c81a52247d1284e4ce

Then run scrcpy, then press Alt+n once. It will output many things in the console. Please post the result.

diff
diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
index 5b1e5f5e..52b1a90e 100644
--- a/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
+++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
@@ -20,6 +20,8 @@ public class StatusBarManager {
     }
 
     private Method getExpandNotificationsPanelMethod() throws NoSuchMethodException {
+        for (Method method : manager.getClass().getMethods())
+            System.err.println("=== " + method);
         if (expandNotificationsPanelMethod == null) {
             expandNotificationsPanelMethod = manager.getClass().getMethod("expandNotificationsPanel");
         }

@Peter-maximus
Copy link
Author

Peter-maximus commented Sep 10, 2021

[server] INFO: Device: OnePlus ONEPLUS A3003 (Android 8.0.0)
INFO: Renderer: direct3d
INFO: Initial texture: 576x1024
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.addTile(android.content.ComponentName) throws android.os.RemoteException
=== public android.os.IBinder com.android.internal.statusbar.IStatusBarService$Stub$Proxy.asBinder()
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.clearNotificationEffects() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.clickTile(android.content.ComponentName) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.collapsePanels() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.disable(int,android.os.IBinder,java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.disable2(int,android.os.IBinder,java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.disable2ForUser(int,android.os.IBinder,java.lang.String,int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.disableForUser(int,android.os.IBinder,java.lang.String,int) throws android.os.RemoteException
=== public boolean java.lang.Object.equals(java.lang.Object)
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.expandNotificationsPanel(int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.expandSettingsPanel(java.lang.String) throws android.os.RemoteException
=== public final java.lang.Class java.lang.Object.getClass()
=== public java.lang.String com.android.internal.statusbar.IStatusBarService$Stub$Proxy.getInterfaceDescriptor()
=== public java.util.List com.android.internal.statusbar.IStatusBarService$Stub$Proxy.getLockedPackageList() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.handleSystemNavigationKey(int) throws android.os.RemoteException
=== public int java.lang.Object.hashCode()
=== public final native void java.lang.Object.notify()
=== public final native void java.lang.Object.notifyAll()
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.notifyNavBarColorChanged(int,java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onClearAllNotifications(int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onGlobalActionsHidden() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onGlobalActionsShown() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationActionClick(java.lang.String,int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationClear(java.lang.String,java.lang.String,int,int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationClick(java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationError(java.lang.String,java.lang.String,int,int,int,java.lang.String,int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationExpansionChanged(java.lang.String,boolean,boolean) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onNotificationVisibilityChanged(com.android.internal.statusbar.NotificationVisibility[],com.android.internal.statusbar.NotificationVisibility[]) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onPanelHidden() throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.onPanelRevealed(boolean,int) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.reboot(boolean) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.registerStatusBar(com.android.internal.statusbar.IStatusBar,java.util.List,java.util.List,int[],java.util.List,android.graphics.Rect,android.graphics.Rect) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.remTile(android.content.ComponentName) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.removeIcon(java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.setIcon(java.lang.String,java.lang.String,int,int,java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.setIconVisibility(java.lang.String,boolean) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.setImeWindowStatus(android.os.IBinder,int,int,boolean) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.setSystemUiVisibility(int,int,java.lang.String) throws android.os.RemoteException
=== public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.shutdown() throws android.os.RemoteException
=== public java.lang.String java.lang.Object.toString()
=== public final native void java.lang.Object.wait() throws java.lang.InterruptedException
=== public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
=== public final native void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
[server] ERROR: Could not invoke method
java.lang.NoSuchMethodException: expandNotificationsPanel []
        at java.lang.Class.getMethod(Class.java:2068)
        at java.lang.Class.getMethod(Class.java:1690)
        at com.genymobile.scrcpy.wrappers.StatusBarManager.getExpandNotificationsPanelMethod(StatusBarManager.java:26)
        at com.genymobile.scrcpy.wrappers.StatusBarManager.expandNotificationsPanel(StatusBarManager.java:54)
        at com.genymobile.scrcpy.Device.expandNotificationPanel(Device.java:215)
        at com.genymobile.scrcpy.Controller.handleEvent(Controller.java:108)
        at com.genymobile.scrcpy.Controller.control(Controller.java:71)
        at com.genymobile.scrcpy.Server$2.run(Server.java:100)
        at java.lang.Thread.run(Thread.java:764)

@rom1v
Copy link
Collaborator

rom1v commented Sep 10, 2021

public void com.android.internal.statusbar.IStatusBarService$Stub$Proxy.expandNotificationsPanel(int) throws android.os.RemoteException

As expected, they modified the method in the custom ROM (they added an int parameter, but I don't know what it is).

Let's try to just pass 0:

scrcpy-server sha256:df8c2075769796c7b12801bfc89b381dabfdfe91199c7aa413c5ed8e0533acb1

diff
diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
index 5b1e5f5e..0ddd8311 100644
--- a/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
+++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/StatusBarManager.java
@@ -11,6 +11,7 @@ public class StatusBarManager {
 
     private final IInterface manager;
     private Method expandNotificationsPanelMethod;
+    private boolean expandNotificationPanelMethodCustomVersion;
     private Method expandSettingsPanelMethod;
     private boolean expandSettingsPanelMethodNewVersion = true;
     private Method collapsePanelsMethod;
@@ -21,7 +22,13 @@ public class StatusBarManager {
 
     private Method getExpandNotificationsPanelMethod() throws NoSuchMethodException {
         if (expandNotificationsPanelMethod == null) {
-            expandNotificationsPanelMethod = manager.getClass().getMethod("expandNotificationsPanel");
+            try {
+                expandNotificationsPanelMethod = manager.getClass().getMethod("expandNotificationsPanel");
+            } catch (NoSuchMethodException e) {
+                // https://github.com/Genymobile/scrcpy/issues/2551
+                expandNotificationsPanelMethod = manager.getClass().getMethod("expandNotificationsPanel", int.class);
+                expandNotificationPanelMethodCustomVersion = true;
+            }
         }
         return expandNotificationsPanelMethod;
     }
@@ -50,7 +57,11 @@ public class StatusBarManager {
     public void expandNotificationsPanel() {
         try {
             Method method = getExpandNotificationsPanelMethod();
-            method.invoke(manager);
+            if (expandNotificationPanelMethodCustomVersion) {
+                method.invoke(manager, 0);
+            } else {
+                method.invoke(manager);
+            }
         } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
             Ln.e("Could not invoke method", e);
         }

@Peter-maximus
Copy link
Author

Peter-maximus commented Sep 10, 2021

great! it works.
what can i do to have it working also in the next versions of the app?
is it possible to somehow implement it into scrcpy-server bundled with regular version of the app?

rom1v added a commit that referenced this issue Sep 11, 2021
Some custom vendor ROM added an int as a parameter.

Fixes #2551 <#2551>
@rom1v
Copy link
Collaborator

rom1v commented Sep 11, 2021

great! it works.

👍

what can i do to have it working also in the next versions of the app?
is it possible to somehow implement it into scrcpy-server bundled with regular version of the app?

I just merged in into dev, so it will be in the next release: fa100b8

@rom1v rom1v closed this as completed Sep 11, 2021
@Peter-maximus
Copy link
Author

thx a lot. appreciate it.

rom1v added a commit that referenced this issue Oct 21, 2021
Some custom vendor ROM added an int as a parameter.

Fixes #2551 <#2551>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants