Skip to content

Commit c4d6cec

Browse files
authored
Merge pull request commons-app#1824 from tanvidadu/addedReasonList
Provide a selectable list of reasons when requesting deletion of a file
2 parents e9bfc4b + 2bcc8c1 commit c4d6cec

File tree

4 files changed

+172
-39
lines changed

4 files changed

+172
-39
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package fr.free.nrw.commons.delete;
2+
3+
import android.accounts.Account;
4+
import android.content.Context;
5+
import android.util.Log;
6+
7+
import com.google.gson.JsonObject;
8+
9+
import org.json.JSONException;
10+
import org.json.JSONObject;
11+
12+
import java.text.SimpleDateFormat;
13+
import java.util.Date;
14+
import java.util.Locale;
15+
16+
import javax.inject.Inject;
17+
18+
import fr.free.nrw.commons.Media;
19+
import fr.free.nrw.commons.R;
20+
import fr.free.nrw.commons.achievements.FeedbackResponse;
21+
import fr.free.nrw.commons.auth.SessionManager;
22+
import fr.free.nrw.commons.mwapi.MediaWikiApi;
23+
import fr.free.nrw.commons.utils.ViewUtil;
24+
import io.reactivex.android.schedulers.AndroidSchedulers;
25+
import io.reactivex.disposables.CompositeDisposable;
26+
import io.reactivex.schedulers.Schedulers;
27+
import timber.log.Timber;
28+
29+
public class ReasonBuilder {
30+
31+
private SessionManager sessionManager;
32+
private MediaWikiApi mediaWikiApi;
33+
private CompositeDisposable compositeDisposable = new CompositeDisposable();
34+
35+
private String reason;
36+
private Context context;
37+
private Media media;
38+
39+
public ReasonBuilder(String reason,
40+
Context context,
41+
Media media,
42+
SessionManager sessionManager,
43+
MediaWikiApi mediaWikiApi){
44+
this.reason = reason;
45+
this.context = context;
46+
this.media = media;
47+
this.sessionManager = sessionManager;
48+
this.mediaWikiApi = mediaWikiApi;
49+
}
50+
51+
private String prettyUploadedDate(Media media) {
52+
Date date = media.getDateUploaded();
53+
if (date == null || date.toString() == null || date.toString().isEmpty()) {
54+
return "Uploaded date not available";
55+
}
56+
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault());
57+
return formatter.format(date);
58+
}
59+
60+
private void fetchArticleNumber() {
61+
if (checkAccount()) {
62+
compositeDisposable.add(mediaWikiApi
63+
.getAchievements(sessionManager.getCurrentAccount().name)
64+
.subscribeOn(Schedulers.io())
65+
.observeOn(AndroidSchedulers.mainThread())
66+
.subscribe(
67+
jsonObject -> appendArticlesUsed(jsonObject),
68+
t -> Timber.e(t, "Fetching achievements statistics failed")
69+
));
70+
}
71+
}
72+
73+
private void appendArticlesUsed(FeedbackResponse object){
74+
reason += context.getString(R.string.uploaded_by_myself).toString() + prettyUploadedDate(media);
75+
reason += context.getString(R.string.used_by).toString()
76+
+ object.getArticlesUsingImages()
77+
+ context.getString(R.string.articles).toString();
78+
Log.i("New Reason", reason);
79+
}
80+
81+
82+
public String getReason(){
83+
fetchArticleNumber();
84+
return reason;
85+
}
86+
87+
/**
88+
* check to ensure that user is logged in
89+
* @return
90+
*/
91+
private boolean checkAccount(){
92+
Account currentAccount = sessionManager.getCurrentAccount();
93+
if(currentAccount == null) {
94+
Timber.d("Current account is null");
95+
ViewUtil.showLongToast(context, context.getResources().getString(R.string.user_not_logged_in));
96+
sessionManager.forceLogin(context);
97+
return false;
98+
}
99+
return true;
100+
}
101+
}

