From a7a596f1ac76a0a07c6eb01195897f1b92a201cb Mon Sep 17 00:00:00 2001 From: Ashish Date: Sun, 29 Nov 2020 00:19:52 +0530 Subject: [PATCH 1/2] Fixes #3341, #4018 * Defined two feild author and user in Media and used them at the corresponding places Minor bug fixes -displaying userName in uploadedBy. -modified HTML parsing in getArtist. -Replaced creator with author. --- app/src/main/java/fr/free/nrw/commons/Media.kt | 15 +++++++++------ .../free/nrw/commons/auth/SessionManager.java | 12 ------------ .../nrw/commons/category/GridViewAdapter.java | 17 ++++++++--------- .../nrw/commons/contributions/Contribution.kt | 3 ++- .../contributions/ContributionViewHolder.java | 3 +-- .../java/fr/free/nrw/commons/db/AppDatabase.kt | 2 +- .../free/nrw/commons/delete/DeleteHelper.java | 5 ++--- .../nrw/commons/explore/media/MediaConverter.kt | 16 +++++++++++----- .../commons/explore/media/PagedMediaAdapter.kt | 4 ++-- .../nrw/commons/media/MediaDetailFragment.java | 8 +++----- .../commons/media/MediaDetailPagerFragment.java | 2 +- .../free/nrw/commons/media/MediaInterface.java | 2 +- .../nrw/commons/upload/PageContentsCreator.java | 4 ++-- .../nrw/commons/upload/UploadController.java | 6 +++--- .../free/nrw/commons/delete/DeleteHelperTest.kt | 10 +++++----- .../nrw/commons/upload/UploadControllerTest.kt | 2 +- 16 files changed, 52 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.kt b/app/src/main/java/fr/free/nrw/commons/Media.kt index e2580284f1..090d8e2306 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.kt +++ b/app/src/main/java/fr/free/nrw/commons/Media.kt @@ -55,13 +55,15 @@ class Media constructor( val licenseUrl: String? = null, /** * Gets the name of the creator of the file. - * @return creator name as a String + * @return author name as a String */ /** - * Sets the creator name of the file. - * @param creator creator name as a string + * Sets the author name of the file. + * @param author creator name as a string */ - var creator: String? = null, + var author: String? = null, + + var user:String?=null, /** * Gets the categories the file falls under. @@ -83,12 +85,13 @@ class Media constructor( categories: List?, filename: String?, fallbackDescription: String?, - creator: String? + author: String?, user:String? ) : this( filename = filename, fallbackDescription = fallbackDescription, dateUploaded = Date(), - creator = creator, + author = author, + user=user, categories = categories, captions = captions ) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java index 0caa8e8e52..9861a30073 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java @@ -28,7 +28,6 @@ public class SessionManager { private final Context context; private Account currentAccount; // Unlike a savings account... ;-) private JsonKvStore defaultKvStore; - private static final String KEY_RAWUSERNAME = "rawusername"; @Inject public SessionManager(Context context, @@ -99,17 +98,6 @@ public String getUserName() { return account == null ? null : account.name; } - @Nullable - private String getRawUserName() { - Account account = getCurrentAccount(); - return account == null ? null : accountManager().getUserData(account, KEY_RAWUSERNAME); - } - - public String getAuthorName(){ - return getRawUserName() == null ? getUserName() : getRawUserName(); - } - - @Nullable public String getPassword() { Account account = getCurrentAccount(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java index e8aab51bc3..af28ad07d1 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Locale; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; @@ -87,9 +86,9 @@ public View getView(int position, View convertView, ViewGroup parent) { Media item = data.get(position); SimpleDraweeView imageView = convertView.findViewById(R.id.categoryImageView); TextView fileName = convertView.findViewById(R.id.categoryImageTitle); - TextView author = convertView.findViewById(R.id.categoryImageAuthor); + TextView uploader = convertView.findViewById(R.id.categoryImageAuthor); fileName.setText(item.getMostRelevantCaption()); - setAuthorView(item, author); + setUploaderView(item, uploader); imageView.setImageURI(item.getThumbUrl()); return convertView; } @@ -107,14 +106,14 @@ public Media getItem(int position) { /** * Shows author information if its present * @param item - * @param author + * @param uploader */ - private void setAuthorView(Media item, TextView author) { - if (!TextUtils.isEmpty(item.getCreator())) { - author.setVisibility(View.VISIBLE); - author.setText(getContext().getString(R.string.image_uploaded_by, item.getCreator())); + private void setUploaderView(Media item, TextView uploader) { + if (!TextUtils.isEmpty(item.getAuthor())) { + uploader.setVisibility(View.VISIBLE); + uploader.setText(getContext().getString(R.string.image_uploaded_by, item.getUser())); } else { - author.setVisibility(View.GONE); + uploader.setVisibility(View.GONE); } } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt index f55c334c6e..b46d1087eb 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt @@ -57,7 +57,8 @@ data class Contribution constructor( categories, item.fileName, formatDescriptions(item.uploadMediaDetails), - sessionManager.authorName + sessionManager.userName, + sessionManager.userName ), localUri = item.mediaUri, decimalCoords = item.gpsCoords.decimalCoords, diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java index 107877eb93..791d2d5c24 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java @@ -18,7 +18,6 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback; import fr.free.nrw.commons.media.MediaClient; -import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; @@ -68,7 +67,7 @@ public void init(final int position, final Contribution contribution) { this.contribution = contribution; this.position = position; titleView.setText(contribution.getMedia().getMostRelevantCaption()); - authorView.setText(contribution.getMedia().getCreator()); + authorView.setText(contribution.getMedia().getAuthor()); imageView.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder); imageView.getHierarchy().setFailureImage(R.drawable.image_placeholder); diff --git a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt index 8acb6079c8..e83869395b 100644 --- a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt +++ b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt @@ -10,7 +10,7 @@ import fr.free.nrw.commons.contributions.ContributionDao * The database for accessing the respective DAOs * */ -@Database(entities = [Contribution::class], version = 6, exportSchema = false) +@Database(entities = [Contribution::class], version = 7, exportSchema = false) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun contributionDao(): ContributionDao diff --git a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java index 3eac4908eb..58f5745950 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java @@ -94,11 +94,10 @@ private Observable delete(Media media, String reason) { String userPageString = "\n{{subst:idw|" + media.getFilename() + "}} ~~~~"; - String creator = media.getCreator(); + String creator = media.getAuthor(); if (creator == null || creator.isEmpty()) { throw new RuntimeException("Failed to nominate for deletion"); } - String creatorName = creator.replace(" (page does not exist)", ""); return pageEditClient.prependEdit(media.getFilename(), fileDeleteString + "\n", summary) .flatMap(result -> { @@ -113,7 +112,7 @@ private Observable delete(Media media, String reason) { throw new RuntimeException("Failed to nominate for deletion"); }).flatMap(result -> { if (result) { - return pageEditClient.appendEdit("User_Talk:" + creatorName, userPageString + "\n", summary); + return pageEditClient.appendEdit("User_Talk:" + creator, userPageString + "\n", summary); } throw new RuntimeException("Failed to nominate for deletion"); }); diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt index e2f48ae4c7..2c140bc990 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt @@ -29,7 +29,8 @@ class MediaConverter @Inject constructor() { safeParseDate(metadata.dateTime()), metadata.licenseShortName(), metadata.prefixedLicenseUrl, - getArtist(metadata), + getAuthor(metadata), + imageInfo.user, MediaDataExtractorUtil.extractCategoriesFromList(metadata.categories), metadata.latLng, entity.labels().mapValues { it.value.value() }, @@ -61,11 +62,16 @@ class MediaConverter @Inject constructor() { * @param metadata * @return */ - private fun getArtist(metadata: ExtMetadata): String? { + private fun getAuthor(metadata: ExtMetadata): String? { return try { - val artistHtml = metadata.artist() - artistHtml.substring(artistHtml.indexOf("title=\""), artistHtml.indexOf("\">")) - .replace("title=\"User:", "") + val authorHtml = metadata.artist() + val anchorStartTagTerminalChars = "\">" + val anchorCloseTag = "" + + return authorHtml.substring( + authorHtml.indexOf(anchorStartTagTerminalChars) + anchorStartTagTerminalChars + .length, authorHtml.indexOf(anchorCloseTag) + ) } catch (ex: java.lang.Exception) { "" } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt index 43825158cb..7e74e0f359 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt @@ -37,10 +37,10 @@ class SearchImagesViewHolder(containerView: View, val onImageClicked: (Int) -> U categoryImageView.setOnClickListener { onImageClicked(item.second) } categoryImageTitle.text = media.mostRelevantCaption categoryImageView.setImageURI(media.thumbUrl) - if (media.creator?.isNotEmpty() == true) { + if (media.author?.isNotEmpty() == true) { categoryImageAuthor.visibility = View.VISIBLE categoryImageAuthor.text = - containerView.context.getString(R.string.image_uploaded_by, media.creator) + containerView.context.getString(R.string.image_uploaded_by, media.user) } else { categoryImageAuthor.visibility = View.GONE } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 18cdf2cbc4..5f41abc3aa 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -17,7 +17,6 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -66,7 +65,6 @@ import fr.free.nrw.commons.nearby.Label; import fr.free.nrw.commons.ui.widget.HtmlTextView; import fr.free.nrw.commons.utils.ViewUtilWrapper; -import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -542,10 +540,10 @@ private void setTextFields(Media media) { updateCategoryList(); - if (media.getCreator() == null || media.getCreator().equals("")) { + if (media.getAuthor() == null || media.getAuthor().equals("")) { authorLayout.setVisibility(GONE); } else { - author.setText(media.getCreator()); + author.setText(media.getAuthor()); } } @@ -679,7 +677,7 @@ public void updateCategories(List selectedCategories) { @SuppressLint("StringFormatInvalid") @OnClick(R.id.nominateDeletion) public void onDeleteButtonClicked(){ - if (AccountUtil.getUserName(getContext()) != null && AccountUtil.getUserName(getContext()).equals(media.getCreator())) { + if (AccountUtil.getUserName(getContext()) != null && AccountUtil.getUserName(getContext()).equals(media.getAuthor())) { final ArrayAdapter languageAdapter = new ArrayAdapter<>(getActivity(), R.layout.simple_spinner_dropdown_list, reasonList); final Spinner spinner = new Spinner(getActivity()); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index cb23263b0b..4c7f16c114 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -254,7 +254,7 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Initialize bookmark object bookmark = new Bookmark( m.getFilename(), - m.getCreator(), + m.getAuthor(), BookmarkPicturesContentProvider.uriForName(m.getFilename()) ); updateBookmarkState(menu.findItem(R.id.menu_bookmark_current_image)); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java index c104235a98..2ff346085e 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java @@ -11,7 +11,7 @@ * Interface for interacting with Commons media related APIs */ public interface MediaInterface { - String MEDIA_PARAMS="&prop=imageinfo&iiprop=url|extmetadata&iiurlwidth=640" + + String MEDIA_PARAMS="&prop=imageinfo&iiprop=url|extmetadata|user&&iiurlwidth=640" + "&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" + "|Artist|LicenseShortName|LicenseUrl"; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java index d9c0f94b8a..ddb629979b 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java @@ -37,8 +37,8 @@ public String createFrom(Contribution contribution) { .append("{{Information\n") .append("|description=").append(media.getFallbackDescription()).append("\n") .append("|source=").append("{{own}}\n") - .append("|author=[[User:").append(media.getCreator()).append("|") - .append(media.getCreator()).append("]]\n"); + .append("|author=[[User:").append(media.getAuthor()).append("|") + .append(media.getAuthor()).append("]]\n"); String templatizedCreatedDate = getTemplatizedCreatedDate( contribution.getDateCreated(), contribution.getDateCreatedSource()); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java index 86ba2124dd..79afe90dc1 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java @@ -97,10 +97,10 @@ public void startUpload(final Contribution contribution) { final Media media = contribution.getMedia(); if (store.getBoolean("useAuthorName", false)) { final String authorName = store.getString("authorName", ""); - media.setCreator(authorName); + media.setAuthor(authorName); } - if (TextUtils.isEmpty(media.getCreator())) { + if (TextUtils.isEmpty(media.getAuthor())) { final Account currentAccount = sessionManager.getCurrentAccount(); if (currentAccount == null) { Timber.d("Current account is null"); @@ -108,7 +108,7 @@ public void startUpload(final Contribution contribution) { sessionManager.forceLogin(context); return; } - media.setCreator(sessionManager.getAuthorName()); + media.setAuthor(sessionManager.getUserName()); } if (media.getFallbackDescription() == null) { diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt index e778893f83..e5df2058bf 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt @@ -56,7 +56,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") val creatorName = "Creator" - whenever(media.creator).thenReturn("$creatorName (page does not exist)") + whenever(media.author).thenReturn("$creatorName (page does not exist)") whenever(media.filename).thenReturn("Test file.jpg") val makeDeletion = deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() @@ -78,7 +78,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(true)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -93,7 +93,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(false)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -108,7 +108,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(true)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -125,7 +125,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn(null) + whenever(media.author).thenReturn(null) deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt index 2a2a59ecc9..1a12018991 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt @@ -52,7 +52,7 @@ class UploadControllerTest { val contribution = mock(Contribution::class.java) val media = mock() whenever(contribution.media).thenReturn(media) - whenever(media.creator).thenReturn("Creator") + whenever(media.author).thenReturn("Creator") uploadController!!.startUpload(contribution) } } From a299a9f2a7a34996bd4026dc054df9ba9e5f86be Mon Sep 17 00:00:00 2001 From: Ashish Date: Sun, 29 Nov 2020 00:19:52 +0530 Subject: [PATCH 2/2] Fixes #3341, #4018 * Defined two feild author and user in Media and used them at the corresponding places Minor bug fixes -displaying userName in uploadedBy. -modified HTML parsing in getArtist. -Replaced creator with author. --- app/src/main/java/fr/free/nrw/commons/Media.kt | 15 +++++++++------ .../free/nrw/commons/auth/SessionManager.java | 12 ------------ .../nrw/commons/category/GridViewAdapter.java | 17 ++++++++--------- .../nrw/commons/contributions/Contribution.kt | 3 ++- .../contributions/ContributionViewHolder.java | 3 +-- .../java/fr/free/nrw/commons/db/AppDatabase.kt | 2 +- .../free/nrw/commons/delete/DeleteHelper.java | 5 ++--- .../nrw/commons/explore/media/MediaConverter.kt | 16 +++++++++++----- .../commons/explore/media/PagedMediaAdapter.kt | 4 ++-- .../nrw/commons/media/MediaDetailFragment.java | 8 +++----- .../commons/media/MediaDetailPagerFragment.java | 2 +- .../free/nrw/commons/media/MediaInterface.java | 2 +- .../nrw/commons/upload/PageContentsCreator.java | 4 ++-- .../nrw/commons/upload/UploadController.java | 6 +++--- app/src/test/kotlin/ModelFunctions.kt | 6 ++++-- .../free/nrw/commons/delete/DeleteHelperTest.kt | 10 +++++----- .../nrw/commons/upload/UploadControllerTest.kt | 2 +- 17 files changed, 56 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.kt b/app/src/main/java/fr/free/nrw/commons/Media.kt index e2580284f1..090d8e2306 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.kt +++ b/app/src/main/java/fr/free/nrw/commons/Media.kt @@ -55,13 +55,15 @@ class Media constructor( val licenseUrl: String? = null, /** * Gets the name of the creator of the file. - * @return creator name as a String + * @return author name as a String */ /** - * Sets the creator name of the file. - * @param creator creator name as a string + * Sets the author name of the file. + * @param author creator name as a string */ - var creator: String? = null, + var author: String? = null, + + var user:String?=null, /** * Gets the categories the file falls under. @@ -83,12 +85,13 @@ class Media constructor( categories: List?, filename: String?, fallbackDescription: String?, - creator: String? + author: String?, user:String? ) : this( filename = filename, fallbackDescription = fallbackDescription, dateUploaded = Date(), - creator = creator, + author = author, + user=user, categories = categories, captions = captions ) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java index 0caa8e8e52..9861a30073 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java @@ -28,7 +28,6 @@ public class SessionManager { private final Context context; private Account currentAccount; // Unlike a savings account... ;-) private JsonKvStore defaultKvStore; - private static final String KEY_RAWUSERNAME = "rawusername"; @Inject public SessionManager(Context context, @@ -99,17 +98,6 @@ public String getUserName() { return account == null ? null : account.name; } - @Nullable - private String getRawUserName() { - Account account = getCurrentAccount(); - return account == null ? null : accountManager().getUserData(account, KEY_RAWUSERNAME); - } - - public String getAuthorName(){ - return getRawUserName() == null ? getUserName() : getRawUserName(); - } - - @Nullable public String getPassword() { Account account = getCurrentAccount(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java index e8aab51bc3..af28ad07d1 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Locale; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; @@ -87,9 +86,9 @@ public View getView(int position, View convertView, ViewGroup parent) { Media item = data.get(position); SimpleDraweeView imageView = convertView.findViewById(R.id.categoryImageView); TextView fileName = convertView.findViewById(R.id.categoryImageTitle); - TextView author = convertView.findViewById(R.id.categoryImageAuthor); + TextView uploader = convertView.findViewById(R.id.categoryImageAuthor); fileName.setText(item.getMostRelevantCaption()); - setAuthorView(item, author); + setUploaderView(item, uploader); imageView.setImageURI(item.getThumbUrl()); return convertView; } @@ -107,14 +106,14 @@ public Media getItem(int position) { /** * Shows author information if its present * @param item - * @param author + * @param uploader */ - private void setAuthorView(Media item, TextView author) { - if (!TextUtils.isEmpty(item.getCreator())) { - author.setVisibility(View.VISIBLE); - author.setText(getContext().getString(R.string.image_uploaded_by, item.getCreator())); + private void setUploaderView(Media item, TextView uploader) { + if (!TextUtils.isEmpty(item.getAuthor())) { + uploader.setVisibility(View.VISIBLE); + uploader.setText(getContext().getString(R.string.image_uploaded_by, item.getUser())); } else { - author.setVisibility(View.GONE); + uploader.setVisibility(View.GONE); } } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt index f55c334c6e..b46d1087eb 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt @@ -57,7 +57,8 @@ data class Contribution constructor( categories, item.fileName, formatDescriptions(item.uploadMediaDetails), - sessionManager.authorName + sessionManager.userName, + sessionManager.userName ), localUri = item.mediaUri, decimalCoords = item.gpsCoords.decimalCoords, diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java index 107877eb93..791d2d5c24 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java @@ -18,7 +18,6 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback; import fr.free.nrw.commons.media.MediaClient; -import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; @@ -68,7 +67,7 @@ public void init(final int position, final Contribution contribution) { this.contribution = contribution; this.position = position; titleView.setText(contribution.getMedia().getMostRelevantCaption()); - authorView.setText(contribution.getMedia().getCreator()); + authorView.setText(contribution.getMedia().getAuthor()); imageView.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder); imageView.getHierarchy().setFailureImage(R.drawable.image_placeholder); diff --git a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt index 8acb6079c8..e83869395b 100644 --- a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt +++ b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt @@ -10,7 +10,7 @@ import fr.free.nrw.commons.contributions.ContributionDao * The database for accessing the respective DAOs * */ -@Database(entities = [Contribution::class], version = 6, exportSchema = false) +@Database(entities = [Contribution::class], version = 7, exportSchema = false) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun contributionDao(): ContributionDao diff --git a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java index 3eac4908eb..58f5745950 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java @@ -94,11 +94,10 @@ private Observable delete(Media media, String reason) { String userPageString = "\n{{subst:idw|" + media.getFilename() + "}} ~~~~"; - String creator = media.getCreator(); + String creator = media.getAuthor(); if (creator == null || creator.isEmpty()) { throw new RuntimeException("Failed to nominate for deletion"); } - String creatorName = creator.replace(" (page does not exist)", ""); return pageEditClient.prependEdit(media.getFilename(), fileDeleteString + "\n", summary) .flatMap(result -> { @@ -113,7 +112,7 @@ private Observable delete(Media media, String reason) { throw new RuntimeException("Failed to nominate for deletion"); }).flatMap(result -> { if (result) { - return pageEditClient.appendEdit("User_Talk:" + creatorName, userPageString + "\n", summary); + return pageEditClient.appendEdit("User_Talk:" + creator, userPageString + "\n", summary); } throw new RuntimeException("Failed to nominate for deletion"); }); diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt index e2f48ae4c7..2c140bc990 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt @@ -29,7 +29,8 @@ class MediaConverter @Inject constructor() { safeParseDate(metadata.dateTime()), metadata.licenseShortName(), metadata.prefixedLicenseUrl, - getArtist(metadata), + getAuthor(metadata), + imageInfo.user, MediaDataExtractorUtil.extractCategoriesFromList(metadata.categories), metadata.latLng, entity.labels().mapValues { it.value.value() }, @@ -61,11 +62,16 @@ class MediaConverter @Inject constructor() { * @param metadata * @return */ - private fun getArtist(metadata: ExtMetadata): String? { + private fun getAuthor(metadata: ExtMetadata): String? { return try { - val artistHtml = metadata.artist() - artistHtml.substring(artistHtml.indexOf("title=\""), artistHtml.indexOf("\">")) - .replace("title=\"User:", "") + val authorHtml = metadata.artist() + val anchorStartTagTerminalChars = "\">" + val anchorCloseTag = "" + + return authorHtml.substring( + authorHtml.indexOf(anchorStartTagTerminalChars) + anchorStartTagTerminalChars + .length, authorHtml.indexOf(anchorCloseTag) + ) } catch (ex: java.lang.Exception) { "" } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt index 43825158cb..7e74e0f359 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt @@ -37,10 +37,10 @@ class SearchImagesViewHolder(containerView: View, val onImageClicked: (Int) -> U categoryImageView.setOnClickListener { onImageClicked(item.second) } categoryImageTitle.text = media.mostRelevantCaption categoryImageView.setImageURI(media.thumbUrl) - if (media.creator?.isNotEmpty() == true) { + if (media.author?.isNotEmpty() == true) { categoryImageAuthor.visibility = View.VISIBLE categoryImageAuthor.text = - containerView.context.getString(R.string.image_uploaded_by, media.creator) + containerView.context.getString(R.string.image_uploaded_by, media.user) } else { categoryImageAuthor.visibility = View.GONE } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 18cdf2cbc4..5f41abc3aa 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -17,7 +17,6 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -66,7 +65,6 @@ import fr.free.nrw.commons.nearby.Label; import fr.free.nrw.commons.ui.widget.HtmlTextView; import fr.free.nrw.commons.utils.ViewUtilWrapper; -import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -542,10 +540,10 @@ private void setTextFields(Media media) { updateCategoryList(); - if (media.getCreator() == null || media.getCreator().equals("")) { + if (media.getAuthor() == null || media.getAuthor().equals("")) { authorLayout.setVisibility(GONE); } else { - author.setText(media.getCreator()); + author.setText(media.getAuthor()); } } @@ -679,7 +677,7 @@ public void updateCategories(List selectedCategories) { @SuppressLint("StringFormatInvalid") @OnClick(R.id.nominateDeletion) public void onDeleteButtonClicked(){ - if (AccountUtil.getUserName(getContext()) != null && AccountUtil.getUserName(getContext()).equals(media.getCreator())) { + if (AccountUtil.getUserName(getContext()) != null && AccountUtil.getUserName(getContext()).equals(media.getAuthor())) { final ArrayAdapter languageAdapter = new ArrayAdapter<>(getActivity(), R.layout.simple_spinner_dropdown_list, reasonList); final Spinner spinner = new Spinner(getActivity()); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index cb23263b0b..4c7f16c114 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -254,7 +254,7 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Initialize bookmark object bookmark = new Bookmark( m.getFilename(), - m.getCreator(), + m.getAuthor(), BookmarkPicturesContentProvider.uriForName(m.getFilename()) ); updateBookmarkState(menu.findItem(R.id.menu_bookmark_current_image)); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java index c104235a98..2ff346085e 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java @@ -11,7 +11,7 @@ * Interface for interacting with Commons media related APIs */ public interface MediaInterface { - String MEDIA_PARAMS="&prop=imageinfo&iiprop=url|extmetadata&iiurlwidth=640" + + String MEDIA_PARAMS="&prop=imageinfo&iiprop=url|extmetadata|user&&iiurlwidth=640" + "&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" + "|Artist|LicenseShortName|LicenseUrl"; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java index d9c0f94b8a..ddb629979b 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java @@ -37,8 +37,8 @@ public String createFrom(Contribution contribution) { .append("{{Information\n") .append("|description=").append(media.getFallbackDescription()).append("\n") .append("|source=").append("{{own}}\n") - .append("|author=[[User:").append(media.getCreator()).append("|") - .append(media.getCreator()).append("]]\n"); + .append("|author=[[User:").append(media.getAuthor()).append("|") + .append(media.getAuthor()).append("]]\n"); String templatizedCreatedDate = getTemplatizedCreatedDate( contribution.getDateCreated(), contribution.getDateCreatedSource()); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java index 86ba2124dd..79afe90dc1 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java @@ -97,10 +97,10 @@ public void startUpload(final Contribution contribution) { final Media media = contribution.getMedia(); if (store.getBoolean("useAuthorName", false)) { final String authorName = store.getString("authorName", ""); - media.setCreator(authorName); + media.setAuthor(authorName); } - if (TextUtils.isEmpty(media.getCreator())) { + if (TextUtils.isEmpty(media.getAuthor())) { final Account currentAccount = sessionManager.getCurrentAccount(); if (currentAccount == null) { Timber.d("Current account is null"); @@ -108,7 +108,7 @@ public void startUpload(final Contribution contribution) { sessionManager.forceLogin(context); return; } - media.setCreator(sessionManager.getAuthorName()); + media.setAuthor(sessionManager.getUserName()); } if (media.getFallbackDescription() == null) { diff --git a/app/src/test/kotlin/ModelFunctions.kt b/app/src/test/kotlin/ModelFunctions.kt index e9d317a210..4a70acc7d3 100644 --- a/app/src/test/kotlin/ModelFunctions.kt +++ b/app/src/test/kotlin/ModelFunctions.kt @@ -40,7 +40,8 @@ fun media( dateUploaded: Date? = Date(), license: String? = "license", licenseUrl: String? = "licenseUrl", - creator: String? = "creator", + author: String? = "creator", + user:String?="user", pageId: String = "pageId", categories: List? = listOf("categories"), coordinates: LatLng? = LatLng(0.0, 0.0, 0.0f), @@ -56,7 +57,8 @@ fun media( dateUploaded, license, licenseUrl, - creator, + author, + user, categories, coordinates, captions, diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt index e778893f83..9e7e974733 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt @@ -56,7 +56,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") val creatorName = "Creator" - whenever(media.creator).thenReturn("$creatorName (page does not exist)") + whenever(media.author).thenReturn("$creatorName") whenever(media.filename).thenReturn("Test file.jpg") val makeDeletion = deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() @@ -78,7 +78,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(true)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -93,7 +93,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(false)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -108,7 +108,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(true)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn("Creator (page does not exist)") + whenever(media.author).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -125,7 +125,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.creator).thenReturn(null) + whenever(media.author).thenReturn(null) deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt index 2a2a59ecc9..1a12018991 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadControllerTest.kt @@ -52,7 +52,7 @@ class UploadControllerTest { val contribution = mock(Contribution::class.java) val media = mock() whenever(contribution.media).thenReturn(media) - whenever(media.creator).thenReturn("Creator") + whenever(media.author).thenReturn("Creator") uploadController!!.startUpload(contribution) } }