From 553c3fc3314cd6348f1c5b3fe17eb72c2dd2896b Mon Sep 17 00:00:00 2001 From: mikko-n Date: Mon, 2 Sep 2024 10:28:19 +0300 Subject: [PATCH] Update UsbDocumentProvider.java to support Android 14 / sdk 34 Added broadcast receiver register/unregister actions and build sdk version check to include mandatory flags for sdk 34 --- .../storageprovider/UsbDocumentProvider.java | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/storageprovider/src/main/java/me/jahnen/libaums/storageprovider/UsbDocumentProvider.java b/storageprovider/src/main/java/me/jahnen/libaums/storageprovider/UsbDocumentProvider.java index 5eeb1220..cd340345 100644 --- a/storageprovider/src/main/java/me/jahnen/libaums/storageprovider/UsbDocumentProvider.java +++ b/storageprovider/src/main/java/me/jahnen/libaums/storageprovider/UsbDocumentProvider.java @@ -45,6 +45,7 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -104,6 +105,10 @@ private static String[] resolveDocumentProjection(String[] projection) { return projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION; } + private ArrayList broadcastReceivers = new ArrayList(); + + private final static int receiverFlags = Context.RECEIVER_NOT_EXPORTED; + @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { Log.d(TAG, "queryRoots()"); @@ -273,6 +278,29 @@ public String getDocumentType(String documentId) { return "application/octet-stream"; } + private void registerBroadcaster(Context ctx, BroadcastReceiver receiverToRegister, IntentFilter receiverFilter) { + + broadcastReceivers.add(receiverToRegister); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ctx.registerReceiver(receiverToRegister, receiverFilter, receiverFlags); + } + else { + ctx.registerReceiver(receiverToRegister, receiverFilter); + } + } + + private void unregisterBroadcasters() { + Context cts = getContext(); + for (BroadcastReceiver receiver : broadcastReceivers) { + try { + cts.unregisterReceiver(receiver); + } catch (IllegalArgumentException ilex) { + Log.d(TAG, "failed to unregister broadcast receiver"); + } + } + } + @Override public boolean onCreate() { Log.d(TAG, "onCreate()"); @@ -280,7 +308,7 @@ public boolean onCreate() { Context context = getContext(); assert context != null; - context.registerReceiver(new BroadcastReceiver() { + registerBroadcaster(context, new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { @@ -288,8 +316,7 @@ public void onReceive(Context context, Intent intent) { } } }, new IntentFilter(ACTION_USB_PERMISSION)); - - context.registerReceiver(new BroadcastReceiver() { + registerBroadcaster(context, new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); @@ -297,7 +324,7 @@ public void onReceive(Context context, Intent intent) { } }, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED)); - context.registerReceiver(new BroadcastReceiver() { + registerBroadcaster(context, new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); @@ -313,6 +340,10 @@ public void onReceive(Context context, Intent intent) { return true; } + public void onDestroy() { + unregisterBroadcasters(); + } + private static String getMimeType(UsbFile file) { if (file.isDirectory()) {