From d7f58dab36af5bdc0ed07e608b485af960aa23af Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 12 Nov 2022 12:15:16 +0100 Subject: [PATCH] Add reports --- app/src/main/AndroidManifest.xml | 5 + .../activities/AccountReportActivity.java | 387 ++++++++---------- .../android/client/entities/api/Report.java | 17 + .../app/fedilab/android/helper/Helper.java | 2 + .../ui/drawer/StatusReportAdapter.java | 73 ++++ .../android/viewmodel/mastodon/AdminVM.java | 1 + .../res/layout/drawer_admin_status_report.xml | 29 ++ app/src/main/res/values/strings.xml | 20 + 8 files changed, 315 insertions(+), 219 deletions(-) create mode 100644 app/src/main/java/app/fedilab/android/ui/drawer/StatusReportAdapter.java create mode 100644 app/src/main/res/layout/drawer_admin_status_report.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9cdafe4f5..84e92d74f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -191,6 +191,11 @@ android:name=".activities.AdminAccountActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/account" /> + fillReport(account, null)); return; } if (report != null) { - targeted_account = report.getTarget_account(); - RecyclerView lv_statuses = findViewById(R.id.lv_statuses); ArrayList contents = new ArrayList<>(); - for (Status status : report.getStatuses()) { - contents.add(status.getContent()); + for (Status status : report.statuses) { + contents.add(status.content); } - lv_statuses.setLayoutManager(new LinearLayoutManager(this)); + binding.lvStatuses.setLayoutManager(new LinearLayoutManager(this)); StatusReportAdapter adapter = new StatusReportAdapter(contents); - lv_statuses.setAdapter(adapter); + binding.lvStatuses.setAdapter(adapter); - Group statuses_group = findViewById(R.id.statuses_group); - statuses_group.setVisibility(View.VISIBLE); - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.GET_ONE_ACCOUNT, report.getTarget_account().getUsername(), null, AccountReportActivity.this); - } + binding.statusesGroup.setVisibility(View.VISIBLE); } if (targeted_account != null) { - account_id = targeted_account.getId(); - fillReport(targeted_account); - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { - account_id = targeted_account.getUsername(); - } + account_id = targeted_account.id; + fillReport(targeted_account, null); + account_id = targeted_account.username; } } - @Override - public void onAdminAction(APIResponse apiResponse) { - if (apiResponse.getError() != null) { - if (apiResponse.getError().getStatusCode() == 403) { - SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); - int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); - int style; - if (theme == Helper.THEME_DARK) { - style = R.style.DialogDark; - } else if (theme == Helper.THEME_BLACK) { - style = R.style.DialogBlack; - } else { - style = R.style.Dialog; - } - AlertDialog.Builder builderInner; - builderInner = new AlertDialog.Builder(AccountReportActivity.this, style); - builderInner.setTitle(R.string.reconnect_account); - builderInner.setMessage(R.string.reconnect_account_message); - builderInner.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); - builderInner.setPositiveButton(R.string.validate, (dialog, which) -> { - Intent intent = new Intent(AccountReportActivity.this, LoginActivity.class); - intent.putExtra("admin", true); - startActivity(intent); - }); - builderInner.show(); - } else { - Toasty.error(AccountReportActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - } - return; - } - if (apiResponse.getReports() != null && apiResponse.getReports().size() > 0) { - report = apiResponse.getReports().get(0); - fillReport(report.getTarget_account()); - } else if (apiResponse.getAccountAdmins() != null && apiResponse.getAccountAdmins().size() > 0) { - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { - account_id = apiResponse.getAccountAdmins().get(0).getUsername(); - } - fillReport(apiResponse.getAccountAdmins().get(0)); - } - - } - - private void fillReport(AccountAdmin accountAdmin) { + private void fillReport(AdminAccount accountAdmin, actionType type) { if (accountAdmin == null) { Toasty.error(AccountReportActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); return; } - if (!accountAdmin.isApproved() && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA && (accountAdmin.getDomain() == null || accountAdmin.getDomain().equals("null"))) { - allow_reject_group.setVisibility(View.VISIBLE); + if (!accountAdmin.approved && (accountAdmin.domain == null || accountAdmin.domain.equals("null"))) { + binding.allowRejectGroup.setVisibility(View.VISIBLE); } - reject.setOnClickListener(view -> { - AdminAction adminAction = new AdminAction(); - adminAction.setType(REJECT); - new PostAdminActionAsyncTask(AccountReportActivity.this, REJECT, account_id, adminAction, AccountReportActivity.this); - }); - - allow.setOnClickListener(view -> { - AdminAction adminAction = new AdminAction(); - adminAction.setType(APPROVE); - new PostAdminActionAsyncTask(AccountReportActivity.this, APPROVE, account_id, adminAction, AccountReportActivity.this); - }); - - warn.setOnClickListener(view -> { - AdminAction adminAction = new AdminAction(); - adminAction.setType(NONE); - adminAction.setSend_email_notification(email_user.isChecked()); - adminAction.setText(comment.getText().toString().trim()); - new PostAdminActionAsyncTask(AccountReportActivity.this, NONE, account_id, adminAction, AccountReportActivity.this); - }); - - - if (!accountAdmin.isSilenced()) { - silence.setText(getString(R.string.silence)); + if (!accountAdmin.silenced) { + binding.silence.setText(getString(R.string.silence)); } else { - silence.setText(getString(R.string.unsilence)); + binding.silence.setText(getString(R.string.unsilence)); } - silence.setOnClickListener(view -> { - if (!accountAdmin.isSilenced()) { - AdminAction adminAction = new AdminAction(); - adminAction.setType(SILENCE); - adminAction.setSend_email_notification(email_user.isChecked()); - adminAction.setText(comment.getText().toString().trim()); - new PostAdminActionAsyncTask(AccountReportActivity.this, SILENCE, account_id, adminAction, AccountReportActivity.this); + if (!accountAdmin.disabled) { + binding.disable.setText(getString(R.string.disable)); + } else { + binding.disable.setText(getString(R.string.undisable)); + } + if (!accountAdmin.suspended) { + binding.suspend.setText(getString(R.string.suspend)); + } else { + binding.suspend.setText(getString(R.string.unsuspend)); + } + + binding.reject.setOnClickListener(view -> adminVM.reject(MainActivity.currentInstance, MainActivity.currentToken, account_id).observe(this, account -> fillReport(account, actionType.REJECT))); + binding.allow.setOnClickListener(view -> adminVM.approve(MainActivity.currentInstance, MainActivity.currentToken, account_id).observe(this, account -> fillReport(account, actionType.APPROVE))); + binding.warn.setOnClickListener(view -> { + adminVM.performAction(MainActivity.currentInstance, MainActivity.currentToken, account_id, "none", null, null, binding.comment.getText().toString().trim(), binding.emailUser.isChecked()); + fillReport(accountAdmin, actionType.NONE); + }); + binding.silence.setOnClickListener(view -> { + if (!accountAdmin.silenced) { + adminVM.performAction(MainActivity.currentInstance, MainActivity.currentToken, account_id, "silence", null, null, binding.comment.getText().toString().trim(), binding.emailUser.isChecked()); + accountAdmin.silenced = true; + fillReport(accountAdmin, actionType.SILENCE); } else { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.UNSILENCE, account_id, null, AccountReportActivity.this); + adminVM.unsilence(MainActivity.currentInstance, MainActivity.currentToken, account_id).observe(this, account -> fillReport(account, actionType.UNSILENCE)); + } + }); + binding.disable.setOnClickListener(view -> { + if (!accountAdmin.disabled) { + adminVM.performAction(MainActivity.currentInstance, MainActivity.currentToken, account_id, "disable", null, null, binding.comment.getText().toString().trim(), binding.emailUser.isChecked()); + accountAdmin.disabled = true; + fillReport(accountAdmin, actionType.DISABLE); + } else { + adminVM.enable(MainActivity.currentInstance, MainActivity.currentToken, account_id).observe(this, account -> fillReport(account, actionType.ENABLE)); } }); - if (!accountAdmin.isDisabled()) { - disable.setText(getString(R.string.disable)); - } else { - disable.setText(getString(R.string.undisable)); - } - disable.setOnClickListener(view -> { - if (!accountAdmin.isDisabled()) { - AdminAction adminAction = new AdminAction(); - adminAction.setType(DISABLE); - adminAction.setSend_email_notification(email_user.isChecked()); - adminAction.setText(comment.getText().toString().trim()); - new PostAdminActionAsyncTask(AccountReportActivity.this, DISABLE, account_id, adminAction, AccountReportActivity.this); + binding.suspend.setOnClickListener(view -> { + if (!accountAdmin.suspended) { + adminVM.performAction(MainActivity.currentInstance, MainActivity.currentToken, account_id, "suspend", null, null, binding.comment.getText().toString().trim(), binding.emailUser.isChecked()); + accountAdmin.suspended = true; + fillReport(accountAdmin, actionType.SUSPEND); } else { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.ENABLE, account_id, null, AccountReportActivity.this); - } - }); - if (!accountAdmin.isSuspended()) { - suspend.setText(getString(R.string.suspend)); - } else { - suspend.setText(getString(R.string.unsuspend)); - } - suspend.setOnClickListener(view -> { - if (!accountAdmin.isSuspended()) { - AdminAction adminAction = new AdminAction(); - adminAction.setType(SUSPEND); - adminAction.setSend_email_notification(email_user.isChecked()); - adminAction.setText(comment.getText().toString().trim()); - new PostAdminActionAsyncTask(AccountReportActivity.this, SUSPEND, account_id, adminAction, AccountReportActivity.this); - } else { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.UNSUSPEND, account_id, null, AccountReportActivity.this); + adminVM.unsuspend(MainActivity.currentInstance, MainActivity.currentToken, account_id).observe(this, account -> fillReport(account, actionType.UNSUSPEND)); } }); - if (accountAdmin.getAction() != null) { + if (type != null) { String message = null; - switch (accountAdmin.getAction()) { + switch (type) { case SILENCE: message = getString(R.string.account_silenced); break; @@ -265,139 +195,158 @@ public class AccountReportActivity extends BaseActivity implements OnAdminAction message = getString(R.string.account_warned); break; case APPROVE: - allow_reject_group.setVisibility(View.GONE); + binding.allowRejectGroup.setVisibility(View.GONE); message = getString(R.string.account_approved); break; case REJECT: - allow_reject_group.setVisibility(View.GONE); + binding.allowRejectGroup.setVisibility(View.GONE); message = getString(R.string.account_rejected); break; } if (message != null) { Toasty.success(AccountReportActivity.this, message, Toast.LENGTH_LONG).show(); } - comment.setText(""); + binding.comment.setText(""); InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); assert imm != null; - imm.hideSoftInputFromWindow(comment.getWindowToken(), 0); + imm.hideSoftInputFromWindow(binding.comment.getWindowToken(), 0); } - if (accountAdmin.getAccount() != null) { - username.setText(String.format("@%s", accountAdmin.getAccount().getAcct())); + if (accountAdmin.account != null) { + binding.username.setText(String.format("@%s", accountAdmin.account.acct)); } - email.setText(accountAdmin.getEmail()); + binding.email.setText(accountAdmin.email); - if (accountAdmin.getEmail() == null || accountAdmin.getEmail().trim().equals("")) { - email.setVisibility(View.GONE); - email_label.setVisibility(View.GONE); + if (accountAdmin.email == null || accountAdmin.email.trim().equals("")) { + binding.email.setVisibility(View.GONE); + binding.emailLabel.setVisibility(View.GONE); } - if (accountAdmin.getIp() == null || accountAdmin.getIp().trim().equals("")) { - recent_ip.setVisibility(View.GONE); - recent_ip_label.setVisibility(View.GONE); + if (accountAdmin.ip == null || accountAdmin.ip.ip.trim().equals("")) { + binding.recentIp.setVisibility(View.GONE); + binding.recentIpLabel.setVisibility(View.GONE); } - if (accountAdmin.getCreated_at() == null) { - joined.setVisibility(View.GONE); - joined_label.setVisibility(View.GONE); + if (accountAdmin.created_at == null) { + binding.joined.setVisibility(View.GONE); + binding.joinedLabel.setVisibility(View.GONE); } - if (accountAdmin.isDisabled()) { - login_status.setText(getString(R.string.disabled)); - } else if (accountAdmin.isSilenced()) { - login_status.setText(getString(R.string.silenced)); - } else if (accountAdmin.isSuspended()) { - login_status.setText(getString(R.string.suspended)); + if (accountAdmin.disabled) { + binding.loginStatus.setText(getString(R.string.disabled)); + } else if (accountAdmin.silenced) { + binding.loginStatus.setText(getString(R.string.silenced)); + } else if (accountAdmin.suspended) { + binding.loginStatus.setText(getString(R.string.suspended)); } else { - login_status.setText(getString(R.string.active)); + binding.loginStatus.setText(getString(R.string.active)); } - if (accountAdmin.getDomain() == null || accountAdmin.getDomain().equals("null")) { - warn.setVisibility(View.VISIBLE); - email_user.setVisibility(View.VISIBLE); - comment_label.setVisibility(View.VISIBLE); - comment.setVisibility(View.VISIBLE); - recent_ip.setText(accountAdmin.getIp()); - disable.setVisibility(View.VISIBLE); - suspend.setVisibility(View.VISIBLE); + if (accountAdmin.domain == null || accountAdmin.domain.equals("null")) { + binding.warn.setVisibility(View.VISIBLE); + binding.emailUser.setVisibility(View.VISIBLE); + binding.commentLabel.setVisibility(View.VISIBLE); + binding.comment.setVisibility(View.VISIBLE); + binding.recentIp.setText(accountAdmin.ip != null ? accountAdmin.ip.ip : ""); + binding.disable.setVisibility(View.VISIBLE); + binding.suspend.setVisibility(View.VISIBLE); } else { - warn.setVisibility(View.GONE); - email_user.setVisibility(View.GONE); - email_user.setChecked(false); - comment.setVisibility(View.GONE); - recent_ip.setText("-"); - permissions.setText("-"); - email.setText("-"); - disable.setVisibility(View.GONE); - suspend.setVisibility(View.VISIBLE); - comment_label.setVisibility(View.GONE); + binding.warn.setVisibility(View.GONE); + binding.emailUser.setVisibility(View.GONE); + binding.emailUser.setChecked(false); + binding.comment.setVisibility(View.GONE); + binding.recentIp.setText("-"); + binding.permissions.setText("-"); + binding.email.setText("-"); + binding.disable.setVisibility(View.GONE); + binding.suspend.setVisibility(View.VISIBLE); + binding.commentLabel.setVisibility(View.GONE); } - if (accountAdmin.getRole() != null) { - switch (accountAdmin.getRole()) { + if (accountAdmin.role != null) { + switch (accountAdmin.role) { case "user": - permissions.setText(getString(R.string.user)); + binding.permissions.setText(getString(R.string.user)); break; case "moderator": - permissions.setText(getString(R.string.moderator)); + binding.permissions.setText(getString(R.string.moderator)); break; case "admin": - permissions.setText(getString(R.string.administrator)); + binding.permissions.setText(getString(R.string.administrator)); break; } - if (accountAdmin.getRole().equals("admin") || accountAdmin.getRole().equals("moderator")) { - warn.setVisibility(View.GONE); - suspend.setVisibility(View.GONE); - silence.setVisibility(View.GONE); - disable.setVisibility(View.GONE); - email_user.setVisibility(View.GONE); - email_user.setChecked(false); - comment.setVisibility(View.GONE); - comment_label.setVisibility(View.GONE); + if (accountAdmin.role.equals("admin") || accountAdmin.role.equals("moderator")) { + binding.warn.setVisibility(View.GONE); + binding.suspend.setVisibility(View.GONE); + binding.silence.setVisibility(View.GONE); + binding.disable.setVisibility(View.GONE); + binding.emailUser.setVisibility(View.GONE); + binding.emailUser.setChecked(false); + binding.comment.setVisibility(View.GONE); + binding.commentLabel.setVisibility(View.GONE); } - email_status.setText(accountAdmin.isConfirmed() ? getString(R.string.confirmed) : getString(R.string.unconfirmed)); + binding.emailStatus.setText(accountAdmin.confirmed ? getString(R.string.confirmed) : getString(R.string.unconfirmed)); } - joined.setText(Helper.dateToString(accountAdmin.getCreated_at())); + binding.joined.setText(Helper.dateToString(accountAdmin.created_at)); if (report != null) { - assign.setVisibility(View.VISIBLE); - status.setVisibility(View.VISIBLE); - if (report.getAssigned_account() == null) { - assign.setText(getString(R.string.assign_to_me)); + binding.assign.setVisibility(View.VISIBLE); + binding.status.setVisibility(View.VISIBLE); + if (report.assigned_account == null) { + binding.assign.setText(getString(R.string.assign_to_me)); } else { - assign.setText(getString(R.string.unassign)); + binding.assign.setText(getString(R.string.unassign)); } - assign.setOnClickListener(view -> { - if (report.getAssigned_account() == null) { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.ASSIGN_TO_SELF, report.getId(), null, AccountReportActivity.this); + binding.assign.setOnClickListener(view -> { + if (report.assigned_account == null) { + adminVM.assignToSelf(MainActivity.currentInstance, MainActivity.currentToken, report.id).observe(this, adminReport -> { + + }); } else { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.UNASSIGN, report.getId(), null, AccountReportActivity.this); + adminVM.unassign(MainActivity.currentInstance, MainActivity.currentToken, report.id).observe(this, adminReport -> { + + }); } }); - if (report.isAction_taken()) { - status.setText(getString(R.string.mark_unresolved)); + if (report.action_taken) { + binding.status.setText(getString(R.string.mark_unresolved)); } else { - status.setText(getString(R.string.mark_resolved)); + binding.status.setText(getString(R.string.mark_resolved)); } - status.setOnClickListener(view -> { - if (report.isAction_taken()) { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.REOPEN, report.getId(), null, AccountReportActivity.this); + binding.status.setOnClickListener(view -> { + if (report.action_taken) { + adminVM.reopen(MainActivity.currentInstance, MainActivity.currentToken, report.id).observe(this, adminReport -> { + + }); } else { - new PostAdminActionAsyncTask(AccountReportActivity.this, API.adminAction.RESOLVE, report.getId(), null, AccountReportActivity.this); + adminVM.resolved(MainActivity.currentInstance, MainActivity.currentToken, report.id).observe(this, adminReport -> { + + }); } }); } else { - assign.setVisibility(View.GONE); - status.setVisibility(View.GONE); - } - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { - email_user.setVisibility(View.GONE); - email_user.setChecked(false); - comment.setVisibility(View.INVISIBLE); - comment_label.setVisibility(View.GONE); - warn.setVisibility(View.GONE); - silence.setVisibility(View.GONE); - assign.setVisibility(View.GONE); + binding.assign.setVisibility(View.GONE); + binding.status.setVisibility(View.GONE); } } + + public enum actionType { + ENABLE, + APPROVE, + REJECT, + NONE, + SILENCE, + DISABLE, + UNSILENCE, + SUSPEND, + UNSUSPEND, + ASSIGN_TO_SELF, + UNASSIGN, + REOPEN, + RESOLVE, + GET_ACCOUNTS, + GET_ONE_ACCOUNT, + GET_REPORTS, + GET_ONE_REPORT + } } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Report.java b/app/src/main/java/app/fedilab/android/client/entities/api/Report.java index 81fbdb381..db86304a5 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Report.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Report.java @@ -17,6 +17,7 @@ package app.fedilab.android.client.entities.api; import com.google.gson.annotations.SerializedName; import java.io.Serializable; +import java.util.Date; import java.util.List; public class Report implements Serializable { @@ -25,6 +26,22 @@ public class Report implements Serializable { public String id; @SerializedName("action_taken") public boolean action_taken; + @SerializedName("comment") + public String comment; + @SerializedName("created_at") + public Date created_at; + @SerializedName("updated_at") + public Date updated_at; + @SerializedName("account") + public Account account; + @SerializedName("target_account") + public Account target_account; + @SerializedName("assigned_account") + public Account assigned_account; + @SerializedName("action_taken_by_account") + public String action_taken_by_account; + @SerializedName("statuses") + public List statuses; public static class ReportParams implements Serializable { @SerializedName("account_id") diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 79d43d292..7ca807c98 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -231,6 +231,8 @@ public class Helper { public static final String ARG_MENTION_BOOSTER = "ARG_MENTION_BOOSTER"; public static final String ARG_STATUS_REPLY_ID = "ARG_STATUS_REPLY_ID"; public static final String ARG_ACCOUNT = "ARG_ACCOUNT"; + public static final String ARG_ACCOUNT_ID = "ARG_ACCOUNT_ID"; + public static final String ARG_REPORT = "ARG_REPORT"; public static final String ARG_ACCOUNT_MENTION = "ARG_ACCOUNT_MENTION"; public static final String ARG_MINIFIED = "ARG_MINIFIED"; public static final String ARG_STATUS_REPORT = "ARG_STATUS_REPORT"; diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusReportAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusReportAdapter.java new file mode 100644 index 000000000..dddf9e867 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusReportAdapter.java @@ -0,0 +1,73 @@ +package app.fedilab.android.ui.drawer; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import android.os.Build; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import app.fedilab.android.databinding.DrawerAdminStatusReportBinding; + +public class StatusReportAdapter extends RecyclerView.Adapter { + + private final List mData; + + + public StatusReportAdapter(List data) { + this.mData = data; + } + + + @NotNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + DrawerAdminStatusReportBinding itemBinding = DrawerAdminStatusReportBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new StatusReportViewHolder(itemBinding); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { + String content; + StatusReportViewHolder holder = (StatusReportViewHolder) viewHolder; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + content = Html.fromHtml(mData.get(position), Html.FROM_HTML_MODE_LEGACY).toString(); + else + content = Html.fromHtml(mData.get(position)).toString(); + holder.binding.reportContent.setText(content); + } + + + @Override + public int getItemCount() { + return mData.size(); + } + + public static class StatusReportViewHolder extends RecyclerView.ViewHolder { + DrawerAdminStatusReportBinding binding; + + StatusReportViewHolder(DrawerAdminStatusReportBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AdminVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AdminVM.java index 2375ee81f..cb764d01c 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AdminVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AdminVM.java @@ -262,6 +262,7 @@ public class AdminVM extends AndroidViewModel { return adminAccountMutableLiveData; } + /** * Re-enable a local account whose login is currently disabled. * diff --git a/app/src/main/res/layout/drawer_admin_status_report.xml b/app/src/main/res/layout/drawer_admin_status_report.xml new file mode 100644 index 000000000..77556c630 --- /dev/null +++ b/app/src/main/res/layout/drawer_admin_status_report.xml @@ -0,0 +1,29 @@ + + + + + + + \ 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 87a7b5a0f..2e880712e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1576,4 +1576,24 @@ Notify the user per e-mail Custom warning Reported statuses + Silenced + User + Moderator + Administrator + Confirmed + Unconfirmed + Assign to me + Unassign + Mark unresolved + Mark resolved + Account rejected + Account approved + Account warned + Account unsuspended + Account suspended + Account undisabled + Account disabled + Account unsilenced + Account silenced + Report