mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-28 21:33:53 +01:00
* #3222 Merge master into Structured Data branch, fix conflicts (#3447)
* [WIP] Fixes #2942. Set 'depicts' automatically for images uploaded via 'Nearby'
* Feature/refractor uploads [WIP] (#2887)
* Fix duplicate param information (#2515)
* Bug fix issue #2476 (#2526)
* Added wikidataEntityID in all db versions, handled db.execSql via method runQuery
* Versioning and changelog for v2.10.2 (#2531)
* Update changelog.md
* Versioning for v2.10.2
* Update changelog.md
* Bugfix/issue 2580 (#2584)
* Corrected string placedholders in certain string files
* Corrected string placedholders in certain string files[Bug fix #2580]
* Bug Fix #2585 (#2647)
* Bug Fix #2585
* Added null checks on view in SearchImageFragment when updating views from external sources
* Disposed the disposables in SearchActivity and SearchImageFragment when no longer in active lifecycle
* use FragmentUtils to verify fragment active state
* Bug Fix issue #2648 (#2678)
* Bug Fix issue #2648
* Handled external storage permission before file download
* * Removed redudant check for permission in MediaDetailPagerFragment (Dexter already does that)
* Removed duplicate code in PermissionUtil$checkPermissionsAndPerformAction, used the existing function with conditional extra parameters
* string name typo correction
* BugFix issue #2652 (#2706)
* Addded null check on bookmark before operating on it
* BugFix issue #2711 (#2712)
* Added null checks in OkHttpJsonApiClient$searchImages MwQueryResponse
* BugFix #2718 (#2719)
* Handled null auth cookies
* Fix #2791: NPE when nominating for deletion and leaving screen (#2792)
* Bug Fix issue #2789 (#2790)
* Handled Illegal State Exception for non existent appropriate view parents in ViewUtils$showShortSnackbar
* BugFix #2720 (#2831)
BugFix deprecated licenes #2720
* ui fixes, wip, upload
* *Issue #2886, BugFix #2832[wip]
* updated UploadActivity code
* modified ui
* Updated UploadPresenterTest
* * updated interfaces names to follow names suffixed with Contract
* added test cases
* card view elevation
* view pager disabled swipe
* bug fix, duplicate image
* used existing non-swipable view pager
* Avoid image view resize with keyboard, added adjustPan and stateVisible as softinputMode for UploadActivity
* retain UploadBaseFragment instances on orientation changes
* * Added test cases for UploadMediaPresenter
* Injected io and main thread schedulers
* categories presenter test cased wip
* Added CategoriesPresenter test
* * Added the logic to show open map (with to be uploaded image's coordinates while uploading image)
* codacy suggested changes * added java docs
* Added travis_wait fot android-wait-for-emulator
* ranamed interface onResponseCallback to Callback
* * Added api to delete picture in UploadModel
* cleanUp in UploadModel. once upload has been initiated
* Removed unused methods from UploadModel and the corresponding test class
* * Added tests for UploadPresenter
* Travis suggested changes
* Addded copy previous title and description
* * Made the upload add descriptions visible when keyboard visible
* add description request focus only when user manually requests it
* Added JavaDocs, review suggested changes
* Fix dagger injection
* use DialogUtil to show info in descriptions
* use activity context for DialogUtil
* Minor changes
* refactored title
* ui for depicts
* bug fix
* basic architecture for depicts
* adde architecture components for depicts
* [WIP] ApacheHttpClientMediaWikiApi.wikidataEditEntity: JSON param creation uses object instead of string
* resolved dagger errors
* multilingual captions and next button error resolved
* fixed next button issues in depicts fragment
* captions and depicts
* resolved previous button click issues
* fixed bindview error and added multi-captions
* replaced description and caption with uploadmediadetail
* refactored few classes
* modified ui of depicts
* minor fixes
* Bug fix, reduced the add description edit text clickable bound (#2973)
* moved depicts before categories
* replaced previous filename with captions
* removed time from filename
* added depicts suggestions
* [WIP] Wikidata Sandbox (Q4115189) test
* changes layout of layout_upload_depicts
* changed layout of upload_depicts
* code stuck at IO_SCHEDULER
* labels and description for depicts activity
* Bugfix/uploads (#3000)
* merged with master
* BugFix IllegalStateException
* setRetainState(true), not required with FragmentStatePagerAdapter
* Increase the ViewPager's Offscreen Limit, we want all the fragments to be active
* BugFix, clear selected categoris for previous upload session
* Clear Selected Categories
* Addded JavaDocs for CategoriesModel
* Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java
* Added class level JavaDoc UploadRemoteDataSource
* Added class level JavaDoc for UploadRepository
* Added JavaDocs for ThumbnailsAdapter
* Added JavaDocs for MediaLicensePresenter, CategoriesPresenter
* Removed null check on category query
* Show default catgeories based on image title and gps location when category text empty
* Allow search for empty category search
* Attached image scale listener to upload media image
* Bug fix, reduced the add description edit text clickable bound
* Fix memory leak (#3001)
* Bugfix/uploads (#3002)
* merged with master
* BugFix IllegalStateException
* setRetainState(true), not required with FragmentStatePagerAdapter
* Increase the ViewPager's Offscreen Limit, we want all the fragments to be active
* BugFix, clear selected categoris for previous upload session
* Clear Selected Categories
* Addded JavaDocs for CategoriesModel
* Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java
* Added class level JavaDoc UploadRemoteDataSource
* Added class level JavaDoc for UploadRepository
* Added JavaDocs for ThumbnailsAdapter
* Added JavaDocs for MediaLicensePresenter, CategoriesPresenter
* Removed null check on category query
* Show default catgeories based on image title and gps location when category text empty
* Allow search for empty category search
* Attached image scale listener to upload media image
* Bug fix, reduced the add description edit text clickable bound
* Added tooltip in Title in UploadMediaFragment
* BugFix recent categories
* Updated test methods
* Bugfix/uploads (#3011)
* merged with master
* BugFix IllegalStateException
* setRetainState(true), not required with FragmentStatePagerAdapter
* Increase the ViewPager's Offscreen Limit, we want all the fragments to be active
* BugFix, clear selected categoris for previous upload session
* Clear Selected Categories
* Addded JavaDocs for CategoriesModel
* Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java
* Added class level JavaDoc UploadRemoteDataSource
* Added class level JavaDoc for UploadRepository
* Added JavaDocs for ThumbnailsAdapter
* Added JavaDocs for MediaLicensePresenter, CategoriesPresenter
* Removed null check on category query
* Show default catgeories based on image title and gps location when category text empty
* Allow search for empty category search
* Attached image scale listener to upload media image
* Bug fix, reduced the add description edit text clickable bound
* Added tooltip in Title in UploadMediaFragment
* BugFix recent categories
* Updated test methods
* Avoid memory leak, free the adpater in MediaLicenseFragment.onDestroyView
* bugfix/uploads (#3012)
* merged with master
* BugFix IllegalStateException
* setRetainState(true), not required with FragmentStatePagerAdapter
* Increase the ViewPager's Offscreen Limit, we want all the fragments to be active
* BugFix, clear selected categoris for previous upload session
* Clear Selected Categories
* Addded JavaDocs for CategoriesModel
* Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java
* Added class level JavaDoc UploadRemoteDataSource
* Added class level JavaDoc for UploadRepository
* Added JavaDocs for ThumbnailsAdapter
* Added JavaDocs for MediaLicensePresenter, CategoriesPresenter
* Removed null check on category query
* Show default catgeories based on image title and gps location when category text empty
* Allow search for empty category search
* Attached image scale listener to upload media image
* Bug fix, reduced the add description edit text clickable bound
* Added tooltip in Title in UploadMediaFragment
* BugFix recent categories
* Updated test methods
* Avoid memory leak, free the adpater in MediaLicenseFragment.onDestroyView
* BugFix Illegal State Exception in ViewpPagerAdapter
* Remove irrelevant comment
* merge conflict with strings (#3016)
* [WIP] Fixed duplicated subscriprion for 'addPropertyP180'
* added documentation
* fixed issue #3006
* resolved issue #3004
* fixed issue with categoryPresenterTest.kt
* send captions as labels
* fixed issue with the captions
* optimised imports
* added upload for captions
* minor changes
* resolved issue with uploading captions
* resolved issue with api call
* uploading captions to wikibase
* added some tests and documentation
* undo formatting changes
* uploaded captions as labels to wikibase
* minor changes
* resolved error with spinner adpater
* adding captions to local database
* Fixed issue #3035
* fixed issue #3033
* fixed issue #3005
* fixed issue #3005
* added search for depicts
* fixed issue with compile time
* fixe issue with project build
* fixed issue #3044
* merged uploading depicts into branch
* uploading depicts
* rebased branch
* fixed crash due to depicts
* modified depicts interface
* Resolve merge conflicts
* Fix issues with API calls
* Use wikidata token
* searching depictions from depicts activity
* added some documentation and other changes
* fixed crash on selecting depictions
* sending wikidataentity id to upload depictions
* added changes after review
* Fixed issue with next button diabling in media detail activity
* added tests for depictions
* added all the unit tests and fixed few more issues
* showing captions in media details
* show captions in media details
* added documentations and worked upon review comments
* parsing response for depictions
* displaying captions and depiction QID in media detail
* added documentation
* fetching labels from QIDs
* captions working perfectly
* added documentations and code cleaning
* minor changes
* minor changes
* Showing items in explore
* added search via depicts in explore
* Added setOffscreenPageLimit in ViewPager
* show captions in explore
* show captions in home
* showing depict images under items
* added documentation and code refactoring
* enabled pagination in depiction search
* added some tests and media deatils in depiction detail activity
* fixed bug with back button in media
* fixed issue #3100
* fixed issue #3098
* fixed issue #3099
* fixed issue #3104 and #3098
* showing captions in place of title in home and explore:media
* show captions in explore:depiction image list activity
* showing depictions in media details
* showing depictions in media details in production flavor
* fixed issue #3108 and #3107
* fix isse #3108
* fixed issue #3110 and #3112
* fixed issue #3113
* added documentations
* fixed issue #3076 and #3109
* added depiction search test
* fixed issue #3113
* fixed issue #3111
* fixed issue #3106
* Showing items in explore
* minor change
* fixed issue #3118 and some other changes
* added MVP in searchdepictionsfragment
* added mvp architecture
* added MVP architecture to DepictedImagesDetailsActivity
* added documentation and some minor changes
* added image to depicted item in search depictions
* * Use callbacks from renderer to fetch thumbnails
* adding fresco to load image in depictions
* adding thumbnail image for depictions in upload and explore
* pagination issues
* fixed issue --(showing previous depiction thumbnail in explore)
* Fixed the logic for pagination
* hide progress on success of last page
* adding sub-items and parent items to search in explore
* minor changes for review comments
* fixed issue #3119
* fixed issue #3130
* changes after review comments
* showing child classes for depictions
* Showing child items
* showing parent classes for depicted items
* adding localised search for parent and child items
* clicking on any child class or parent class should call the corresponding class items
* fixed issue of showing wrong thumbnail for P18 item
* fixed issue #3132
* added test for DepictedImagesPresenter.java
* added unit tests for depicted items parent and child classes
* removed unused imports and code formatting
* fixed issue in search test
* deleting unnecessary .attach_pid9313 file
* deleting unnecessary .attach_pid9655 file
* added SearchDepictionsPresenterTest
* changes after review comments
* updates for review comments
* added more documentations
* removed unused code and classes and addressed spacing changes
* changes after review
* fixed build issues in the app
* worked on some review comments
* fixed issue:wrong thumbnail appears on wikidata item
* minor change
* worked on some review changes
* worked on review comments
* minor change
* addressed remaining review comments
* replaced hardcoded jpgs with pageIds to fetch captions
* added documentation
* removed hardcoded extensions and worked on review comments
* review comments
* [WIP] Added Depicts values for flavors
* [WIP] Minor fix
* [WIP] Minor fixes
* [WIP] Fixed URL
* [WIP] Fixed URLs and tokens
* Fixed MediaClient: added check for null in continuation store
* Fixed Media::from, changed return from null to new Media()
* [WIP] Merged with master
* Fix #3254 Displays a proper message in explore section when no result for caption
* Updated Mockito to org.mockito:mockito-inline:2.13.0
* [WIP] Fixed tests after merging
* [WIP] Fixed some JUnit tests
* Fixed 'accessing from wrong thread' error
* #3222 Delete manifest declaration of activity as fragment - stop casting MainActivity to CatgoryImagesCallback - fix tests
* Remove unit test not associated with any class - make CategoryPresenterTest more idiomatic
* fix compilation errors
Co-authored-by: Vitaly V. Pinchuk <vetal.978@gmail.com>
Co-authored-by: Ashish Kumar <ashishkumar468@gmail.com>
Co-authored-by: vanshikaarora <vanshikaa937@gmail.com>
Co-authored-by: Vivek Maskara <maskaravivek@gmail.com>
Co-authored-by: Vanshika Arora <34261945+vanshikaarora@users.noreply.github.com>
Co-authored-by: Somanshu and Himanshu <somanshS14@gmail.com>
* #3482 Use Room in Structured Data branch - remove unused code (#3483)
* #3482 Use Room in Structured Data branch - remove unused code
* #3482 Use Room in Structured Data branch - fix unit test compilation
* #3482 Use Room in Structured Data branch - add kdoc
* #3490 Depiction Search in upload shows No Results before it gets results (#3491)
* #3482 Use Room in Structured Data branch - remove unused code
* #3482 Use Room in Structured Data branch - fix unit test compilation
* #3490 Depiction Search in upload shows No Results before it gets results - stop showing error on subscription
* #3490 Depiction Search in upload shows No Results before it gets results - update test cases
* make labels nullable too
* fix unit test compilation
* #3222 remove lingering reference to depiction content provider
* Fix Crash
* #3222 Merge master into Structured Data branch, fix conflicts - review fixes
* Fix method invocations
* #3529 Captions/depictions are not saved to Commons (#3574)
* #3529 Captions/depictions are not saved to Commons - make copy of list of depictionEntityIds - uncomment editBaseDepictsProperty - refactor upload related classes
* #3529 Captions/depictions are not saved to Commons - fix wrong ArrayList usage
* #3529 Captions/depictions are not saved to Commons - fix test
* #3503 Remove Title/Caption From MediaUploadDetail and only use Caption/Description pairs (#3578)
* #3529 Captions/depictions are not saved to Commons - make copy of list of depictionEntityIds - uncomment editBaseDepictsProperty - refactor upload related classes
* #3529 Captions/depictions are not saved to Commons - fix wrong ArrayList usage
* #3529 Captions/depictions are not saved to Commons - fix test
* #3503 Remove Title/Caption From MediaUploadDetail and only use Caption/Description pairs - replace title with the first MediaDetail
* #3503 Remove Title/Caption From MediaUploadDetail and only use Caption/Description pairs - restore button disabling
* #3503 Remove Title/Caption From MediaUploadDetail and only use Caption/Description pairs - fix nearby place
* fix thumbnail issue 3526 (#3617)
* #3222 Merge master into Structured Data branch, fix conflicts - fix bad merge
* #3529 Captions/depictions are not saved to Commons (#3588)
* #3529 Captions/depictions are not saved to Commons - update flow to update appropriate data
* #3529 Captions/depictions are not saved to Commons - fix invoking of setlabel
* #3529 Captions/depictions are not saved to Commons - fix unit tests
* #3529 Captions/depictions are not saved to Commons - use constant for @Named
* #3529 Captions/depictions are not saved to Commons - remove captions interface
* #3529 Captions/depictions are not saved to Commons - delete unused Contribution fields - enforce Single Responsibility by using PageContentsCreator
* #3529 Captions/depictions are not saved to Commons - prefix id with M - remove language from url and only add from Field
* #3529 Captions/depictions are not saved to Commons - make edits of depictions and captions sequential
* #3529 Captions/depictions are not saved to Commons - remove unused model fields
* #3529 Captions/depictions are not saved to Commons - weaken type of categories - copy list on Contribution creation
* #3529 Captions/depictions are not saved to Commons - mark Media fields private - weaken types - remove partly implemented fields
* #3529 Captions/depictions are not saved to Commons - add semi colon
* #3529 Captions/depictions are not saved to Commons - fix test
* Fix issue 3526 Unlike "Items" tab, "child classes" tab does not display description nor image thumbnail (#3619)
* fix thumbnail issue 3526
* Fix Description issue 3526
* revert changes on this file, not finished with it yet
* Fix Description for Child and Parent classes - issue 3526
* Remove conflict text in file
* Remove retrofit.HEAD import
* Incorporated review comments
* Fix issue 3137 (#3637)
* Fix issue 3137
* Remove import Timber
* Remove unnecessary space
* #3222 Merge master into Structured Data branch, fix conflicts - revert logging
* Fix build
* #3661 No Depictions Selected Dialog has reversed buttons - fix button order
* Revert "#3661 No Depictions Selected Dialog has reversed buttons - fix button order"
This reverts commit d8f9809584.
* #3222 Merge master into Structured Data branch, fix conflicts - remove unused methods/fields
* #3661 No Depictions Selected Dialog has reversed buttons - fix button order (#3662)
* #3653 Many Mnull requests - stop requesting captions for null ids (#3657)
* #3653 Many Mnull requests - stop requesting captions for null ids
* #3653 Many Mnull requests - move log line
* #3633 [structured-data branch] In depictions selection screen, suggest nearby items (#3650)
* #3633 [structured-data branch] In depictions selection screen, suggest nearby items - for empty search terms show nearby items for depictions
* #3633 [structured-data branch] In depictions selection screen, suggest nearby items - use linear radii progression to search for places
* #3666 Crash when uploading on structured-data branch - revert cleanup of UploadController (#3670)
* #3222 Merge Structured Data branch into master - fix caption rendering in new UI
* #3222 Merge Structured Data branch into master - upgrade retrofit + okhttp
* #3664 Stop using JsonObject on StructuredData (#3672)
* #3664 Stop using JsonObject on StructuredData - remove usage in Media classes - remove from depicts client - create partial network models
* #3664 Stop using JsonObject on StructuredData - allow partial mapping of polymorphic models by returning null in typeadapter
* #3664 Stop using JsonObject on StructuredData - use models for editing depicts property
* #3664 Stop using JsonObject on StructuredData - use models for sparql parent query
* #3664 Stop using JsonObject on StructuredData - fix unit test compilation
* #3664 Stop using JsonObject on StructuredData - unify sparql responses
* #3664 Stop using JsonObject on StructuredData - minor cleanup of misnamed/unused/too broad visibility
* #3664 Stop using JsonObject on StructuredData - share variable names and logic for the Sarql queries
* #3664 Stop using JsonObject on StructuredData - add error logging
Co-authored-by: Vitaly V. Pinchuk <vetal.978@gmail.com>
Co-authored-by: Ashish Kumar <ashishkumar468@gmail.com>
Co-authored-by: vanshikaarora <vanshikaa937@gmail.com>
Co-authored-by: Vivek Maskara <maskaravivek@gmail.com>
Co-authored-by: Vanshika Arora <34261945+vanshikaarora@users.noreply.github.com>
Co-authored-by: Somanshu and Himanshu <somanshS14@gmail.com>
Co-authored-by: vvijayalakshmi21 <34595292+vvijayalakshmi21@users.noreply.github.com>
This commit is contained in:
parent
22c20687f3
commit
0f906b20c9
168 changed files with 7463 additions and 2123 deletions
|
|
@ -1,36 +1,22 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringDef;
|
||||
import androidx.room.Entity;
|
||||
import androidx.room.PrimaryKey;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
import fr.free.nrw.commons.CommonsApplication;
|
||||
import fr.free.nrw.commons.Media;
|
||||
import fr.free.nrw.commons.filepicker.UploadableFile;
|
||||
import fr.free.nrw.commons.settings.Prefs;
|
||||
import fr.free.nrw.commons.utils.ConfigUtils;
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||
import fr.free.nrw.commons.auth.SessionManager;
|
||||
import fr.free.nrw.commons.upload.UploadMediaDetail;
|
||||
import fr.free.nrw.commons.upload.UploadModel.UploadItem;
|
||||
import fr.free.nrw.commons.upload.WikidataPlace;
|
||||
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.wikipedia.dataclient.mwapi.MwQueryLogEvent;
|
||||
|
||||
@Entity(tableName = "contribution")
|
||||
public class Contribution extends Media {
|
||||
|
||||
//{{According to Exif data|2009-01-09}}
|
||||
private static final String TEMPLATE_DATE_ACC_TO_EXIF = "{{According to Exif data|%s}}";
|
||||
|
||||
//2009-01-09 → 9 January 2009
|
||||
private static final String TEMPLATE_DATA_OTHER_SOURCE = "%s";
|
||||
public class Contribution extends Media {
|
||||
|
||||
// No need to be bitwise - they're mutually exclusive
|
||||
public static final int STATE_COMPLETED = -1;
|
||||
|
|
@ -38,219 +24,133 @@ public class Contribution extends Media {
|
|||
public static final int STATE_QUEUED = 2;
|
||||
public static final int STATE_IN_PROGRESS = 3;
|
||||
|
||||
@Retention(SOURCE)
|
||||
@StringDef({SOURCE_CAMERA, SOURCE_GALLERY, SOURCE_EXTERNAL})
|
||||
public @interface FileSource {}
|
||||
|
||||
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;
|
||||
public int state;
|
||||
public long transferred;
|
||||
public String decimalCoords;
|
||||
public boolean isMultiple;
|
||||
public String wikiDataEntityId;
|
||||
public String wikiItemName;
|
||||
private String p18Value;
|
||||
public Uri contentProviderUri;
|
||||
public String dateCreatedSource;
|
||||
private long _id;
|
||||
private int state;
|
||||
private long transferred;
|
||||
private String decimalCoords;
|
||||
private String dateCreatedSource;
|
||||
private WikidataPlace wikidataPlace;
|
||||
/**
|
||||
* Each depiction loaded in depictions activity is associated with a wikidata entity id,
|
||||
* this Id is in turn used to upload depictions to wikibase
|
||||
*/
|
||||
private List<DepictedItem> depictedItems = new ArrayList<>();
|
||||
private String mimeType;
|
||||
/**
|
||||
* This hasmap stores the list of multilingual captions, where
|
||||
* key of the HashMap is the language and value is the caption in the corresponding language
|
||||
* Ex: key = "en", value: "<caption in short in English>"
|
||||
* key = "de" , value: "<caption in german>"
|
||||
*/
|
||||
private Map<String, String> captions = new HashMap<>();
|
||||
|
||||
public Contribution(Uri localUri, String imageUrl, String filename, String description, long dataLength,
|
||||
Date dateCreated, Date dateUploaded, String creator, String editSummary, String decimalCoords) {
|
||||
super(localUri, imageUrl, filename, description, dataLength, dateCreated, dateUploaded, creator);
|
||||
this.decimalCoords = decimalCoords;
|
||||
this.editSummary = editSummary;
|
||||
this.dateCreatedSource = "";
|
||||
public Contribution() {
|
||||
}
|
||||
|
||||
public Contribution(Uri localUri, String imageUrl, String filename, String description, long dataLength,
|
||||
Date dateCreated, Date dateUploaded, String creator, String editSummary, String decimalCoords, int state) {
|
||||
super(localUri, imageUrl, filename, description, dataLength, dateCreated, dateUploaded, creator);
|
||||
this.decimalCoords = decimalCoords;
|
||||
this.editSummary = editSummary;
|
||||
this.dateCreatedSource = "";
|
||||
this.state=state;
|
||||
public Contribution(final UploadItem item, final SessionManager sessionManager,
|
||||
final List<DepictedItem> depictedItems, final List<String> categories) {
|
||||
super(item.getMediaUri(),
|
||||
item.getFileName(),
|
||||
UploadMediaDetail.formatList(item.getUploadMediaDetails()),
|
||||
sessionManager.getAuthorName(),
|
||||
categories);
|
||||
captions = UploadMediaDetail.formatCaptions(item.getUploadMediaDetails());
|
||||
decimalCoords = item.getGpsCoords().getDecimalCoords();
|
||||
dateCreatedSource = "";
|
||||
this.depictedItems = depictedItems;
|
||||
wikidataPlace = WikidataPlace.from(item.getPlace());
|
||||
}
|
||||
|
||||
public Contribution(final MwQueryLogEvent queryLogEvent, final String user) {
|
||||
super(queryLogEvent.title(),queryLogEvent.date(), user);
|
||||
decimalCoords = "";
|
||||
dateCreatedSource = "";
|
||||
state = STATE_COMPLETED;
|
||||
}
|
||||
|
||||
|
||||
public void setDateCreatedSource(String dateCreatedSource) {
|
||||
public void setDateCreatedSource(final String dateCreatedSource) {
|
||||
this.dateCreatedSource = dateCreatedSource;
|
||||
}
|
||||
|
||||
public boolean getMultiple() {
|
||||
return isMultiple;
|
||||
}
|
||||
|
||||
public void setMultiple(boolean multiple) {
|
||||
isMultiple = multiple;
|
||||
public String getDateCreatedSource() {
|
||||
return dateCreatedSource;
|
||||
}
|
||||
|
||||
public long getTransferred() {
|
||||
return transferred;
|
||||
}
|
||||
|
||||
public void setTransferred(long transferred) {
|
||||
public void setTransferred(final long transferred) {
|
||||
this.transferred = transferred;
|
||||
}
|
||||
|
||||
public String getEditSummary() {
|
||||
return editSummary != null ? editSummary : CommonsApplication.DEFAULT_EDIT_SUMMARY;
|
||||
}
|
||||
|
||||
public Uri getContentUri() {
|
||||
return contentUri;
|
||||
}
|
||||
|
||||
public void setContentUri(Uri contentUri) {
|
||||
this.contentUri = contentUri;
|
||||
}
|
||||
|
||||
public int getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(int state) {
|
||||
public void setState(final int state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public void setDateUploaded(Date date) {
|
||||
this.dateUploaded = date;
|
||||
/**
|
||||
* @return array list of entityids for the depictions
|
||||
*/
|
||||
public List<DepictedItem> getDepictedItems() {
|
||||
return depictedItems;
|
||||
}
|
||||
|
||||
public String getPageContents(Context applicationContext) {
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
buffer
|
||||
.append("== {{int:filedesc}} ==\n")
|
||||
.append("{{Information\n")
|
||||
.append("|description=").append(getDescription()).append("\n")
|
||||
.append("|source=").append("{{own}}\n")
|
||||
.append("|author=[[User:").append(creator).append("|").append(creator).append("]]\n");
|
||||
public void setWikidataPlace(final WikidataPlace wikidataPlace) {
|
||||
this.wikidataPlace = wikidataPlace;
|
||||
}
|
||||
|
||||
String templatizedCreatedDate = getTemplatizedCreatedDate();
|
||||
if (!StringUtils.isBlank(templatizedCreatedDate)) {
|
||||
buffer.append("|date=").append(templatizedCreatedDate);
|
||||
}
|
||||
public WikidataPlace getWikidataPlace() {
|
||||
return wikidataPlace;
|
||||
}
|
||||
|
||||
buffer.append("}}").append("\n");
|
||||
public long get_id() {
|
||||
return _id;
|
||||
}
|
||||
|
||||
//Only add Location template (e.g. {{Location|37.51136|-77.602615}} ) if coords is not null
|
||||
if (decimalCoords != null) {
|
||||
buffer.append("{{Location|").append(decimalCoords).append("}}").append("\n");
|
||||
}
|
||||
public void set_id(final long _id) {
|
||||
this._id = _id;
|
||||
}
|
||||
|
||||
buffer.append("== {{int:license-header}} ==\n")
|
||||
.append(licenseTemplateFor(getLicense())).append("\n\n")
|
||||
.append("{{Uploaded from Mobile|platform=Android|version=")
|
||||
.append(ConfigUtils.getVersionNameWithSha(applicationContext)).append("}}\n");
|
||||
if(categories!=null&&categories.size()!=0) {
|
||||
for (int i = 0; i < categories.size(); i++) {
|
||||
String category = categories.get(i);
|
||||
buffer.append("\n[[Category:").append(category).append("]]");
|
||||
}
|
||||
}
|
||||
else
|
||||
buffer.append("{{subst:unc}}");
|
||||
return buffer.toString();
|
||||
public String getDecimalCoords() {
|
||||
return decimalCoords;
|
||||
}
|
||||
|
||||
public void setDecimalCoords(final String decimalCoords) {
|
||||
this.decimalCoords = decimalCoords;
|
||||
}
|
||||
|
||||
public void setDepictedItems(final List<DepictedItem> depictedItems) {
|
||||
this.depictedItems = depictedItems;
|
||||
}
|
||||
|
||||
public void setMimeType(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
public String getMimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns upload date in either TEMPLATE_DATE_ACC_TO_EXIF or TEMPLATE_DATA_OTHER_SOURCE
|
||||
* @return
|
||||
* Captions are a feature part of Structured data. They are meant to store short, multilingual descriptions about files
|
||||
* This is a replacement of the previously used titles for images (titles were not multilingual)
|
||||
* Also now captions replace the previous convention of using title for filename
|
||||
*
|
||||
* key of the HashMap is the language and value is the caption in the corresponding language
|
||||
*
|
||||
* returns list of captions stored in hashmap
|
||||
*/
|
||||
private String getTemplatizedCreatedDate() {
|
||||
if (dateCreated != null) {
|
||||
java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
|
||||
if (UploadableFile.DateTimeWithSource.EXIF_SOURCE.equals(dateCreatedSource)) {
|
||||
return String.format(Locale.ENGLISH, TEMPLATE_DATE_ACC_TO_EXIF, dateFormat.format(dateCreated)) + "\n";
|
||||
} else {
|
||||
return String.format(Locale.ENGLISH, TEMPLATE_DATA_OTHER_SOURCE, dateFormat.format(dateCreated)) + "\n";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
public Map<String, String> getCaptions() {
|
||||
return captions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFilename(String filename) {
|
||||
this.filename = filename;
|
||||
}
|
||||
|
||||
public void setImageUrl(String imageUrl) {
|
||||
this.imageUrl = imageUrl;
|
||||
}
|
||||
|
||||
public Contribution() {
|
||||
|
||||
}
|
||||
|
||||
public String getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
public void setSource(String source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private String licenseTemplateFor(String license) {
|
||||
switch (license) {
|
||||
case Prefs.Licenses.CC_BY_3:
|
||||
return "{{self|cc-by-3.0}}";
|
||||
case Prefs.Licenses.CC_BY_4:
|
||||
return "{{self|cc-by-4.0}}";
|
||||
case Prefs.Licenses.CC_BY_SA_3:
|
||||
return "{{self|cc-by-sa-3.0}}";
|
||||
case Prefs.Licenses.CC_BY_SA_4:
|
||||
return "{{self|cc-by-sa-4.0}}";
|
||||
case Prefs.Licenses.CC0:
|
||||
return "{{self|cc-zero}}";
|
||||
}
|
||||
|
||||
throw new RuntimeException("Unrecognized license value: " + license);
|
||||
}
|
||||
|
||||
public String getWikiDataEntityId() {
|
||||
return wikiDataEntityId;
|
||||
}
|
||||
|
||||
public String getWikiItemName() {
|
||||
return wikiItemName;
|
||||
}
|
||||
|
||||
/**
|
||||
* When the corresponding wikidata entity is known as in case of nearby uploads, it can be set
|
||||
* using the setter method
|
||||
* @param wikiDataEntityId wikiDataEntityId
|
||||
*/
|
||||
public void setWikiDataEntityId(String wikiDataEntityId) {
|
||||
this.wikiDataEntityId = wikiDataEntityId;
|
||||
}
|
||||
|
||||
public void setWikiItemName(String wikiItemName) {
|
||||
this.wikiItemName = wikiItemName;
|
||||
}
|
||||
|
||||
public String getP18Value() {
|
||||
return p18Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* When the corresponding image property of wiki entity is known as in case of nearby uploads,
|
||||
* it can be set using the setter method
|
||||
* @param p18Value p18 value, image property of the wikidata item
|
||||
*/
|
||||
public void setP18Value(String p18Value) {
|
||||
this.p18Value = p18Value;
|
||||
}
|
||||
|
||||
public void setContentProviderUri(Uri contentProviderUri) {
|
||||
this.contentProviderUri = contentProviderUri;
|
||||
public void setCaptions(Map<String, String> captions) {
|
||||
this.captions = captions;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -259,48 +159,34 @@ public class Contribution extends Media {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
public void writeToParcel(final Parcel dest, final int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
dest.writeLong(this._id);
|
||||
dest.writeParcelable(this.contentUri, flags);
|
||||
dest.writeString(this.source);
|
||||
dest.writeString(this.editSummary);
|
||||
dest.writeInt(this.state);
|
||||
dest.writeLong(this.transferred);
|
||||
dest.writeString(this.decimalCoords);
|
||||
dest.writeByte(this.isMultiple ? (byte) 1 : (byte) 0);
|
||||
dest.writeString(this.wikiDataEntityId);
|
||||
dest.writeString(this.wikiItemName);
|
||||
dest.writeString(this.p18Value);
|
||||
dest.writeParcelable(this.contentProviderUri, flags);
|
||||
dest.writeString(this.dateCreatedSource);
|
||||
dest.writeLong(_id);
|
||||
dest.writeInt(state);
|
||||
dest.writeLong(transferred);
|
||||
dest.writeString(decimalCoords);
|
||||
dest.writeString(dateCreatedSource);
|
||||
dest.writeSerializable((HashMap) captions);
|
||||
}
|
||||
|
||||
protected Contribution(Parcel in) {
|
||||
protected Contribution(final Parcel in) {
|
||||
super(in);
|
||||
this._id = in.readLong();
|
||||
this.contentUri = in.readParcelable(Uri.class.getClassLoader());
|
||||
this.source = in.readString();
|
||||
this.editSummary = in.readString();
|
||||
this.state = in.readInt();
|
||||
this.transferred = in.readLong();
|
||||
this.decimalCoords = in.readString();
|
||||
this.isMultiple = in.readByte() != 0;
|
||||
this.wikiDataEntityId = in.readString();
|
||||
this.wikiItemName = in.readString();
|
||||
this.p18Value = in.readString();
|
||||
this.contentProviderUri = in.readParcelable(Uri.class.getClassLoader());
|
||||
this.dateCreatedSource = in.readString();
|
||||
_id = in.readLong();
|
||||
state = in.readInt();
|
||||
transferred = in.readLong();
|
||||
decimalCoords = in.readString();
|
||||
dateCreatedSource = in.readString();
|
||||
captions = (HashMap<String, String>) in.readSerializable();
|
||||
}
|
||||
|
||||
public static final Creator<Contribution> CREATOR = new Creator<Contribution>() {
|
||||
@Override
|
||||
public Contribution createFromParcel(Parcel source) {
|
||||
public Contribution createFromParcel(final Parcel source) {
|
||||
return new Contribution(source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Contribution[] newArray(int size) {
|
||||
public Contribution[] newArray(final int size) {
|
||||
return new Contribution[size];
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,19 +1,13 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import static fr.free.nrw.commons.upload.UploadService.EXTRA_FILES;
|
||||
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.filepicker.DefaultCallback;
|
||||
import fr.free.nrw.commons.filepicker.FilePicker;
|
||||
|
|
@ -23,12 +17,11 @@ import fr.free.nrw.commons.nearby.Place;
|
|||
import fr.free.nrw.commons.upload.UploadActivity;
|
||||
import fr.free.nrw.commons.utils.PermissionUtils;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
|
||||
import static fr.free.nrw.commons.contributions.Contribution.SOURCE_CAMERA;
|
||||
import static fr.free.nrw.commons.contributions.Contribution.SOURCE_GALLERY;
|
||||
import static fr.free.nrw.commons.upload.UploadService.EXTRA_FILES;
|
||||
import static fr.free.nrw.commons.upload.UploadService.EXTRA_SOURCE;
|
||||
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class ContributionController {
|
||||
|
|
@ -109,7 +102,7 @@ public class ContributionController {
|
|||
|
||||
@Override
|
||||
public void onImagesPicked(@NonNull List<UploadableFile> imagesFiles, FilePicker.ImageSource source, int type) {
|
||||
Intent intent = handleImagesPicked(activity, imagesFiles, getSourceFromImageSource(source));
|
||||
Intent intent = handleImagesPicked(activity, imagesFiles);
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
|
@ -125,11 +118,9 @@ public class ContributionController {
|
|||
* Attaches place object for nearby uploads
|
||||
*/
|
||||
private Intent handleImagesPicked(Context context,
|
||||
List<UploadableFile> imagesFiles,
|
||||
String source) {
|
||||
List<UploadableFile> imagesFiles) {
|
||||
Intent shareIntent = new Intent(context, UploadActivity.class);
|
||||
shareIntent.setAction(ACTION_INTERNAL_UPLOADS);
|
||||
shareIntent.putExtra(EXTRA_SOURCE, source);
|
||||
shareIntent.putParcelableArrayListExtra(EXTRA_FILES, new ArrayList<>(imagesFiles));
|
||||
Place place = defaultKvStore.getJson(PLACE_OBJECT, Place.class);
|
||||
if (place != null) {
|
||||
|
|
@ -139,13 +130,4 @@ public class ContributionController {
|
|||
return shareIntent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get image upload source
|
||||
*/
|
||||
private String getSourceFromImageSource(FilePicker.ImageSource source) {
|
||||
if (source.equals(FilePicker.ImageSource.CAMERA_IMAGE)) {
|
||||
return SOURCE_CAMERA;
|
||||
}
|
||||
return SOURCE_GALLERY;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,13 +7,10 @@ import androidx.room.Insert;
|
|||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
import androidx.room.Transaction;
|
||||
|
||||
import androidx.room.Update;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.Single;
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
public abstract class ContributionDao {
|
||||
|
|
@ -40,9 +37,6 @@ public abstract class ContributionDao {
|
|||
@Delete
|
||||
public abstract Single<Integer> delete(Contribution contribution);
|
||||
|
||||
@Query("SELECT * from contribution WHERE contentProviderUri=:uri")
|
||||
public abstract List<Contribution> getContributionWithUri(String uri);
|
||||
|
||||
@Query("SELECT * from contribution WHERE filename=:fileName")
|
||||
public abstract List<Contribution> getContributionWithTitle(String fileName);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,33 +1,34 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import static fr.free.nrw.commons.depictions.Media.DepictedImagesFragment.PAGE_ID_PREFIX;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
|
||||
import java.util.HashMap;
|
||||
import fr.free.nrw.commons.media.MediaClient;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class ContributionViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private static final long TIMEOUT_SECONDS = 15;
|
||||
private final Callback callback;
|
||||
@BindView(R.id.contributionImage)
|
||||
SimpleDraweeView imageView;
|
||||
|
|
@ -37,20 +38,26 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
|
|||
@BindView(R.id.contributionProgress) ProgressBar progressView;
|
||||
@BindView(R.id.failed_image_options) LinearLayout failedImageOptions;
|
||||
|
||||
|
||||
private int position;
|
||||
private Contribution contribution;
|
||||
private Random random = new Random();
|
||||
private CompositeDisposable compositeDisposable = new CompositeDisposable();
|
||||
private final MediaClient mediaClient;
|
||||
|
||||
ContributionViewHolder(View parent, Callback callback) {
|
||||
ContributionViewHolder(View parent, Callback callback,
|
||||
MediaClient mediaClient) {
|
||||
super(parent);
|
||||
this.mediaClient = mediaClient;
|
||||
ButterKnife.bind(this, parent);
|
||||
this.callback=callback;
|
||||
}
|
||||
|
||||
public void init(int position, Contribution contribution) {
|
||||
this.contribution = contribution;
|
||||
fetchAndDisplayCaption(contribution);
|
||||
this.position = position;
|
||||
String imageSource = chooseImageSource(contribution.thumbUrl, contribution.getLocalUri());
|
||||
String imageSource = chooseImageSource(contribution.getThumbUrl(), contribution.getLocalUri());
|
||||
if (!TextUtils.isEmpty(imageSource)) {
|
||||
final ImageRequest imageRequest =
|
||||
ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource))
|
||||
|
|
@ -58,7 +65,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
|
|||
.build();
|
||||
imageView.setImageRequest(imageRequest);
|
||||
}
|
||||
titleView.setText(contribution.getDisplayTitle());
|
||||
|
||||
seqNumView.setText(String.valueOf(position + 1));
|
||||
seqNumView.setVisibility(View.VISIBLE);
|
||||
|
|
@ -97,6 +103,38 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* In contributions first we show the title for the image stored in cache,
|
||||
* then we fetch captions associated with the image and replace title on the thumbnail with caption
|
||||
*
|
||||
* @param contribution
|
||||
*/
|
||||
private void fetchAndDisplayCaption(Contribution contribution) {
|
||||
if ((contribution.getState() != Contribution.STATE_COMPLETED)) {
|
||||
titleView.setText(contribution.getDisplayTitle());
|
||||
} else {
|
||||
final String pageId = contribution.getPageId();
|
||||
if (pageId != null) {
|
||||
Timber.d("Fetching caption for %s", contribution.getFilename());
|
||||
String wikibaseMediaId = PAGE_ID_PREFIX
|
||||
+ pageId; // Create Wikibase media id from the page id. Example media id: M80618155 for https://commons.wikimedia.org/wiki/File:Tantanmen.jpeg with has the pageid 80618155
|
||||
compositeDisposable.add(mediaClient.getCaptionByWikibaseIdentifier(wikibaseMediaId)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.timeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
|
||||
.subscribe(subscriber -> {
|
||||
if (!subscriber.trim().equals(MediaClient.NO_CAPTION)) {
|
||||
titleView.setText(subscriber);
|
||||
} else {
|
||||
titleView.setText(contribution.getDisplayTitle());
|
||||
}
|
||||
}));
|
||||
} else {
|
||||
titleView.setText(contribution.getDisplayTitle());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the image source for the image view, first preference is given to thumbUrl if that is
|
||||
* null, moves to local uri and if both are null return null
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
|
||||
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
|
||||
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
|
|
@ -12,21 +16,12 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import fr.free.nrw.commons.MediaDataExtractor;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import fr.free.nrw.commons.HandlerService;
|
||||
|
|
@ -60,12 +55,11 @@ import io.reactivex.Observable;
|
|||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import timber.log.Timber;
|
||||
|
||||
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
|
||||
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
|
||||
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
|
||||
|
||||
public class ContributionsFragment
|
||||
extends CommonsDaggerSupportFragment
|
||||
implements
|
||||
|
|
@ -221,7 +215,7 @@ public class ContributionsFragment
|
|||
|
||||
@Override
|
||||
public void fetchMediaUriFor(Contribution contribution) {
|
||||
Timber.d("Fetching thumbnail for %s", contribution.filename);
|
||||
Timber.d("Fetching thumbnail for %s", contribution.getFilename());
|
||||
contributionsPresenter.fetchMediaDetails(contribution);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,29 +1,28 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.media.MediaClient;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import fr.free.nrw.commons.R;
|
||||
|
||||
/**
|
||||
* Represents The View Adapter for the List of Contributions
|
||||
*/
|
||||
public class ContributionsListAdapter extends RecyclerView.Adapter<ContributionViewHolder> {
|
||||
|
||||
private Callback callback;
|
||||
private final MediaClient mediaClient;
|
||||
private List<Contribution> contributions;
|
||||
|
||||
public ContributionsListAdapter(Callback callback) {
|
||||
public ContributionsListAdapter(Callback callback,
|
||||
MediaClient mediaClient) {
|
||||
this.callback = callback;
|
||||
this.mediaClient = mediaClient;
|
||||
contributions = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
|
@ -36,7 +35,7 @@ public class ContributionsListAdapter extends RecyclerView.Adapter<ContributionV
|
|||
public ContributionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
ContributionViewHolder viewHolder = new ContributionViewHolder(
|
||||
LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.layout_contribution, parent, false), callback);
|
||||
.inflate(R.layout.layout_contribution, parent, false), callback, mediaClient);
|
||||
return viewHolder;
|
||||
}
|
||||
|
||||
|
|
@ -63,7 +62,7 @@ public class ContributionsListAdapter extends RecyclerView.Adapter<ContributionV
|
|||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return contributions.get(position)._id;
|
||||
return contributions.get(position).get_id();
|
||||
}
|
||||
|
||||
public interface Callback {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
|
|
@ -10,31 +13,24 @@ import android.view.animation.AnimationUtils;
|
|||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView.LayoutManager;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import fr.free.nrw.commons.media.MediaClient;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* Created by root on 01.06.2018.
|
||||
|
|
@ -60,6 +56,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment {
|
|||
|
||||
@Inject @Named("default_preferences") JsonKvStore kvStore;
|
||||
@Inject ContributionController controller;
|
||||
@Inject MediaClient mediaClient;
|
||||
|
||||
private Animation fab_close;
|
||||
private Animation fab_open;
|
||||
|
|
@ -89,7 +86,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment {
|
|||
}
|
||||
|
||||
private void initAdapter() {
|
||||
adapter = new ContributionsListAdapter(callback);
|
||||
adapter = new ContributionsListAdapter(callback, mediaClient);
|
||||
adapter.setHasStableIds(true);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,45 +1,30 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.database.DataSetObserver;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import fr.free.nrw.commons.MediaDataExtractor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import fr.free.nrw.commons.CommonsApplication;
|
||||
import fr.free.nrw.commons.Media;
|
||||
import fr.free.nrw.commons.MediaDataExtractor;
|
||||
import fr.free.nrw.commons.auth.SessionManager;
|
||||
import fr.free.nrw.commons.contributions.ContributionsContract.UserActionListener;
|
||||
import fr.free.nrw.commons.db.AppDatabase;
|
||||
import fr.free.nrw.commons.di.CommonsApplicationModule;
|
||||
import fr.free.nrw.commons.mwapi.UserClient;
|
||||
import fr.free.nrw.commons.utils.ExecutorUtils;
|
||||
import fr.free.nrw.commons.utils.NetworkUtils;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.Scheduler;
|
||||
import io.reactivex.SingleObserver;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import timber.log.Timber;
|
||||
|
||||
import static fr.free.nrw.commons.contributions.Contribution.STATE_COMPLETED;
|
||||
|
||||
/**
|
||||
* The presenter class for Contributions
|
||||
*/
|
||||
|
|
@ -105,12 +90,7 @@ public class ContributionsPresenter implements UserActionListener {
|
|||
.observeOn(mainThreadScheduler)
|
||||
.doOnNext(mwQueryLogEvent -> Timber.d("Received image %s", mwQueryLogEvent.title()))
|
||||
.filter(mwQueryLogEvent -> !mwQueryLogEvent.isDeleted()).doOnNext(mwQueryLogEvent -> Timber.d("Image %s passed filters", mwQueryLogEvent.title()))
|
||||
.map(image -> {
|
||||
Contribution contribution = new Contribution(null, null, image.title(),
|
||||
"", -1, image.date(), image.date(), user,
|
||||
"", "", STATE_COMPLETED);
|
||||
return contribution;
|
||||
})
|
||||
.map(image -> new Contribution(image, user))
|
||||
.toList()
|
||||
.subscribe(this::saveContributionsToDB, error -> {
|
||||
Timber.e("Failed to fetch contributions: %s", error.getMessage());
|
||||
|
|
@ -197,11 +177,11 @@ public class ContributionsPresenter implements UserActionListener {
|
|||
@Override
|
||||
public void fetchMediaDetails(Contribution contribution) {
|
||||
compositeDisposable.add(mediaDataExtractor
|
||||
.getMediaFromFileName(contribution.filename)
|
||||
.getMediaFromFileName(contribution.getFilename())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(media -> {
|
||||
contribution.thumbUrl=media.thumbUrl;
|
||||
contribution.setThumbUrl(media.getThumbUrl());
|
||||
updateContribution(contribution);
|
||||
}));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue