From 495d001dc98eb7dce56307ad2561913c25ca7320 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:25:16 +0530 Subject: [PATCH] Send thanks button in more details fragment (#5424) * Send thanks button in more details fragment * failing test fix * suggested fix --- .../commons/media/MediaDetailFragment.java | 98 ++++++++++++++++++- .../free/nrw/commons/review/ReviewHelper.java | 2 +- .../main/res/layout/fragment_media_detail.xml | 10 ++ app/src/main/res/values/strings.xml | 2 + .../media/MediaDetailFragmentUnitTests.kt | 3 + 5 files changed, 109 insertions(+), 6 deletions(-) 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 3d6cddf15..f91c1ec3d 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 @@ -12,7 +12,6 @@ import static fr.free.nrw.commons.description.EditDescriptionConstants.WIKITEXT; import static fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION; import static fr.free.nrw.commons.utils.LangCodeUtils.getLocalizedResources; -import android.Manifest; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; @@ -23,6 +22,7 @@ import android.graphics.drawable.Animatable; import android.net.Uri; import android.os.Bundle; import android.text.Editable; +import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -64,6 +64,7 @@ import fr.free.nrw.commons.Media; import fr.free.nrw.commons.MediaDataExtractor; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.actions.ThanksClient; import fr.free.nrw.commons.auth.AccountUtil; import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.category.CategoryClient; @@ -75,12 +76,15 @@ import fr.free.nrw.commons.delete.DeleteHelper; import fr.free.nrw.commons.delete.ReasonBuilder; import fr.free.nrw.commons.description.DescriptionEditActivity; import fr.free.nrw.commons.description.DescriptionEditHelper; +import fr.free.nrw.commons.di.ApplicationlessInjection; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.explore.depictions.WikidataItemDetailsActivity; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.media.ZoomableActivity.ZoomableActivityConstants; import fr.free.nrw.commons.profile.ProfileActivity; +import fr.free.nrw.commons.review.ReviewController; +import fr.free.nrw.commons.review.ReviewHelper; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.ui.widget.HtmlTextView; import fr.free.nrw.commons.upload.categories.UploadCategoriesFragment; @@ -88,9 +92,13 @@ import fr.free.nrw.commons.upload.depicts.DepictsFragment; import fr.free.nrw.commons.upload.UploadMediaDetail; import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.PermissionUtils; +import fr.free.nrw.commons.utils.ViewUtil; import fr.free.nrw.commons.utils.ViewUtilWrapper; +import io.reactivex.Observable; +import io.reactivex.ObservableSource; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; import java.util.ArrayList; import java.util.Arrays; @@ -101,11 +109,13 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.concurrent.Callable; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; +import org.wikipedia.dataclient.mwapi.MwQueryPage; import org.wikipedia.language.AppLanguageLookUpTable; import org.wikipedia.util.DateUtil; import timber.log.Timber; @@ -154,6 +164,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements @Inject DeleteHelper deleteHelper; @Inject + ReviewHelper reviewHelper; + @Inject CategoryEditHelper categoryEditHelper; @Inject CoordinateEditHelper coordinateEditHelper; @@ -164,6 +176,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements @Inject CategoryClient categoryClient; @Inject + ThanksClient thanksClient; + @Inject @Named("default_preferences") JsonKvStore applicationKvStore; @@ -241,6 +255,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements ProgressBar progressBarEditCategory; @BindView(R.id.description_edit) Button editDescription; + @BindView(R.id.sendThanks) + Button sendThanksButton; private ArrayList categoryNames = new ArrayList<>(); private String categorySearchQuery; @@ -431,6 +447,13 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements enableProgressBar(); } + if (AccountUtil.getUserName(getContext()) != null && media != null + && AccountUtil.getUserName(getContext()).equals(media.getAuthor())) { + sendThanksButton.setVisibility(GONE); + } else { + sendThanksButton.setVisibility(VISIBLE); + } + scrollView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override @@ -780,12 +803,77 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements } @OnClick(R.id.copyWikicode) - public void onCopyWikicodeClicked(){ - String data = "[[" + media.getFilename() + "|thumb|" + media.getFallbackDescription() + "]]"; - Utils.copy("wikiCode",data,getContext()); + public void onCopyWikicodeClicked() { + String data = + "[[" + media.getFilename() + "|thumb|" + media.getFallbackDescription() + "]]"; + Utils.copy("wikiCode", data, getContext()); Timber.d("Generated wikidata copy code: %s", data); - Toast.makeText(getContext(), getString(R.string.wikicode_copied), Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(R.string.wikicode_copied), Toast.LENGTH_SHORT) + .show(); + } + + /** + * Sends thanks to author if the author is not the user + */ + @OnClick(R.id.sendThanks) + public void sendThanksToAuthor() { + String fileName = media.getFilename(); + if (TextUtils.isEmpty(fileName)) { + Toast.makeText(getContext(), getString(R.string.error_sending_thanks), + Toast.LENGTH_SHORT).show(); + return; + } + compositeDisposable.add(reviewHelper.getFirstRevisionOfFile(fileName) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(revision -> sendThanks(getContext(), revision))); + } + + /** + * Api call for sending thanks to the author when the author is not the user + * and display toast depending on the result + * @param context context + * @param firstRevision the revision id of the image + */ + @SuppressLint({"CheckResult", "StringFormatInvalid"}) + void sendThanks(Context context, MwQueryPage.Revision firstRevision) { + ViewUtil.showShortToast(context, + context.getString(R.string.send_thank_toast, media.getDisplayTitle())); + + if (firstRevision == null) { + return; + } + + Observable.defer((Callable>) () -> thanksClient.thank( + firstRevision.getRevisionId())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((result) -> { + displayThanksToast(context, result); + }, Timber::e); + } + + /** + * Method to display toast when api call to thank the author is completed + * @param context context + * @param result true if success, false otherwise + */ + @SuppressLint("StringFormatInvalid") + private void displayThanksToast(final Context context, final boolean result) { + final String message; + final String title; + if (result) { + title = context.getString(R.string.send_thank_success_title); + message = context.getString(R.string.send_thank_success_message, + media.getDisplayTitle()); + } else { + title = context.getString(R.string.send_thank_failure_title); + message = context.getString(R.string.send_thank_failure_message, + media.getDisplayTitle()); + } + + ViewUtil.showShortToast(context, message); } @OnClick(R.id.categoryEditButton) diff --git a/app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java b/app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java index 2ac863fe2..0caaa3f9e 100644 --- a/app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java @@ -109,7 +109,7 @@ public class ReviewHelper { * @param filename * @return */ - Observable getFirstRevisionOfFile(String filename) { + public Observable getFirstRevisionOfFile(String filename) { return reviewInterface.getFirstRevisionOfFile(filename) .map(response -> response.query().firstPage().revisions().get(0)); } diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index 9cb870df1..81885dfa1 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -464,6 +464,16 @@ android:text="@string/copy_wikicode" android:textColor="@color/primaryTextColor" /> +