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
This commit is contained in:
Kanahia 2023-11-02 06:49:47 +05:30 committed by GitHub
parent 6f96e8959b
commit 187872114c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 108 additions and 15 deletions

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload;
import static fr.free.nrw.commons.contributions.ContributionController.ACTION_INTERNAL_UPLOADS; import static fr.free.nrw.commons.contributions.ContributionController.ACTION_INTERNAL_UPLOADS;
import static fr.free.nrw.commons.utils.PermissionUtils.PERMISSIONS_STORAGE; import static fr.free.nrw.commons.utils.PermissionUtils.PERMISSIONS_STORAGE;
import static fr.free.nrw.commons.utils.PermissionUtils.checkPermissionsAndPerformAction;
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT; import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE; import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE;
import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY; import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY;
@ -146,6 +147,23 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
*/ */
public static HashMap<Place,Boolean> nearbyPopupAnswers; public static HashMap<Place,Boolean> nearbyPopupAnswers;
/**
* A private boolean variable to control whether a permissions dialog should be shown
* when necessary. Initially, it is set to `true`, indicating that the permissions dialog
* should be displayed if permissions are missing and it is first time calling
* `checkStoragePermissions` method.
*
* This variable is used in the `checkStoragePermissions` method to determine whether to
* show a permissions dialog to the user if the required permissions are not granted.
*
* If `showPermissionsDialog` is set to `true` and the necessary permissions are missing,
* a permissions dialog will be displayed to request the required permissions. If set
* to `false`, the dialog won't be shown.
*
* @see UploadActivity#checkStoragePermissions()
*/
private boolean showPermissionsDialog = true;
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -169,7 +187,6 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
} }
locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER); locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);
locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER); locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER);
checkStoragePermissions();
} }
private void init() { private void init() {
@ -227,6 +244,12 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
return sessionManager.isUserLoggedIn(); return sessionManager.isUserLoggedIn();
} }
@Override
protected void onStart() {
super.onStart();
checkStoragePermissions();
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@ -235,6 +258,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
askUserToLogIn(); askUserToLogIn();
} }
checkBlockStatus(); checkBlockStatus();
checkStoragePermissions();
} }
/** /**
@ -255,13 +279,36 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
true))); true)));
} }
private void checkStoragePermissions() { public void checkStoragePermissions() {
// Check if all required permissions are granted
final boolean hasAllPermissions = PermissionUtils.hasPermission(this, PERMISSIONS_STORAGE); final boolean hasAllPermissions = PermissionUtils.hasPermission(this, PERMISSIONS_STORAGE);
if (hasAllPermissions) { if (hasAllPermissions) {
// All required permissions are granted, so enable UI elements and perform actions
receiveSharedItems(); receiveSharedItems();
} else if (VERSION.SDK_INT >= VERSION_CODES.M) { cvContainerTopCard.setVisibility(View.VISIBLE);
requestPermissions(PERMISSIONS_STORAGE, RequestCodes.STORAGE); } else {
// Permissions are missing
cvContainerTopCard.setVisibility(View.INVISIBLE);
if(showPermissionsDialog){
checkPermissionsAndPerformAction(this,
() -> {
cvContainerTopCard.setVisibility(View.VISIBLE);
this.receiveSharedItems();
},() -> {
this.showPermissionsDialog = true;
this.checkStoragePermissions();
},
R.string.storage_permission_title,
R.string.write_storage_permission_rationale_for_image_share,
PERMISSIONS_STORAGE);
}
} }
/* If all permissions are not granted and a dialog is already showing on screen
showPermissionsDialog will set to false making it not show dialog again onResume,
but if user Denies any permission showPermissionsDialog will be to true
and permissions dialog will be shown again.
*/
this.showPermissionsDialog = hasAllPermissions ;
} }
@Override @Override
@ -721,6 +768,25 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
} }
} }
/**
* Get the value of the showPermissionDialog variable.
*
* @return {@code true} if Permission Dialog should be shown, {@code false} otherwise.
*/
public boolean isShowPermissionsDialog() {
return showPermissionsDialog;
}
/**
* Set the value of the showPermissionDialog variable.
*
* @param showPermissionsDialog {@code true} to indicate to show
* Permissions Dialog if permissions are missing, {@code false} otherwise.
*/
public void setShowPermissionsDialog(final boolean showPermissionsDialog) {
this.showPermissionsDialog = showPermissionsDialog;
}
/** /**
* Overrides the back button to make sure the user is prepared to lose their progress * Overrides the back button to make sure the user is prepared to lose their progress
*/ */

