Skip to content

Commit de52177

Browse files
committed
Added resaons in dropdown list
1 parent f12f1d5 commit de52177

File tree

4 files changed

+159
-43
lines changed

4 files changed

+159
-43
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 & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,18 @@
1111
import android.text.Editable;
1212
import android.text.TextUtils;
1313
import android.text.TextWatcher;
14+
import android.util.Log;
1415
import android.util.TypedValue;
1516
import android.view.LayoutInflater;
1617
import android.view.View;
1718
import android.view.ViewGroup;
1819
import android.view.ViewTreeObserver;
20+
import android.widget.ArrayAdapter;
1921
import android.widget.Button;
2022
import android.widget.EditText;
2123
import android.widget.LinearLayout;
2224
import android.widget.ScrollView;
25+
import android.widget.Spinner;
2326
import android.widget.TextView;
2427
import android.widget.Toast;
2528

@@ -42,8 +45,10 @@
4245
import fr.free.nrw.commons.MediaWikiImageView;
4346
import fr.free.nrw.commons.PageTitle;
4447
import fr.free.nrw.commons.R;
48+
import fr.free.nrw.commons.auth.SessionManager;
4549
import fr.free.nrw.commons.category.CategoryDetailsActivity;
4650
import fr.free.nrw.commons.delete.DeleteTask;
51+
import fr.free.nrw.commons.delete.ReasonBuilder;
4752
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
4853
import fr.free.nrw.commons.location.LatLng;
4954
import fr.free.nrw.commons.mwapi.MediaWikiApi;
@@ -61,6 +66,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
6166
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
6267
private int index;
6368
private Locale locale;
69+
private boolean isDeleted = false;
70+
6471

6572
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
6673
MediaDetailFragment mf = new MediaDetailFragment();
@@ -81,6 +88,8 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
8188
Provider<MediaDataExtractor> mediaDataExtractorProvider;
8289
@Inject
8390
MediaWikiApi mwApi;
91+
@Inject
92+
SessionManager sessionManager;
8493

8594
private int initialListTop = 0;
8695

@@ -124,6 +133,11 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
124133

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

128142
@Override
129143
public void onSaveInstanceState(Bundle outState) {
@@ -353,52 +367,43 @@ public void onMediaDetailCoordinatesClicked(){
353367

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

404409
@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
@@ -334,6 +334,7 @@
334334

335335
<string name="delete_recent_searches_dialog">Are you sure you want to clear your search history?</string>
336336
<string name="search_history_deleted">Search history deleted</string>
337+
<string name="nominate_delete">Nominate For Deletion</string>
337338

338339
<string name="Achievements">Achievements</string>
339340
<string name="statistics">STATISTICS</string>

0 commit comments

Comments
 (0)