diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java b/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java index 4c202071bc..16fc5712ae 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java @@ -17,6 +17,7 @@ import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.mwapi.CategoryApi; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; import timber.log.Timber; @@ -42,11 +43,16 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse { private ExifInterface exifInterface; private boolean haveCheckedForOtherImages = false; private GPSExtractor tempImageObj; + private CompositeDisposable compositeDisposable = new CompositeDisposable(); @Inject FileProcessor() { } + public void cleanup() { + compositeDisposable.clear(); + } + void initFileDetails(@NonNull String filePath, ContentResolver contentResolver) { this.filePath = filePath; this.contentResolver = contentResolver; @@ -138,7 +144,7 @@ private void useImageCoords() { // If no categories found in cache, call MediaWiki API to match image coords with nearby Commons categories if (catListEmpty) { - apiCall.request(decimalCoords) + compositeDisposable.add(apiCall.request(decimalCoords) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .subscribe( @@ -147,7 +153,7 @@ private void useImageCoords() { Timber.e(throwable); gpsCategoryModel.clear(); } - ); + )); Timber.d("displayCatList size 0, calling MWAPI %s", displayCatList); } else { Timber.d("Cache found, setting categoryList in model to %s", displayCatList); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java index ede4ae08bb..be6ce413a3 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java @@ -33,16 +33,19 @@ public class ImageProcessingService { private final MediaWikiApi mwApi; private final ReadFBMD readFBMD; private final EXIFReader EXIFReader; + private final Context context; @Inject public ImageProcessingService(FileUtilsWrapper fileUtilsWrapper, ImageUtilsWrapper imageUtilsWrapper, - MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader) { + MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader, + Context context) { this.fileUtilsWrapper = fileUtilsWrapper; this.imageUtilsWrapper = imageUtilsWrapper; this.mwApi = mwApi; this.readFBMD = readFBMD; this.EXIFReader = EXIFReader; + this.context = context; } /** @@ -61,13 +64,13 @@ Single validateImage(UploadModel.UploadItem uploadItem, boolean checkTi Timber.d("Checking the validity of image"); String filePath = uploadItem.getMediaUri().getPath(); Uri contentUri=uploadItem.getContentUri(); - Context context=uploadItem.getContext(); Single duplicateImage = checkDuplicateImage(filePath); Single wrongGeoLocation = checkImageGeoLocation(uploadItem.getPlace(), filePath); Single darkImage = checkDarkImage(filePath); Single itemTitle = checkTitle ? validateItemTitle(uploadItem) : Single.just(ImageUtils.IMAGE_OK); Single checkFBMD = checkFBMD(context,contentUri); Single checkEXIF = checkEXIF(filePath); + Single zipResult = Single.zip(duplicateImage, wrongGeoLocation, darkImage, itemTitle, (duplicate, wrongGeo, dark, title) -> { Timber.d("Result for duplicate: %d, geo: %d, dark: %d, title: %d", duplicate, wrongGeo, dark, title); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java index 3eb0319f1a..afd59f4caf 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java @@ -26,7 +26,7 @@ import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.BehaviorSubject; @@ -45,6 +45,7 @@ public class UploadModel { }; private final JsonKvStore store; private final List licenses; + private final Context context; private String license; private final Map licensesByName; private List items = new ArrayList<>(); @@ -52,8 +53,7 @@ public class UploadModel { private boolean bottomCardState = true; private boolean rightCardState = true; private int currentStepIndex = 0; - public static Context context; - private Disposable badImageSubscription; + private CompositeDisposable compositeDisposable = new CompositeDisposable(); private SessionManager sessionManager; private FileProcessor fileProcessor; @@ -77,6 +77,11 @@ public class UploadModel { this.imageProcessingService = imageProcessingService; } + void cleanup() { + compositeDisposable.clear(); + fileProcessor.cleanup(); + } + @SuppressLint("CheckResult") Observable preProcessImages(List uploadableFiles, Place place, @@ -219,8 +224,7 @@ private void setCurrentUploadDescriptions(List descriptions) { } public void previous() { - if (badImageSubscription != null) - badImageSubscription.dispose(); + cleanup(); markCurrentUploadVisited(); if (currentStepIndex > 0) { currentStepIndex--; @@ -305,16 +309,16 @@ void keepPicture() { } void deletePicture() { - badImageSubscription.dispose(); + cleanup(); updateItemState(); } void subscribeBadPicture(Consumer consumer, boolean checkTitle) { if (isShowingItem()) { - badImageSubscription = getImageQuality(getCurrentItem(), checkTitle) + compositeDisposable.add(getImageQuality(getCurrentItem(), checkTitle) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(consumer, Timber::e); + .subscribe(consumer, Timber::e)); } } @@ -432,10 +436,6 @@ public Place getPlace() { public Uri getContentUri() { return originalContentUri; } - - public Context getContext(){ - return UploadModel.context; - } } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java index 30bfc037fb..36348e7e67 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java @@ -21,6 +21,7 @@ import fr.free.nrw.commons.utils.StringUtils; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; import timber.log.Timber; @@ -52,6 +53,7 @@ public class UploadPresenter { private final UploadController uploadController; private final Context context; private final JsonKvStore directKvStore; + private CompositeDisposable compositeDisposable = new CompositeDisposable(); @Inject UploadPresenter(UploadModel uploadModel, @@ -77,12 +79,12 @@ void receive(List media, Observable uploadItemObservable = uploadModel .preProcessImages(media, place, source, similarImageInterface); - uploadItemObservable + compositeDisposable.add(uploadItemObservable .toList() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(uploadItems -> onImagesProcessed(uploadItems, place), - throwable -> Timber.e(throwable, "Error occurred in processing images")); + throwable -> Timber.e(throwable, "Error occurred in processing images"))); } private void onImagesProcessed(List uploadItems, Place place) { @@ -211,9 +213,9 @@ void thumbnailClicked(UploadItem item) { @SuppressLint("CheckResult") void handleSubmit(CategoriesModel categoriesModel) { if (view.checkIfLoggedIn()) - uploadModel.buildContributions(categoriesModel.getCategoryStringList()) + compositeDisposable.add(uploadModel.buildContributions(categoriesModel.getCategoryStringList()) .observeOn(Schedulers.io()) - .subscribe(uploadController::startUpload); + .subscribe(uploadController::startUpload)); } /** @@ -286,6 +288,8 @@ public void init() { } void cleanup() { + compositeDisposable.clear(); + uploadModel.cleanup(); uploadController.cleanup(); }