From 1856196851bf6db076ce1d637b1f516fa79e487a Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Mon, 17 Aug 2020 14:30:46 +0300 Subject: [PATCH] Todo for user (#3851) * Add a simple message * Categories are edited * Display categories * read whole page * Revert wrong changes * Add newly added category field * Doesnt displaey alreasy added categories * add strings for notifications * clean code * Readd accidentally removed imports * Fix edit layout style * Fix category update messages * Pass isWikipediaButtonDisplayed information to fragment * Remove unused class * Fix strings * Fix string * Add exeption for uncategorised images too * Revert project.xml changes * fix update buttonvisibility issue * Make sure it works for auto added categories too * make the button visible * Make the button appear when categories are entered * Include cancel button * Make view updated too * Make category view edited * Update categories in an hacky way * Fix unnecessary method call * Add notes for short term fix to display added category * Fix tests * Fix strings * Fix click issue --- .idea/codeStyles/Project.xml | 2 +- .../main/java/fr/free/nrw/commons/Media.kt | 10 + .../nrw/commons/actions/PageEditClient.java | 18 +- .../nrw/commons/category/CategoryClient.kt | 2 + .../commons/category/CategoryEditHelper.java | 109 ++++++++ ...CategoryEditSearchRecyclerViewAdapter.java | 176 +++++++++++++ .../contributions/ContributionViewHolder.java | 4 +- .../contributions/ContributionsFragment.java | 4 +- .../ContributionsListAdapter.java | 3 +- .../ContributionsListFragment.java | 11 +- .../commons/media/MediaDetailFragment.java | 232 +++++++++++++++++- .../media/MediaDetailPagerFragment.java | 9 +- .../notification/NotificationHelper.java | 1 + .../nrw/commons/widget/PicOfDayAppWidget.java | 5 +- .../main/res/drawable/ic_baseline_edit_24.xml | 10 + .../main/res/layout/fragment_media_detail.xml | 57 ++++- .../res/layout/layout_edit_categories.xml | 114 +++++++++ .../res/layout/layout_edit_category_item.xml | 27 ++ app/src/main/res/values/strings.xml | 15 ++ .../nrw/commons/actions/PageEditClientTest.kt | 26 +- 20 files changed, 799 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoryEditHelper.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoryEditSearchRecyclerViewAdapter.java create mode 100644 app/src/main/res/drawable/ic_baseline_edit_24.xml create mode 100644 app/src/main/res/layout/layout_edit_categories.xml create mode 100644 app/src/main/res/layout/layout_edit_category_item.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 405537524..084bac90e 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -325,4 +325,4 @@ - \ No newline at end of file + 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 1aad1ea38..e2580284f 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.kt +++ b/app/src/main/java/fr/free/nrw/commons/Media.kt @@ -121,4 +121,14 @@ class Media constructor( get() = captions[Locale.getDefault().language] ?: captions.values.firstOrNull() ?: displayTitle + + /** + * Gets the categories the file falls under. + * @return file categories as an ArrayList of Strings + */ + var addedCategories: List? = null + // TODO added categories should be removed. It is added for a short fix. On category update, + // categories should be re-fetched instead + get() = field // getter + set(value) { field = value } // setter } diff --git a/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.java b/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.java index 46005d006..a2d7bd543 100644 --- a/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.java +++ b/app/src/main/java/fr/free/nrw/commons/actions/PageEditClient.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons.actions; +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; import org.wikipedia.csrf.CsrfTokenClient; import org.wikipedia.dataclient.Service; @@ -48,12 +50,16 @@ public class PageEditClient { * @param summary Edit summary */ public Observable appendEdit(String pageTitle, String appendText, String summary) { - try { - return pageEditInterface.postAppendEdit(pageTitle, summary, appendText, csrfTokenClient.getTokenBlocking()) - .map(editResponse -> editResponse.edit().editSucceeded()); - } catch (Throwable throwable) { - return Observable.just(false); - } + return Single.create((SingleOnSubscribe) emitter -> { + try { + emitter.onSuccess(csrfTokenClient.getTokenBlocking()); + } catch (Throwable throwable) { + emitter.onError(throwable); + throwable.printStackTrace(); + } + }).flatMapObservable(token -> pageEditInterface.postAppendEdit(pageTitle, summary, appendText, token) + .map(editResponse -> editResponse.edit().editSucceeded())); + } /** diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt index 2af925317..bcdb1cdd7 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt @@ -8,6 +8,8 @@ import javax.inject.Singleton const val CATEGORY_PREFIX = "Category:" const val SUB_CATEGORY_CONTINUATION_PREFIX = "sub_category_" const val PARENT_CATEGORY_CONTINUATION_PREFIX = "parent_category_" +const val CATEGORY_UNCATEGORISED = "uncategorised" +const val CATEGORY_NEEDING_CATEGORIES = "needing categories" /** * Category Client to handle custom calls to Commons MediaWiki APIs diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryEditHelper.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryEditHelper.java new file mode 100644 index 000000000..7fa637b97 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryEditHelper.java @@ -0,0 +1,109 @@ +package fr.free.nrw.commons.category; + +import static fr.free.nrw.commons.notification.NotificationHelper.NOTIFICATION_EDIT_CATEGORY; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.util.Log; +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 java.util.List; +import javax.inject.Inject; +import javax.inject.Named; +import timber.log.Timber; + +public class CategoryEditHelper { + private final NotificationHelper notificationHelper; + public final PageEditClient pageEditClient; + private final ViewUtilWrapper viewUtil; + private final String username; + private Callback callback; + + @Inject + public CategoryEditHelper(NotificationHelper notificationHelper, + @Named("commons-page-edit") PageEditClient pageEditClient, + ViewUtilWrapper viewUtil, + @Named("username") String username) { + this.notificationHelper = notificationHelper; + this.pageEditClient = pageEditClient; + this.viewUtil = viewUtil; + this.username = username; + } + + /** + * Public interface to edit categories + * @param context + * @param media + * @param categories + * @return + */ + public Single makeCategoryEdit(Context context, Media media, List categories, Callback callback) { + viewUtil.showShortToast(context, context.getString(R.string.category_edit_helper_make_edit_toast)); + return addCategory(media, categories) + .flatMapSingle(result -> Single.just(showCategoryEditNotification(context, media, result))) + .firstOrError(); + } + + /** + * Appends new categories + * @param media + * @param categories to be added + * @return + */ + private Observable addCategory(Media media, List categories) { + Timber.d("thread is category adding %s", Thread.currentThread().getName()); + String summary = "Adding categories"; + + StringBuilder buffer = new StringBuilder(); + + if (categories != null && categories.size() != 0) { + + for (int i = 0; i < categories.size(); i++) { + buffer.append("\n[[Category:").append(categories.get(i)).append("]]"); + } + } else { + buffer.append("{{subst:unc}}"); + } + String appendText = buffer.toString(); + return pageEditClient.appendEdit(media.getFilename(), appendText + "\n", summary); + } + + private boolean showCategoryEditNotification(Context context, Media media, boolean result) { + String message; + String title = context.getString(R.string.category_edit_helper_show_edit_title); + + if (result) { + title += ": " + context.getString(R.string.category_edit_helper_show_edit_title_success); + StringBuilder categoriesInMessage = new StringBuilder(); + List mediaCategoryList = media.getCategories(); + for (String category : mediaCategoryList) { + categoriesInMessage.append(category); + if (category.equals(mediaCategoryList.get(mediaCategoryList.size()-1))) { + continue; + } + categoriesInMessage.append(","); + } + + message = context.getResources().getQuantityString(R.plurals.category_edit_helper_show_edit_message_if, mediaCategoryList.size(), categoriesInMessage.toString()); + } else { + title += ": " + context.getString(R.string.category_edit_helper_show_edit_title); + message = context.getString(R.string.category_edit_helper_edit_message_else) ; + } + + String urlForFile = BuildConfig.COMMONS_URL + "/wiki/" + media.getFilename(); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlForFile)); + notificationHelper.showNotification(context, title, message, NOTIFICATION_EDIT_CATEGORY, browserIntent); + return result; + } + + public interface Callback { + boolean updateCategoryDisplay(List categories); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryEditSearchRecyclerViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryEditSearchRecyclerViewAdapter.java new file mode 100644 index 000000000..78342777d --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryEditSearchRecyclerViewAdapter.java @@ -0,0 +1,176 @@ +package fr.free.nrw.commons.category; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.category.CategoryEditSearchRecyclerViewAdapter.RecyclerViewHolder; +import fr.free.nrw.commons.nearby.Label; +import java.util.ArrayList; +import java.util.List; + +public class CategoryEditSearchRecyclerViewAdapter + extends RecyclerView.Adapter + implements Filterable { + + private List displayedCategories; + private List categories = new ArrayList<>(); + private List newCategories = new ArrayList<>(); + private final LayoutInflater inflater; + private CategoryClient categoryClient; + private Context context; + + private Callback callback; + + public CategoryEditSearchRecyclerViewAdapter(Context context, ArrayList