Skip to content

Commit 1878721

Browse files
authored
Fixed Grey empty screen at Upload wizard (#5356)
* Fixed Grey empty screen at Upload wizard caption step after denying files permission * Empty commit * Fixed loop issue * Created docs for earlier commits * Fixed javadoc * Fixed spaces
1 parent 6f96e89 commit 1878721

File tree

3 files changed

+108
-15
lines changed

3 files changed

+108
-15
lines changed

app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java

+70-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static fr.free.nrw.commons.contributions.ContributionController.ACTION_INTERNAL_UPLOADS;
44
import static fr.free.nrw.commons.utils.PermissionUtils.PERMISSIONS_STORAGE;
5+
import static fr.free.nrw.commons.utils.PermissionUtils.checkPermissionsAndPerformAction;
56
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
67
import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE;
78
import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY;
@@ -146,6 +147,23 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
146147
*/
147148
public static HashMap<Place,Boolean> nearbyPopupAnswers;
148149

150+
/**
151+
* A private boolean variable to control whether a permissions dialog should be shown
152+
* when necessary. Initially, it is set to `true`, indicating that the permissions dialog
153+
* should be displayed if permissions are missing and it is first time calling
154+
* `checkStoragePermissions` method.
155+
*
156+
* This variable is used in the `checkStoragePermissions` method to determine whether to
157+
* show a permissions dialog to the user if the required permissions are not granted.
158+
*
159+
* If `showPermissionsDialog` is set to `true` and the necessary permissions are missing,
160+
* a permissions dialog will be displayed to request the required permissions. If set
161+
* to `false`, the dialog won't be shown.
162+
*
163+
* @see UploadActivity#checkStoragePermissions()
164+
*/
165+
private boolean showPermissionsDialog = true;
166+
149167
@SuppressLint("CheckResult")
150168
@Override
151169
protected void onCreate(Bundle savedInstanceState) {
@@ -169,7 +187,6 @@ protected void onCreate(Bundle savedInstanceState) {
169187
}
170188
locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);
171189
locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER);
172-
checkStoragePermissions();
173190
}
174191

175192
private void init() {
@@ -227,6 +244,12 @@ public boolean isLoggedIn() {
227244
return sessionManager.isUserLoggedIn();
228245
}
229246

247+
@Override
248+
protected void onStart() {
249+
super.onStart();
250+
checkStoragePermissions();
251+
}
252+
230253
@Override
231254
protected void onResume() {
232255
super.onResume();
@@ -235,6 +258,7 @@ protected void onResume() {
235258
askUserToLogIn();
236259
}
237260
checkBlockStatus();
261+
checkStoragePermissions();
238262
}
239263

240264
/**
@@ -255,13 +279,36 @@ protected void checkBlockStatus() {
255279
true)));
256280
}
257281

258-
private void checkStoragePermissions() {
282+
public void checkStoragePermissions() {
283+
// Check if all required permissions are granted
259284
final boolean hasAllPermissions = PermissionUtils.hasPermission(this, PERMISSIONS_STORAGE);
260285
if (hasAllPermissions) {
286+
// All required permissions are granted, so enable UI elements and perform actions
261287
receiveSharedItems();
262-
} else if (VERSION.SDK_INT >= VERSION_CODES.M) {
263-
requestPermissions(PERMISSIONS_STORAGE, RequestCodes.STORAGE);
288+
cvContainerTopCard.setVisibility(View.VISIBLE);
289+
} else {
290+
// Permissions are missing
291+
cvContainerTopCard.setVisibility(View.INVISIBLE);
292+
if(showPermissionsDialog){
293+
checkPermissionsAndPerformAction(this,
294+
() -> {
295+
cvContainerTopCard.setVisibility(View.VISIBLE);
296+
this.receiveSharedItems();
297+
},() -> {
298+
this.showPermissionsDialog = true;
299+
this.checkStoragePermissions();
300+
},
301+
R.string.storage_permission_title,
302+
R.string.write_storage_permission_rationale_for_image_share,
303+
PERMISSIONS_STORAGE);
304+
}
264305
}
306+
/* If all permissions are not granted and a dialog is already showing on screen
307+
showPermissionsDialog will set to false making it not show dialog again onResume,
308+
but if user Denies any permission showPermissionsDialog will be to true
309+
and permissions dialog will be shown again.
310+
*/
311+
this.showPermissionsDialog = hasAllPermissions ;
265312
}
266313

267314
@Override
@@ -721,6 +768,25 @@ protected void onDestroy() {
721768
}
722769
}
723770

