Skip to content

Commit b07282f

Browse files
committed
Added resaons in dropdown list
1 parent e8f4a28 commit b07282f

File tree

4 files changed

+159
-39
lines changed

4 files changed

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

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

Lines changed: 48 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,8 +47,10 @@
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.delete.DeleteTask;
53+
import fr.free.nrw.commons.delete.ReasonBuilder;
4954
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
5055
import fr.free.nrw.commons.location.LatLng;
5156
import fr.free.nrw.commons.mwapi.MediaWikiApi;
@@ -64,6 +69,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
6469
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
6570
private int index;
6671
private Locale locale;
72+
private boolean isDeleted = false;
73+
6774

6875
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
6976
MediaDetailFragment mf = new MediaDetailFragment();
@@ -84,6 +91,8 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
8491
Provider<MediaDataExtractor> mediaDataExtractorProvider;
8592
@Inject
8693
MediaWikiApi mwApi;
94+
@Inject
95+
SessionManager sessionManager;
8796

8897
private int initialListTop = 0;
8998

@@ -127,6 +136,11 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
127136

128137
//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
129138
private Media media;
139+
private String reasonList[] = {"I uploaded it by mistake",
140+
"I did not know it would be publicly visible",
141+
"I realized it is bad for my privacy",
142+
"Sorry this picture is not interesting for an encyclopedia",
143+
"I changed my mind, I don't want it to be publicly visible anymore"};
130144

131145
@Override
132146
public void onSaveInstanceState(Bundle outState) {
@@ -368,48 +382,43 @@ public void onCopyWikicodeClicked(){
368382

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

415424
@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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@
336336

337337
<string name="delete_recent_searches_dialog">Are you sure you want to clear your search history?</string>
338338
<string name="search_history_deleted">Search history deleted</string>
339+
<string name="nominate_delete">Nominate For Deletion</string>
339340

340341
<string name="Achievements">Achievements</string>
341342
<string name="statistics">STATISTICS</string>

0 commit comments

Comments
 (0)