Skip to content

Commit c2a20ce

Browse files
committed
Properly contain and dispose of additional observables.
1 parent fd6c482 commit c2a20ce

File tree

4 files changed

+33
-20
lines changed

4 files changed

+33
-20
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import fr.free.nrw.commons.caching.CacheController;
1818
import fr.free.nrw.commons.kvstore.JsonKvStore;
1919
import fr.free.nrw.commons.mwapi.CategoryApi;
20+
import io.reactivex.disposables.CompositeDisposable;
2021
import io.reactivex.schedulers.Schedulers;
2122
import timber.log.Timber;
2223

@@ -42,11 +43,16 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse {
4243
private ExifInterface exifInterface;
4344
private boolean haveCheckedForOtherImages = false;
4445
private GPSExtractor tempImageObj;
46+
private CompositeDisposable compositeDisposable = new CompositeDisposable();
4547

4648
@Inject
4749
FileProcessor() {
4850
}
4951

52+
public void cleanup() {
53+
compositeDisposable.clear();
54+
}
55+
5056
void initFileDetails(@NonNull String filePath, ContentResolver contentResolver) {
5157
this.filePath = filePath;
5258
this.contentResolver = contentResolver;
@@ -138,7 +144,7 @@ private void useImageCoords() {
138144

139145
// If no categories found in cache, call MediaWiki API to match image coords with nearby Commons categories
140146
if (catListEmpty) {
141-
apiCall.request(decimalCoords)
147+
compositeDisposable.add(apiCall.request(decimalCoords)
142148
.subscribeOn(Schedulers.io())
143149
.observeOn(Schedulers.io())
144150
.subscribe(
@@ -147,7 +153,7 @@ private void useImageCoords() {
147153
Timber.e(throwable);
148154
gpsCategoryModel.clear();
149155
}
150-
);
156+
));
151157
Timber.d("displayCatList size 0, calling MWAPI %s", displayCatList);
152158
} else {
153159
Timber.d("Cache found, setting categoryList in model to %s", displayCatList);

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,19 @@ public class ImageProcessingService {
3333
private final MediaWikiApi mwApi;
3434
private final ReadFBMD readFBMD;
3535
private final EXIFReader EXIFReader;
36+
private final Context context;
3637

3738
@Inject
3839
public ImageProcessingService(FileUtilsWrapper fileUtilsWrapper,
3940
ImageUtilsWrapper imageUtilsWrapper,
40-
MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader) {
41+
MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader,
42+
Context context) {
4143
this.fileUtilsWrapper = fileUtilsWrapper;
4244
this.imageUtilsWrapper = imageUtilsWrapper;
4345
this.mwApi = mwApi;
4446
this.readFBMD = readFBMD;
4547
this.EXIFReader = EXIFReader;
48+
this.context = context;
4649
}
4750

4851
/**
@@ -61,13 +64,13 @@ Single<Integer> validateImage(UploadModel.UploadItem uploadItem, boolean checkTi
6164
Timber.d("Checking the validity of image");
6265
String filePath = uploadItem.getMediaUri().getPath();
6366
Uri contentUri=uploadItem.getContentUri();
64-
Context context=uploadItem.getContext();
6567
Single<Integer> duplicateImage = checkDuplicateImage(filePath);
6668
Single<Integer> wrongGeoLocation = checkImageGeoLocation(uploadItem.getPlace(), filePath);
6769
Single<Integer> darkImage = checkDarkImage(filePath);
6870
Single<Integer> itemTitle = checkTitle ? validateItemTitle(uploadItem) : Single.just(ImageUtils.IMAGE_OK);
6971
Single<Integer> checkFBMD = checkFBMD(context,contentUri);
7072
Single<Integer> checkEXIF = checkEXIF(filePath);
73+
7174
Single<Integer> zipResult = Single.zip(duplicateImage, wrongGeoLocation, darkImage, itemTitle,
7275
(duplicate, wrongGeo, dark, title) -> {
7376
Timber.d("Result for duplicate: %d, geo: %d, dark: %d, title: %d", duplicate, wrongGeo, dark, title);

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import io.reactivex.Observable;
2727
import io.reactivex.Single;
2828
import io.reactivex.android.schedulers.AndroidSchedulers;
29-
import io.reactivex.disposables.Disposable;
29+
import io.reactivex.disposables.CompositeDisposable;
3030
import io.reactivex.functions.Consumer;
3131
import io.reactivex.schedulers.Schedulers;
3232
import io.reactivex.subjects.BehaviorSubject;
@@ -45,15 +45,15 @@ public class UploadModel {
4545
};
4646
private final JsonKvStore store;
4747
private final List<String> licenses;
48+
private final Context context;
4849
private String license;
4950
private final Map<String, String> licensesByName;
5051
private List<UploadItem> items = new ArrayList<>();
5152
private boolean topCardState = true;
5253
private boolean bottomCardState = true;
5354
private boolean rightCardState = true;
5455
private int currentStepIndex = 0;
55-
public static Context context;
56-
private Disposable badImageSubscription;
56+
private CompositeDisposable compositeDisposable = new CompositeDisposable();
5757

5858
private SessionManager sessionManager;
5959
private FileProcessor fileProcessor;
@@ -77,6 +77,11 @@ public class UploadModel {
7777
this.imageProcessingService = imageProcessingService;
7878
}
7979

80+
void cleanup() {
81+
compositeDisposable.clear();
82+
fileProcessor.cleanup();
83+
}
84+
8085
@SuppressLint("CheckResult")
8186
Observable<UploadItem> preProcessImages(List<UploadableFile> uploadableFiles,
8287
Place place,
@@ -219,8 +224,7 @@ private void setCurrentUploadDescriptions(List<Description> descriptions) {
219224
}
220225

221226
public void previous() {
222-
if (badImageSubscription != null)
223-
badImageSubscription.dispose();
227+
cleanup();
224228
markCurrentUploadVisited();
225229
if (currentStepIndex > 0) {
226230
currentStepIndex--;
@@ -305,16 +309,16 @@ void keepPicture() {
305309
}
306310

307311
void deletePicture() {
308-
badImageSubscription.dispose();
312+
cleanup();
309313
updateItemState();
310314
}
311315

312316
void subscribeBadPicture(Consumer<Integer> consumer, boolean checkTitle) {
313317
if (isShowingItem()) {
314-
badImageSubscription = getImageQuality(getCurrentItem(), checkTitle)
318+
compositeDisposable.add(getImageQuality(getCurrentItem(), checkTitle)
315319
.subscribeOn(Schedulers.io())
316320
.observeOn(AndroidSchedulers.mainThread())
317-
.subscribe(consumer, Timber::e);
321+
.subscribe(consumer, Timber::e));
318322
}
319323
}
320324

@@ -432,10 +436,6 @@ public Place getPlace() {
432436
public Uri getContentUri() {
433437
return originalContentUri;
434438
}
435-
436-
public Context getContext(){
437-
return UploadModel.context;
438-
}
439439
}
440440

441441
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import fr.free.nrw.commons.utils.StringUtils;
2222
import io.reactivex.Observable;
2323
import io.reactivex.android.schedulers.AndroidSchedulers;
24+
import io.reactivex.disposables.CompositeDisposable;
2425
import io.reactivex.schedulers.Schedulers;
2526
import timber.log.Timber;
2627

@@ -52,6 +53,7 @@ public class UploadPresenter {
5253
private final UploadController uploadController;
5354
private final Context context;
5455
private final JsonKvStore directKvStore;
56+
private CompositeDisposable compositeDisposable = new CompositeDisposable();
5557

5658
@Inject
5759
UploadPresenter(UploadModel uploadModel,
@@ -77,12 +79,12 @@ void receive(List<UploadableFile> media,
7779
Observable<UploadItem> uploadItemObservable = uploadModel
7880
.preProcessImages(media, place, source, similarImageInterface);
7981

80-
uploadItemObservable
82+
compositeDisposable.add(uploadItemObservable
8183
.toList()
8284
.subscribeOn(Schedulers.io())
8385
.observeOn(AndroidSchedulers.mainThread())
8486
.subscribe(uploadItems -> onImagesProcessed(uploadItems, place),
85-
throwable -> Timber.e(throwable, "Error occurred in processing images"));
87+
throwable -> Timber.e(throwable, "Error occurred in processing images")));
8688
}
8789

8890
private void onImagesProcessed(List<UploadItem> uploadItems, Place place) {
@@ -211,9 +213,9 @@ void thumbnailClicked(UploadItem item) {
211213
@SuppressLint("CheckResult")
212214
void handleSubmit(CategoriesModel categoriesModel) {
213215
if (view.checkIfLoggedIn())
214-
uploadModel.buildContributions(categoriesModel.getCategoryStringList())
216+
compositeDisposable.add(uploadModel.buildContributions(categoriesModel.getCategoryStringList())
215217
.observeOn(Schedulers.io())
216-
.subscribe(uploadController::startUpload);
218+
.subscribe(uploadController::startUpload));
217219
}
218220

219221
/**
@@ -286,6 +288,8 @@ public void init() {
286288
}
287289

288290
void cleanup() {
291+
compositeDisposable.clear();
292+
uploadModel.cleanup();
289293
uploadController.cleanup();
290294
}
291295

0 commit comments

Comments
 (0)