From 8cddc76fde9b1904a9c8daf1f35773cb23272690 Mon Sep 17 00:00:00 2001 From: or-else Date: Sun, 25 Jun 2023 18:39:07 -0700 Subject: [PATCH] avoid infinite loop in premission checking on API 33 --- .../co/tinode/tindroid/MessagesFragment.java | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/co/tinode/tindroid/MessagesFragment.java b/app/src/main/java/co/tinode/tindroid/MessagesFragment.java index e4c8fd74..955368b0 100644 --- a/app/src/main/java/co/tinode/tindroid/MessagesFragment.java +++ b/app/src/main/java/co/tinode/tindroid/MessagesFragment.java @@ -165,7 +165,7 @@ public class MessagesFragment extends Fragment implements MenuProvider { registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { // Check if permission is granted. if (isGranted) { - openFileSelector(requireActivity()); + openFileSelector(requireActivity(), false); } }); @@ -179,7 +179,7 @@ public class MessagesFragment extends Fragment implements MenuProvider { } // Try to open the image selector again. - openMediaSelector(requireActivity()); + openMediaSelector(requireActivity(), false); }); private final ActivityResultLauncher mAudioRecorderPermissionLauncher = @@ -358,10 +358,10 @@ public PromisedReply onFailure(Exception err) { doneEditing.setOnClickListener(v -> sendText(activity)); // Send image button - view.findViewById(R.id.attachImage).setOnClickListener(v -> openMediaSelector(activity)); + view.findViewById(R.id.attachImage).setOnClickListener(v -> openMediaSelector(activity, true)); // Send file button - view.findViewById(R.id.attachFile).setOnClickListener(v -> openFileSelector(activity)); + view.findViewById(R.id.attachFile).setOnClickListener(v -> openFileSelector(activity, true)); // Cancel reply preview button. view.findViewById(R.id.cancelPreview).setOnClickListener(v -> cancelPreview(activity)); @@ -1162,15 +1162,17 @@ void notifyDataSetChanged(boolean meta) { } } - private void openFileSelector(@NonNull Activity activity) { + private void openFileSelector(@NonNull Activity activity, boolean checkPermissions) { if (activity.isFinishing() || activity.isDestroyed()) { return; } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && - !UiUtils.isPermissionGranted(activity, Manifest.permission.READ_EXTERNAL_STORAGE)) { - mFileOpenerRequestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); - return; + if (checkPermissions) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && + !UiUtils.isPermissionGranted(activity, Manifest.permission.READ_EXTERNAL_STORAGE)) { + mFileOpenerRequestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); + return; + } } try { @@ -1181,23 +1183,25 @@ private void openFileSelector(@NonNull Activity activity) { } } - private void openMediaSelector(@NonNull final Activity activity) { + private void openMediaSelector(@NonNull final Activity activity, boolean checkPermissions) { if (activity.isFinishing() || activity.isDestroyed()) { return; } - LinkedList permissions = new LinkedList<>(); - permissions.add(Manifest.permission.CAMERA); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { - permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); - } else { - permissions.add(Manifest.permission.READ_MEDIA_VIDEO); - permissions.add(Manifest.permission.READ_MEDIA_IMAGES); - } - LinkedList missing = UiUtils.getMissingPermissions(activity, permissions.toArray(new String[]{})); - if (!missing.isEmpty()) { - mImagePickerRequestPermissionLauncher.launch(missing.toArray(new String[]{})); - return; + if (checkPermissions) { + LinkedList permissions = new LinkedList<>(); + permissions.add(Manifest.permission.CAMERA); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); + } else { + permissions.add(Manifest.permission.READ_MEDIA_VIDEO); + permissions.add(Manifest.permission.READ_MEDIA_IMAGES); + } + LinkedList missing = UiUtils.getMissingPermissions(activity, permissions.toArray(new String[]{})); + if (!missing.isEmpty()) { + mImagePickerRequestPermissionLauncher.launch(missing.toArray(new String[]{})); + return; + } } mMediaPickerLauncher.launch(null);