app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,18 @@
1414
import android.text.Html;
1515
import android.text.TextUtils;
1616
import android.text.TextWatcher;
17+
import android.util.Log;
1718
import android.util.TypedValue;
1819
import android.view.LayoutInflater;
1920
import android.view.View;
2021
import android.view.ViewGroup;
2122
import android.view.ViewTreeObserver;
23+
import android.widget.ArrayAdapter;
2224
import android.widget.Button;
2325
import android.widget.EditText;
2426
import android.widget.LinearLayout;
2527
import android.widget.ScrollView;
28+
import android.widget.Spinner;
2629
import android.widget.TextView;
2730
import android.widget.Toast;
2831

@@ -44,9 +47,11 @@
4447
import fr.free.nrw.commons.MediaDataExtractor;
4548
import fr.free.nrw.commons.MediaWikiImageView;
4649
import fr.free.nrw.commons.R;
50+
import fr.free.nrw.commons.auth.SessionManager;
4751
import fr.free.nrw.commons.category.CategoryDetailsActivity;
4852
import fr.free.nrw.commons.contributions.ContributionsFragment;
4953
import fr.free.nrw.commons.delete.DeleteTask;
54+
import fr.free.nrw.commons.delete.ReasonBuilder;
5055
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
5156
import fr.free.nrw.commons.location.LatLng;
5257
import fr.free.nrw.commons.mwapi.MediaWikiApi;
@@ -65,6 +70,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
6570
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
6671
private int index;
6772
private Locale locale;
73+
private boolean isDeleted = false;
74+
6875

6976
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
7077
MediaDetailFragment mf = new MediaDetailFragment();
@@ -85,6 +92,8 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
8592
Provider<MediaDataExtractor> mediaDataExtractorProvider;
8693
@Inject
8794
MediaWikiApi mwApi;
95+
@Inject
96+
SessionManager sessionManager;
8897

8998
private int initialListTop = 0;
9099

@@ -128,6 +137,8 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
128137

129138
//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
130139
private Media media;
140+
private ArrayList<String> reasonList;
141+
131142

132143
@Override
133144
public void onSaveInstanceState(Bundle outState) {
@@ -160,6 +171,13 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
160171
initialListTop = 0;
161172
}
162173

174+
reasonList = new ArrayList<>();
175+
reasonList.add(getString(R.string.deletion_reason_uploaded_by_mistake));
176+
reasonList.add(getString(R.string.deletion_reason_publicly_visible));
177+
reasonList.add(getString(R.string.deletion_reason_not_interesting));
178+
reasonList.add(getString(R.string.deletion_reason_no_longer_want_public));
179+
reasonList.add(getString(R.string.deletion_reason_bad_for_my_privacy));
180+
163181
categoryNames = new ArrayList<>();
164182
categoryNames.add(getString(R.string.detail_panel_cats_loading));
165183

