mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
Fixes multiple dialog boxes
This commit is contained in:
parent
2862cf80fa
commit
82730d9b0c
1 changed files with 94 additions and 16 deletions
|
|
@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
|
@ -16,7 +17,9 @@ import android.support.annotation.RequiresApi;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
import android.support.graphics.drawable.VectorDrawableCompat;
|
import android.support.graphics.drawable.VectorDrawableCompat;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
@ -46,11 +49,14 @@ import fr.free.nrw.commons.caching.CacheController;
|
||||||
import fr.free.nrw.commons.category.CategorizationFragment;
|
import fr.free.nrw.commons.category.CategorizationFragment;
|
||||||
import fr.free.nrw.commons.category.OnCategoriesSaveHandler;
|
import fr.free.nrw.commons.category.OnCategoriesSaveHandler;
|
||||||
import fr.free.nrw.commons.contributions.Contribution;
|
import fr.free.nrw.commons.contributions.Contribution;
|
||||||
|
import fr.free.nrw.commons.contributions.ContributionsActivity;
|
||||||
import fr.free.nrw.commons.modifications.CategoryModifier;
|
import fr.free.nrw.commons.modifications.CategoryModifier;
|
||||||
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
|
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
|
||||||
import fr.free.nrw.commons.modifications.ModifierSequence;
|
import fr.free.nrw.commons.modifications.ModifierSequence;
|
||||||
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
|
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
|
||||||
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
|
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
|
||||||
|
import fr.free.nrw.commons.mwapi.EventLog;
|
||||||
|
import fr.free.nrw.commons.utils.ImageUtils;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
|
@ -64,7 +70,7 @@ import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE;
|
||||||
public class ShareActivity
|
public class ShareActivity
|
||||||
extends AuthenticatedActivity
|
extends AuthenticatedActivity
|
||||||
implements SingleUploadFragment.OnUploadActionInitiated,
|
implements SingleUploadFragment.OnUploadActionInitiated,
|
||||||
OnCategoriesSaveHandler {
|
OnCategoriesSaveHandler,SimilarImageDialogFragment.onResponse {
|
||||||
|
|
||||||
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
|
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
|
||||||
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
|
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
|
||||||
|
|
@ -96,6 +102,7 @@ public class ShareActivity
|
||||||
private boolean cacheFound;
|
private boolean cacheFound;
|
||||||
|
|
||||||
private GPSExtractor imageObj;
|
private GPSExtractor imageObj;
|
||||||
|
private GPSExtractor tempImageObj;
|
||||||
private String decimalCoords;
|
private String decimalCoords;
|
||||||
|
|
||||||
private boolean useNewPermissions = false;
|
private boolean useNewPermissions = false;
|
||||||
|
|
@ -106,7 +113,7 @@ public class ShareActivity
|
||||||
private String description;
|
private String description;
|
||||||
private Snackbar snackbar;
|
private Snackbar snackbar;
|
||||||
private boolean duplicateCheckPassed = false;
|
private boolean duplicateCheckPassed = false;
|
||||||
|
private boolean haveCheckedForOtherImages = false;
|
||||||
/**
|
/**
|
||||||
* Called when user taps the submit button.
|
* Called when user taps the submit button.
|
||||||
*/
|
*/
|
||||||
|
|
@ -285,7 +292,7 @@ public class ShareActivity
|
||||||
REQUEST_PERM_ON_CREATE_LOCATION);
|
REQUEST_PERM_ON_CREATE_LOCATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
|
|
||||||
|
|
||||||
SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView");
|
SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView");
|
||||||
|
|
@ -309,7 +316,7 @@ public class ShareActivity
|
||||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
backgroundImageView.setImageURI(mediaUri);
|
backgroundImageView.setImageURI(mediaUri);
|
||||||
storagePermitted = true;
|
storagePermitted = true;
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -317,7 +324,7 @@ public class ShareActivity
|
||||||
if (grantResults.length >= 1
|
if (grantResults.length >= 1
|
||||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
locationPermitted = true;
|
locationPermitted = true;
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -326,12 +333,12 @@ public class ShareActivity
|
||||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
backgroundImageView.setImageURI(mediaUri);
|
backgroundImageView.setImageURI(mediaUri);
|
||||||
storagePermitted = true;
|
storagePermitted = true;
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
}
|
}
|
||||||
if (grantResults.length >= 2
|
if (grantResults.length >= 2
|
||||||
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
|
||||||
locationPermitted = true;
|
locationPermitted = true;
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +349,7 @@ public class ShareActivity
|
||||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
//It is OK to call this at both (1) and (4) because if perm had been granted at
|
//It is OK to call this at both (1) and (4) because if perm had been granted at
|
||||||
//snackbar, user should not be prompted at submit button
|
//snackbar, user should not be prompted at submit button
|
||||||
performPreuploadProcessingOfFile();
|
performPreUploadProcessingOfFile();
|
||||||
|
|
||||||
//Uploading only begins if storage permission granted from arrow icon
|
//Uploading only begins if storage permission granted from arrow icon
|
||||||
uploadBegins();
|
uploadBegins();
|
||||||
|
|
@ -353,7 +360,7 @@ public class ShareActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void performPreuploadProcessingOfFile() {
|
private void performPreUploadProcessingOfFile() {
|
||||||
if (!useNewPermissions || storagePermitted) {
|
if (!useNewPermissions || storagePermitted) {
|
||||||
if (!duplicateCheckPassed) {
|
if (!duplicateCheckPassed) {
|
||||||
//Test SHA1 of image to see if it matches SHA1 of a file on Commons
|
//Test SHA1 of image to see if it matches SHA1 of a file on Commons
|
||||||
|
|
@ -368,7 +375,17 @@ public class ShareActivity
|
||||||
Timber.d("%s duplicate check: %s", mediaUri.toString(), result);
|
Timber.d("%s duplicate check: %s", mediaUri.toString(), result);
|
||||||
duplicateCheckPassed = (result == DUPLICATE_PROCEED
|
duplicateCheckPassed = (result == DUPLICATE_PROCEED
|
||||||
|| result == NO_DUPLICATE);
|
|| result == NO_DUPLICATE);
|
||||||
}, mwApi);
|
/*
|
||||||
|
TODO: 16/9/17 should we run DetectUnwantedPicturesAsync if DUPLICATE_PROCEED is returned? Since that means
|
||||||
|
we are processing images that are already on server???...
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (duplicateCheckPassed) {
|
||||||
|
//image can be uploaded, so now check if its a useless picture or not
|
||||||
|
performUnwantedPictureDetectionProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
},mwApi);
|
||||||
fileAsyncTask.execute();
|
fileAsyncTask.execute();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Timber.d(e, "IO Exception: ");
|
Timber.d(e, "IO Exception: ");
|
||||||
|
|
@ -382,6 +399,37 @@ public class ShareActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void performUnwantedPictureDetectionProcess() {
|
||||||
|
String imageMediaFilePath = FileUtils.getPath(this,mediaUri);
|
||||||
|
DetectUnwantedPicturesAsync detectUnwantedPicturesAsync = new DetectUnwantedPicturesAsync(imageMediaFilePath, result -> {
|
||||||
|
|
||||||
|
if (result != ImageUtils.Result.IMAGE_OK) {
|
||||||
|
//show appropriate error message
|
||||||
|
String errorMessage = result == ImageUtils.Result.IMAGE_DARK ? getString(R.string.upload_image_too_dark) : getString(R.string.upload_image_blurry);
|
||||||
|
AlertDialog.Builder errorDialogBuilder = new AlertDialog.Builder(this);
|
||||||
|
errorDialogBuilder.setMessage(errorMessage);
|
||||||
|
errorDialogBuilder.setTitle(getString(R.string.warning));
|
||||||
|
errorDialogBuilder.setPositiveButton(getString(R.string.no), (dialogInterface, i) -> {
|
||||||
|
//user does not wish to upload the picture, take them back to ContributionsActivity
|
||||||
|
Intent intent = new Intent(ShareActivity.this, ContributionsActivity.class);
|
||||||
|
dialogInterface.dismiss();
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
errorDialogBuilder.setNegativeButton(getString(R.string.yes), (dialogInterface, i) -> {
|
||||||
|
//user wishes to go ahead with the upload of this picture, just dismiss this dialog
|
||||||
|
dialogInterface.dismiss();
|
||||||
|
});
|
||||||
|
|
||||||
|
AlertDialog errorDialog = errorDialogBuilder.create();
|
||||||
|
if (!isFinishing()) {
|
||||||
|
errorDialog.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
detectUnwantedPicturesAsync.execute();
|
||||||
|
}
|
||||||
|
|
||||||
private Snackbar requestPermissionUsingSnackBar(String rationale,
|
private Snackbar requestPermissionUsingSnackBar(String rationale,
|
||||||
final String[] perms,
|
final String[] perms,
|
||||||
final int code) {
|
final int code) {
|
||||||
|
|
@ -463,9 +511,14 @@ public class ShareActivity
|
||||||
// Check if the location is from GPS or EXIF
|
// Check if the location is from GPS or EXIF
|
||||||
// Find other photos taken around the same time which has gps coordinates
|
// Find other photos taken around the same time which has gps coordinates
|
||||||
Timber.d("EXIF:false");
|
Timber.d("EXIF:false");
|
||||||
findOtherImages(gpsEnabled);
|
Timber.d("EXIF call"+(imageObj==tempImageObj));
|
||||||
|
if(!haveCheckedForOtherImages)
|
||||||
|
findOtherImages(gpsEnabled);// Do not do repeat the process
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// As the selected image has GPS data in EXIF go ahead with the same.
|
||||||
|
useImageCoords();
|
||||||
}
|
}
|
||||||
useImageCoords();
|
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Timber.w("File not found: " + mediaUri, e);
|
Timber.w("File not found: " + mediaUri, e);
|
||||||
|
|
@ -477,15 +530,14 @@ public class ShareActivity
|
||||||
String filePath = getPathOfMediaOrCopy();
|
String filePath = getPathOfMediaOrCopy();
|
||||||
long timeOfCreation = new File(filePath).lastModified();//Time when the original image was created
|
long timeOfCreation = new File(filePath).lastModified();//Time when the original image was created
|
||||||
File folder = new File(filePath.substring(0,filePath.lastIndexOf('/')));
|
File folder = new File(filePath.substring(0,filePath.lastIndexOf('/')));
|
||||||
// Timber.d("folderath"+folderPath);
|
|
||||||
File[] files = folder.listFiles();
|
File[] files = folder.listFiles();
|
||||||
Timber.d("folder:"+files.length);
|
Timber.d("folderTime Number:"+files.length);
|
||||||
|
|
||||||
for(File file : files){
|
for(File file : files){
|
||||||
if(file.lastModified()-timeOfCreation<=(120*1000) && file.lastModified()-timeOfCreation>=-(120*1000)){
|
if(file.lastModified()-timeOfCreation<=(120*1000) && file.lastModified()-timeOfCreation>=-(120*1000)){
|
||||||
//Make sure the photos were taken within 20seconds
|
//Make sure the photos were taken within 20seconds
|
||||||
Timber.d("fild date:"+file.lastModified()+ " time of creation"+timeOfCreation);
|
Timber.d("fild date:"+file.lastModified()+ " time of creation"+timeOfCreation);
|
||||||
GPSExtractor tempImageObj = null;//Temporary GPSExtractor to extract coords from these photos
|
tempImageObj = null;//Temporary GPSExtractor to extract coords from these photos
|
||||||
ParcelFileDescriptor descriptor
|
ParcelFileDescriptor descriptor
|
||||||
= null;
|
= null;
|
||||||
try {
|
try {
|
||||||
|
|
@ -508,12 +560,38 @@ public class ShareActivity
|
||||||
if(tempImageObj.getCoords(gpsEnabled)!=null && tempImageObj.imageCoordsExists){
|
if(tempImageObj.getCoords(gpsEnabled)!=null && tempImageObj.imageCoordsExists){
|
||||||
// Current image has gps coordinates and it's not current gps locaiton
|
// Current image has gps coordinates and it's not current gps locaiton
|
||||||
Timber.d("This fild has image coords:"+ file.getAbsolutePath());
|
Timber.d("This fild has image coords:"+ file.getAbsolutePath());
|
||||||
|
// Create a dialog fragment for the suggestion
|
||||||
|
FragmentManager fragmentManager = getSupportFragmentManager();
|
||||||
|
SimilarImageDialogFragment newFragment = new SimilarImageDialogFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString("originalImagePath",filePath);
|
||||||
|
args.putString("possibleImagePath",file.getAbsolutePath());
|
||||||
|
newFragment.setArguments(args);
|
||||||
|
newFragment.show(fragmentManager, "dialog");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
haveCheckedForOtherImages = true; //Finished checking for other images
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPostiveResponse() {
|
||||||
|
imageObj = tempImageObj;
|
||||||
|
decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data
|
||||||
|
Timber.d("EXIF from tempImageObj");
|
||||||
|
useImageCoords();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNegativeResponse() {
|
||||||
|
Timber.d("EXIF from imageObj");
|
||||||
|
useImageCoords();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -523,7 +601,7 @@ public class ShareActivity
|
||||||
public void useImageCoords() {
|
public void useImageCoords() {
|
||||||
if (decimalCoords != null) {
|
if (decimalCoords != null) {
|
||||||
Timber.d("Decimal coords of image: %s", decimalCoords);
|
Timber.d("Decimal coords of image: %s", decimalCoords);
|
||||||
Timber.d("is EXIF data present:"+imageObj.imageCoordsExists);
|
Timber.d("is EXIF data present:"+imageObj.imageCoordsExists+" from findOther image:"+(imageObj==tempImageObj));
|
||||||
|
|
||||||
// Only set cache for this point if image has coords
|
// Only set cache for this point if image has coords
|
||||||
if (imageObj.imageCoordsExists) {
|
if (imageObj.imageCoordsExists) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue