Skip to content

Commit d5717ca

Browse files
Bug Fix issue commons-app#2648
* Handled external storage permission before file download
1 parent e9b696c commit d5717ca

File tree

3 files changed

+77
-22
lines changed

3 files changed

+77
-22
lines changed

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

+19-19
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import android.os.Bundle;
1010
import android.os.Environment;
1111
import android.os.Handler;
12-
import android.support.design.widget.Snackbar;
13-
import android.support.v4.app.ActivityCompat;
1412
import android.support.v4.app.Fragment;
1513
import android.support.v4.app.FragmentManager;
1614
import android.support.v4.app.FragmentStatePagerAdapter;
@@ -23,10 +21,6 @@
2321
import android.view.View;
2422
import android.view.ViewGroup;
2523
import android.widget.Toast;
26-
27-
import javax.inject.Inject;
28-
import javax.inject.Named;
29-
3024
import butterknife.BindView;
3125
import butterknife.ButterKnife;
3226
import fr.free.nrw.commons.Media;
@@ -43,10 +37,13 @@
4337
import fr.free.nrw.commons.mwapi.MediaWikiApi;
4438
import fr.free.nrw.commons.utils.ImageUtils;
4539
import fr.free.nrw.commons.utils.NetworkUtils;
40+
import fr.free.nrw.commons.utils.PermissionUtils;
4641
import fr.free.nrw.commons.utils.ViewUtil;
42+
import javax.inject.Inject;
43+
import javax.inject.Named;
4744
import timber.log.Timber;
4845

49-
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
46+
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
5047
import static android.content.Context.DOWNLOAD_SERVICE;
5148
import static android.content.Intent.ACTION_VIEW;
5249
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -238,19 +235,22 @@ private void downloadMedia(Media m) {
238235
req.allowScanningByMediaScanner();
239236
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
240237

241-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
242-
ContextCompat.checkSelfPermission(getContext(), READ_EXTERNAL_STORAGE)
243-
!= PERMISSION_GRANTED
244-
&& getView() != null) {
245-
Snackbar.make(getView(), R.string.read_storage_permission_rationale,
246-
Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok,
247-
view -> ActivityCompat.requestPermissions(getActivity(),
248-
new String[]{READ_EXTERNAL_STORAGE}, 1)).show();
238+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
239+
&& ContextCompat.checkSelfPermission(getContext(), WRITE_EXTERNAL_STORAGE)
240+
!= PERMISSION_GRANTED
241+
&& getView() != null) {
242+
PermissionUtils.checkPermissionsAndPerformAction(getActivity(), WRITE_EXTERNAL_STORAGE,
243+
() -> enqueueRequest(req), () -> Toast.makeText(getContext(),R.string.donwload_failed_we_cannot_download_the_file_without_storage_permission,Toast.LENGTH_SHORT).show(), R.string.storage_permission, R.string.write_storage_permission_rationale);
249244
} else {
250-
DownloadManager systemService = (DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE);
251-
if (systemService != null) {
252-
systemService.enqueue(req);
253-
}
245+
enqueueRequest(req);
246+
}
247+
}
248+
249+
private void enqueueRequest(DownloadManager.Request req) {
250+
DownloadManager systemService =
251+
(DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE);
252+
if (systemService != null) {
253+
systemService.enqueue(req);
254254
}
255255
}
256256

app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java

+56-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77
import android.provider.Settings;
88
import android.support.annotation.StringRes;
99
import android.support.v4.content.ContextCompat;
10-
1110
import com.karumi.dexter.Dexter;
1211
import com.karumi.dexter.PermissionToken;
1312
import com.karumi.dexter.listener.PermissionDeniedResponse;
1413
import com.karumi.dexter.listener.PermissionGrantedResponse;
1514
import com.karumi.dexter.listener.PermissionRequest;
1615
import com.karumi.dexter.listener.single.BasePermissionListener;
17-
1816
import fr.free.nrw.commons.CommonsApplication;
1917
import fr.free.nrw.commons.R;
2018

@@ -102,4 +100,60 @@ public void onPermissionRationaleShouldBeShown(PermissionRequest permission, Per
102100
}
103101
}).check();
104102
}
103+
104+
/**
105+
* Checks for a particular permission and runs the corresponding runnables to perform an action when the permission is granted/denied
106+
* Also, it shows a rationale if needed
107+
*
108+
* Sample usage:
109+
*
110+
* PermissionUtils.checkPermissionsAndPerformAction(activity,
111+
* Manifest.permission.WRITE_EXTERNAL_STORAGE,
112+
* () -> initiateCameraUpload(activity),
113+
* () -> showMessage(),
114+
* R.string.storage_permission_title,
115+
* R.string.write_storage_permission_rationale);
116+
*
117+
*
118+
* @param activity activity requesting permissions
119+
* @param permission the permission being requests
120+
* @param onPermissionGranted the runnable to be executed when the permission is granted
121+
* @param onPermissionDenied the runnable to be executed when the permission is denied(but not permanently)
122+
* @param rationaleTitle rationale title to be displayed when permission was denied
123+
* @param rationaleMessage rationale message to be displayed when permission was denied
124+
*/
125+
126+
public static void checkPermissionsAndPerformAction(Activity activity, String permission,
127+
Runnable onPermissionGranted, Runnable onPermissionDenied, @StringRes int rationaleTitle,
128+
@StringRes int rationaleMessage) {
129+
Dexter.withActivity(activity)
130+
.withPermission(permission)
131+
.withListener(new BasePermissionListener() {
132+
@Override public void onPermissionGranted(PermissionGrantedResponse response) {
133+
onPermissionGranted.run();
134+
}
135+
136+
@Override public void onPermissionDenied(PermissionDeniedResponse response) {
137+
if (response.isPermanentlyDenied()) {
138+
DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle),
139+
activity.getString(rationaleMessage),
140+
activity.getString(R.string.navigation_item_settings), null,
141+
() -> askUserToManuallyEnablePermissionFromSettings(activity), null);
142+
} else {
143+
onPermissionDenied.run();
144+
}
145+
}
146+
147+
@Override
148+
public void onPermissionRationaleShouldBeShown(PermissionRequest permission,
149+
PermissionToken token) {
150+
DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle),
151+
activity.getString(rationaleMessage),
152+
activity.getString(android.R.string.ok),
153+
activity.getString(android.R.string.cancel),
154+
token::continuePermissionRequest, token::cancelPermissionRequest);
155+
}
156+
})
157+
.check();
158+
}
105159
}

app/src/main/res/values/strings.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@
165165
<string name="menu_refresh">Refresh</string>
166166
<string name="storage_permission_title">Requesting Storage Permission</string>
167167
<string name="read_storage_permission_rationale">Required permission: Read external storage. App cannot access your gallery without this.</string>
168-
<string name="write_storage_permission_rationale">Required permission: Write external storage. App cannot access your camera without this.</string>
168+
<string name="write_storage_permission_rationale">Required permission: Write external storage. App cannot access your camera/gallery without this.</string>
169169
<string name="location_permission_rationale">Optional permission: Get current location for category suggestions</string>
170170
<string name="ok">OK</string>
171171
<string name="title_activity_nearby">Nearby Places</string>
@@ -472,4 +472,5 @@ Upload your first media by touching the camera or gallery icon above.</string>
472472
<string name="image_chooser_title">Choose Images to upload</string>
473473

474474
<string name="please_wait">Please wait…</string>
475+
<string name="donwload_failed_we_cannot_download_the_file_without_storage_permission">Download Failed!!. We cannot download the file without external storage permission.</string>
475476
</resources>

0 commit comments

Comments
 (0)