Migrate report feature to current branch

This commit is contained in:
Hafiz 2023-09-11 22:22:34 -04:00 committed by Phillip Thelen
parent d3a4071683
commit def6f89e45
33 changed files with 432 additions and 33 deletions

View file

@ -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"

View file

@ -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" />

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>?

View file

@ -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?

View file

@ -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) }
}

View file

@ -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

View file

@ -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)

View file

@ -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
}
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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")

View 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>