diff --git a/Habitica/res/layout/activity_report_message.xml b/Habitica/res/layout/activity_report_message.xml index f16c97117..ab39fe2db 100644 --- a/Habitica/res/layout/activity_report_message.xml +++ b/Habitica/res/layout/activity_report_message.xml @@ -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"> + diff --git a/Habitica/res/values-b+es+419/strings.xml b/Habitica/res/values-b+es+419/strings.xml index 70f7c674b..044bf94df 100644 --- a/Habitica/res/values-b+es+419/strings.xml +++ b/Habitica/res/values-b+es+419/strings.xml @@ -796,7 +796,7 @@ Conviértete en un %s Clase %s Reporta a %s por violación: - Razón para reportar (opcional) + Razón para reportar (opcional) Conjuntos misteriosos Descripción del Gremio Invitar al Gremio diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index 9eb372c91..53a083d07 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -805,7 +805,7 @@ Die Quest-Schriftrolle wird an den Quest-Besitzer zurückgegeben. Gilde beitreten In Gilde einladen Gildenbeschreibung - Grund für die Meldung (optional) + Grund für die Meldung (optional) Melde %s wegen eines Verstoßes: 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. %s-Klasse diff --git a/Habitica/res/values-en-rGB/strings.xml b/Habitica/res/values-en-rGB/strings.xml index 5c321cb56..16b99080c 100644 --- a/Habitica/res/values-en-rGB/strings.xml +++ b/Habitica/res/values-en-rGB/strings.xml @@ -790,7 +790,7 @@ Defeat Guild Description Mystery Sets - Reason for report (optional) + Reason for report (optional) Report %s for violation: Invite to Guild Join Guild diff --git a/Habitica/res/values-es/strings.xml b/Habitica/res/values-es/strings.xml index 3ef569b86..419508003 100644 --- a/Habitica/res/values-es/strings.xml +++ b/Habitica/res/values-es/strings.xml @@ -834,7 +834,7 @@ Publica un mensaje en el %s para que tus preguntas sean respondidas por otros jugadores. Atributo Asignado **Ú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. - Motivo de la denuncia (opcional) + Motivo de la denuncia (opcional) Texto de la lista Actividad del equipo ¡Te agrupaste con un miembro del equipo! diff --git a/Habitica/res/values-fr/strings.xml b/Habitica/res/values-fr/strings.xml index 3550b00e3..b0342b57b 100644 --- a/Habitica/res/values-fr/strings.xml +++ b/Habitica/res/values-fr/strings.xml @@ -742,7 +742,7 @@ Inviter dans la guilde Description de la guilde Ensembles mystère - Motif du signalement (optionnel) + Motif du signalement (optionnel) Signaler %s pour violation : 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. Classe %s diff --git a/Habitica/res/values-hr-rHR/strings.xml b/Habitica/res/values-hr-rHR/strings.xml index 54cbd3e09..2cb71c34c 100644 --- a/Habitica/res/values-hr-rHR/strings.xml +++ b/Habitica/res/values-hr-rHR/strings.xml @@ -790,7 +790,7 @@ Tema aplikacije Prihvati Koristi obavijesti e-pošte - Razlog prijave (neobavezno) + Razlog prijave (neobavezno) Mistični setovi Napusti Ceh Opis Ceha diff --git a/Habitica/res/values-in/strings.xml b/Habitica/res/values-in/strings.xml index 62c7c9d53..4254f27cf 100644 --- a/Habitica/res/values-in/strings.xml +++ b/Habitica/res/values-in/strings.xml @@ -760,7 +760,7 @@ t Laporkan pelanggaran Set Misteri - Alasan pelaporan (opsional) + Alasan pelaporan (opsional) Melaporkan %s atas pelanggaran: **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. Menjadi %s diff --git a/Habitica/res/values-it/strings.xml b/Habitica/res/values-it/strings.xml index 795b01bf6..c91f58fd8 100644 --- a/Habitica/res/values-it/strings.xml +++ b/Habitica/res/values-it/strings.xml @@ -672,7 +672,7 @@ Invita nella Gilda Descrizione della Gilda Set del Mistero - Ragioni della segnalazione (facoltativo) + Ragioni della segnalazione (facoltativo) Segnala %s per violazione: 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. Classe %s diff --git a/Habitica/res/values-ja/strings.xml b/Habitica/res/values-ja/strings.xml index 5da6b1b3c..80f4c3036 100644 --- a/Habitica/res/values-ja/strings.xml +++ b/Habitica/res/values-ja/strings.xml @@ -708,7 +708,7 @@ くり返し %s クラス %sになる - 報告の理由(任意) + 報告の理由(任意) 違反として%sを報告する: アップデートが利用可能です:%1$s (%2$d) ギルドを脱退する diff --git a/Habitica/res/values-ko/strings.xml b/Habitica/res/values-ko/strings.xml index e26331374..70665549a 100644 --- a/Habitica/res/values-ko/strings.xml +++ b/Habitica/res/values-ko/strings.xml @@ -682,7 +682,7 @@ 길드에 초대하기 길드 설명 미스터리 세트 - 신고 이유 (생략 가능) + 신고 이유 (생략 가능) %s 을(를) 규정 위반으로 신고하기: 해당 글이 [커뮤니티 방침](https://habitica.com/static/community-guidelines)이나 [이용 약관](https://habitica.com/static/terms)을 **위반했을 때만** 신고하세요. 허위 신고는 규정 위반으로 간주됩니다. %s 직업 diff --git a/Habitica/res/values-nl/strings.xml b/Habitica/res/values-nl/strings.xml index de9ae97d6..8053a0df5 100644 --- a/Habitica/res/values-nl/strings.xml +++ b/Habitica/res/values-nl/strings.xml @@ -854,7 +854,7 @@ Nodig uit voor Gilde Gilde Beschrijving Mysteriesets - Reden voor melding (optioneel) + Reden voor melding (optioneel) %s melden wegens overtreding: 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. Je hebt %s een %s-maand Habitica-abonnement gestuurd en hetzelfde abonnement is toegepast op je account voor onze Gift One Get One-promotie! diff --git a/Habitica/res/values-pl/strings.xml b/Habitica/res/values-pl/strings.xml index fc00a7bd6..fb4618c7c 100644 --- a/Habitica/res/values-pl/strings.xml +++ b/Habitica/res/values-pl/strings.xml @@ -717,7 +717,7 @@ Wszystkich zalogowań Ostatnie zalogowanie Tajemnicze zestawy - Przyczyna zgłoszenia (opcjonalnie) + Przyczyna zgłoszenia (opcjonalnie) Zgłoś %s za naruszenie: 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ę. Porażka diff --git a/Habitica/res/values-pt-rBR/strings.xml b/Habitica/res/values-pt-rBR/strings.xml index 32022751a..2ebb901fc 100644 --- a/Habitica/res/values-pt-rBR/strings.xml +++ b/Habitica/res/values-pt-rBR/strings.xml @@ -784,7 +784,7 @@ Convidar para a Guilda Descrição da Guilda Conjuntos Misteriosos - Motivo para reportar (opcional) + Motivo para reportar (opcional) Reportar %s por violação: 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. %s Classe diff --git a/Habitica/res/values-ru/strings.xml b/Habitica/res/values-ru/strings.xml index d874b286c..83ec9c4ca 100644 --- a/Habitica/res/values-ru/strings.xml +++ b/Habitica/res/values-ru/strings.xml @@ -716,7 +716,7 @@ Пригласить в гильдию Описание гильдии Таинственные наборы - Причина (необязательно) + Причина (необязательно) Класс персонажа %s Стать %s Нужна помощь\? diff --git a/Habitica/res/values-tr/strings.xml b/Habitica/res/values-tr/strings.xml index 230c45680..f5710c2d4 100644 --- a/Habitica/res/values-tr/strings.xml +++ b/Habitica/res/values-tr/strings.xml @@ -785,7 +785,7 @@ Loncaya Davet Et Lonca Açıklaması Gizem Setleri - Bildirme nedeni (tercihen) + Bildirme nedeni (tercihen) %s kullanıcısını ihlal nedeniyle bildir: **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. %s Sınıfı diff --git a/Habitica/res/values-uk/strings.xml b/Habitica/res/values-uk/strings.xml index 4573bff9d..f0ea7ae91 100755 --- a/Habitica/res/values-uk/strings.xml +++ b/Habitica/res/values-uk/strings.xml @@ -747,7 +747,7 @@ Запросити до гільдії Опис гільдії Містичний комплект - Причина (опціонально) + Причина (опціонально) Помітити %s, як порушення за: Будь ласка, повідомляйте **лише** про публікації, які порушують [Правила спільноти](https://habitica.com/static/community-guidelines) і/або [Умови надання послуг](https://habitica.com/static/terms). Неналежне повідомлення про публікацію може призвести до порушення. Клас %s diff --git a/Habitica/res/values-vi/strings.xml b/Habitica/res/values-vi/strings.xml index 2f6b8c3f7..4731726d0 100755 --- a/Habitica/res/values-vi/strings.xml +++ b/Habitica/res/values-vi/strings.xml @@ -644,7 +644,7 @@ Thu lại Mô tả Bang hội Bộ Bí ẩn - Lí do báo cáo (tùy chọn) + Lí do báo cáo (tùy chọn) Báo có %s vì vi phạm: **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. Chức nghiệp %s diff --git a/Habitica/res/values-zh-rTW/strings.xml b/Habitica/res/values-zh-rTW/strings.xml index 3627d2f22..bfad38ed5 100644 --- a/Habitica/res/values-zh-rTW/strings.xml +++ b/Habitica/res/values-zh-rTW/strings.xml @@ -839,7 +839,7 @@ 邀請加入公會 公會描述 神秘套裝 - 報告原因(可選) + 報告原因(可選) 舉報%s違反: 你**只能**舉報違反了【社會準則】(https://habitica.com/static/community-guidelines)和/或者【服務條款】(https://habitica.com/static/terms)的消息。不當的舉報會讓你違規。 %s職業 diff --git a/Habitica/res/values-zh/strings.xml b/Habitica/res/values-zh/strings.xml index 305f7acce..291cf101b 100644 --- a/Habitica/res/values-zh/strings.xml +++ b/Habitica/res/values-zh/strings.xml @@ -772,7 +772,7 @@ 邀请加入公会 公会简介 神秘套装 - 报告原因(可选) + 报告原因(可选) 举报%s违反: 你**只能**举报违反了【社会准则】(https://habitica.com/static/community-guidelines)和/或者【服务条款】(https://habitica.com/static/terms)的消息。不当的举报会让你违规。 宝石送礼 diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 66644415d..9c46bbf10 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -803,7 +803,16 @@ %s Class **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. Report %s for violation: - Reason for report (optional) + **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. + **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. + Report %s? + Report Player + Reason for report (required) + This will also block %s - A blocked user cannot send you Private Messages but you will still see their posts. + Reason for report (optional) + %s Reported + Report failed, please try again later + Report %s Mystery Sets Guild Description Invite to Guild diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt index f644642bc..f2eb0e363 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt @@ -265,6 +265,9 @@ interface ApiService { @Body data: Map ): HabitResponse + @POST("members/{mid}/flag") + suspend fun reportMember(@Path("mid") mid: String, @Body data: Map): HabitResponse + @POST("groups/{gid}/chat/seen") suspend fun seenMessages(@Path("gid") groupId: String): HabitResponse diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 0bf465cd8..5711c047c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -165,6 +165,8 @@ interface ApiClient { suspend fun flagMessage(groupId: String, mid: String, data: MutableMap): Void? suspend fun flagInboxMessage(mid: String, data: MutableMap): Void? + suspend fun reportMember(mid: String, data: Map): Void? + suspend fun seenMessages(groupId: String): Void? suspend fun inviteToGroup(groupId: String, inviteData: Map): List? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt index 0b5ce7fa3..89ffb71e9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt @@ -27,6 +27,8 @@ interface SocialRepository : BaseRepository { groupID: String? = null ): Void? + suspend fun reportMember(memberID: String, data: Map): Void? + suspend fun likeMessage(chatMessage: ChatMessage): ChatMessage? suspend fun deleteMessage(chatMessage: ChatMessage): Void? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 9c5baa902..2f8bee3d3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -583,6 +583,10 @@ class ApiClientImpl( return process { apiService.likeMessage(groupId, mid) } } + override suspend fun reportMember(mid: String, data: Map): Void? { + return process { apiService.reportMember(mid, data) } + } + override suspend fun flagMessage(groupId: String, mid: String, data: MutableMap): Void? { return process { apiService.flagMessage(groupId, mid, data) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt index 842701579..bd6c6894d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt @@ -96,6 +96,10 @@ class SocialRepositoryImpl( } } + override suspend fun reportMember(memberID: String, data: Map): Void? { + return apiClient.reportMember(memberID, data) + } + override suspend fun likeMessage(chatMessage: ChatMessage): ChatMessage? { if (chatMessage.id.isBlank()) { return null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 7a4065299..5b1baa111 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -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) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt new file mode 100644 index 000000000..cdb84be94 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/ReportBottomSheetFragment.kt @@ -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 + } + } +} + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt index 55c820e82..1c26c0063 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt @@ -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() { 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() { } } - 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) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index 666080619..c5f7a405f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -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 + + + + + + + + + + + + + +