From b07282f5aff8f4754d25967aae61157dc091edec Mon Sep 17 00:00:00 2001 From: tanvidadu Date: Tue, 7 Aug 2018 19:56:18 +0530 Subject: [PATCH 1/4] Added resaons in dropdown list --- .../nrw/commons/delete/ReasonBuilder.java | 102 ++++++++++++++++++ .../commons/media/MediaDetailFragment.java | 85 ++++++++------- .../layout/simple_spinner_dropdown_list.xml | 8 ++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 158 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java create mode 100644 app/src/main/res/layout/simple_spinner_dropdown_list.xml diff --git a/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java new file mode 100644 index 000000000..52b1c2764 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java @@ -0,0 +1,102 @@ +package fr.free.nrw.commons.delete; + +import android.accounts.Account; +import android.content.Context; +import android.util.Log; + +import com.google.gson.JsonObject; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +import javax.inject.Inject; + +import fr.free.nrw.commons.Media; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.auth.SessionManager; +import fr.free.nrw.commons.mwapi.MediaWikiApi; +import fr.free.nrw.commons.utils.ViewUtil; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; +import timber.log.Timber; + +public class ReasonBuilder { + + private SessionManager sessionManager; + private MediaWikiApi mediaWikiApi; + private CompositeDisposable compositeDisposable = new CompositeDisposable(); + + private String reason; + private Context context; + private Media media; + + public ReasonBuilder(String reason, + Context context, + Media media, + SessionManager sessionManager, + MediaWikiApi mediaWikiApi){ + this.reason = reason; + this.context = context; + this.media = media; + this.sessionManager = sessionManager; + this.mediaWikiApi = mediaWikiApi; + } + + private String prettyUploadedDate(Media media) { + Date date = media.getDateUploaded(); + if (date == null || date.toString() == null || date.toString().isEmpty()) { + return "Uploaded date not available"; + } + SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault()); + return formatter.format(date); + } + + private void fetchArticleNumber() { + if (checkAccount()) { + compositeDisposable.add(mediaWikiApi + .getAchievements(sessionManager.getCurrentAccount().name) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + jsonObject -> appendArticlesUsed(jsonObject), + t -> Timber.e(t, "Fetching achievements statistics failed") + )); + } + } + + private void appendArticlesUsed(JSONObject object){ + try { + reason += ". Uploaded by myself on" + prettyUploadedDate(media); + reason += ",used in " + object.getInt("articlesUsingImages") + " articles"; + Log.i("New Reason", reason); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + + public String getReason(){ + fetchArticleNumber(); + return reason; + } + + /** + * check to ensure that user is logged in + * @return + */ + private boolean checkAccount(){ + Account currentAccount = sessionManager.getCurrentAccount(); + if(currentAccount == null) { + Timber.d("Current account is null"); + ViewUtil.showLongToast(context, context.getResources().getString(R.string.user_not_logged_in)); + sessionManager.forceLogin(context); + return false; + } + return true; + } +} 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 f6c1a3e35..20e43c96e 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 @@ -14,15 +14,18 @@ import android.text.Editable; import android.text.Html; import android.text.TextUtils; import android.text.TextWatcher; +import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ScrollView; +import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -44,8 +47,10 @@ import fr.free.nrw.commons.Media; import fr.free.nrw.commons.MediaDataExtractor; import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.category.CategoryDetailsActivity; import fr.free.nrw.commons.delete.DeleteTask; +import fr.free.nrw.commons.delete.ReasonBuilder; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.mwapi.MediaWikiApi; @@ -64,6 +69,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private int index; private Locale locale; + private boolean isDeleted = false; + public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) { MediaDetailFragment mf = new MediaDetailFragment(); @@ -84,6 +91,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { Provider mediaDataExtractorProvider; @Inject MediaWikiApi mwApi; + @Inject + SessionManager sessionManager; private int initialListTop = 0; @@ -127,6 +136,11 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { //Had to make this class variable, to implement various onClicks, which access the media, also I fell why make separate variables when one can serve the purpose private Media media; + private String reasonList[] = {"I uploaded it by mistake", + "I did not know it would be publicly visible", + "I realized it is bad for my privacy", + "Sorry this picture is not interesting for an encyclopedia", + "I changed my mind, I don't want it to be publicly visible anymore"}; @Override public void onSaveInstanceState(Bundle outState) { @@ -368,48 +382,43 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { @OnClick(R.id.nominateDeletion) public void onDeleteButtonClicked(){ - //Reviewer correct me if i have misunderstood something over here - //But how does this if (delete.getVisibility() == View.VISIBLE) { - // enableDeleteButton(true); makes sense ? - AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); - alert.setMessage("Why should this file be deleted?"); - final EditText input = new EditText(getActivity()); - alert.setView(input); - input.requestFocus(); - alert.setPositiveButton(R.string.ok, (dialog, whichButton) -> { - String reason = input.getText().toString(); - DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason); - deleteTask.execute(); - enableDeleteButton(false); - }); - alert.setNegativeButton(R.string.cancel, (dialog, whichButton) -> { - }); - AlertDialog d = alert.create(); - input.addTextChangedListener(new TextWatcher() { - private void handleText() { - final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE); - if (input.getText().length() == 0) { - okButton.setEnabled(false); - } else { - okButton.setEnabled(true); - } - } + final ArrayAdapter languageAdapter = new ArrayAdapter(getActivity(), + R.layout.simple_spinner_dropdown_list, reasonList); + final Spinner spinner = new Spinner(getActivity()); + spinner.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); + spinner.setAdapter(languageAdapter); + spinner.setGravity(17); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setView(spinner); + builder.setTitle(R.string.nominate_delete) + .setPositiveButton(R.string.about_translate_proceed, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String reason = spinner.getSelectedItem().toString(); + ReasonBuilder reasonBuilder = new ReasonBuilder(reason, + getActivity(), + media, + sessionManager, + mwApi); + reason = reasonBuilder.getReason(); + DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason); + deleteTask.execute(); + isDeleted = true; + enableDeleteButton(false); + } + }); + builder.setNegativeButton(R.string.about_translate_cancel, new DialogInterface.OnClickListener() { @Override - public void afterTextChanged(Editable arg0) { - handleText(); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); } }); - d.show(); - d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + AlertDialog dialog = builder.create(); + dialog.show(); + if(isDeleted) { + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + } } @OnClick(R.id.seeMore) diff --git a/app/src/main/res/layout/simple_spinner_dropdown_list.xml b/app/src/main/res/layout/simple_spinner_dropdown_list.xml new file mode 100644 index 000000000..9d98f7b2a --- /dev/null +++ b/app/src/main/res/layout/simple_spinner_dropdown_list.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a14377ccc..31dfa67e1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -336,6 +336,7 @@ Are you sure you want to clear your search history? Search history deleted + Nominate For Deletion Achievements STATISTICS From 079aabde998f89ba00fe8ea5671a25abfaccbfdf Mon Sep 17 00:00:00 2001 From: tanvidadu Date: Wed, 31 Oct 2018 01:52:52 +0530 Subject: [PATCH 2/4] Made changes --- .../nrw/commons/media/MediaDetailFragment.java | 14 +++++++++----- app/src/main/res/values/strings.xml | 10 ++++++++-- 2 files changed, 17 insertions(+), 7 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 20e43c96e..3f5a265e9 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 @@ -136,11 +136,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { //Had to make this class variable, to implement various onClicks, which access the media, also I fell why make separate variables when one can serve the purpose private Media media; - private String reasonList[] = {"I uploaded it by mistake", - "I did not know it would be publicly visible", - "I realized it is bad for my privacy", - "Sorry this picture is not interesting for an encyclopedia", - "I changed my mind, I don't want it to be publicly visible anymore"}; + private ArrayList reasonList; + @Override public void onSaveInstanceState(Bundle outState) { @@ -173,6 +170,13 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { initialListTop = 0; } + reasonList = new ArrayList<>(); + reasonList.add(getString(R.string.deletion_reason_1)); + reasonList.add(getString(R.string.deletion_reason_2)); + reasonList.add(getString(R.string.deletion_reason_3)); + reasonList.add(getString(R.string.deletion_reason_4)); + reasonList.add(getString(R.string.deletion_reason_5)); + categoryNames = new ArrayList<>(); categoryNames.add(getString(R.string.detail_panel_cats_loading)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31dfa67e1..f7beb8157 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -366,6 +366,12 @@ You haven\'t added any bookmarks Bookmarks Log collection started. Please RESTART the app, perform action that you wish to log, and then tap \'Send log file\' again - Welcome to Commons!\n -Upload your first media by touching the camera or gallery icon above. + Welcome to Commons!\n Upload your first media by touching the camera or gallery icon above. + + I uploaded it by mistake + I did not know it would be publicly visible + I realized it is bad for my privacy + I changed my mind, I don\'t want it to be publicly visible anymore + Sorry this picture is not interesting for an encyclopedia + From af3cabfb361a6897a4c124f835f334a33fb59b2d Mon Sep 17 00:00:00 2001 From: tanvidadu Date: Sat, 3 Nov 2018 14:03:19 +0530 Subject: [PATCH 3/4] Fixed Conflicts --- .../fr/free/nrw/commons/delete/ReasonBuilder.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java index 52b1c2764..46e709d85 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java +++ b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java @@ -17,6 +17,7 @@ import javax.inject.Inject; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.achievements.FeedbackResponse; import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.utils.ViewUtil; @@ -69,14 +70,10 @@ public class ReasonBuilder { } } - private void appendArticlesUsed(JSONObject object){ - try { - reason += ". Uploaded by myself on" + prettyUploadedDate(media); - reason += ",used in " + object.getInt("articlesUsingImages") + " articles"; - Log.i("New Reason", reason); - } catch (JSONException e) { - e.printStackTrace(); - } + private void appendArticlesUsed(FeedbackResponse object){ + reason += ". Uploaded by myself on" + prettyUploadedDate(media); + reason += ",used in " + object.getArticlesUsingImages() + " articles"; + Log.i("New Reason", reason); } From f6a2df6c4fef5ca9b50bd3ce8b366b4de5114af1 Mon Sep 17 00:00:00 2001 From: tanvidadu Date: Sun, 4 Nov 2018 12:39:21 +0530 Subject: [PATCH 4/4] Shifted strings to String.xml --- .../fr/free/nrw/commons/delete/ReasonBuilder.java | 6 ++++-- .../free/nrw/commons/media/MediaDetailFragment.java | 10 +++++----- app/src/main/res/values/strings.xml | 13 ++++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java index 46e709d85..5a1700ec1 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java +++ b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java @@ -71,8 +71,10 @@ public class ReasonBuilder { } private void appendArticlesUsed(FeedbackResponse object){ - reason += ". Uploaded by myself on" + prettyUploadedDate(media); - reason += ",used in " + object.getArticlesUsingImages() + " articles"; + reason += context.getString(R.string.uploaded_by_myself).toString() + prettyUploadedDate(media); + reason += context.getString(R.string.used_by).toString() + + object.getArticlesUsingImages() + + context.getString(R.string.articles).toString(); Log.i("New Reason", reason); } 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 3f5a265e9..ffac70170 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 @@ -171,11 +171,11 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } reasonList = new ArrayList<>(); - reasonList.add(getString(R.string.deletion_reason_1)); - reasonList.add(getString(R.string.deletion_reason_2)); - reasonList.add(getString(R.string.deletion_reason_3)); - reasonList.add(getString(R.string.deletion_reason_4)); - reasonList.add(getString(R.string.deletion_reason_5)); + reasonList.add(getString(R.string.deletion_reason_uploaded_by_mistake)); + reasonList.add(getString(R.string.deletion_reason_publicly_visible)); + reasonList.add(getString(R.string.deletion_reason_not_interesting)); + reasonList.add(getString(R.string.deletion_reason_no_longer_want_public)); + reasonList.add(getString(R.string.deletion_reason_bad_for_my_privacy)); categoryNames = new ArrayList<>(); categoryNames.add(getString(R.string.detail_panel_cats_loading)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7beb8157..3fbcee13c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -368,10 +368,13 @@ Log collection started. Please RESTART the app, perform action that you wish to log, and then tap \'Send log file\' again Welcome to Commons!\n Upload your first media by touching the camera or gallery icon above. - I uploaded it by mistake - I did not know it would be publicly visible - I realized it is bad for my privacy - I changed my mind, I don\'t want it to be publicly visible anymore - Sorry this picture is not interesting for an encyclopedia + I uploaded it by mistake + I did not know it would be publicly visible + I realized it is bad for my privacy + I changed my mind, I don\'t want it to be publicly visible anymore + Sorry this picture is not interesting for an encyclopedia + Uploaded by myself on + ,used in + articles