Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

With lazy loading of contributions #3566

Merged
merged 48 commits into from
May 28, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
3adf1e3
With lazy loading of contributions
maskaravivek Mar 23, 2020
27a8352
With contribution fetch
maskaravivek Mar 23, 2020
0537470
fix display of contributions
maskaravivek Apr 16, 2020
5dd362c
more changes
maskaravivek Apr 17, 2020
b9ed4e5
Bugfix/contributions pagination (#5)
ashishkumar468 Apr 20, 2020
6e3c61a
Merge branch 'master' into lazyContributions
maskaravivek Apr 20, 2020
d0b127b
Merge branch 'lazyContributions' of https://github.com/maskaravivek/a…
maskaravivek Apr 20, 2020
25884ca
Merge branch 'master' into lazyContributions
maskaravivek Apr 21, 2020
2c1e271
Fix build
maskaravivek Apr 21, 2020
1e12d31
minor fixes
maskaravivek Apr 21, 2020
22fd8e9
Delete and save contribution with correct pageid when upload succeeds
maskaravivek Apr 23, 2020
854ab5c
Merge branch 'master' into lazyContributions
maskaravivek Apr 26, 2020
5d2216b
fix build
maskaravivek Apr 26, 2020
da1b3cc
Code review comments
maskaravivek May 7, 2020
e93e491
With paging library added
maskaravivek May 7, 2020
d2f9029
Address code review comments
maskaravivek May 7, 2020
6c54e35
Add boundary callback
maskaravivek May 8, 2020
8d62704
Minor changes
maskaravivek May 8, 2020
26cf097
Minor changes
maskaravivek May 9, 2020
abba64d
Merge branch 'master' into lazyContributions
maskaravivek May 9, 2020
971cb29
Minor fixes
maskaravivek May 9, 2020
050dd87
Fix test case
maskaravivek May 9, 2020
5f32477
Minor
maskaravivek May 9, 2020
6ba2736
update saved state
maskaravivek May 9, 2020
3fb265a
Fix test
maskaravivek May 10, 2020
def6ecc
With more test cases
maskaravivek May 10, 2020
34bd6f6
With java docs
maskaravivek May 10, 2020
0842da7
With code review comments
maskaravivek May 11, 2020
ee70c21
With build fix
maskaravivek May 11, 2020
ab97455
Minor changes
maskaravivek May 12, 2020
aa88926
Merge branch 'master' into lazyContributions
maskaravivek May 12, 2020
d23115b
Address code review comments
maskaravivek May 13, 2020
85f48a9
Minor
maskaravivek May 14, 2020
bb4f91c
Use ktx library
maskaravivek May 14, 2020
edb828e
Fix loading of contributions on upload
maskaravivek May 14, 2020
ee6f5bf
Merge branch 'master' into lazyContributions
maskaravivek May 20, 2020
e1e761b
Fix test
maskaravivek May 20, 2020
193ed2a
Merge branch 'lazyContributions' of github.com:maskaravivek/apps-andr…
maskaravivek May 20, 2020
9ca4662
Handle end of list for user media
maskaravivek May 20, 2020
66ec641
Init continuation exists
maskaravivek May 21, 2020
cf0393c
More changes
maskaravivek May 24, 2020
6b7ac2b
Fix minor UI issues
maskaravivek May 26, 2020
a4dfc1d
Merge branch 'master' into lazyContributions
maskaravivek May 26, 2020
92336f5
With minor
maskaravivek May 26, 2020
3260bc7
Fix test
maskaravivek May 26, 2020
ac2898b
Replace direct scheduler with completable
maskaravivek May 26, 2020
2eb67c5
Fix code review comments
maskaravivek May 27, 2020
5f12c5f
Merge branch 'master' into lazyContributions
maskaravivek May 27, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/src/main/java/fr/free/nrw/commons/Media.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.utils.CommonsDateUtil;
import fr.free.nrw.commons.utils.MediaDataExtractorUtil;
Expand Down Expand Up @@ -50,6 +51,9 @@ public class Media implements Parcelable {
public HashMap<String, String> descriptions; // multilingual descriptions as loaded
public HashMap<String, String> tags = new HashMap<>();
@Nullable public LatLng coordinates;
@PrimaryKey
@NonNull
public int pageId;

/**
* Provides local constructor
Expand Down Expand Up @@ -154,6 +158,7 @@ public static Media from(MwQueryPage page) {
if (metadata == null) {
Media media = new Media(null, imageInfo.getOriginalUrl(),
page.title(), "", 0, null, null, null);
media.pageId=page.pageId();
if (!StringUtils.isBlank(imageInfo.getThumbUrl())) {
media.setThumbUrl(imageInfo.getThumbUrl());
}
Expand All @@ -169,6 +174,7 @@ public static Media from(MwQueryPage page) {
safeParseDate(metadata.dateTime()),
getArtist(metadata)
);
media.pageId=page.pageId();

if (!StringUtils.isBlank(imageInfo.getThumbUrl())) {
media.setThumbUrl(imageInfo.getThumbUrl());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ public class Contribution extends Media {
public static final String SOURCE_CAMERA = "camera";
public static final String SOURCE_GALLERY = "gallery";
public static final String SOURCE_EXTERNAL = "external";
@PrimaryKey (autoGenerate = true)
@NonNull
public long _id;

public Uri contentUri;
public String source;
public String editSummary;
Expand Down Expand Up @@ -73,7 +71,7 @@ public Contribution(Media media) {
media.license, media.getLicenseUrl(), media.creator, media.getCategories(),
media.requestedDeletion,
media.descriptions, media.tags, media.coordinates);

this.pageId=media.pageId;
this.state = STATE_COMPLETED;
}

Expand Down Expand Up @@ -258,7 +256,6 @@ public int describeContents() {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeLong(this._id);
dest.writeParcelable(this.contentUri, flags);
dest.writeString(this.source);
dest.writeString(this.editSummary);
Expand All @@ -275,7 +272,6 @@ public void writeToParcel(Parcel dest, int flags) {

protected Contribution(Parcel in) {
super(in);
this._id = in.readLong();
this.contentUri = in.readParcelable(Uri.class.getClassLoader());
this.source = in.readString();
this.editSummary = in.readString();
Expand Down Expand Up @@ -305,7 +301,7 @@ public Contribution[] newArray(int size) {
@NonNull
@Override
public String toString() {
return String.valueOf(_id);
return String.valueOf(pageId);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,8 @@ public abstract class ContributionDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
public abstract Single<Long> save(Contribution contribution);

public Completable deleteAllAndSave(List<Contribution> contributions){
return Completable.fromAction(() -> deleteAllAndSaveTransaction(contributions));
}

@Transaction
public void deleteAllAndSaveTransaction(List<Contribution> contributions){
deleteAll(Contribution.STATE_COMPLETED);
save(contributions);
}

@Insert
public abstract void save(List<Contribution> contribution);
@Insert(onConflict = OnConflictStrategy.REPLACE)
public abstract Single<List<Long>> save(List<Contribution> contribution);

@Delete
public abstract Single<Integer> delete(Contribution contribution);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ public class ContributionsListAdapter extends RecyclerView.Adapter<ContributionV
private Callback callback;
private List<Contribution> contributions;

public ContributionsListAdapter(Callback callback) {
public ContributionsListAdapter(final Callback callback) {
this.callback = callback;
contributions = new ArrayList<>();
setHasStableIds(true);
}

/**
Expand Down Expand Up @@ -54,12 +55,7 @@ public int getItemCount() {
}

public void setContributions(@NonNull final List<Contribution> contributionList) {
contributions.addAll(contributionList);
final HashSet<Contribution> hashSet = new HashSet<>(contributions);
contributions.clear();
contributions.addAll(hashSet);
Collections.sort(contributions,
(o1, o2) -> -o1.getDateUploaded().compareTo(o2.getDateUploaded()));
contributions = contributionList;
notifyDataSetChanged();
}

Expand All @@ -69,7 +65,7 @@ public Contribution getContributionForPosition(int position) {

@Override
public long getItemId(int position) {
return contributions.get(position)._id;
return contributions.get(position).pageId;
}

public interface Callback {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public void showNoContributionsUI(boolean shouldShow) {
}

@Override
public void showContributions(List<Contribution> contributionList) {
public void showContributions(final List<Contribution> contributionList) {
adapter.setContributions(contributionList);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,10 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {

public void fetchContributions() {
if (NetworkUtils.isInternetConnectionEstablished(CommonsApplication.getInstance())) {
view.showProgress(true);
this.user = sessionManager.getUserName();

view.showContributions(Collections.emptyList());
if (contributionList.isEmpty()) {
view.showProgress(true);
}
user = sessionManager.getUserName();
compositeDisposable.add(mediaClient.getMediaListForUser(user)
.subscribeOn(ioThreadScheduler)
.observeOn(mainThreadScheduler)
Expand Down Expand Up @@ -146,7 +146,7 @@ private void showContributions(@NonNull final List<Contribution> contributions)
}
}

private void saveContributionsToDB(List<Contribution> contributions) {
private void saveContributionsToDB(final List<Contribution> contributions) {
repository.save(contributions).subscribeOn(ioThreadScheduler).subscribe();
repository.set("last_fetch_timestamp", System.currentTimeMillis());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ public LiveData<List<Contribution>> getContributions() {
return contributionDao.fetchContributions();
}

public Completable saveContributions(List<Contribution> contributions) {
return contributionDao.deleteAllAndSave(contributions);
public Single<List<Long>> saveContributions(List<Contribution> contributions) {
return contributionDao.save(contributions);
}

public void set(String key, long value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import javax.inject.Inject;

import io.reactivex.Completable;
import io.reactivex.Single;

/**
Expand Down Expand Up @@ -50,7 +49,7 @@ public LiveData<List<Contribution>> fetchContributions() {
return localDataSource.getContributions();
}

public Completable save(List<Contribution> contributions) {
public Single<List<Long>> save(List<Contribution> contributions) {
return localDataSource.saveContributions(contributions);
}

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/fr/free/nrw/commons/db/AppDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionDao;

@Database(entities = {Contribution.class}, version = 1, exportSchema = false)
@Database(entities = {Contribution.class}, version = 2, exportSchema = false)
@TypeConverters({Converters.class})
abstract public class AppDatabase extends RoomDatabase {
public abstract ContributionDao getContributionDao();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import android.view.inputmethod.InputMethodManager;
import androidx.collection.LruCache;
import androidx.room.Room;
import androidx.room.RoomDatabase.Builder;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;
import com.github.varunpant.quadtree.QuadTree;
import com.google.gson.Gson;
import dagger.Module;
Expand Down Expand Up @@ -231,10 +234,55 @@ public QuadTree providesQuadTres() {
@Provides
@Singleton
public AppDatabase provideAppDataBase() {
appDatabase=Room.databaseBuilder(applicationContext, AppDatabase.class, "commons_room.db").build();
Builder<AppDatabase> appDatabaseBuilder = Room
.databaseBuilder(applicationContext, AppDatabase.class, "commons_room.db");
appDatabaseBuilder.addMigrations(MIGRATION_1_2);
appDatabase = appDatabaseBuilder.build();
return appDatabase;
}

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("DROP TABLE `contribution`");
macgills marked this conversation as resolved.
Show resolved Hide resolved
database.execSQL("CREATE TABLE IF NOT EXISTS `contribution` ("
+ "`localUri` TEXT,"
+ " `thumbUrl` TEXT,"
+ " `imageUrl` TEXT,"
+ " `filename` TEXT,"
+ " `description` TEXT,"
+ " `discussion` TEXT,"
+ " `dateCreated` INTEGER,"
+ " `dateUploaded` INTEGER,"
+ " `width` INTEGER NOT NULL,"
+ " `height` INTEGER NOT NULL,"
+ " `license` TEXT,"
+ " `licenseUrl` TEXT,"
+ " `creator` TEXT,"
+ " `categories` TEXT,"
+ " `requestedDeletion`"
+ " INTEGER NOT NULL,"
+ " `descriptions` TEXT,"
+ " `tags` TEXT,"
+ " `coordinates` TEXT,"
+ " `pageId` INTEGER NOT NULL,"
+ " `contentUri` TEXT,"
+ " `source` TEXT,"
+ " `editSummary` TEXT,"
+ " `state` INTEGER NOT NULL,"
+ " `transferred` INTEGER NOT NULL,"
+ " `decimalCoords` TEXT,"
+ " `isMultiple` INTEGER NOT NULL,"
+ " `wikiDataEntityId` TEXT,"
+ " `wikiItemName` TEXT,"
+ " `p18Value` TEXT,"
+ " `contentProviderUri` TEXT,"
+ " `dateCreatedSource` TEXT,"
+ " `dataLength` INTEGER NOT NULL,"
+ " PRIMARY KEY(`pageId`))");
}
};

@Provides
public ContributionDao providesContributionsDao() {
return appDatabase.getContributionDao();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,7 @@ public void queue(int what, Contribution contribution) {
.subscribeOn(ioThreadScheduler)
.observeOn(mainThreadScheduler)
.subscribe(aLong->{
contribution._id = aLong;
UploadService.super.queue(what, contribution);
super.queue(what, contribution);
}, Throwable::printStackTrace));
break;
default:
Expand Down