771+
/**
772+
* Get the value of the showPermissionDialog variable.
773+
*
774+
* @return {@code true} if Permission Dialog should be shown, {@code false} otherwise.
775+
*/
776+
public boolean isShowPermissionsDialog() {
777+
return showPermissionsDialog;
778+
}
779+
780+
/**
781+
* Set the value of the showPermissionDialog variable.
782+
*
783+
* @param showPermissionsDialog {@code true} to indicate to show
784+
* Permissions Dialog if permissions are missing, {@code false} otherwise.
785+
*/
786+
public void setShowPermissionsDialog(final boolean showPermissionsDialog) {
787+
this.showPermissionsDialog = showPermissionsDialog;
788+
}
789+
724790
/**
725791
* Overrides the back button to make sure the user is prepared to lose their progress
726792
*/

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

+37-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.net.Uri;
88
import android.os.Build;
99
import android.provider.Settings;
10+
import android.widget.Toast;
1011
import androidx.annotation.StringRes;
1112
import androidx.core.content.ContextCompat;
1213
import com.karumi.dexter.Dexter;
@@ -16,6 +17,7 @@
1617
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
1718
import fr.free.nrw.commons.CommonsApplication;
1819
import fr.free.nrw.commons.R;
20+
import fr.free.nrw.commons.upload.UploadActivity;
1921
import java.util.List;
2022

2123

@@ -80,14 +82,14 @@ public static boolean hasPermission(Activity activity, String permissions[]) {
8082
* <p>
8183
* Sample usage:
8284
* <p>
83-
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
84-
* () -> initiateCameraUpload(activity), R.string.storage_permission_title,
85-
* R.string.write_storage_permission_rationale);
85+
* PermissionUtils.checkPermissionsAndPerformAction(activity,
86+
* Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity),
87+
* R.string.storage_permission_title, R.string.write_storage_permission_rationale);
8688
* <p>
8789
* If you don't want the permission rationale to be shown then use:
8890
* <p>
89-
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
90-
* () -> initiateCameraUpload(activity), - 1, -1);
91+
* PermissionUtils.checkPermissionsAndPerformAction(activity,
92+
* Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity), - 1, -1);
9193
*
9294
* @param activity activity requesting permissions
9395
* @param permissions the permissions array being requests
@@ -110,8 +112,9 @@ public static void checkPermissionsAndPerformAction(Activity activity,
110112
* <p>
111113
* Sample usage:
112114
* <p>
113-
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
114-
* () -> initiateCameraUpload(activity), () -> showMessage(), R.string.storage_permission_title,
115+
* PermissionUtils.checkPermissionsAndPerformAction(activity,
116+
* Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity), () ->
117+
* showMessage(), R.string.storage_permission_title,
115118
* R.string.write_storage_permission_rationale);
116119
*
117120
* @param activity activity requesting permissions
@@ -138,8 +141,15 @@ public void onPermissionsChecked(MultiplePermissionsReport report) {
138141
// permission is denied permanently, we will show user a dialog message.
139142
DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle),
140143
activity.getString(rationaleMessage),
141-
activity.getString(R.string.navigation_item_settings), null,
142-
() -> askUserToManuallyEnablePermissionFromSettings(activity), null);
144+
activity.getString(R.string.navigation_item_settings),
145+
null,
146+
() -> {
147+
askUserToManuallyEnablePermissionFromSettings(activity);
148+
if (activity instanceof UploadActivity) {
149+
((UploadActivity) activity).setShowPermissionsDialog(true);
150+
}
151+
}, null, null,
152+
!(activity instanceof UploadActivity));
143153
} else {
144154
if (null != onPermissionDenied) {
145155
onPermissionDenied.run();
@@ -158,8 +168,24 @@ public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissio
158168
activity.getString(rationaleMessage),
159169
activity.getString(android.R.string.ok),
160170
activity.getString(android.R.string.cancel),
161-
token::continuePermissionRequest,
162-
token::cancelPermissionRequest,
171+
() -> {
172+
if (activity instanceof UploadActivity) {
173+
((UploadActivity) activity).setShowPermissionsDialog(true);
174+
}
175+
token.continuePermissionRequest();
176+
}
177+
,
178+
() -> {
179+
Toast.makeText(activity.getApplicationContext(),
180+
R.string.permissions_are_required_for_functionality,
181+
Toast.LENGTH_LONG)
182+
.show();
183+
token.cancelPermissionRequest();
184+
if (activity instanceof UploadActivity) {
185+
activity.finish();
186+
}
187+
}
188+
,
163189
null,
164190
false);
165191
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,7 @@ Upload your first media by tapping on the add button.</string>
778778
<string name="similar_coordinate_description_auto_set">The coordinates are not the exact coordinates, but the person who uploaded this picture thinks they are close enough.</string>
779779
<string name="storage_permissions_denied">Storage Permissions Denied</string>
780780
<string name="unable_to_share_upload_item">Unable to share this item</string>
781+
<string name="permissions_are_required_for_functionality">Permissions are required for functionality</string>
781782
<plurals name="custom_picker_images_selected_title_appendix">
782783
<item quantity="one">%d image selected</item>
783784
<item quantity="other">%d images selected</item>

0 commit comments

Comments
 (0)