Skip to content

Commit e7d9315

Browse files
Bugfix/p18 uploads (commons-app#3869)
* updated gradle plugin version * BugFix commons-app#3856 * Do not use preference for deciding acceptable lat long for nearby uploads, instead save the corresponding location in the Contribution via UploadItem * Marshall contribution's hasInvalidLocation * reset un-related changes * Fixed test cases * Minor code formatting and docs
1 parent e471226 commit e7d9315

File tree

10 files changed

+67
-33
lines changed

10 files changed

+67
-33
lines changed

app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ public class Contribution extends Media {
6060
private String p18Value;
6161
public Uri contentProviderUri;
6262
public String dateCreatedSource;
63+
public int hasInvalidLocation;
64+
65+
/**
66+
* Set this true when ImageProcessor has said that the location is invalid
67+
* @param hasInvalidLocation
68+
*/
69+
public void setHasInvalidLocation(boolean hasInvalidLocation) {
70+
this.hasInvalidLocation = hasInvalidLocation ? 1 : 0;
71+
}
72+
73+
public boolean isHasInvalidLocation() {
74+
return hasInvalidLocation == 1;
75+
}
6376

6477
public Contribution(Uri contentUri, String filename, Uri localUri, String imageUrl, Date dateCreated,
6578
int state, long dataLength, Date dateUploaded, long transferred,
@@ -269,6 +282,7 @@ public void setContentProviderUri(Uri contentProviderUri) {
269282
this.contentProviderUri = contentProviderUri;
270283
}
271284

285+
272286
@Override
273287
public int describeContents() {
274288
return 0;
@@ -290,6 +304,7 @@ public void writeToParcel(Parcel dest, int flags) {
290304
dest.writeString(this.p18Value);
291305
dest.writeParcelable(this.contentProviderUri, flags);
292306
dest.writeString(this.dateCreatedSource);
307+
dest.writeInt(this.hasInvalidLocation);
293308
}
294309

295310
protected Contribution(Parcel in) {
@@ -307,6 +322,7 @@ protected Contribution(Parcel in) {
307322
this.p18Value = in.readString();
308323
this.contentProviderUri = in.readParcelable(Uri.class.getClassLoader());
309324
this.dateCreatedSource = in.readString();
325+
this.hasInvalidLocation = in.readInt();
310326
}
311327

312328
public static final Creator<Contribution> CREATOR = new Creator<Contribution>() {

app/src/main/java/fr/free/nrw/commons/db/AppDatabase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import fr.free.nrw.commons.contributions.Contribution;
88
import fr.free.nrw.commons.contributions.ContributionDao;
99

10-
@Database(entities = {Contribution.class}, version = 1, exportSchema = false)
10+
@Database(entities = {Contribution.class}, version = 2, exportSchema = false)
1111
@TypeConverters({Converters.class})
1212
abstract public class AppDatabase extends RoomDatabase {
1313
public abstract ContributionDao getContributionDao();

app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import android.view.inputmethod.InputMethodManager;
88
import androidx.collection.LruCache;
99
import androidx.room.Room;
10+
import androidx.room.migration.Migration;
11+
import androidx.sqlite.db.SupportSQLiteDatabase;
1012
import com.github.varunpant.quadtree.QuadTree;
1113
import com.google.gson.Gson;
1214
import dagger.Module;
@@ -52,6 +54,14 @@ public class CommonsApplicationModule {
5254
public static final String MAIN_THREAD="main_thread";
5355
private AppDatabase appDatabase;
5456

57+
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
58+
@Override
59+
public void migrate(SupportSQLiteDatabase database) {
60+
database.execSQL("ALTER TABLE contribution "
61+
+ " ADD COLUMN hasInvalidLocation INTEGER");
62+
}
63+
};
64+
5565
public CommonsApplicationModule(Context applicationContext) {
5666
this.applicationContext = applicationContext;
5767
}
@@ -231,7 +241,9 @@ public QuadTree providesQuadTres() {
231241
@Provides
232242
@Singleton
233243
public AppDatabase provideAppDataBase() {
234-
appDatabase=Room.databaseBuilder(applicationContext, AppDatabase.class, "commons_room.db").build();
244+
appDatabase=Room.databaseBuilder(applicationContext, AppDatabase.class, "commons_room.db")
245+
.addMigrations(MIGRATION_1_2)
246+
.build();
235247
return appDatabase;
236248
}
237249

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ public Observable<Contribution> buildContributions() {
172172
contribution.setSource(item.source);
173173
contribution.setContentProviderUri(item.mediaUri);
174174
contribution.setDateUploaded(new Date());
175+
contribution.setHasInvalidLocation(item.hasInvalidLocation);
175176

176177
Timber.d("Created timestamp while building contribution is %s, %s",
177178
item.getCreatedTimestamp(),
@@ -221,6 +222,7 @@ public static class UploadItem {
221222
private final String mimeType;
222223
private final String source;
223224
private ImageCoordinates gpsCoords;
225+
private boolean hasInvalidLocation;
224226

225227
public void setGpsCoords(ImageCoordinates gpsCoords) {
226228
this.gpsCoords = gpsCoords;
@@ -326,6 +328,10 @@ public boolean equals(@Nullable Object obj) {
326328
public int hashCode() {
327329
return mediaUri.hashCode();
328330
}
331+
332+
public void setHasInvalidLocation(boolean hasInvalidLocation) {
333+
this.hasInvalidLocation=hasInvalidLocation;
334+
}
329335
}
330336

331337
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,15 @@ private void uploadContribution(Contribution contribution) {
282282
Timber.d("Contribution upload success. Initiating Wikidata edit for"
283283
+ " entity id %s if necessary (if P18 is null). P18 value is %s",
284284
contribution.getWikiDataEntityId(), contribution.getP18Value());
285-
wikidataEditService.createClaimWithLogging(contribution.getWikiDataEntityId(), contribution.getWikiItemName(), canonicalFilename, contribution.getP18Value());
285+
if (!contribution.isHasInvalidLocation()) {
286+
wikidataEditService
287+
.createClaimWithLogging(contribution.getWikiDataEntityId(),
288+
contribution.getWikiItemName(), canonicalFilename,
289+
contribution.getP18Value());
290+
} else {
291+
Timber
292+
.d("Image location and nearby place location mismatched, so Wikidata item won't be edited");
293+
}
286294
contribution.setFilename(canonicalFilename);
287295
contribution.setImageUrl(uploadResult.getImageinfo().getOriginalUrl());
288296
contribution.setState(Contribution.STATE_COMPLETED);

app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public void verifyImageQuality(UploadItem uploadItem) {
120120
.observeOn(mainThreadScheduler)
121121
.subscribe(imageResult -> {
122122
view.showProgress(false);
123-
handleImageResult(imageResult);
123+
handleImageResult(imageResult, uploadItem);
124124
},
125125
throwable -> {
126126
view.showProgress(false);
@@ -165,26 +165,31 @@ public void useSimilarPictureCoordinates(ImageCoordinates imageCoordinates, int
165165
/**
166166
* handles image quality verifications
167167
*
168-
* @param imageResult
169-
*/
170-
public void handleImageResult(Integer imageResult) {
168+
* @param imageResult
169+
* @param uploadItem
170+
*/
171+
public void handleImageResult(Integer imageResult,
172+
UploadItem uploadItem) {
171173
if (imageResult == IMAGE_KEEP || imageResult == IMAGE_OK) {
172174
view.onImageValidationSuccess();
175+
uploadItem.setHasInvalidLocation(false);
173176
} else {
174-
handleBadImage(imageResult);
177+
handleBadImage(imageResult, uploadItem);
175178
}
176179
}
177180

178181
/**
179182
* Handle images, say empty title, duplicate file name, bad picture(in all other cases)
180183
*
181184
* @param errorCode
185+
* @param uploadItem
182186
*/
183-
public void handleBadImage(Integer errorCode) {
187+
public void handleBadImage(Integer errorCode,
188+
UploadItem uploadItem) {
184189
Timber.d("Handle bad picture with error code %d", errorCode);
185190
if (errorCode
186-
>= 8) { // If location of image and nearby does not match, then set shared preferences to disable wikidata edits
187-
repository.saveValue("Picture_Has_Correct_Location", false);
191+
>= 8) { // If location of image and nearby does not match, then set shared preferences to disable wikidata edits
192+
uploadItem.setHasInvalidLocation(true);
188193
}
189194

190195
switch (errorCode) {

app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,6 @@ public void createClaimWithLogging(String wikidataEntityId, String wikiItemName,
6161
return;
6262
}
6363

64-
if (!(directKvStore.getBoolean("Picture_Has_Correct_Location", true))) {
65-
Timber.d("Image location and nearby place location mismatched, so Wikidata item won't be edited");
66-
return;
67-
}
68-
6964
if (p18Value != null && !p18Value.trim().isEmpty()) {
7065
Timber.d("Skipping creation of claim as p18Value is not empty, we won't override existing image");
7166
return;

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,20 @@ class UploadMediaPresenterTest {
109109
@Test
110110
fun handleImageResult() {
111111
//Positive case test
112-
uploadMediaPresenter.handleImageResult(IMAGE_KEEP)
112+
uploadMediaPresenter.handleImageResult(IMAGE_KEEP, uploadItem)
113113
verify(view).onImageValidationSuccess()
114114

115115
//Duplicate file name
116-
uploadMediaPresenter.handleImageResult(FILE_NAME_EXISTS)
116+
uploadMediaPresenter.handleImageResult(FILE_NAME_EXISTS, uploadItem)
117117
verify(view).showDuplicatePicturePopup()
118118

119119
//Empty Title test
120-
uploadMediaPresenter.handleImageResult(EMPTY_TITLE)
120+
uploadMediaPresenter.handleImageResult(EMPTY_TITLE, uploadItem)
121121
verify(view).showMessage(ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())
122122

123123
//Bad Picture test
124124
//Empty Title test
125-
uploadMediaPresenter.handleImageResult(-7)
125+
uploadMediaPresenter.handleImageResult(-7, uploadItem)
126126
verify(view).showBadImagePopup(ArgumentMatchers.anyInt())
127127

128128
}
@@ -158,8 +158,8 @@ class UploadMediaPresenterTest {
158158
*/
159159
@Test
160160
fun handleBadImageBaseTestInvalidLocation() {
161-
uploadMediaPresenter.handleBadImage(8)
162-
verify(repository).saveValue(ArgumentMatchers.anyString(), eq(false))
161+
uploadMediaPresenter.handleBadImage(8, uploadItem)
162+
verify(uploadItem).setHasInvalidLocation(true)
163163
verify(view).showBadImagePopup(8)
164164
}
165165

@@ -168,7 +168,7 @@ class UploadMediaPresenterTest {
168168
*/
169169
@Test
170170
fun handleBadImageBaseTestEmptyTitle() {
171-
uploadMediaPresenter.handleBadImage(-3)
171+
uploadMediaPresenter.handleBadImage(-3, uploadItem)
172172
verify(view).showMessage(ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())
173173
}
174174

@@ -177,7 +177,7 @@ class UploadMediaPresenterTest {
177177
*/
178178
@Test
179179
fun handleBadImageBaseTestFileNameExists() {
180-
uploadMediaPresenter.handleBadImage(-4)
180+
uploadMediaPresenter.handleBadImage(-4, uploadItem)
181181
verify(view).showDuplicatePicturePopup()
182182
}
183183

app/src/test/kotlin/fr/free/nrw/commons/wikidata/WikidataEditServiceTest.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,6 @@ class WikidataEditServiceTest {
5050
verifyZeroInteractions(wikidataClient!!)
5151
}
5252

53-
@Test
54-
fun noClaimsWhenLocationIsNotCorrect() {
55-
`when`(directKvStore!!.getBoolean("Picture_Has_Correct_Location", true))
56-
.thenReturn(false)
57-
wikidataEditService!!.createClaimWithLogging("Q1", "","Test.jpg","")
58-
verifyZeroInteractions(wikidataClient!!)
59-
}
60-
6153
@Test
6254
fun createClaimWithLogging() {
6355
`when`(directKvStore!!.getBoolean("Picture_Has_Correct_Location", true))

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77
maven { url "https://plugins.gradle.org/m2/" }
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:3.6.1'
10+
classpath 'com.android.tools.build:gradle:3.6.3'
1111
classpath "com.hiya:jacoco-android:0.2"
1212
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2'
1313
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION"

0 commit comments

Comments
 (0)