Skip to content

Conversation

@Victor-Bonin
Copy link
Contributor

Bookmark System

Fixes #1756

Creation of a new section Bookmarks in the navigation drawer, divided in 2 tabs.
Those tabs list the user's bookmarked media and places using the previsouly used display.
When clicking a media or a location you can access its details. From the details screen you can now save the picture or place, or unsave it if it is already bookmarked.

Creation of a new package : bookmarks including both subpackages locations and pictures
The subpackages have their own DAO, ContentProvider, Controller and Fragment.
Creation of corresponding tests.

Tests performed (required)

Tested on API level 24 (Samsung Galaxy S6) & 28 (Emulator Pixel 2), with betaDebug & betaRelease.

Screenshots :

screenshot_20181012-152337
screenshot_20181012-152411
screenshot_20181012-152442
screenshot_20181012-152446

RomainGF and others added 26 commits October 8, 2018 10:43
When user come back from detail picture fragment, it solve the refresh bug.
@Victor-Bonin Victor-Bonin reopened this Oct 14, 2018
@commons-app commons-app deleted a comment Oct 14, 2018
@codecov-io
Copy link

codecov-io commented Oct 14, 2018

Codecov Report

Merging #1935 into master will decrease coverage by 0.18%.
The diff coverage is 0.93%.

Impacted file tree graph

@@            Coverage Diff            @@
##           master   #1935      +/-   ##
=========================================
- Coverage    4.54%   4.36%   -0.19%     
=========================================
  Files         199     211      +12     
  Lines       10113   10646     +533     
  Branches      900     951      +51     
=========================================
+ Hits          460     465       +5     
- Misses       9618   10146     +528     
  Partials       35      35
Impacted Files Coverage Δ
.../fr/free/nrw/commons/di/FragmentBuilderModule.java 0% <ø> (ø) ⬆️
...e/nrw/commons/di/ContentProviderBuilderModule.java 0% <ø> (ø) ⬆️
.../fr/free/nrw/commons/di/ActivityBuilderModule.java 0% <ø> (ø) ⬆️
...n/java/fr/free/nrw/commons/CommonsApplication.java 43.9% <0%> (-1.1%) ⬇️
...e/nrw/commons/bookmarks/BookmarksPagerAdapter.java 0% <0%> (ø)
...n/java/fr/free/nrw/commons/bookmarks/Bookmark.java 0% <0%> (ø)
...rc/main/java/fr/free/nrw/commons/nearby/Place.java 0% <0%> (ø) ⬆️
...java/fr/free/nrw/commons/nearby/PlaceRenderer.java 0% <0%> (ø) ⬆️
...s/bookmarks/pictures/BookmarkPicturesFragment.java 0% <0%> (ø)
...bookmarks/locations/BookmarkLocationsFragment.java 0% <0%> (ø)
... and 27 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 89d2d0c...9317344. Read the comment docs.

@maskaravivek
Copy link
Contributor

@R0ma1nG Thanks for the PR. I tried testing it and the app crashes as soon as I click on bookmarks. Here are the logs:

2018-10-14 23:15:19.303 19638-19638/fr.free.nrw.commons.beta E/AndroidRuntime: FATAL EXCEPTION: main
    Process: fr.free.nrw.commons.beta, PID: 19638
    android.database.sqlite.SQLiteException: no such table: bookmarks (code 1): , while compiling: SELECT media_name, media_creator FROM bookmarks
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1392)
        at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:399)
        at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
        at fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesContentProvider.query(BookmarkPicturesContentProvider.java:46)
        at android.content.ContentProvider.query(ContentProvider.java:1063)
        at android.content.ContentProvider.query(ContentProvider.java:1155)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:240)
        at android.content.ContentProviderClient.query(ContentProviderClient.java:154)
        at android.content.ContentProviderClient.query(ContentProviderClient.java:137)
        at android.content.ContentProviderClient.query(ContentProviderClient.java:127)
        at fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao.getAllBookmarks(BookmarkPicturesDao.java:42)
        at fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesController.needRefreshBookmarkedPictures(BookmarkPicturesController.java:53)
        at fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesFragment.onResume(BookmarkPicturesFragment.java:89)
        at android.support.v4.app.Fragment.performResume(Fragment.java:2390)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1474)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2215)
        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:649)
        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1238)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1086)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1616)
        at android.view.View.measure(View.java:22105)
        at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1676)
        at android.view.View.measure(View.java:22105)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1059)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6606)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:141)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6606)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
2018-10-14 23:15:19.305 19638-19638/fr.free.nrw.commons.beta E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6606)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6606)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6606)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:727)
        at android.view.View.measure(View.java:22105)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2462)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1544)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1801)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1432)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6861)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1026)
        at android.view.Choreographer.doCallbacks(Choreographer.java:838)
        at android.view.Choreographer.doFrame(Choreographer.java:769)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1012)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:171)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

Note: I didn't do a fresh install. If the user already has the app installed, you should handle it using sqlite migrations ie onUpgrade

@maskaravivek
Copy link
Contributor

Great work @R0ma1nG!!

I tested the feature on a fresh install and it works like a charm. I tried the following things:

  • Bookmarked a media item
  • Removed a media item from bookmarks
  • Bookmarked/removed a nearby item
  • Tried uploading an image using the bookmarked item, and ensured that the corresponding wikidata edit is also attempted.

Am happy to do a code review and merge this PR once the upgrade thing is fixed. :)

@nicolas-raoul
Copy link
Member

Looks great!
This feature will be extremely useful to me, as I look for nearby places using Android, usually shoot them with an unconnected DLSR camera, and link them to Wikidata later.
Insalien ? :-)

@RomainGF
Copy link

Hey @maskaravivek
I fixed the database upgrade :)
Yes @nicolas-raoul from INSA Lyon.

@commons-app commons-app deleted a comment Oct 15, 2018
Copy link
Contributor

@maskaravivek maskaravivek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work @R0ma1nG! The code quality looks good and it is nice to see that you have added a lot of test cases.

I am happy to merge it once someone else also tests it. :)

import fr.free.nrw.commons.auth.AuthenticatedActivity;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;

public class BookmarksActivity extends AuthenticatedActivity
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO this feature can be used without the user logging in. In that case, you don't need to extend AuthenticatedActivity

Media m = provider.getMediaAtPosition(pager.getCurrentItem());
switch (item.getItemId()) {
case R.id.menu_bookmark_current_image:
// TODO Update image state in database and in UI
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has this todo being taken care of?

@misaochan
Copy link
Member

Wow, fantastic PR! Merging, thanks for the great job @Victor-Bonin and @R0ma1nG . :)

@misaochan misaochan merged commit 80a9c94 into commons-app:master Oct 25, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants