mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
* 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
This commit is contained in:
parent
9bf5cf7441
commit
1a8a068552
4 changed files with 93 additions and 15 deletions
|
|
@ -470,6 +470,16 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showAlertDialog(int messageResourceId, Runnable onPositiveClick) {
|
||||||
|
DialogUtil.showAlertDialog(this,
|
||||||
|
"",
|
||||||
|
getString(messageResourceId),
|
||||||
|
getString(R.string.ok),
|
||||||
|
onPositiveClick,
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNextButtonClicked(int index) {
|
public void onNextButtonClicked(int index) {
|
||||||
if (index < fragments.size() - 1) {
|
if (index < fragments.size() - 1) {
|
||||||
|
|
@ -478,18 +488,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
|
||||||
((LinearLayoutManager) rvThumbnails.getLayoutManager())
|
((LinearLayoutManager) rvThumbnails.getLayoutManager())
|
||||||
.scrollToPositionWithOffset((index > 0) ? index-1 : 0, 0);
|
.scrollToPositionWithOffset((index > 0) ? index-1 : 0, 0);
|
||||||
} else {
|
} else {
|
||||||
if(defaultKvStore.getInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0) >= 10){
|
|
||||||
DialogUtil.showAlertDialog(this,
|
|
||||||
"",
|
|
||||||
getString(R.string.location_message),
|
|
||||||
getString(R.string.ok),
|
|
||||||
() -> {
|
|
||||||
defaultKvStore.putInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
|
|
||||||
presenter.handleSubmit();
|
presenter.handleSubmit();
|
||||||
}, false);
|
|
||||||
} else {
|
|
||||||
presenter.handleSubmit();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,12 @@ public interface UploadContract {
|
||||||
|
|
||||||
void showMessage(int messageResourceId);
|
void showMessage(int messageResourceId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays an alert with message given by {@code messageResourceId}.
|
||||||
|
* {@code onPositiveClick} is run after acknowledgement.
|
||||||
|
*/
|
||||||
|
void showAlertDialog(int messageResourceId, Runnable onPositiveClick);
|
||||||
|
|
||||||
List<UploadableFile> getUploadableFiles();
|
List<UploadableFile> getUploadableFiles();
|
||||||
|
|
||||||
void showHideTopCard(boolean shouldShow);
|
void showHideTopCard(boolean shouldShow);
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ public class UploadPresenter implements UploadContract.UserActionListener {
|
||||||
public static final String COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES
|
public static final String COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES
|
||||||
= "number_of_consecutive_uploads_without_coordinates";
|
= "number_of_consecutive_uploads_without_coordinates";
|
||||||
|
|
||||||
|
public static final int CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD = 10;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
UploadPresenter(UploadRepository uploadRepository,
|
UploadPresenter(UploadRepository uploadRepository,
|
||||||
|
|
@ -51,6 +53,31 @@ public class UploadPresenter implements UploadContract.UserActionListener {
|
||||||
@SuppressLint("CheckResult")
|
@SuppressLint("CheckResult")
|
||||||
@Override
|
@Override
|
||||||
public void handleSubmit() {
|
public void handleSubmit() {
|
||||||
|
boolean hasLocationProvidedForNewUploads = false;
|
||||||
|
for (UploadItem item : repository.getUploads()) {
|
||||||
|
if (item.getGpsCoords().getImageCoordsExists()) {
|
||||||
|
hasLocationProvidedForNewUploads = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean hasManyConsecutiveUploadsWithoutLocation = defaultKvStore.getInt(
|
||||||
|
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0) >=
|
||||||
|
CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD;
|
||||||
|
|
||||||
|
if (hasManyConsecutiveUploadsWithoutLocation && !hasLocationProvidedForNewUploads) {
|
||||||
|
defaultKvStore.putInt(COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
|
||||||
|
view.showAlertDialog(
|
||||||
|
R.string.location_message,
|
||||||
|
() -> {defaultKvStore.putInt(
|
||||||
|
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES,
|
||||||
|
0);
|
||||||
|
processContributionsForSubmission();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
processContributionsForSubmission();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processContributionsForSubmission() {
|
||||||
if (view.isLoggedIn()) {
|
if (view.isLoggedIn()) {
|
||||||
view.showProgress(true);
|
view.showProgress(true);
|
||||||
repository.buildContributions()
|
repository.buildContributions()
|
||||||
|
|
@ -72,9 +99,8 @@ public class UploadPresenter implements UploadContract.UserActionListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(Contribution contribution) {
|
public void onNext(Contribution contribution) {
|
||||||
if(contribution.getDecimalCoords() == null){
|
if (contribution.getDecimalCoords() == null) {
|
||||||
final int recentCount
|
final int recentCount = defaultKvStore.getInt(
|
||||||
= defaultKvStore.getInt(
|
|
||||||
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
|
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0);
|
||||||
defaultKvStore.putInt(
|
defaultKvStore.putInt(
|
||||||
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, recentCount + 1);
|
COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, recentCount + 1);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import fr.free.nrw.commons.contributions.Contribution
|
||||||
import fr.free.nrw.commons.filepicker.UploadableFile
|
import fr.free.nrw.commons.filepicker.UploadableFile
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore
|
import fr.free.nrw.commons.kvstore.JsonKvStore
|
||||||
import fr.free.nrw.commons.repository.UploadRepository
|
import fr.free.nrw.commons.repository.UploadRepository
|
||||||
|
import fr.free.nrw.commons.upload.ImageCoordinates
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -13,6 +14,7 @@ import org.mockito.ArgumentMatchers
|
||||||
import org.mockito.InjectMocks
|
import org.mockito.InjectMocks
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito.`when`
|
import org.mockito.Mockito.`when`
|
||||||
|
import org.mockito.Mockito.times
|
||||||
import org.mockito.MockitoAnnotations
|
import org.mockito.MockitoAnnotations
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
@ -38,10 +40,16 @@ class UploadPresenterTest {
|
||||||
@Mock
|
@Mock
|
||||||
private lateinit var anotherUploadableFile: UploadableFile
|
private lateinit var anotherUploadableFile: UploadableFile
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var imageCoords: ImageCoordinates
|
||||||
|
@Mock
|
||||||
|
private lateinit var uploadItem: UploadItem
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
lateinit var uploadPresenter: UploadPresenter
|
lateinit var uploadPresenter: UploadPresenter
|
||||||
|
|
||||||
private var uploadableFiles: ArrayList<UploadableFile> = ArrayList()
|
private var uploadableFiles: ArrayList<UploadableFile> = ArrayList()
|
||||||
|
private var uploadableItems: ArrayList<UploadItem> = ArrayList()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initial setup, test environment
|
* initial setup, test environment
|
||||||
|
|
@ -70,6 +78,45 @@ class UploadPresenterTest {
|
||||||
verify(repository).buildContributions()
|
verify(repository).buildContributions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleSubmitImagesNoLocationWithConsecutiveNoLocationUploads() {
|
||||||
|
`when`(imageCoords.imageCoordsExists).thenReturn(false)
|
||||||
|
`when`(uploadItem.getGpsCoords()).thenReturn(imageCoords)
|
||||||
|
`when`(repository.uploads).thenReturn(uploadableItems)
|
||||||
|
uploadableItems.add(uploadItem)
|
||||||
|
|
||||||
|
// test 1 - insufficient count
|
||||||
|
`when`(
|
||||||
|
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
|
||||||
|
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD - 1)
|
||||||
|
uploadPresenter.handleSubmit()
|
||||||
|
// no alert dialog expected as insufficient consecutive count
|
||||||
|
verify(view, times(0)).showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
|
||||||
|
|
||||||
|
// test 2 - sufficient count
|
||||||
|
`when`(
|
||||||
|
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
|
||||||
|
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD)
|
||||||
|
uploadPresenter.handleSubmit()
|
||||||
|
// alert dialog expected as consecutive count is at threshold
|
||||||
|
verify(view).showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun handleSubmitImagesWithLocationWithConsecutiveNoLocationUploads() {
|
||||||
|
`when`(
|
||||||
|
defaultKvStore.getInt(UploadPresenter.COUNTER_OF_CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES, 0))
|
||||||
|
.thenReturn(UploadPresenter.CONSECUTIVE_UPLOADS_WITHOUT_COORDINATES_REMINDER_THRESHOLD)
|
||||||
|
`when`(imageCoords.imageCoordsExists).thenReturn(true)
|
||||||
|
`when`(uploadItem.getGpsCoords()).thenReturn(imageCoords)
|
||||||
|
`when`(repository.uploads).thenReturn(uploadableItems)
|
||||||
|
uploadableItems.add(uploadItem)
|
||||||
|
uploadPresenter.handleSubmit()
|
||||||
|
// no alert dialog expected
|
||||||
|
verify(view, times(0))
|
||||||
|
.showAlertDialog(ArgumentMatchers.anyInt(), ArgumentMatchers.any<Runnable>())
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun handleSubmitTestUserLoggedInAndLimitedConnectionOn() {
|
fun handleSubmitTestUserLoggedInAndLimitedConnectionOn() {
|
||||||
`when`(
|
`when`(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue