diff options
author | Stefan Niedermann <info@niedermann.it> | 2023-01-03 19:19:47 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2023-01-03 19:19:47 +0300 |
commit | 72f5ad7460a60e93ea151948b1351c5d9b39af10 (patch) | |
tree | edda286fa35c81036279382b2cfb6a075c9e41fd /app/src | |
parent | d2756b572a2a43a5643b4844f616fe4d01e673b8 (diff) |
Fix picture attachment picker for Android 13
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java | 2 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java | 84 |
2 files changed, 30 insertions, 56 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java index ea2549a4e..4fe2db958 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java @@ -153,7 +153,7 @@ public class ImportAccountActivity extends AppCompatActivity { if (progress.first > 0) { binding.progressCircular.setIndeterminate(false); } - if (progress.first <= progress.second) { + if (progress.first < progress.second) { binding.progressText.setText(getString(R.string.progress_import, progress.first + 1, progress.second)); } binding.progressCircular.setProgress(progress.first); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java index 182d7d9fa..01706f9b1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java @@ -3,7 +3,10 @@ package it.niedermann.nextcloud.deck.ui.card.attachments; import static android.Manifest.permission.CAMERA; import static android.Manifest.permission.READ_CONTACTS; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.READ_MEDIA_IMAGES; import static android.app.Activity.RESULT_OK; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.TIRAMISU; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static androidx.core.content.PermissionChecker.PERMISSION_GRANTED; @@ -123,14 +126,12 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet private int clickedItemPosition; @Override - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentCardEditTabAttachmentsBinding.inflate(inflater, container, false); editViewModel = new ViewModelProvider(requireActivity()).get(EditCardViewModel.class); previewViewModel = new ViewModelProvider(requireActivity()).get(PreviewDialogViewModel.class); - binding.bottomNavigation.setOnNavigationItemSelectedListener(item -> { + binding.bottomNavigation.setOnItemSelectedListener(item -> { if (item.getItemId() == R.id.gallery) { showGalleryPicker(); } else if (item.getItemId() == R.id.contacts) { @@ -151,12 +152,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet return binding.getRoot(); } - adapter = new CardAttachmentAdapter( - getChildFragmentManager(), - requireActivity().getMenuInflater(), - this, - editViewModel.getAccount(), - editViewModel.getFullCard().getLocalId()); + adapter = new CardAttachmentAdapter(getChildFragmentManager(), requireActivity().getMenuInflater(), this, editViewModel.getAccount(), editViewModel.getFullCard().getLocalId()); binding.attachmentsList.setAdapter(adapter); adapter.isEmpty().observe(getViewLifecycleOwner(), (isEmpty) -> { @@ -173,9 +169,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet mBottomSheetBehaviour.setDraggable(true); mBottomSheetBehaviour.setHideable(true); mBottomSheetBehaviour.setState(STATE_HIDDEN); - mBottomSheetBehaviour.addBottomSheetCallback(new CardAttachmentsBottomsheetBehaviorCallback( - requireContext(), backPressedCallback, binding.fab, binding.pickerBackdrop, binding.bottomNavigation, - R.color.mdtp_transparent_black, android.R.color.transparent, R.dimen.attachments_bottom_navigation_height)); + mBottomSheetBehaviour.addBottomSheetCallback(new CardAttachmentsBottomsheetBehaviorCallback(requireContext(), backPressedCallback, binding.fab, binding.pickerBackdrop, binding.bottomNavigation, R.color.mdtp_transparent_black, android.R.color.transparent, R.dimen.attachments_bottom_navigation_height)); binding.pickerBackdrop.setOnClickListener(v -> mBottomSheetBehaviour.setState(STATE_HIDDEN)); final var displayMetrics = getResources().getDisplayMetrics(); @@ -199,8 +193,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet setExitSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { - AttachmentViewHolder selectedViewHolder = (AttachmentViewHolder) binding.attachmentsList - .findViewHolderForAdapterPosition(clickedItemPosition); + final var selectedViewHolder = (AttachmentViewHolder) binding.attachmentsList.findViewHolderForAdapterPosition(clickedItemPosition); if (selectedViewHolder != null) { sharedElements.put(names.get(0), selectedViewHolder.getPreview()); } @@ -220,10 +213,8 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet binding.attachmentsList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - if (dy > 0) - binding.fab.hide(); - else if (dy < 0) - binding.fab.show(); + if (dy > 0) binding.fab.hide(); + else if (dy < 0) binding.fab.show(); } }); } else { @@ -250,7 +241,9 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet private void showGalleryPicker() { if (!(pickerAdapter instanceof GalleryAdapter)) { - if (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED || checkSelfPermission(requireActivity(), CAMERA) != PERMISSION_GRANTED) { + if (SDK_INT >= TIRAMISU && (checkSelfPermission(requireActivity(), READ_MEDIA_IMAGES) != PERMISSION_GRANTED || checkSelfPermission(requireActivity(), CAMERA) != PERMISSION_GRANTED)) { + requestPermissions(new String[]{READ_MEDIA_IMAGES, CAMERA}, REQUEST_CODE_PICK_GALLERY_PERMISSION); + } else if (SDK_INT < TIRAMISU && (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED || checkSelfPermission(requireActivity(), CAMERA) != PERMISSION_GRANTED)) { requestPermissions(new String[]{READ_EXTERNAL_STORAGE, CAMERA}, REQUEST_CODE_PICK_GALLERY_PERMISSION); } else { unbindPickerAdapter(); @@ -296,10 +289,13 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet private void showFilePicker() { if (!(pickerAdapter instanceof FileAdapter)) { - if (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) { - requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, REQUEST_CODE_PICK_FILE_PERMISSION); - } else { + if (SDK_INT >= TIRAMISU) { // No READ_EXTERNAL_STORAGE permission needed for native file picker openNativeFilePicker(); + } else { + if (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) { + requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, REQUEST_CODE_PICK_FILE_PERMISSION); + } else { + openNativeFilePicker(); // unbindPickerAdapter(); // pickerAdapter = new FileAdapter(requireContext(), (uri, pair) -> { // previewViewModel.prepareDialog(pair.first, pair.second); @@ -313,6 +309,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet // removeGalleryItemDecoration(); // binding.pickerRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); // binding.pickerRecyclerView.setAdapter(pickerAdapter); + } } } } @@ -329,9 +326,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet } private void openNativeFilePicker() { - startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT) - .addCategory(Intent.CATEGORY_OPENABLE) - .setType("*/*"), REQUEST_CODE_PICK_FILE); + startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).addCategory(Intent.CATEGORY_OPENABLE).setType("*/*"), REQUEST_CODE_PICK_FILE); } private void unbindPickerAdapter() { @@ -354,13 +349,9 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet case REQUEST_CODE_PICK_CAMERA: case REQUEST_CODE_PICK_FILE: { if (resultCode == RESULT_OK) { - final Uri sourceUri = requestCode == REQUEST_CODE_PICK_CONTACT - ? VCardUtil.getVCardContentUri(requireContext(), Uri.parse(data.getDataString())) - : data.getData(); + final Uri sourceUri = requestCode == REQUEST_CODE_PICK_CONTACT ? VCardUtil.getVCardContentUri(requireContext(), Uri.parse(data.getDataString())) : data.getData(); try { - uploadNewAttachmentFromUri(sourceUri, requestCode == REQUEST_CODE_PICK_CAMERA - ? data.getType() - : requireContext().getContentResolver().getType(sourceUri)); + uploadNewAttachmentFromUri(sourceUri, requestCode == REQUEST_CODE_PICK_CAMERA ? data.getType() : requireContext().getContentResolver().getType(sourceUri)); mBottomSheetBehaviour.setState(STATE_HIDDEN); } catch (Exception e) { ExceptionDialogFragment.newInstance(e, editViewModel.getAccount()).show(getChildFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); @@ -400,15 +391,7 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet requireActivity().runOnUiThread(() -> { if (compressImagesOnUpload && MimeTypeUtil.isImage(mimeType)) { try { - JavaCompressor.compress( - (AppCompatActivity) requireActivity(), - originalFile, - (status, file) -> uploadNewAttachmentFromFile(status && file != null ? file : originalFile, mimeType), - new ResolutionConstraint(1920, 1920), - new SizeConstraint(1_000_000, 10, 10, 10), - new FormatConstraint(Bitmap.CompressFormat.JPEG), - new QualityConstraint(80) - ); + JavaCompressor.compress((AppCompatActivity) requireActivity(), originalFile, (status, file) -> uploadNewAttachmentFromFile(status && file != null ? file : originalFile, mimeType), new ResolutionConstraint(1920, 1920), new SizeConstraint(1_000_000, 10, 10, 10), new FormatConstraint(Bitmap.CompressFormat.JPEG), new QualityConstraint(80)); } catch (Throwable t) { DeckLog.logError(t); uploadNewAttachmentFromFile(originalFile, mimeType); @@ -489,7 +472,9 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet break; } case REQUEST_CODE_PICK_GALLERY_PERMISSION: { - if (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED && checkSelfPermission(requireActivity(), CAMERA) == PERMISSION_GRANTED) { + if (SDK_INT >= TIRAMISU && (checkSelfPermission(requireActivity(), READ_MEDIA_IMAGES) == PERMISSION_GRANTED && checkSelfPermission(requireActivity(), CAMERA) == PERMISSION_GRANTED)) { + showGalleryPicker(); + } else if (SDK_INT < TIRAMISU && (checkSelfPermission(requireActivity(), READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED && checkSelfPermission(requireActivity(), CAMERA) == PERMISSION_GRANTED)) { showGalleryPicker(); } else { Toast.makeText(requireContext(), R.string.cannot_upload_files_without_permission, Toast.LENGTH_LONG).show(); @@ -538,19 +523,8 @@ public class CardAttachmentsFragment extends Fragment implements AttachmentDelet private void applyBrand(@ColorInt int boardColor) { applyBrandToFAB(boardColor, binding.fab); - @ColorInt final int finalMainColor = DeckColorUtil.contrastRatioIsSufficient(boardColor, primaryColor) - ? boardColor - : accentColor; - final ColorStateList list = new ColorStateList( - new int[][]{ - new int[]{android.R.attr.state_checked}, - new int[]{} - }, - new int[]{ - finalMainColor, - accentColor - } - ); + @ColorInt final int finalMainColor = DeckColorUtil.contrastRatioIsSufficient(boardColor, primaryColor) ? boardColor : accentColor; + final ColorStateList list = new ColorStateList(new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}}, new int[]{finalMainColor, accentColor}); binding.bottomNavigation.setItemIconTintList(list); binding.bottomNavigation.setItemTextColor(list); adapter.applyBrand(boardColor); |