Skip to content

Commit 1a8a068

Browse files
authored
Fix commons-app#493: Fix erroneous no location reminder (commons-app#5145)
* Add showAlertDialog option for UploadPresenter to use * Move location reminder logic from UploadActivity to UploadPresenter * Add test cases for dialog alert with handleSubmit * Change threshold variable name to be more descriptive * Fix broken reference to renamed constant in tests
1 parent 9bf5cf7 commit 1a8a068

File tree

4 files changed

+93
-15
lines changed

4 files changed

+93
-15
lines changed

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

+11-12
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,16 @@ private void showInfoAlert(int titleStringID, int messageStringId, Runnable posi
470470
.show();
471471
}
472472

473+
@Override
474+
public void showAlertDialog(int messageResourceId, Runnable onPositiveClick) {
475+
DialogUtil.showAlertDialog(this,
476+
"",
477+
getString(messageResourceId),
478+
getString(R.string.ok),
479+
onPositiveClick,
480+
false);
481+
}
482+
473483
@Override
474484
public void onNextButtonClicked(int index) {
475485
if (index < fragments.size() - 1) {
@@ -478,18 +488,7 @@ public void onNextButtonClicked(int index) {
478488
((LinearLayoutManager) rvThumbnails.getLayoutManager())
479489
.scrollToPositionWithOffset((index > 0) ? index-1 : 0, 0);
480490
} else {
481-
if(defaultKvStore.getInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0) >= 10){
482-
DialogUtil.showAlertDialog(this,
483-
"",
484-
getString(R.string.location_message),
485-
getString(R.string.ok),
486-
() -> {
487-
defaultKvStore.putInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
488-
presenter.handleSubmit();
489-
}, false);
490-
} else {
491-
presenter.handleSubmit();
492-
}
491+
presenter.handleSubmit();
493492
}
494493
}
495494

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

+6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public interface View {
2424

2525
void showMessage(int messageResourceId);
2626

27+
/**
28+
* Displays an alert with message given by {@code messageResourceId}.
29+
* {@code onPositiveClick} is run after acknowledgement.
30+
*/
31+
void showAlertDialog(int messageResourceId, Runnable onPositiveClick);
32+
2733
List<UploadableFile> getUploadableFiles();
2834

2935
void showHideTopCard(boolean shouldShow);

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

+29-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public class UploadPresenter implements UploadContract.UserActionListener {
3535
public static final String COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES
3636
= "number_of_consecutive_uploads_without_coordinates";
3737

38+
public static final int CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD = 10;
39+
3840

3941
@Inject
4042
UploadPresenter(UploadRepository uploadRepository,
@@ -51,6 +53,31 @@ public class UploadPresenter implements UploadContract.UserActionListener {
5153
@SuppressLint("CheckResult")
5254
@Override
5355
public void handleSubmit() {
56+
boolean hasLocationProvidedForNewUploads = false;
57+
for (UploadItem item : repository.getUploads()) {
58+
if (item.getGpsCoords().getImageCoordsExists()) {
59+
hasLocationProvidedForNewUploads = true;
60+
}
61+
}
62+
boolean hasManyConsecutiveUploadsWithoutLocation = defaultKvStore.getInt(
63+
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0) >=
64+
CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD;
65+
66+
if (hasManyConsecutiveUploadsWithoutLocation && !hasLocationProvidedForNewUploads) {
67+
defaultKvStore.putInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
68+
view.showAlertDialog(
69+
R.string.location_message,
70+
() -> {defaultKvStore.putInt(
71+
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES,
72+
0);
73+
processContributionsForSubmission();
74+
});
75+
} else {
76+
processContributionsForSubmission();
77+
}
78+
}
79+
80+
private void processContributionsForSubmission() {
5481
if (view.isLoggedIn()) {
5582
view.showProgress(true);
5683
repository.buildContributions()
@@ -72,9 +99,8 @@ public void onSubscribe(Disposable d) {
7299

73100
@Override
74101
public void onNext(Contribution contribution) {
75-
if(contribution.getDecimalCoords() == null){
76-
final int recentCount
77-
= defaultKvStore.getInt(
102+
if (contribution.getDecimalCoords() == null) {
103+
final int recentCount = defaultKvStore.getInt(
78104
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
79105
defaultKvStore.putInt(
80106
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, recentCount + 1);

app/src/test/kotlin/fr/free/nrw/commons/upload/UploadPresenterTest.kt

+47
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import fr.free.nrw.commons.contributions.Contribution
66
import fr.free.nrw.commons.filepicker.UploadableFile
77
import fr.free.nrw.commons.kvstore.JsonKvStore
88
import fr.free.nrw.commons.repository.UploadRepository
9+
import fr.free.nrw.commons.upload.ImageCoordinates
910
import io.reactivex.Observable
1011
import org.junit.Before
1112
import org.junit.Test
1213
import org.mockito.ArgumentMatchers
1314
import org.mockito.InjectMocks
1415
import org.mockito.Mock
1516
import org.mockito.Mockito.`when`
17+
import org.mockito.Mockito.times
1618
import org.mockito.MockitoAnnotations
1719
import java.util.*
1820

@@ -38,10 +40,16 @@ class UploadPresenterTest {
3840
@Mock
3941
private lateinit var anotherUploadableFile: UploadableFile
4042

43+
@Mock
44+
private lateinit var imageCoords: ImageCoordinates
45+
@Mock
46+
private lateinit var uploadItem: UploadItem
47+
4148
@InjectMocks
4249
lateinit var uploadPresenter: UploadPresenter
4350

4451
private var uploadableFiles: ArrayList<UploadableFile> = ArrayList()
52+
private var uploadableItems: ArrayList<UploadItem> = ArrayList()
4553

4654
/**
4755
* initial setup, test environment
@@ -70,6 +78,45 @@ class UploadPresenterTest {
7078
verify(repository).buildContributions()
7179
}
7280

81+
@Test
82+
fun handleSubmitImagesNoLocationWithConsecutiveNoLocationUploads() {
83+
`when`(imageCoords.imageCoordsExists).thenReturn(false)
84+
`when`(uploadItem.getGpsCoords()).thenReturn(imageCoords)
85+
`when`(repository.uploads).thenReturn(uploadableItems)
86+
uploadableItems.add(uploadItem)
87+
88+
// test 1 - insufficient count
89+
`when`(
90+
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
91+
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD - 1)
92+
uploadPresenter.handleSubmit()
93+
// no alert dialog expected as insufficient consecutive count
94+
verify(view, times(0)).showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
95+
96+
// test 2 - sufficient count
97+
`when`(
98+
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
99+
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD)
100+
uploadPresenter.handleSubmit()
101+
// alert dialog expected as consecutive count is at threshold
102+
verify(view).showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
103+
}
104+
105+
@Test
106+
fun handleSubmitImagesWithLocationWithConsecutiveNoLocationUploads() {
107+
`when`(
108+
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
109+
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD)
110+
`when`(imageCoords.imageCoordsExists).thenReturn(true)
111+
`when`(uploadItem.getGpsCoords()).thenReturn(imageCoords)
112+
`when`(repository.uploads).thenReturn(uploadableItems)
113+
uploadableItems.add(uploadItem)
114+
uploadPresenter.handleSubmit()
115+
// no alert dialog expected
116+
verify(view, times(0))
117+
.showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
118+
}
119+
73120
@Test
74121
fun handleSubmitTestUserLoggedInAndLimitedConnectionOn() {
75122
`when`(

0 commit comments

Comments
 (0)