diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
index e95196bbb..238777cce 100644
--- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
+++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
@@ -110,6 +110,10 @@ public class CommonsApplication extends MultiDexApplication {
public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App Feedback";
+ public static final String REPORT_EMAIL = "commons-app-android-private@googlegroups.com";
+
+ public static final String REPORT_EMAIL_SUBJECT = "Report a violation";
+
public static final String NOTIFICATION_CHANNEL_ID_ALL = "CommonsNotificationAll";
public static final String FEEDBACK_EMAIL_TEMPLATE_HEADER = "-- Technical information --";
diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
index b1e74b447..eaede2484 100644
--- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
@@ -3,6 +3,7 @@ package fr.free.nrw.commons.media;
import static fr.free.nrw.commons.Utils.handleWebUrl;
import android.annotation.SuppressLint;
+import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@@ -12,7 +13,9 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
@@ -22,6 +25,7 @@ import androidx.viewpager.widget.ViewPager;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.snackbar.Snackbar;
+import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
@@ -33,7 +37,6 @@ import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.profile.ProfileActivity;
-import fr.free.nrw.commons.theme.BaseActivity;
import fr.free.nrw.commons.utils.DownloadUtils;
import fr.free.nrw.commons.utils.ImageUtils;
import fr.free.nrw.commons.utils.NetworkUtils;
@@ -211,11 +214,83 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
ProfileActivity.startYourself(getActivity(), m.getUser(),
!Objects.equals(sessionManager.getUserName(), m.getUser()));
}
+ return true;
+ case R.id.menu_view_report:
+ showReportDialog(m);
default:
return super.onOptionsItemSelected(item);
}
}
+ private void showReportDialog(final Media media) {
+ if (media == null) {
+ return;
+ }
+ final AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
+ final String[] values = requireContext().getResources()
+ .getStringArray(R.array.report_violation_options);
+ builder.setTitle(R.string.report_violation);
+ builder.setItems(R.array.report_violation_options, (dialog, which) -> {
+ sendReportEmail(media, values[which]);
+ });
+ builder.show();
+ }
+
+ private void sendReportEmail(final Media media, final String type) {
+ final String technicalInfo = getTechInfo(media, type);
+
+ final Intent feedbackIntent = new Intent(Intent.ACTION_SENDTO);
+ feedbackIntent.setType("message/rfc822");
+ feedbackIntent.setData(Uri.parse("mailto:"));
+ feedbackIntent.putExtra(Intent.EXTRA_EMAIL,
+ new String[]{CommonsApplication.REPORT_EMAIL});
+ feedbackIntent.putExtra(Intent.EXTRA_SUBJECT,
+ CommonsApplication.REPORT_EMAIL_SUBJECT);
+ feedbackIntent.putExtra(Intent.EXTRA_TEXT, technicalInfo);
+ try {
+ startActivity(feedbackIntent);
+ } catch (final ActivityNotFoundException e) {
+ Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private String getTechInfo(final Media media, final String type) {
+ final StringBuilder builder = new StringBuilder();
+
+ builder.append("Report type: ")
+ .append(type)
+ .append("\n\n");
+
+ builder.append("Image that you want to report: ")
+ .append(media.getImageUrl())
+ .append("\n\n");
+
+ builder.append("User that you want to report: ")
+ .append(media.getAuthor())
+ .append("\n\n");
+
+ if (sessionManager.getUserName() != null) {
+ builder.append("Your username: ")
+ .append(sessionManager.getUserName())
+ .append("\n\n");
+ }
+
+ builder.append("Violation reason: ")
+ .append("\n");
+
+ builder.append("----------------------------------------------")
+ .append("\n")
+ .append("(please write reason here)")
+ .append("\n")
+ .append("----------------------------------------------")
+ .append("\n\n")
+ .append("Thank you for your report! Our team will investigate as soon as possible.")
+ .append("\n")
+ .append("Please note that images also have a `Nominate for deletion` button.");
+
+ return builder.toString();
+ }
+
/**
* Set the media as the device's wallpaper if the imageUrl is not null
* Fails silently if setting the wallpaper fails
diff --git a/app/src/main/res/menu/fragment_image_detail.xml b/app/src/main/res/menu/fragment_image_detail.xml
index c101ae9b2..65ad9ebbe 100644
--- a/app/src/main/res/menu/fragment_image_detail.xml
+++ b/app/src/main/res/menu/fragment_image_detail.xml
@@ -34,5 +34,9 @@
android:id="@+id/menu_view_user_page"
android:title="@string/menu_view_user_page"
app:showAsAction="never" />
+
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 89ce57701..c09853373 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -70,5 +70,10 @@
- yearly
- all_time
-
+
+ - @string/report_user
+ - @string/report_content
+ - @string/request_user_block
+
+
\ 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 a251d21ed..8b165000d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -717,4 +717,9 @@ Upload your first media by tapping on the add button.
Error while sending feedback
What is your feedback?
Your feedback
+ Report
+ Report violation
+ Report this user
+ Report this content
+ Request to block this user