diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 24938f7..d2b2402 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + - - { + implements OnSelectionListener, OnCameraClickListener { public static final String MEDIA_FILES = "MEDIA_FILES"; public static final String SELECTED_MEDIA_FILES = "SELECTED_MEDIA_FILES"; public static final String CONFIGS = "CONFIGS"; public static final String TAG = "FilePicker"; private static final String PATH = "PATH"; private static final String URI = "URI"; - private static final int REQUEST_PERMISSION = 1; - public final String[] permissions = new String[]{ - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.CAMERA - }; + private static final int REQUEST_WRITE_PERMISSION = 1; + private static final int REQUEST_CAMERA_PERMISSION_FOR_CAMERA = 2; + private static final int REQUEST_CAMERA_PERMISSION_FOR_VIDEO = 3; private Configurations configs; private ArrayList mediaFiles = new ArrayList<>(); private FileGalleryAdapter fileGalleryAdapter; @@ -104,6 +103,7 @@ protected void onCreate(Bundle savedInstanceState) { fileGalleryAdapter.setSingleChoiceMode(isSingleChoice); fileGalleryAdapter.setMaxSelection(isSingleChoice ? 1 : configs.getMaxSelection()); fileGalleryAdapter.setSelectedItems(configs.getSelectedMediaFiles()); + fileGalleryAdapter.setOnCameraClickListener(this); RecyclerView recyclerView = findViewById(R.id.file_gallery); recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount)); recyclerView.setAdapter(fileGalleryAdapter); @@ -111,20 +111,8 @@ protected void onCreate(Bundle savedInstanceState) { recyclerView.setItemAnimator(null); if (savedInstanceState == null) { - boolean success = false; - for (String permission : permissions) { - success = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED; - if (!success) break; - } - if (success) + if (requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_WRITE_PERMISSION)) { loadFiles(false); - else if (configs.isCheckPermission()) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - requestPermissions(permissions, REQUEST_PERMISSION); - } - } else { - Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show(); - finish(); } } else { loadFiles(false); @@ -152,10 +140,18 @@ public void onResult(ArrayList filesResults) { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_PERMISSION) { - if (grantResults[0] == PackageManager.PERMISSION_GRANTED - && grantResults[1] == PackageManager.PERMISSION_GRANTED) { + if (requestCode == REQUEST_WRITE_PERMISSION) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { loadFiles(false); + } else { + Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show(); + finish(); + } + } else if (requestCode == REQUEST_CAMERA_PERMISSION_FOR_CAMERA || requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + fileGalleryAdapter.openCamera(requestCode == REQUEST_CAMERA_PERMISSION_FOR_VIDEO); + } else { + Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show(); } } } @@ -233,6 +229,29 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) { } } + @Override + public boolean onCameraClick(boolean forVideo) { + return requestPermission( + Manifest.permission.CAMERA, + forVideo ? REQUEST_CAMERA_PERMISSION_FOR_VIDEO : REQUEST_CAMERA_PERMISSION_FOR_CAMERA + ); + } + + public boolean requestPermission(String permission, int requestCode) { + if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { + if (configs.isCheckPermission()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions(new String[]{permission}, requestCode); + } + } else { + Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show(); + finish(); + } + return false; + } + return true; + } + @Override public void onSelectionBegin() { diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java index 1f909db..9f51412 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java @@ -58,6 +58,7 @@ public class FileGalleryAdapter extends MultiSelectionAdapter onSelectionListener; + private OnCameraClickListener onCameraClickListener; private boolean showCamera; private boolean showVideoCamera; private File lastCapturedFile; @@ -165,44 +166,50 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE); } - private void handleCamera(ImageView openCamera, final boolean forVideo) { + private void handleCamera(final ImageView openCamera, final boolean forVideo) { openCamera.setVisibility(View.VISIBLE); openCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent; - String fileName; - File dir; - Uri externalContentUri; - if (forVideo) { - intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); - fileName = "/VID_" + getTimeStamp() + ".mp4"; - dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES); - externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else { - intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES); - fileName = "/IMG_" + getTimeStamp() + ".jpeg"; - externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } - if (!dir.exists() && !dir.mkdir()) { - Log.d(TAG, "onClick: " + - (forVideo ? "MOVIES" : "PICTURES") + " Directory not exists"); + if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(forVideo)) return; - } - lastCapturedFile = new File(dir.getAbsolutePath() + fileName); + openCamera(forVideo); + } + }); + } - Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile); + public void openCamera(boolean forVideo) { + Intent intent; + String fileName; + File dir; + Uri externalContentUri; + if (forVideo) { + intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); + fileName = "/VID_" + getTimeStamp() + ".mp4"; + dir = getExternalStoragePublicDirectory(DIRECTORY_MOVIES); + externalContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else { + intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + dir = getExternalStoragePublicDirectory(DIRECTORY_PICTURES); + fileName = "/IMG_" + getTimeStamp() + ".jpeg"; + externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } + if (!dir.exists() && !dir.mkdir()) { + Log.d(TAG, "onClick: " + + (forVideo ? "MOVIES" : "PICTURES") + " Directory not exists"); + return; + } + lastCapturedFile = new File(dir.getAbsolutePath() + fileName); - ContentValues values = new ContentValues(); - values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath()); - values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis()); - lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values); + Uri fileUri = FilePickerProvider.getUriForFile(activity, lastCapturedFile); - intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); - activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO); - } - }); + ContentValues values = new ContentValues(); + values.put(MediaStore.MediaColumns.DATA, lastCapturedFile.getAbsolutePath()); + values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis()); + lastCapturedUri = activity.getContentResolver().insert(externalContentUri, values); + + intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); + activity.startActivityForResult(intent, CAPTURE_IMAGE_VIDEO); } private String getTimeStamp() { @@ -214,6 +221,10 @@ public void setOnSelectionListener(OnSelectionListener onSelectionLi this.onSelectionListener = onSelectionListener; } + public void setOnCameraClickListener(OnCameraClickListener onCameraClickListener) { + this.onCameraClickListener = onCameraClickListener; + } + @Override public int getItemCount() { if (showCamera) { @@ -292,4 +303,8 @@ public static class ViewHolder extends RecyclerView.ViewHolder { fileSelected = v.findViewById(R.id.file_selected); } } + + public interface OnCameraClickListener { + boolean onCameraClick(boolean forVideo); + } }