Fix "turn screen off" on Android Q

Call getInternalDisplayToken(), which retrieve the id of the first
physical display (which is not necessarily 0 anymore).

Fixes <https://github.com/Genymobile/scrcpy/issues/835>
This commit is contained in:
Romain Vimont 2019-10-17 23:14:18 +02:00
parent 8b33c6c108
commit c33a147fd0
2 changed files with 10 additions and 4 deletions

View file

@ -161,7 +161,7 @@ public final class Device {
* @param mode one of the {@code SCREEN_POWER_MODE_*} constants * @param mode one of the {@code SCREEN_POWER_MODE_*} constants
*/ */
public void setScreenPowerMode(int mode) { public void setScreenPowerMode(int mode) {
IBinder d = SurfaceControl.getBuiltInDisplay(0); IBinder d = SurfaceControl.getBuiltInDisplay();
if (d == null) { if (d == null) {
Ln.e("Could not get built-in display"); Ln.e("Could not get built-in display");
return; return;

View file

@ -92,7 +92,7 @@ public final class SurfaceControl {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
getBuiltInDisplayMethod = CLASS.getMethod("getBuiltInDisplay", int.class); getBuiltInDisplayMethod = CLASS.getMethod("getBuiltInDisplay", int.class);
} else { } else {
getBuiltInDisplayMethod = CLASS.getMethod("getPhysicalDisplayToken", long.class); getBuiltInDisplayMethod = CLASS.getMethod("getInternalDisplayToken");
} }
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
Ln.e("Could not find method", e); Ln.e("Could not find method", e);
@ -101,13 +101,19 @@ public final class SurfaceControl {
return getBuiltInDisplayMethod; return getBuiltInDisplayMethod;
} }
public static IBinder getBuiltInDisplay(int builtInDisplayId) { public static IBinder getBuiltInDisplay() {
Method method = getGetBuiltInDisplayMethod(); Method method = getGetBuiltInDisplayMethod();
if (method == null) { if (method == null) {
return null; return null;
} }
try { try {
return (IBinder) method.invoke(null, builtInDisplayId); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
// call getBuiltInDisplay(0)
return (IBinder) method.invoke(null, 0);
}
// call getInternalDisplayToken()
return (IBinder) method.invoke(null);
} catch (InvocationTargetException | IllegalAccessException e) { } catch (InvocationTargetException | IllegalAccessException e) {
Ln.e("Could not invoke " + method.getName(), e); Ln.e("Could not invoke " + method.getName(), e);
return null; return null;