@@ -371,48 +389,43 @@ public void onCopyWikicodeClicked(){
371389

372390
@OnClick(R.id.nominateDeletion)
373391
public void onDeleteButtonClicked(){
374-
//Reviewer correct me if i have misunderstood something over here
375-
//But how does this if (delete.getVisibility() == View.VISIBLE) {
376-
// enableDeleteButton(true); makes sense ?
377-
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
378-
alert.setMessage("Why should this file be deleted?");
379-
final EditText input = new EditText(getActivity());
380-
alert.setView(input);
381-
input.requestFocus();
382-
alert.setPositiveButton(R.string.ok, (dialog, whichButton) -> {
383-
String reason = input.getText().toString();
384-
DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason);
385-
deleteTask.execute();
386-
enableDeleteButton(false);
387-
});
388-
alert.setNegativeButton(R.string.cancel, (dialog, whichButton) -> {
389-
});
390-
AlertDialog d = alert.create();
391-
input.addTextChangedListener(new TextWatcher() {
392-
private void handleText() {
393-
final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
394-
if (input.getText().length() == 0) {
395-
okButton.setEnabled(false);
396-
} else {
397-
okButton.setEnabled(true);
398-
}
399-
}
400-
401-
@Override
402-
public void afterTextChanged(Editable arg0) {
403-
handleText();
404-
}
405-
406-
@Override
407-
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
408-
}
409-
392+
final ArrayAdapter<String> languageAdapter = new ArrayAdapter<String>(getActivity(),
393+
R.layout.simple_spinner_dropdown_list, reasonList);
394+
final Spinner spinner = new Spinner(getActivity());
395+
spinner.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
396+
spinner.setAdapter(languageAdapter);
397+
spinner.setGravity(17);
398+
399+
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
400+
builder.setView(spinner);
401+
builder.setTitle(R.string.nominate_delete)
402+
.setPositiveButton(R.string.about_translate_proceed, new DialogInterface.OnClickListener() {
403+
@Override
404+
public void onClick(DialogInterface dialog, int which) {
405+
String reason = spinner.getSelectedItem().toString();
406+
ReasonBuilder reasonBuilder = new ReasonBuilder(reason,
407+
getActivity(),
408+
media,
409+
sessionManager,
410+
mwApi);
411+
reason = reasonBuilder.getReason();
412+
DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason);
413+
deleteTask.execute();
414+
isDeleted = true;
415+
enableDeleteButton(false);
416+
}
417+
});
418+
builder.setNegativeButton(R.string.about_translate_cancel, new DialogInterface.OnClickListener() {
410419
@Override
411-
public void onTextChanged(CharSequence s, int start, int before, int count) {
420+
public void onClick(DialogInterface dialog, int which) {
421+
dialog.dismiss();
412422
}
413423
});
414-
d.show();
415-
d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
424+
AlertDialog dialog = builder.create();
425+
dialog.show();
426+
if(isDeleted) {
427+
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
428+
}
416429
}
417430

418431
@OnClick(R.id.seeMore)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:id="@android:id/text1"
4+
style="?android:attr/spinnerDropDownItemStyle"
5+
android:singleLine="false"
6+
android:layout_width="match_parent"
7+
android:layout_height="?android:attr/listPreferredItemHeight"
8+
android:ellipsize="marquee" />

app/src/main/res/values/strings.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@
345345

346346
<string name="delete_recent_searches_dialog">Are you sure you want to clear your search history?</string>
347347
<string name="search_history_deleted">Search history deleted</string>
348+
<string name="nominate_delete">Nominate For Deletion</string>
348349

349350
<string name="Achievements">Achievements</string>
350351
<string name="statistics">STATISTICS</string>
@@ -396,6 +397,16 @@
396397
<string name="bookmark_empty">You haven\'t added any bookmarks</string>
397398
<string name="provider_bookmarks_location">Bookmarks</string>
398399
<string name="log_collection_started">Log collection started. Please RESTART the app, perform action that you wish to log, and then tap \'Send log file\' again</string>
400+
401+
<string name="deletion_reason_uploaded_by_mistake">I uploaded it by mistake</string>
402+
<string name="deletion_reason_publicly_visible">I did not know it would be publicly visible</string>
403+
<string name="deletion_reason_bad_for_my_privacy">I realized it is bad for my privacy</string>
404+
<string name="deletion_reason_no_longer_want_public">I changed my mind, I don\'t want it to be publicly visible anymore</string>
405+
<string name="deletion_reason_not_interesting">Sorry this picture is not interesting for an encyclopedia</string>
406+
<string name="uploaded_by_myself">Uploaded by myself on</string>
407+
<string name="used_by">,used in</string>
408+
<string name="articles">articles</string>
409+
399410
<string name="no_uploads">Welcome to Commons!\n
400411
Upload your first media by touching the camera or gallery icon above.</string>
401412

0 commit comments

Comments
 (0)