Skip to content

Commit 9cbed5e

Browse files
ashishkumar468maskara
authored and
maskara
committed
When uploading several files at once the date is missing commons-app#1854 (#2)
* Bug fix issue commons-app#1854 * updated ContributionsDao to save create date, which it was not doing currently [it was instead saving current date] * UploadItem accepts are dateCreated param * Added a function in UploadModel, getFileCreatedDate which tries to fetched the file creaction date from all possible content providers.
1 parent dc4d5ff commit 9cbed5e

File tree

5 files changed

+55
-27
lines changed

5 files changed

+55
-27
lines changed

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

+5-16
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,20 @@ public Contribution[] newArray(int i) {
4949
private Uri contentUri;
5050
private String source;
5151
private String editSummary;
52-
private Date timestamp;
5352
private int state;
5453
private long transferred;
5554
private String decimalCoords;
5655
private boolean isMultiple;
5756
private String wikiDataEntityId;
5857
private Uri contentProviderUri;
5958

60-
public Contribution(Uri contentUri, String filename, Uri localUri, String imageUrl, Date timestamp,
59+
public Contribution(Uri contentUri, String filename, Uri localUri, String imageUrl, Date dateCreated,
6160
int state, long dataLength, Date dateUploaded, long transferred,
6261
String source, String description, String creator, boolean isMultiple,
6362
int width, int height, String license) {
64-
super(localUri, imageUrl, filename, description, dataLength, timestamp, dateUploaded, creator);
63+
super(localUri, imageUrl, filename, description, dataLength, dateCreated, dateUploaded, creator);
6564
this.contentUri = contentUri;
6665
this.state = state;
67-
this.timestamp = timestamp;
6866
this.transferred = transferred;
6967
this.source = source;
7068
this.isMultiple = isMultiple;
@@ -78,14 +76,12 @@ public Contribution(Uri localUri, String imageUrl, String filename, String descr
7876
super(localUri, imageUrl, filename, description, dataLength, dateCreated, dateUploaded, creator);
7977
this.decimalCoords = decimalCoords;
8078
this.editSummary = editSummary;
81-
timestamp = new Date(System.currentTimeMillis());
8279
}
8380

8481
public Contribution(Parcel in) {
8582
super(in);
8683
contentUri = in.readParcelable(Uri.class.getClassLoader());
8784
source = in.readString();
88-
timestamp = (Date) in.readSerializable();
8985
state = in.readInt();
9086
transferred = in.readLong();
9187
isMultiple = in.readInt() == 1;
@@ -96,12 +92,13 @@ public void writeToParcel(Parcel parcel, int flags) {
9692
super.writeToParcel(parcel, flags);
9793
parcel.writeParcelable(contentUri, flags);
9894
parcel.writeString(source);
99-
parcel.writeSerializable(timestamp);
10095
parcel.writeInt(state);
10196
parcel.writeLong(transferred);
10297
parcel.writeInt(isMultiple ? 1 : 0);
10398
}
10499

100+
101+
105102
public boolean getMultiple() {
106103
return isMultiple;
107104
}
@@ -130,14 +127,6 @@ public void setContentUri(Uri contentUri) {
130127
this.contentUri = contentUri;
131128
}
132129

133-
public Date getTimestamp() {
134-
return timestamp;
135-
}
136-
137-
public void setTimestamp(Date timestamp) {
138-
this.timestamp = timestamp;
139-
}
140-
141130
public int getState() {
142131
return state;
143132
}
@@ -196,7 +185,7 @@ public void setImageUrl(String imageUrl) {
196185
}
197186

198187
public Contribution() {
199-
timestamp = new Date(System.currentTimeMillis());
188+
200189
}
201190

202191
public String getSource() {

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ ContentValues toContentValues(Contribution contribution) {
9898
cv.put(Table.COLUMN_UPLOADED, contribution.getDateUploaded().getTime());
9999
}
100100
cv.put(Table.COLUMN_LENGTH, contribution.getDataLength());
101-
cv.put(Table.COLUMN_TIMESTAMP, contribution.getTimestamp().getTime());
101+
//This was always meant to store the date created..If somehow date created is not fetched while actually saving the contribution, lets save today's date
102+
cv.put(Table.COLUMN_TIMESTAMP, contribution.getDateCreated()==null?System.currentTimeMillis():contribution.getDateCreated().getTime());
102103
cv.put(Table.COLUMN_STATE, contribution.getState());
103104
cv.put(Table.COLUMN_TRANSFERRED, contribution.getTransferred());
104105
cv.put(Table.COLUMN_SOURCE, contribution.getSource());

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

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.content.DialogInterface;
77
import android.content.Intent;
88
import android.content.SharedPreferences;
9+
import android.database.Cursor;
910
import android.net.Uri;
1011
import android.os.Build;
1112
import android.os.Bundle;

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

+47-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package fr.free.nrw.commons.upload;
22

3-
import android.accounts.Account;
43
import android.annotation.SuppressLint;
54
import android.content.ContentResolver;
65
import android.content.Context;
76
import android.content.SharedPreferences;
7+
import android.database.Cursor;
88
import android.graphics.BitmapRegionDecoder;
99
import android.net.Uri;
1010
import android.support.annotation.Nullable;
@@ -13,6 +13,7 @@
1313
import java.io.FileInputStream;
1414
import java.io.IOException;
1515
import java.util.ArrayList;
16+
import java.util.Date;
1617
import java.util.List;
1718
import java.util.Map;
1819

@@ -25,7 +26,6 @@
2526
import fr.free.nrw.commons.mwapi.MediaWikiApi;
2627
import fr.free.nrw.commons.settings.Prefs;
2728
import fr.free.nrw.commons.utils.ImageUtils;
28-
import fr.free.nrw.commons.utils.StringUtils;
2929
import io.reactivex.Observable;
3030
import io.reactivex.Single;
3131
import io.reactivex.disposables.Disposable;
@@ -37,7 +37,7 @@
3737
public class UploadModel {
3838

3939
MediaWikiApi mwApi;
40-
private static UploadItem DUMMY = new UploadItem(Uri.EMPTY, "", "", GPSExtractor.DUMMY, "", null) {
40+
private static UploadItem DUMMY = new UploadItem(Uri.EMPTY, "", "", GPSExtractor.DUMMY, "", null,-1l) {
4141
@Override
4242
public boolean isDummy() {
4343
return true;
@@ -59,6 +59,7 @@ public boolean isDummy() {
5959

6060
@Inject
6161
SessionManager sessionManager;
62+
private Uri currentMediaUri;
6263

6364
@Inject
6465
UploadModel(@Named("licenses") List<String> licenses,
@@ -80,12 +81,16 @@ public boolean isDummy() {
8081
public void receive(List<Uri> mediaUri, String mimeType, String source, SimilarImageInterface similarImageInterface) {
8182
currentStepIndex = 0;
8283
Observable<UploadItem> itemObservable = Observable.fromIterable(mediaUri)
83-
.map(this::cacheFileUpload)
84+
.map(media -> {
85+
currentMediaUri=media;
86+
return cacheFileUpload(media);
87+
})
8488
.map(filePath -> {
89+
long fileCreatedDate = getFileCreatedDate(currentMediaUri);
8590
Uri uri = Uri.fromFile(new File(filePath));
8691
FileProcessor fp = new FileProcessor(filePath, context.getContentResolver(), context);
8792
UploadItem item = new UploadItem(uri, mimeType, source, fp.processFileCoordinates(similarImageInterface),
88-
FileUtils.getFileExt(filePath), null);
93+
FileUtils.getFileExt(filePath), null,fileCreatedDate);
8994
Single.zip(
9095
Single.fromCallable(() ->
9196
new FileInputStream(filePath))
@@ -110,11 +115,12 @@ public void receive(List<Uri> mediaUri, String mimeType, String source, SimilarI
110115
public void receiveDirect(Uri media, String mimeType, String source, String wikidataEntityIdPref, String title, String desc, SimilarImageInterface similarImageInterface) {
111116
currentStepIndex = 0;
112117
items = new ArrayList<>();
118+
long fileCreatedDate = getFileCreatedDate(media);
113119
String filePath = this.cacheFileUpload(media);
114120
Uri uri = Uri.fromFile(new File(filePath));
115121
FileProcessor fp = new FileProcessor(filePath, context.getContentResolver(), context);
116122
UploadItem item = new UploadItem(uri, mimeType, source, fp.processFileCoordinates(similarImageInterface),
117-
FileUtils.getFileExt(filePath), wikidataEntityIdPref);
123+
FileUtils.getFileExt(filePath), wikidataEntityIdPref,fileCreatedDate);
118124
item.title.setTitleText(title);
119125
item.descriptions.get(0).setDescriptionText(desc);
120126
//TODO figure out if default descriptions in other languages exist
@@ -135,6 +141,33 @@ public void receiveDirect(Uri media, String mimeType, String source, String wiki
135141
items.get(0).first = true;
136142
}
137143

144+
/**
145+
* Get file creation date from uri from all possible content providers
146+
* @param media
147+
* @return
148+
*/
149+
private long getFileCreatedDate(Uri media) {
150+
try {
151+
Cursor cursor = contentResolver.query(media, null, null, null, null);
152+
if (cursor == null) {
153+
return -1;//Could not fetch last_modified
154+
}
155+
//Content provider contracts for opening gallery from the app and that by sharing from gallery from outside are different and we need to handle both the cases
156+
int lastModifiedColumnIndex = cursor.getColumnIndex("last_modified");//If gallery is opened from in app
157+
if(lastModifiedColumnIndex==-1){
158+
lastModifiedColumnIndex=cursor.getColumnIndex("datetaken");
159+
}
160+
//If both the content providers do not give the data, lets leave it to Jesus
161+
if(lastModifiedColumnIndex==-1){
162+
return -1l;
163+
}
164+
cursor.moveToFirst();
165+
return cursor.getLong(lastModifiedColumnIndex);
166+
} catch (Exception e) {
167+
return -1;////Could not fetch last_modified
168+
}
169+
}
170+
138171
public boolean isPreviousAvailable() {
139172
return currentStepIndex > 0;
140173
}
@@ -266,6 +299,10 @@ public Observable<Contribution> buildContributions(List<String> categoryStringLi
266299
contribution.setTag("mimeType", item.mimeType);
267300
contribution.setSource(item.source);
268301
contribution.setContentProviderUri(item.mediaUri);
302+
if (item.createdTimestamp != -1l) {
303+
contribution.setDateCreated(new Date(item.createdTimestamp));
304+
//Set the date only if you have it, else the upload service is gonna try it the other way
305+
}
269306
return contribution;
270307
});
271308
}
@@ -322,9 +359,10 @@ static class UploadItem {
322359
public String wikidataEntityId;
323360
public boolean visited;
324361
public boolean error;
362+
public long createdTimestamp;
325363

326364
@SuppressLint("CheckResult")
327-
UploadItem(Uri mediaUri, String mimeType, String source, GPSExtractor gpsCoords, String fileExt, @Nullable String wikidataEntityId) {
365+
UploadItem(Uri mediaUri, String mimeType, String source, GPSExtractor gpsCoords, String fileExt, @Nullable String wikidataEntityId, long createdTimestamp) {
328366
title = new Title();
329367
descriptions = new ArrayList<>();
330368
descriptions.add(new Description());
@@ -336,6 +374,8 @@ static class UploadItem {
336374
this.gpsCoords = gpsCoords;
337375
this.fileExt = fileExt;
338376
imageQuality = BehaviorSubject.createDefault(ImageUtils.IMAGE_WAIT);
377+
this.createdTimestamp=createdTimestamp;
378+
// imageQuality.subscribe(iq->Timber.i("New value of imageQuality:"+ImageUtils.IMAGE_OK));
339379
}
340380

341381
public boolean isDummy() {

app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionDaoTest.kt

-3
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ class ContributionDaoTest {
279279
assertEquals("file", it.filename)
280280
assertEquals(localUri, it.localUri.toString())
281281
assertEquals("image", it.imageUrl)
282-
assertEquals(created, it.timestamp.time)
283282
assertEquals(created, it.dateCreated.time)
284283
assertEquals(STATE_QUEUED, it.state)
285284
assertEquals(222L, it.dataLength)
@@ -299,7 +298,6 @@ class ContributionDaoTest {
299298
fun createFromCursor_nullableTimestamps() {
300299
createCursor(0L, 0L, false, localUri).let { mc ->
301300
testObject.fromCursor(mc).let {
302-
assertNull(it.timestamp)
303301
assertNull(it.dateCreated)
304302
assertNull(it.dateUploaded)
305303
}
@@ -342,7 +340,6 @@ class ContributionDaoTest {
342340
source = SOURCE_CAMERA
343341
license = "007"
344342
multiple = isMultiple
345-
timestamp = Date(321L)
346343
width = 640
347344
height = 480 // VGA should be enough for anyone, right?
348345
}

0 commit comments

Comments
 (0)