From 82730d9b0c5f0a0d4e06a4442dbcfd1d77e54911 Mon Sep 17 00:00:00 2001 From: harisankerPradeep Date: Sat, 17 Feb 2018 02:33:54 +0530 Subject: [PATCH] Fixes multiple dialog boxes --- .../nrw/commons/upload/ShareActivity.java | 110 +++++++++++++++--- 1 file changed, 94 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index c0f75107b..a5756c06b 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload; import android.Manifest; import android.content.ContentResolver; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -16,7 +17,9 @@ import android.support.annotation.RequiresApi; import android.support.design.widget.Snackbar; import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; import android.view.MenuItem; import android.view.View; 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.OnCategoriesSaveHandler; 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.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.ModifierSequenceDao; 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 timber.log.Timber; @@ -64,7 +70,7 @@ import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; public class ShareActivity extends AuthenticatedActivity 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_LOCATION = 2; @@ -96,6 +102,7 @@ public class ShareActivity private boolean cacheFound; private GPSExtractor imageObj; + private GPSExtractor tempImageObj; private String decimalCoords; private boolean useNewPermissions = false; @@ -106,7 +113,7 @@ public class ShareActivity private String description; private Snackbar snackbar; private boolean duplicateCheckPassed = false; - + private boolean haveCheckedForOtherImages = false; /** * Called when user taps the submit button. */ @@ -285,7 +292,7 @@ public class ShareActivity REQUEST_PERM_ON_CREATE_LOCATION); } } - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); @@ -309,7 +316,7 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { backgroundImageView.setImageURI(mediaUri); storagePermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -317,7 +324,7 @@ public class ShareActivity if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { locationPermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -326,12 +333,12 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { backgroundImageView.setImageURI(mediaUri); storagePermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } if (grantResults.length >= 2 && grantResults[1] == PackageManager.PERMISSION_GRANTED) { locationPermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -342,7 +349,7 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //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 - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); //Uploading only begins if storage permission granted from arrow icon uploadBegins(); @@ -353,7 +360,7 @@ public class ShareActivity } } - private void performPreuploadProcessingOfFile() { + private void performPreUploadProcessingOfFile() { if (!useNewPermissions || storagePermitted) { if (!duplicateCheckPassed) { //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); duplicateCheckPassed = (result == DUPLICATE_PROCEED || 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(); } catch (IOException e) { 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, final String[] perms, final int code) { @@ -463,9 +511,14 @@ public class ShareActivity // Check if the location is from GPS or EXIF // Find other photos taken around the same time which has gps coordinates 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) { Timber.w("File not found: " + mediaUri, e); @@ -477,15 +530,14 @@ public class ShareActivity String filePath = getPathOfMediaOrCopy(); long timeOfCreation = new File(filePath).lastModified();//Time when the original image was created File folder = new File(filePath.substring(0,filePath.lastIndexOf('/'))); -// Timber.d("folderath"+folderPath); File[] files = folder.listFiles(); - Timber.d("folder:"+files.length); + Timber.d("folderTime Number:"+files.length); for(File file : files){ if(file.lastModified()-timeOfCreation<=(120*1000) && file.lastModified()-timeOfCreation>=-(120*1000)){ //Make sure the photos were taken within 20seconds 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 = null; try { @@ -508,12 +560,38 @@ public class ShareActivity if(tempImageObj.getCoords(gpsEnabled)!=null && tempImageObj.imageCoordsExists){ // Current image has gps coordinates and it's not current gps locaiton 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() { if (decimalCoords != null) { 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 if (imageObj.imageCoordsExists) {