From 3d22463445a16f8e17239f27868391e6980f55d4 Mon Sep 17 00:00:00 2001 From: ayans Date: Thu, 30 Sep 2021 01:07:48 +0530 Subject: [PATCH 01/23] DescriptionEditHelper implemented --- .../nrw/commons/actions/PageEditClient.kt | 3 + .../description/DescriptionEditHelper.java | 193 ++++++++++++++++++ .../commons/media/MediaDetailFragment.java | 16 ++ .../main/res/layout/fragment_media_detail.xml | 10 + 4 files changed, 222 insertions(+) create mode 100644 app/src/main/java/fr/free/nrw/commons/description/DescriptionEditHelper.java diff --git a/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.kt b/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.kt index a1a0db6e0b..0f6c2e433e 100644 --- a/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.kt @@ -1,5 +1,6 @@ package fr.free.nrw.commons.actions +import android.util.Log import io.reactivex.Observable import io.reactivex.Single import org.wikipedia.csrf.CsrfTokenClient @@ -25,6 +26,8 @@ class PageEditClient( */ fun edit(pageTitle: String, text: String, summary: String): Observable { return try { + Log.d("hehe", csrfTokenClient.tokenBlocking) + Log.d("hehe", text) pageEditInterface.postEdit(pageTitle, summary, text, csrfTokenClient.tokenBlocking) .map { editResponse -> editResponse.edit()!!.editSucceeded() } } catch (throwable: Throwable) { diff --git a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditHelper.java b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditHelper.java new file mode 100644 index 0000000000..e2417a8c82 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditHelper.java @@ -0,0 +1,193 @@ +package fr.free.nrw.commons.description; + +import static fr.free.nrw.commons.notification.NotificationHelper.NOTIFICATION_EDIT_COORDINATES; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import fr.free.nrw.commons.BuildConfig; +import fr.free.nrw.commons.Media; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.actions.PageEditClient; +import fr.free.nrw.commons.notification.NotificationHelper; +import fr.free.nrw.commons.utils.ViewUtilWrapper; +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; +import java.util.Objects; +import javax.inject.Inject; +import javax.inject.Named; +import org.apache.commons.lang3.StringUtils; +import timber.log.Timber; + +public class DescriptionEditHelper { + + /** + * notificationHelper: helps creating notification + */ + private final NotificationHelper notificationHelper; + /** + * * pageEditClient: methods provided by this member posts the edited coordinates + * to the Media wiki api + */ + public final PageEditClient pageEditClient; + /** + * viewUtil: helps to show Toast + */ + private final ViewUtilWrapper viewUtil; + + @Inject + public DescriptionEditHelper(final NotificationHelper notificationHelper, + @Named("commons-page-edit") final PageEditClient pageEditClient, + final ViewUtilWrapper viewUtil) { + this.notificationHelper = notificationHelper; + this.pageEditClient = pageEditClient; + this.viewUtil = viewUtil; + } + + /** + * Public interface to edit coordinates + * @param context to be added + * @param media to be added + * @param Accuracy to be added + * @return Single + */ + public Single makeDescriptionEdit(final Context context, final Media media, + final String Latitude, final String Longitude, final String Accuracy) { + viewUtil.showShortToast(context, + context.getString(R.string.coordinates_edit_helper_make_edit_toast)); + return addDescription(media, Latitude, Longitude, Accuracy) + .flatMapSingle(result -> Single.just(showDescriptionEditNotification(context, media, + Latitude, Longitude, Accuracy, result))) + .firstOrError(); + } + + /** + * Replaces new coordinates + * @param media to be added + * @param Latitude to be added + * @param Longitude to be added + * @param Accuracy to be added + * @return Observable + */ + private Observable addDescription(final Media media, final String Latitude, + final String Longitude, final String Accuracy) { + Timber.d("thread is coordinates adding %s", Thread.currentThread().getName()); + final String summary = "Adding Coordinates"; + + final StringBuilder buffer = new StringBuilder(); + + final String wikiText = pageEditClient.getCurrentWikiText(media.getFilename()) + .subscribeOn(Schedulers.io()) + .blockingGet(); + + if (Latitude != null) { + buffer.append("\n{{Location|").append(Latitude).append("|").append(Longitude) + .append("|").append(Accuracy).append("}}"); + } + + final String editedLocation = buffer.toString(); + final String appendText = getFormattedWikiText(wikiText, editedLocation); + + return pageEditClient.edit(Objects.requireNonNull(media.getFilename()) + , appendText, summary); + } + + /** + * Helps to get formatted wikitext with upgraded location + * @param wikiText current wikitext + * @param editedLocation new location + * @return String + */ + private String getFormattedWikiText(final String wikiText, final String editedLocation){ + + if (wikiText.contains("filedesc") && wikiText.contains("Location")) { + + final String fromLocationToEnd = wikiText.substring(wikiText.indexOf("{{Location")); + final String firstHalf = wikiText.substring(0, wikiText.indexOf("{{Location")); + final String lastHalf = fromLocationToEnd.substring( + fromLocationToEnd.indexOf("}}") + 2); + + final int startOfSecondSection = StringUtils.ordinalIndexOf(wikiText, + "==", 3); + final StringBuilder buffer = new StringBuilder(); + if (wikiText.charAt(wikiText.indexOf("{{Location")-1) == '\n') { + buffer.append(editedLocation.substring(1)); + } else { + buffer.append(editedLocation); + } + if (startOfSecondSection != -1 && wikiText.charAt(startOfSecondSection-1)!= '\n') { + buffer.append("\n"); + } + + return firstHalf + buffer + lastHalf; + + } + if (wikiText.contains("filedesc") && !wikiText.contains("Location")) { + + final int startOfSecondSection = StringUtils.ordinalIndexOf(wikiText, + "==", 3); + + if (startOfSecondSection != -1) { + final String firstHalf = wikiText.substring(0, startOfSecondSection); + final String lastHalf = wikiText.substring(startOfSecondSection); + final String buffer = editedLocation.substring(1) + + "\n"; + return firstHalf + buffer + lastHalf; + } + + return wikiText + editedLocation; + } + if (!wikiText.contains("filedesc") && !wikiText.contains("Location")) { + + return "== {{int:filedesc}} ==" + editedLocation + wikiText; + + } + if (!wikiText.contains("filedesc") && wikiText.contains("Location")) { + + return "== {{int:filedesc}} ==" + editedLocation + wikiText; + + } + return null; + } + + /** + * Update coordinates and shows notification about coordinates update + * @param context to be added + * @param media to be added + * @param latitude to be added + * @param longitude to be added + * @param Accuracy to be added + * @param result to be added + * @return boolean + */ + private boolean showDescriptionEditNotification(final Context context, final Media media, + final String latitude, final String longitude, final String Accuracy, + final boolean result) { + final String message; + String title = context.getString(R.string.coordinates_edit_helper_show_edit_title); + + if (result) { + media.setCoordinates( + new fr.free.nrw.commons.location.LatLng(Double.parseDouble(latitude), + Double.parseDouble(longitude), + Float.parseFloat(Accuracy))); + title += ": " + context + .getString(R.string.coordinates_edit_helper_show_edit_title_success); + final StringBuilder coordinatesInMessage = new StringBuilder(); + final String mediaCoordinate = String.valueOf(media.getCoordinates()); + coordinatesInMessage.append(mediaCoordinate); + message = context.getString(R.string.coordinates_edit_helper_show_edit_message, + coordinatesInMessage.toString()); + } else { + title += ": " + context.getString(R.string.coordinates_edit_helper_show_edit_title); + message = context.getString(R.string.coordinates_edit_helper_edit_message_else) ; + } + + final String urlForFile = BuildConfig.COMMONS_URL + "/wiki/" + media.getFilename(); + final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlForFile)); + notificationHelper.showNotification(context, title, message, NOTIFICATION_EDIT_COORDINATES, + browserIntent); + return result; + } +} 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 289a859cc8..029da7fd3d 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 @@ -794,6 +794,22 @@ public void onUpdateCoordinatesClicked(){ goToLocationPickerActivity(); } + @OnClick(R.id.description_edit) + public void onUpdateDescriptionClicked(){ + updateDescription(); + } + + private void updateDescription() { +// compositeDisposable.add(coordinateEditHelper.makeCoordinatesEdit(getContext(), media, +// Latitude, Longitude, Accuracy) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(s -> { +// Timber.d("Coordinates are added."); +// coordinates.setText(prettyCoordinates(media)); +// })); + } + /** * Start location picker activity with a request code and get the coordinates from the activity. */ diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index cfbb010942..7e01725b29 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -204,6 +204,16 @@ android:textSize="@dimen/description_text_size" android:textIsSelectable="true" tools:text="Description of the media goes here. This can potentially be fairly long, and will need to wrap across multiple lines. We hope it looks nice though." /> + +