Recover if expand/collapse panels is not available
Some devices don't have the required method. Recover gracefully without
crashing the server.
Fixes <https://github.com/Genymobile/scrcpy/issues/506>.
@@ -2,38 +2,50 @@ package com.genymobile.scrcpy.wrappers;
import android.os.IInterface;
+import com.genymobile.scrcpy.Ln;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class StatusBarManager {
private final IInterface manager;
- private final Method expandNotificationsPanelMethod;
- private final Method collapsePanelsMethod;
+ private Method expandNotificationsPanelMethod;
+ private Method collapsePanelsMethod;
public StatusBarManager(IInterface manager) {
this.manager = manager;
+ }
+
+ public void expandNotificationsPanel() {
+ if (expandNotificationsPanelMethod == null) {
try {
expandNotificationsPanelMethod = manager.getClass().getMethod("expandNotificationsPanel");
- collapsePanelsMethod = manager.getClass().getMethod("collapsePanels");
} catch (NoSuchMethodException e) {
- throw new AssertionError(e);
+ Ln.e("ServiceBarManager.expandNotificationsPanel() is not available on this device");
+ return;
}
}
-
- public void expandNotificationsPanel() {
try {
expandNotificationsPanelMethod.invoke(manager);
} catch (InvocationTargetException | IllegalAccessException e) {
- throw new AssertionError(e);
+ Ln.e("Cannot invoke ServiceBarManager.expandNotificationsPanel()", e);
}
}
public void collapsePanels() {
+ if (collapsePanelsMethod == null) {
+ try {
+ collapsePanelsMethod = manager.getClass().getMethod("collapsePanels");
+ } catch (NoSuchMethodException e) {
+ Ln.e("ServiceBarManager.collapsePanels() is not available on this device");
+ return;
+ }
+ }
try {
collapsePanelsMethod.invoke(manager);
} catch (InvocationTargetException | IllegalAccessException e) {
- throw new AssertionError(e);
+ Ln.e("Cannot invoke ServiceBarManager.collapsePanels()", e);
}
}
}
