mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Migrate report feature to current branch
This commit is contained in:
parent
d3a4071683
commit
def6f89e45
33 changed files with 432 additions and 33 deletions
|
|
@ -102,7 +102,7 @@
|
|||
android:theme="@style/TextInputLayoutAppearanceTheme"
|
||||
style="@style/TextInputLayoutAppearance"
|
||||
android:layout_marginTop="@dimen/spacing_large"
|
||||
android:hint="@string/reason_for_report"
|
||||
android:hint="@string/report_message_hint"
|
||||
android:layout_marginBottom="@dimen/spacing_large">
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/additional_info_edittext"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
android:title="@string/copy_userid" />
|
||||
<item android:id="@+id/block_user"
|
||||
android:title="@string/block_user" />
|
||||
<item android:id="@+id/report_player"
|
||||
android:title="@string/report_player" />
|
||||
<group android:id="@+id/admin_items">
|
||||
<item android:id="@+id/ban_user"
|
||||
android:title="@string/ban_user" />
|
||||
|
|
|
|||
|
|
@ -796,7 +796,7 @@
|
|||
<string name="become_x">Conviértete en un %s</string>
|
||||
<string name="x_class">Clase %s</string>
|
||||
<string name="report_message_title">Reporta a %s por violación:</string>
|
||||
<string name="reason_for_report">Razón para reportar (opcional)</string>
|
||||
<string name="report_message_hint">Razón para reportar (opcional)</string>
|
||||
<string name="mystery_sets">Conjuntos misteriosos</string>
|
||||
<string name="guild_description">Descripción del Gremio</string>
|
||||
<string name="invite_to_guild">Invitar al Gremio</string>
|
||||
|
|
|
|||
|
|
@ -805,7 +805,7 @@ Die Quest-Schriftrolle wird an den Quest-Besitzer zurückgegeben.</string>
|
|||
<string name="join_guild">Gilde beitreten</string>
|
||||
<string name="invite_to_guild">In Gilde einladen</string>
|
||||
<string name="guild_description">Gildenbeschreibung</string>
|
||||
<string name="reason_for_report">Grund für die Meldung (optional)</string>
|
||||
<string name="report_message_hint">Grund für die Meldung (optional)</string>
|
||||
<string name="report_message_title">Melde %s wegen eines Verstoßes:</string>
|
||||
<string name="report_explanation">Melde einen Post **nur**, wenn er die [Community-Richtlinien](https://habitica.com/static/community-guidelines) und/oder die [Allgemeinen Geschäftsbedingungen](https://habitica.com/static/terms) verletzt. Zweckwidrige Meldungen können Dir eine Rüge einbringen.</string>
|
||||
<string name="x_class">%s-Klasse</string>
|
||||
|
|
|
|||
|
|
@ -790,7 +790,7 @@
|
|||
<string name="defeat">Defeat</string>
|
||||
<string name="guild_description">Guild Description</string>
|
||||
<string name="mystery_sets">Mystery Sets</string>
|
||||
<string name="reason_for_report">Reason for report (optional)</string>
|
||||
<string name="report_message_hint">Reason for report (optional)</string>
|
||||
<string name="report_message_title">Report %s for violation:</string>
|
||||
<string name="invite_to_guild">Invite to Guild</string>
|
||||
<string name="join_guild">Join Guild</string>
|
||||
|
|
|
|||
|
|
@ -834,7 +834,7 @@
|
|||
<string name="need_help_header_description">Publica un mensaje en el %s para que tus preguntas sean respondidas por otros jugadores.</string>
|
||||
<string name="assigned_stat">Atributo Asignado</string>
|
||||
<string name="report_explanation">**Únicamente** reporta una publicación que viole las [Normas de la comunidad](https://habitica.com/static/community-guidelines) y/o los [Términos de servicio](https://habitica.com/static/terms). Reportar inadecuadamente una publicación puede conllevarte una infracción.</string>
|
||||
<string name="reason_for_report">Motivo de la denuncia (opcional)</string>
|
||||
<string name="report_message_hint">Motivo de la denuncia (opcional)</string>
|
||||
<string name="checklist_text">Texto de la lista</string>
|
||||
<string name="preference_push_party_activity">Actividad del equipo</string>
|
||||
<string name="partyUpDescription">¡Te agrupaste con un miembro del equipo!</string>
|
||||
|
|
|
|||
|
|
@ -742,7 +742,7 @@
|
|||
<string name="invite_to_guild">Inviter dans la guilde</string>
|
||||
<string name="guild_description">Description de la guilde</string>
|
||||
<string name="mystery_sets">Ensembles mystère</string>
|
||||
<string name="reason_for_report">Motif du signalement (optionnel)</string>
|
||||
<string name="report_message_hint">Motif du signalement (optionnel)</string>
|
||||
<string name="report_message_title">Signaler %s pour violation :</string>
|
||||
<string name="report_explanation">Ne signalez **que** les messages qui enfreignent les [règles de vie en communauté](https://habitica.com/static/community-guidelines) et/ou les [conditions de service](https://habitica.com/static/terms). Signaler des messages de façon inadéquate pourrait vous valoir une infraction.</string>
|
||||
<string name="x_class">Classe %s</string>
|
||||
|
|
|
|||
|
|
@ -790,7 +790,7 @@
|
|||
<string name="app_theme">Tema aplikacije</string>
|
||||
<string name="accept">Prihvati</string>
|
||||
<string name="pref_emails_checkbox">Koristi obavijesti e-pošte</string>
|
||||
<string name="reason_for_report">Razlog prijave (neobavezno)</string>
|
||||
<string name="report_message_hint">Razlog prijave (neobavezno)</string>
|
||||
<string name="mystery_sets">Mistični setovi</string>
|
||||
<string name="leave_guild">Napusti Ceh</string>
|
||||
<string name="guild_description">Opis Ceha</string>
|
||||
|
|
|
|||
|
|
@ -760,7 +760,7 @@
|
|||
<string name="trillion_abbrev">t</string>
|
||||
<string name="report_violation">Laporkan pelanggaran</string>
|
||||
<string name="mystery_sets">Set Misteri</string>
|
||||
<string name="reason_for_report">Alasan pelaporan (opsional)</string>
|
||||
<string name="report_message_hint">Alasan pelaporan (opsional)</string>
|
||||
<string name="report_message_title">Melaporkan %s atas pelanggaran:</string>
|
||||
<string name="report_explanation">**Laporkan** hanya jika postingan tersebut melanggar [Pedoman Komunitas](https://habitica.com/static/community-guidelines) dan/atau [Syarat Layanan](https://habitica.com/static/terms). Laporan yang tidak sesuai dapat memberimu pelanggaran.</string>
|
||||
<string name="become_x">Menjadi %s</string>
|
||||
|
|
|
|||
|
|
@ -672,7 +672,7 @@
|
|||
<string name="invite_to_guild">Invita nella Gilda</string>
|
||||
<string name="guild_description">Descrizione della Gilda</string>
|
||||
<string name="mystery_sets">Set del Mistero</string>
|
||||
<string name="reason_for_report">Ragioni della segnalazione (facoltativo)</string>
|
||||
<string name="report_message_hint">Ragioni della segnalazione (facoltativo)</string>
|
||||
<string name="report_message_title">Segnala %s per violazione:</string>
|
||||
<string name="report_explanation">Segnala **SOLO** i messaggi che violano le [Linee Guida della Community](https://habitica.com/static/community-guidelines) and/o i [Termini di Servizio](https://habitica.com/static/terms). Inappropriately reporting a post may give you an infraction. Se la segnalazione è inappropriata, potrai subire una sanzione.</string>
|
||||
<string name="x_class">Classe %s</string>
|
||||
|
|
|
|||
|
|
@ -708,7 +708,7 @@
|
|||
<string name="repeats">くり返し</string>
|
||||
<string name="x_class">%s クラス</string>
|
||||
<string name="become_x">%sになる</string>
|
||||
<string name="reason_for_report">報告の理由(任意)</string>
|
||||
<string name="report_message_hint">報告の理由(任意)</string>
|
||||
<string name="report_message_title">違反として%sを報告する:</string>
|
||||
<string name="update_available">アップデートが利用可能です:%1$s (%2$d)</string>
|
||||
<string name="leave_guild">ギルドを脱退する</string>
|
||||
|
|
|
|||
|
|
@ -682,7 +682,7 @@
|
|||
<string name="invite_to_guild">길드에 초대하기</string>
|
||||
<string name="guild_description">길드 설명</string>
|
||||
<string name="mystery_sets">미스터리 세트</string>
|
||||
<string name="reason_for_report">신고 이유 (생략 가능)</string>
|
||||
<string name="report_message_hint">신고 이유 (생략 가능)</string>
|
||||
<string name="report_message_title">%s 을(를) 규정 위반으로 신고하기:</string>
|
||||
<string name="report_explanation">해당 글이 [커뮤니티 방침](https://habitica.com/static/community-guidelines)이나 [이용 약관](https://habitica.com/static/terms)을 **위반했을 때만** 신고하세요. 허위 신고는 규정 위반으로 간주됩니다.</string>
|
||||
<string name="x_class">%s 직업</string>
|
||||
|
|
|
|||
|
|
@ -854,7 +854,7 @@
|
|||
<string name="invite_to_guild">Nodig uit voor Gilde</string>
|
||||
<string name="guild_description">Gilde Beschrijving</string>
|
||||
<string name="mystery_sets">Mysteriesets</string>
|
||||
<string name="reason_for_report">Reden voor melding (optioneel)</string>
|
||||
<string name="report_message_hint">Reden voor melding (optioneel)</string>
|
||||
<string name="report_message_title">%s melden wegens overtreding:</string>
|
||||
<string name="report_explanation">Meld **alleen** een bericht dat de [Communityrichtlijnen](https://habitica.com/static/community-guidelines) en/of [Servicevoorwaarden](https://habitica.com/static/terms) schendt. Het ongepast melden van een bericht kan een overtreding opleveren.</string>
|
||||
<string name="gift_confirmation_text_sub_g1g1">Je hebt %s een %s-maand Habitica-abonnement gestuurd en hetzelfde abonnement is toegepast op je account voor onze Gift One Get One-promotie!</string>
|
||||
|
|
|
|||
|
|
@ -717,7 +717,7 @@
|
|||
<string name="total_checkins">Wszystkich zalogowań</string>
|
||||
<string name="last_login">Ostatnie zalogowanie</string>
|
||||
<string name="mystery_sets">Tajemnicze zestawy</string>
|
||||
<string name="reason_for_report">Przyczyna zgłoszenia (opcjonalnie)</string>
|
||||
<string name="report_message_hint">Przyczyna zgłoszenia (opcjonalnie)</string>
|
||||
<string name="report_message_title">Zgłoś %s za naruszenie:</string>
|
||||
<string name="report_explanation">Zgłaszaj **wyłącznie** post który narusza [Standardy Społeczności](https://habitica.com/static/community-guidelines) i/lub [Warunki usługi](https://habitica.com/static/terms). Niewłaściwe zgłoszenie postu może przynieść Ci naganę.</string>
|
||||
<string name="defeat">Porażka</string>
|
||||
|
|
|
|||
|
|
@ -784,7 +784,7 @@
|
|||
<string name="invite_to_guild">Convidar para a Guilda</string>
|
||||
<string name="guild_description">Descrição da Guilda</string>
|
||||
<string name="mystery_sets">Conjuntos Misteriosos</string>
|
||||
<string name="reason_for_report">Motivo para reportar (opcional)</string>
|
||||
<string name="report_message_hint">Motivo para reportar (opcional)</string>
|
||||
<string name="report_message_title">Reportar %s por violação:</string>
|
||||
<string name="report_explanation">Reporte uma mensagem **apenas** se esta violar as [Diretrizes da Comunidade](https://habitica.com/static/community-guidelines) e/ou os [Termos de Serviço](https://habitica.com/static/terms). Reportar uma postagem inadequadamente pode lhe dar uma infração.</string>
|
||||
<string name="x_class">%s Classe</string>
|
||||
|
|
|
|||
|
|
@ -716,7 +716,7 @@
|
|||
<string name="invite_to_guild">Пригласить в гильдию</string>
|
||||
<string name="guild_description">Описание гильдии</string>
|
||||
<string name="mystery_sets">Таинственные наборы</string>
|
||||
<string name="reason_for_report">Причина (необязательно)</string>
|
||||
<string name="report_message_hint">Причина (необязательно)</string>
|
||||
<string name="x_class">Класс персонажа %s</string>
|
||||
<string name="become_x">Стать %s</string>
|
||||
<string name="need_more_help">Нужна помощь\?</string>
|
||||
|
|
|
|||
|
|
@ -785,7 +785,7 @@
|
|||
<string name="invite_to_guild">Loncaya Davet Et</string>
|
||||
<string name="guild_description">Lonca Açıklaması</string>
|
||||
<string name="mystery_sets">Gizem Setleri</string>
|
||||
<string name="reason_for_report">Bildirme nedeni (tercihen)</string>
|
||||
<string name="report_message_hint">Bildirme nedeni (tercihen)</string>
|
||||
<string name="report_message_title">%s kullanıcısını ihlal nedeniyle bildir:</string>
|
||||
<string name="report_explanation">**Sadece** [Topluluk Kuralları](https://habitica.com/static/community-guidelines)\'nı ve/veya [Kullanım Koşulları](https://habitica.com/static/terms)\' nı ihlal eden gönderileri bildirin. Aksi takdirde ceza alabilirsiniz.</string>
|
||||
<string name="x_class">%s Sınıfı</string>
|
||||
|
|
|
|||
|
|
@ -747,7 +747,7 @@
|
|||
<string name="invite_to_guild">Запросити до гільдії</string>
|
||||
<string name="guild_description">Опис гільдії</string>
|
||||
<string name="mystery_sets">Містичний комплект</string>
|
||||
<string name="reason_for_report">Причина (опціонально)</string>
|
||||
<string name="report_message_hint">Причина (опціонально)</string>
|
||||
<string name="report_message_title">Помітити %s, як порушення за:</string>
|
||||
<string name="report_explanation">Будь ласка, повідомляйте **лише** про публікації, які порушують [Правила спільноти](https://habitica.com/static/community-guidelines) і/або [Умови надання послуг](https://habitica.com/static/terms). Неналежне повідомлення про публікацію може призвести до порушення.</string>
|
||||
<string name="x_class">Клас %s</string>
|
||||
|
|
|
|||
|
|
@ -644,7 +644,7 @@
|
|||
<string name="collapse_notes">Thu lại</string>
|
||||
<string name="guild_description">Mô tả Bang hội</string>
|
||||
<string name="mystery_sets">Bộ Bí ẩn</string>
|
||||
<string name="reason_for_report">Lí do báo cáo (tùy chọn)</string>
|
||||
<string name="report_message_hint">Lí do báo cáo (tùy chọn)</string>
|
||||
<string name="report_message_title">Báo có %s vì vi phạm:</string>
|
||||
<string name="report_explanation">**Chỉ** báo cáo một bài viết mà vi phạm [Nội quy Cộng đồng](https://habitica.com/static/community-guidelines) và/hoặc [Điều khoản Dịch vụ](https://habitica.com/static/terms). Báo cáo không hợp lí có thể khiến bạn nhận một cảnh cáo.</string>
|
||||
<string name="x_class">Chức nghiệp %s</string>
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@
|
|||
<string name="invite_to_guild">邀請加入公會</string>
|
||||
<string name="guild_description">公會描述</string>
|
||||
<string name="mystery_sets">神秘套裝</string>
|
||||
<string name="reason_for_report">報告原因(可選)</string>
|
||||
<string name="report_message_hint">報告原因(可選)</string>
|
||||
<string name="report_message_title">舉報%s違反:</string>
|
||||
<string name="report_explanation">你**只能**舉報違反了【社會準則】(https://habitica.com/static/community-guidelines)和/或者【服務條款】(https://habitica.com/static/terms)的消息。不當的舉報會讓你違規。</string>
|
||||
<string name="x_class">%s職業</string>
|
||||
|
|
|
|||
|
|
@ -772,7 +772,7 @@
|
|||
<string name="invite_to_guild">邀请加入公会</string>
|
||||
<string name="guild_description">公会简介</string>
|
||||
<string name="mystery_sets">神秘套装</string>
|
||||
<string name="reason_for_report">报告原因(可选)</string>
|
||||
<string name="report_message_hint">报告原因(可选)</string>
|
||||
<string name="report_message_title">举报%s违反:</string>
|
||||
<string name="report_explanation">你**只能**举报违反了【社会准则】(https://habitica.com/static/community-guidelines)和/或者【服务条款】(https://habitica.com/static/terms)的消息。不当的举报会让你违规。</string>
|
||||
<string name="gems_to_gift">宝石送礼</string>
|
||||
|
|
|
|||
|
|
@ -803,7 +803,16 @@
|
|||
<string name="x_class">%s Class</string>
|
||||
<string name="report_explanation">**Only** report a post that violates the [Community Guidelines](https://habitica.com/static/community-guidelines) and/or [Terms of Service](https://habitica.com/static/terms). Inappropriately reporting a post may give you an infraction.</string>
|
||||
<string name="report_message_title">Report %s for violation:</string>
|
||||
<string name="reason_for_report">Reason for report (optional)</string>
|
||||
<string name="report_message_explanation">**Only** report a post that violates the [Community Guidelines](https://habitica.com/static/community-guidelines) and/or [Terms of Service](https://habitica.com/static/terms). Inappropriately reporting a post may give you an infraction.</string>
|
||||
<string name="report_user_explanation">**Only** report for a user that violates the [Community Guidelines](https://habitica.com/static/community-guidelines) and/or [Terms of Service](https://habitica.com/static/terms). Inappropriately reporting a user may give you an infraction.</string>
|
||||
<string name="report_player_title">Report %s?</string>
|
||||
<string name="report_player">Report Player</string>
|
||||
<string name="report_player_hint">Reason for report (required)</string>
|
||||
<string name="report_user_description">This will also block %s - A blocked user cannot send you Private Messages but you will still see their posts.</string>
|
||||
<string name="report_message_hint">Reason for report (optional)</string>
|
||||
<string name="report_successful">%s Reported</string>
|
||||
<string name="report_failure">Report failed, please try again later</string>
|
||||
<string name="report_player_toolbar_title">Report %s</string>
|
||||
<string name="mystery_sets">Mystery Sets</string>
|
||||
<string name="guild_description">Guild Description</string>
|
||||
<string name="invite_to_guild">Invite to Guild</string>
|
||||
|
|
|
|||
|
|
@ -265,6 +265,9 @@ interface ApiService {
|
|||
@Body data: Map<String, String>
|
||||
): HabitResponse<Void>
|
||||
|
||||
@POST("members/{mid}/flag")
|
||||
suspend fun reportMember(@Path("mid") mid: String, @Body data: Map<String, String>): HabitResponse<Void>
|
||||
|
||||
@POST("groups/{gid}/chat/seen")
|
||||
suspend fun seenMessages(@Path("gid") groupId: String): HabitResponse<Void>
|
||||
|
||||
|
|
|
|||
|
|
@ -165,6 +165,8 @@ interface ApiClient {
|
|||
suspend fun flagMessage(groupId: String, mid: String, data: MutableMap<String, String>): Void?
|
||||
suspend fun flagInboxMessage(mid: String, data: MutableMap<String, String>): Void?
|
||||
|
||||
suspend fun reportMember(mid: String, data: Map<String, String>): Void?
|
||||
|
||||
suspend fun seenMessages(groupId: String): Void?
|
||||
|
||||
suspend fun inviteToGroup(groupId: String, inviteData: Map<String, Any>): List<InviteResponse>?
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ interface SocialRepository : BaseRepository {
|
|||
groupID: String? = null
|
||||
): Void?
|
||||
|
||||
suspend fun reportMember(memberID: String, data: Map<String, String>): Void?
|
||||
|
||||
suspend fun likeMessage(chatMessage: ChatMessage): ChatMessage?
|
||||
|
||||
suspend fun deleteMessage(chatMessage: ChatMessage): Void?
|
||||
|
|
|
|||
|
|
@ -583,6 +583,10 @@ class ApiClientImpl(
|
|||
return process { apiService.likeMessage(groupId, mid) }
|
||||
}
|
||||
|
||||
override suspend fun reportMember(mid: String, data: Map<String, String>): Void? {
|
||||
return process { apiService.reportMember(mid, data) }
|
||||
}
|
||||
|
||||
override suspend fun flagMessage(groupId: String, mid: String, data: MutableMap<String, String>): Void? {
|
||||
return process { apiService.flagMessage(groupId, mid, data) }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,6 +96,10 @@ class SocialRepositoryImpl(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun reportMember(memberID: String, data: Map<String, String>): Void? {
|
||||
return apiClient.reportMember(memberID, data)
|
||||
}
|
||||
|
||||
override suspend fun likeMessage(chatMessage: ChatMessage): ChatMessage? {
|
||||
if (chatMessage.id.isBlank()) {
|
||||
return null
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import com.habitrpg.android.habitica.models.user.Outfit
|
|||
import com.habitrpg.android.habitica.models.user.Permission
|
||||
import com.habitrpg.android.habitica.models.user.Stats
|
||||
import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter
|
||||
import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment
|
||||
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
|
||||
import com.habitrpg.android.habitica.ui.views.AppHeaderView
|
||||
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
|
||||
|
|
@ -270,6 +271,13 @@ class FullProfileActivity : BaseActivity() {
|
|||
}
|
||||
true
|
||||
}
|
||||
R.id.report_player -> {
|
||||
showReportUserBottomSheet(
|
||||
userIdBeingReported = userID,
|
||||
usernameBeingReported = username ?: "",
|
||||
)
|
||||
true
|
||||
}
|
||||
R.id.ban_user -> {
|
||||
banUser()
|
||||
true
|
||||
|
|
@ -342,6 +350,20 @@ class FullProfileActivity : BaseActivity() {
|
|||
alert.show()
|
||||
}
|
||||
|
||||
private fun showReportUserBottomSheet(userIdBeingReported : String, usernameBeingReported: String) {
|
||||
val reportBottomSheetFragment = ReportBottomSheetFragment.newInstance(
|
||||
reportType = ReportBottomSheetFragment.REPORT_TYPE_USER,
|
||||
profileName = usernameBeingReported,
|
||||
messageId = "",
|
||||
messageText = "",
|
||||
groupId = "",
|
||||
userIdBeingReported = userIdBeingReported,
|
||||
sourceView = this::class.simpleName ?: ""
|
||||
)
|
||||
|
||||
reportBottomSheetFragment.show(supportFragmentManager, ReportBottomSheetFragment.TAG)
|
||||
}
|
||||
|
||||
private fun banUser() {
|
||||
val isBanned = member.value?.authentication?.blocked == true
|
||||
val alert = HabiticaAlertDialog(this)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,183 @@
|
|||
package com.habitrpg.android.habitica.ui.fragments
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.data.SocialRepository
|
||||
import com.habitrpg.common.habitica.databinding.FragmentReportMessageBinding
|
||||
import com.habitrpg.common.habitica.helpers.ExceptionHandler
|
||||
import com.habitrpg.common.habitica.helpers.launchCatching
|
||||
import com.habitrpg.common.habitica.helpers.setMarkdown
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
class ReportBottomSheetFragment : BottomSheetDialogFragment() {
|
||||
|
||||
private lateinit var binding: FragmentReportMessageBinding
|
||||
|
||||
@Inject
|
||||
lateinit var socialRepository: SocialRepository
|
||||
|
||||
private var reportType: String? = null
|
||||
private var messageID: String? = null
|
||||
private var messageText: String? = null
|
||||
private var profileName: String? = null
|
||||
private var reportingUserId: String? = null
|
||||
private var groupID: String? = null
|
||||
private var isReporting: Boolean = false
|
||||
private var source: String? = null
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
binding = FragmentReportMessageBinding.inflate(inflater, container, false)
|
||||
return binding.root
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val bottomSheetDialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
|
||||
bottomSheetDialog.setOnShowListener { dialog: DialogInterface ->
|
||||
val notificationDialog = dialog as BottomSheetDialog
|
||||
notificationDialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
notificationDialog.behavior.isDraggable = false
|
||||
}
|
||||
return bottomSheetDialog
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
reportType = arguments?.getString(REPORT_TYPE)
|
||||
messageID = arguments?.getString(MESSAGE_ID)
|
||||
groupID = arguments?.getString(GROUP_ID)
|
||||
messageText = arguments?.getString(MESSAGE_TEXT)
|
||||
profileName = arguments?.getString(PROFILE_NAME)
|
||||
reportingUserId = arguments?.getString(REPORTING_USER_ID)
|
||||
source = arguments?.getString(SOURCE_VIEW)
|
||||
|
||||
|
||||
binding.messageTextView.text = arguments?.getString(messageText)
|
||||
binding.reportButton.setOnClickListener {
|
||||
if (reportType == REPORT_TYPE_MESSAGE)
|
||||
reportMessage()
|
||||
else if (reportType == REPORT_TYPE_USER)
|
||||
reportUser()
|
||||
}
|
||||
binding.closeButton.setOnClickListener { dismiss() }
|
||||
|
||||
if (reportType == REPORT_TYPE_USER) {
|
||||
binding.toolbarTitle.text = getString(R.string.report_player_toolbar_title, profileName)
|
||||
binding.additionalExplanationTextview.visibility = View.VISIBLE
|
||||
binding.infoTextInputLayout.hint = getString(R.string.report_player_hint)
|
||||
binding.additionalExplanationTextview.setMarkdown(
|
||||
getString(
|
||||
R.string.report_user_description,
|
||||
profileName
|
||||
)
|
||||
)
|
||||
binding.reportExplanationTextview.setMarkdown(getString(R.string.report_user_explanation))
|
||||
binding.titleTextView.text = getString(R.string.report_player_title, profileName)
|
||||
binding.messageTextView.visibility = View.GONE
|
||||
} else if (reportType == REPORT_TYPE_MESSAGE) {
|
||||
binding.additionalExplanationTextview.visibility = View.GONE
|
||||
binding.infoTextInputLayout.hint = getString(R.string.report_message_hint)
|
||||
binding.reportExplanationTextview.setMarkdown(getString(R.string.report_message_explanation))
|
||||
binding.titleTextView.text = getString(R.string.report_message_title, profileName)
|
||||
binding.messageTextView.text = messageText
|
||||
}
|
||||
}
|
||||
|
||||
private fun reportMessage() {
|
||||
if (isReporting) {
|
||||
return
|
||||
}
|
||||
isReporting = true
|
||||
messageID?.let {
|
||||
lifecycleScope.launch(
|
||||
ExceptionHandler.coroutine {
|
||||
isReporting = false
|
||||
}
|
||||
) {
|
||||
socialRepository.flagMessage(
|
||||
messageID ?: "",
|
||||
binding.additionalInfoEdittext.text.toString(),
|
||||
groupID
|
||||
)
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun reportUser() {
|
||||
if (isReporting) {
|
||||
return
|
||||
}
|
||||
val userIdBeingReported = reportingUserId
|
||||
if (userIdBeingReported.isNullOrBlank()) {
|
||||
return
|
||||
}
|
||||
isReporting = true
|
||||
lifecycleScope.launchCatching {
|
||||
val reportReasonInfo = binding.additionalInfoEdittext.text.toString()
|
||||
val updateData = mapOf(
|
||||
"comment" to reportReasonInfo,
|
||||
"source" to (source ?: "")
|
||||
)
|
||||
socialRepository.reportMember(userIdBeingReported, updateData)
|
||||
socialRepository.blockMember(userIdBeingReported)
|
||||
Toast.makeText(context, "$profileName Reported", Toast.LENGTH_SHORT).show()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "ReportBottomSheetFragment"
|
||||
const val REPORT_TYPE_MESSAGE = "report_type_message"
|
||||
const val REPORT_TYPE_USER = "report_type_user"
|
||||
|
||||
private const val REPORTING_USER_ID = "reporting_user_id"
|
||||
private const val REPORT_TYPE = "report_type"
|
||||
private const val PROFILE_NAME = "profile_name"
|
||||
private const val MESSAGE_ID = "message_id"
|
||||
private const val MESSAGE_TEXT = "message_text"
|
||||
private const val GROUP_ID = "group_id"
|
||||
private const val SOURCE_VIEW = "source_view"
|
||||
|
||||
|
||||
fun newInstance(
|
||||
reportType: String,
|
||||
profileName: String = "",
|
||||
userIdBeingReported: String,
|
||||
messageId: String = "",
|
||||
messageText: String,
|
||||
groupId: String,
|
||||
sourceView: String
|
||||
): ReportBottomSheetFragment {
|
||||
val args = Bundle()
|
||||
args.putString(REPORT_TYPE, reportType)
|
||||
args.putString(PROFILE_NAME, profileName)
|
||||
args.putString(REPORTING_USER_ID, userIdBeingReported)
|
||||
args.putString(MESSAGE_ID, messageId)
|
||||
args.putString(MESSAGE_TEXT, messageText)
|
||||
args.putString(GROUP_ID, groupId)
|
||||
args.putString(SOURCE_VIEW, sourceView)
|
||||
val fragment = ReportBottomSheetFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -25,6 +25,7 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
|
|||
import com.habitrpg.android.habitica.ui.activities.MainActivity
|
||||
import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter
|
||||
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
|
||||
import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment
|
||||
import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter
|
||||
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
|
||||
import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel
|
||||
|
|
@ -78,7 +79,7 @@ open class ChatFragment : BaseFragment<FragmentChatBinding>() {
|
|||
chatAdapter?.let { adapter ->
|
||||
adapter.onOpenProfile = { userId -> FullProfileActivity.open(userId) }
|
||||
adapter.onDeleteMessage = { this.showDeleteConfirmationDialog(it) }
|
||||
adapter.onFlagMessage = { this.showFlagConfirmationDialog(it) }
|
||||
adapter.onFlagMessage = { this.showFlagMessageBottomSheet(it) }
|
||||
adapter.onReply = { setReplyTo(it) }
|
||||
adapter.onCopyMessage = { this.copyMessageToClipboard(it) }
|
||||
adapter.onMessageLike = { viewModel.likeMessage(it) }
|
||||
|
|
@ -181,14 +182,18 @@ open class ChatFragment : BaseFragment<FragmentChatBinding>() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun showFlagConfirmationDialog(chatMessage: ChatMessage) {
|
||||
val directions = MainNavDirections.actionGlobalReportMessageActivity(
|
||||
chatMessage.text ?: "",
|
||||
chatMessage.user ?: "",
|
||||
chatMessage.id,
|
||||
chatMessage.groupId
|
||||
private fun showFlagMessageBottomSheet(chatMessage : ChatMessage) {
|
||||
val reportBottomSheetFragment = ReportBottomSheetFragment.newInstance(
|
||||
reportType = ReportBottomSheetFragment.REPORT_TYPE_MESSAGE,
|
||||
profileName = chatMessage.username ?: "",
|
||||
messageId = chatMessage.id,
|
||||
messageText = chatMessage.text ?: "",
|
||||
groupId = chatMessage.groupId ?: "",
|
||||
userIdBeingReported = chatMessage.userID ?: "",
|
||||
sourceView = this::class.simpleName ?: ""
|
||||
)
|
||||
MainNavigationController.navigate(directions)
|
||||
|
||||
reportBottomSheetFragment.show(childFragmentManager, ReportBottomSheetFragment.TAG)
|
||||
}
|
||||
|
||||
private fun showDeleteConfirmationDialog(chatMessage: ChatMessage) {
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
|
|||
import com.habitrpg.android.habitica.ui.activities.MainActivity
|
||||
import com.habitrpg.android.habitica.ui.adapter.social.InboxAdapter
|
||||
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
|
||||
import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment
|
||||
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
|
||||
import com.habitrpg.android.habitica.ui.viewmodels.InboxViewModel
|
||||
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
|
||||
|
|
@ -99,7 +100,7 @@ class InboxMessageListFragment : BaseMainFragment<FragmentInboxMessageListBindin
|
|||
FullProfileActivity.open(it)
|
||||
}
|
||||
adapter.onDeleteMessage = { showDeleteConfirmationDialog(it) }
|
||||
adapter.onFlagMessage = { showFlagConfirmationDialog(it) }
|
||||
adapter.onFlagMessage = { showFlagMessageBottomSheet(it) }
|
||||
adapter.onCopyMessage = { copyMessageToClipboard(it) }
|
||||
}
|
||||
|
||||
|
|
@ -201,9 +202,18 @@ class InboxMessageListFragment : BaseMainFragment<FragmentInboxMessageListBindin
|
|||
}
|
||||
}
|
||||
|
||||
private fun showFlagConfirmationDialog(chatMessage: ChatMessage) {
|
||||
val directions = MainNavDirections.actionGlobalReportMessageActivity(chatMessage.text ?: "", chatMessage.user ?: "", chatMessage.id, null)
|
||||
MainNavigationController.navigate(directions)
|
||||
private fun showFlagMessageBottomSheet(chatMessage : ChatMessage) {
|
||||
val reportBottomSheetFragment = ReportBottomSheetFragment.newInstance(
|
||||
reportType = ReportBottomSheetFragment.REPORT_TYPE_MESSAGE,
|
||||
profileName = chatMessage.username ?: "",
|
||||
messageId = chatMessage.id,
|
||||
messageText = chatMessage.text ?: "",
|
||||
groupId = chatMessage.groupId ?: "",
|
||||
userIdBeingReported = chatMessage.userID ?: "",
|
||||
sourceView = this::class.simpleName ?: ""
|
||||
)
|
||||
|
||||
reportBottomSheetFragment.show(childFragmentManager, ReportBottomSheetFragment.TAG)
|
||||
}
|
||||
|
||||
private fun showDeleteConfirmationDialog(chatMessage: ChatMessage) {
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ dependencies {
|
|||
implementation("androidx.recyclerview:recyclerview:1.3.1")
|
||||
implementation("androidx.navigation:navigation-common-ktx:2.7.0")
|
||||
implementation("androidx.navigation:navigation-runtime-ktx:2.7.0")
|
||||
implementation("com.google.android.material:material:1.9.0")
|
||||
|
||||
testImplementation("io.mockk:mockk:$mockk_version")
|
||||
testImplementation("io.mockk:mockk-android:$mockk_version")
|
||||
|
|
|
|||
152
common/src/main/res/layout/fragment_report_message.xml
Normal file
152
common/src/main/res/layout/fragment_report_message.xml
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/bottom_sheet"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
app:behavior_hideable="true">
|
||||
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/app_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
app:elevation="0dp">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/colorContentBackground"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
android:theme="@style/Toolbar"
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
|
||||
app:theme="@style/ReportMessageToolbar"
|
||||
app:title=""
|
||||
app:titleTextColor="@color/text_primary">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/close_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/transparent"
|
||||
android:paddingEnd="@dimen/spacing_small"
|
||||
android:src="@drawable/ic_close_grey_800_24dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/toolbar_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="36dp"
|
||||
android:text="@string/report_violation"
|
||||
android:textColor="@color/text_primary"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/report_button"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="@string/report"
|
||||
android:textColor="@color/red_50" />
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginBottom="0dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:focusableInTouchMode="true"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="24dp"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingEnd="24dp"
|
||||
android:paddingBottom="25dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title_text_view"
|
||||
style="@style/Caption1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="13dp"
|
||||
android:layout_marginBottom="@dimen/spacing_medium"
|
||||
android:textColor="@color/text_primary"
|
||||
tools:text="Report NAME for violation:" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/message_text_view"
|
||||
style="@style/Body2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/border_1f000000"
|
||||
android:lineSpacingExtra="4sp"
|
||||
android:paddingStart="13dp"
|
||||
android:paddingTop="11dp"
|
||||
android:paddingEnd="13dp"
|
||||
android:paddingBottom="11dp"
|
||||
android:textColor="@color/text_quad"
|
||||
tools:text="This is the message that is reported" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/info_text_input_layout"
|
||||
style="@style/TextInputLayoutAppearance"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_large"
|
||||
android:layout_marginBottom="@dimen/spacing_large"
|
||||
android:hint="@string/report_message_hint"
|
||||
android:theme="@style/TextInputLayoutAppearanceTheme">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/additional_info_edittext"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:overScrollMode="always"
|
||||
android:paddingStart="@dimen/spacing_large"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingEnd="@dimen/spacing_large"
|
||||
android:paddingBottom="34dp"
|
||||
android:textColor="@color/text_primary" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/additional_explanation_textview"
|
||||
style="@style/Caption3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/spacing_medium"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
android:textColorLink="?colorAccent"
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone"
|
||||
tools:text="@string/report_user_description" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/report_explanation_textview"
|
||||
style="@style/Caption3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
android:textColorLink="?colorAccent"
|
||||
tools:text="@string/report_message_explanation" />
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
</LinearLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
Loading…
Reference in a new issue