From 3681e2d4ba03795a6d2acadaa27a516367413c2f Mon Sep 17 00:00:00 2001 From: Iordan Iordanov Date: Fri, 29 Dec 2023 16:39:27 -0500 Subject: [PATCH] Fix for Opaque USB support on Android 14. --- .../undatech/opaque/SpiceCommunicator.java | 25 ++++++++++++++----- .../undatech/opaque/util/UsbDeviceManager.kt | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/remoteClientLib/src/main/java/com/undatech/opaque/SpiceCommunicator.java b/remoteClientLib/src/main/java/com/undatech/opaque/SpiceCommunicator.java index e86eea7ab..3554f446a 100644 --- a/remoteClientLib/src/main/java/com/undatech/opaque/SpiceCommunicator.java +++ b/remoteClientLib/src/main/java/com/undatech/opaque/SpiceCommunicator.java @@ -29,6 +29,7 @@ import android.graphics.Bitmap; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -146,12 +147,7 @@ public SpiceCommunicator(Context context, Handler handler, Viewable canvas, bool } usbDeviceManager = new UsbDeviceManager(context, usbEnabled); - if (usbEnabled) { - context.registerReceiver(usbPermissionRequestedReceiver, new IntentFilter(ACTION_USB_PERMISSION)); - IntentFilter filter = new IntentFilter(); - filter.addAction("android.hardware.usb.action.USB_STATE"); - context.registerReceiver(usbStateChangedReceiver, filter); - } + registerReceiversForUsbDevices(context); modifierMap.put(RemoteKeyboard.CTRL_MASK, LCONTROL); modifierMap.put(RemoteKeyboard.RCTRL_MASK, RCONTROL); modifierMap.put(RemoteKeyboard.ALT_MASK, LALT); @@ -163,6 +159,23 @@ public SpiceCommunicator(Context context, Handler handler, Viewable canvas, bool } + private void registerReceiversForUsbDevices(Context context) { + if (usbEnabled) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.registerReceiver(usbPermissionRequestedReceiver, new IntentFilter(ACTION_USB_PERMISSION), Context.RECEIVER_NOT_EXPORTED); + } else { + context.registerReceiver(usbPermissionRequestedReceiver, new IntentFilter(ACTION_USB_PERMISSION)); + } + IntentFilter filter = new IntentFilter(); + filter.addAction("android.hardware.usb.action.USB_STATE"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.registerReceiver(usbStateChangedReceiver, filter, Context.RECEIVER_NOT_EXPORTED); + } else { + context.registerReceiver(usbStateChangedReceiver, filter); + } + } + } + public static void sendMessage(int message) { android.util.Log.d(TAG, "sendMessage called with message: " + message); myself.handler.sendEmptyMessage(message); diff --git a/remoteClientLib/src/main/java/com/undatech/opaque/util/UsbDeviceManager.kt b/remoteClientLib/src/main/java/com/undatech/opaque/util/UsbDeviceManager.kt index 8139bdfd7..199a1f7be 100644 --- a/remoteClientLib/src/main/java/com/undatech/opaque/util/UsbDeviceManager.kt +++ b/remoteClientLib/src/main/java/com/undatech/opaque/util/UsbDeviceManager.kt @@ -71,7 +71,7 @@ class UsbDeviceManager(val context: Context, val usbEnabled: Boolean) { val d = this.getUnrequested() if (d != null) { val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - PendingIntent.FLAG_MUTABLE + PendingIntent.FLAG_IMMUTABLE } else { 0 };