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..5a1700ec1 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/delete/ReasonBuilder.java @@ -0,0 +1,101 @@ +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.achievements.FeedbackResponse; +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(FeedbackResponse object){ + 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); + } + + + 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 76d7214c0..bf649474e 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,9 +47,11 @@ 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.contributions.ContributionsFragment; 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; @@ -65,6 +70,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(); @@ -85,6 +92,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { Provider mediaDataExtractorProvider; @Inject MediaWikiApi mwApi; + @Inject + SessionManager sessionManager; private int initialListTop = 0; @@ -128,6 +137,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 ArrayList reasonList; + @Override public void onSaveInstanceState(Bundle outState) { @@ -160,6 +171,13 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { initialListTop = 0; } + reasonList = new ArrayList<>(); + 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)); @@ -371,48 +389,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 5104f0c75..9cc8234f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,6 +345,7 @@ Are you sure you want to clear your search history? Search history deleted + Nominate For Deletion Achievements STATISTICS @@ -396,6 +397,16 @@ 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 + + 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 + Welcome to Commons!\n Upload your first media by touching the camera or gallery icon above.