mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2026-06-17 06:10:58 +00:00
Fix handling of onInputDeviceChanged when using sensors and lights
DS4 triggers this path when we release our pointer capture on activity pause
This commit is contained in:
@@ -230,18 +230,9 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
|
|
||||||
LimeLog.info("Device changed: "+existingContext.name+" ("+deviceId+")");
|
LimeLog.info("Device changed: "+existingContext.name+" ("+deviceId+")");
|
||||||
|
|
||||||
// Don't release the controller number, because we will carry it over if it is present.
|
// Migrate the existing context into this new one by moving any stateful elements
|
||||||
// We also want to make sure the change is invisible to the host PC to avoid an add/remove
|
|
||||||
// cycle for the gamepad which may break some games.
|
|
||||||
existingContext.destroy();
|
|
||||||
|
|
||||||
InputDeviceContext newContext = createInputDeviceContextForDevice(device);
|
InputDeviceContext newContext = createInputDeviceContextForDevice(device);
|
||||||
|
newContext.migrateContext(existingContext);
|
||||||
// Copy over existing controller number state
|
|
||||||
newContext.assignedControllerNumber = existingContext.assignedControllerNumber;
|
|
||||||
newContext.reservedControllerNumber = existingContext.reservedControllerNumber;
|
|
||||||
newContext.controllerNumber = existingContext.controllerNumber;
|
|
||||||
|
|
||||||
inputDeviceContexts.put(deviceId, newContext);
|
inputDeviceContexts.put(deviceId, newContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2774,6 +2765,32 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
sendControllerBatteryPacket(this);
|
sendControllerBatteryPacket(this);
|
||||||
handler.postDelayed(batteryStateUpdateRunnable, BATTERY_RECHECK_INTERVAL_MS);
|
handler.postDelayed(batteryStateUpdateRunnable, BATTERY_RECHECK_INTERVAL_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void migrateContext(InputDeviceContext oldContext) {
|
||||||
|
// Take ownership of the sensor and light sessions
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
this.lightsSession = oldContext.lightsSession;
|
||||||
|
this.gyroListener = oldContext.gyroListener;
|
||||||
|
this.accelListener = oldContext.accelListener;
|
||||||
|
oldContext.lightsSession = null;
|
||||||
|
oldContext.gyroListener = null;
|
||||||
|
oldContext.accelListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't release the controller number, because we will carry it over if it is present.
|
||||||
|
// We also want to make sure the change is invisible to the host PC to avoid an add/remove
|
||||||
|
// cycle for the gamepad which may break some games.
|
||||||
|
oldContext.destroy();
|
||||||
|
|
||||||
|
// Copy over existing controller number state
|
||||||
|
this.assignedControllerNumber = oldContext.assignedControllerNumber;
|
||||||
|
this.reservedControllerNumber = oldContext.reservedControllerNumber;
|
||||||
|
this.controllerNumber = oldContext.controllerNumber;
|
||||||
|
|
||||||
|
// Refresh battery state and start the battery state polling again
|
||||||
|
sendControllerBatteryPacket(this);
|
||||||
|
handler.postDelayed(batteryStateUpdateRunnable, BATTERY_RECHECK_INTERVAL_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class UsbDeviceContext extends GenericControllerContext {
|
class UsbDeviceContext extends GenericControllerContext {
|
||||||
|
|||||||
Reference in New Issue
Block a user