View file

@ -7,6 +7,7 @@ import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.Settings; import android.provider.Settings;
import android.widget.Toast;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.karumi.dexter.Dexter; import com.karumi.dexter.Dexter;
@ -16,6 +17,7 @@ import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.upload.UploadActivity;
import java.util.List; import java.util.List;
@ -80,14 +82,14 @@ public class PermissionUtils {
* <p> * <p>
* Sample usage: * Sample usage:
* <p> * <p>
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE, * PermissionUtils.checkPermissionsAndPerformAction(activity,
* () -> initiateCameraUpload(activity), R.string.storage_permission_title, * Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity),
* R.string.write_storage_permission_rationale); * R.string.storage_permission_title, R.string.write_storage_permission_rationale);
* <p> * <p>
* If you don't want the permission rationale to be shown then use: * If you don't want the permission rationale to be shown then use:
* <p> * <p>
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE, * PermissionUtils.checkPermissionsAndPerformAction(activity,
* () -> initiateCameraUpload(activity), - 1, -1); * Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity), - 1, -1);
* *
* @param activity activity requesting permissions * @param activity activity requesting permissions
* @param permissions the permissions array being requests * @param permissions the permissions array being requests
@ -110,8 +112,9 @@ public class PermissionUtils {
* <p> * <p>
* Sample usage: * Sample usage:
* <p> * <p>
* PermissionUtils.checkPermissionsAndPerformAction(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE, * PermissionUtils.checkPermissionsAndPerformAction(activity,
* () -> initiateCameraUpload(activity), () -> showMessage(), R.string.storage_permission_title, * Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> initiateCameraUpload(activity), () ->
* showMessage(), R.string.storage_permission_title,
* R.string.write_storage_permission_rationale); * R.string.write_storage_permission_rationale);
* *
* @param activity activity requesting permissions * @param activity activity requesting permissions
@ -138,8 +141,15 @@ public class PermissionUtils {
// permission is denied permanently, we will show user a dialog message. // permission is denied permanently, we will show user a dialog message.
DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle), DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle),
activity.getString(rationaleMessage), activity.getString(rationaleMessage),
activity.getString(R.string.navigation_item_settings), null, activity.getString(R.string.navigation_item_settings),
() -> askUserToManuallyEnablePermissionFromSettings(activity), null); null,
() -> {
askUserToManuallyEnablePermissionFromSettings(activity);
if (activity instanceof UploadActivity) {
((UploadActivity) activity).setShowPermissionsDialog(true);
}
}, null, null,
!(activity instanceof UploadActivity));
} else { } else {
if (null != onPermissionDenied) { if (null != onPermissionDenied) {
onPermissionDenied.run(); onPermissionDenied.run();
@ -158,8 +168,24 @@ public class PermissionUtils {
activity.getString(rationaleMessage), activity.getString(rationaleMessage),
activity.getString(android.R.string.ok), activity.getString(android.R.string.ok),
activity.getString(android.R.string.cancel), activity.getString(android.R.string.cancel),
token::continuePermissionRequest, () -> {
token::cancelPermissionRequest, if (activity instanceof UploadActivity) {
((UploadActivity) activity).setShowPermissionsDialog(true);
}
token.continuePermissionRequest();
}
,
() -> {
Toast.makeText(activity.getApplicationContext(),
R.string.permissions_are_required_for_functionality,
Toast.LENGTH_LONG)
.show();
token.cancelPermissionRequest();
if (activity instanceof UploadActivity) {
activity.finish();
}
}
,
null, null,
false); false);
} }

View file

@ -778,6 +778,7 @@ Upload your first media by tapping on the add button.</string>
<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> <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>
<string name="storage_permissions_denied">Storage Permissions Denied</string> <string name="storage_permissions_denied">Storage Permissions Denied</string>
<string name="unable_to_share_upload_item">Unable to share this item</string> <string name="unable_to_share_upload_item">Unable to share this item</string>
<string name="permissions_are_required_for_functionality">Permissions are required for functionality</string>
<plurals name="custom_picker_images_selected_title_appendix"> <plurals name="custom_picker_images_selected_title_appendix">
<item quantity="one">%d image selected</item> <item quantity="one">%d image selected</item>
<item quantity="other">%d images selected</item> <item quantity="other">%d images selected</item>