Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add invitation hint #3049

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions app/src/main/java/one/mixin/android/db/MessageDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,17 @@ interface MessageDao : BaseDao<Message> {
)
suspend fun isSilence(conversationId: String, userId: String): Int?

@Query(
"""SELECT user_id FROM messages
WHERE conversation_id =:conversationId
AND category = 'SYSTEM_CONVERSATION'
AND `action` = 'ADD'
AND participant_id =:userId
ORDER BY created_at ASC LIMIT 1
"""
)
suspend fun findInviterId(conversationId: String, userId: String): String?

@Query("SELECT * FROM messages WHERE id IN (:messageIds) ORDER BY created_at, rowid")
suspend fun getSortMessagesByIds(messageIds: List<String>): List<Message>

Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/one/mixin/android/db/UserDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ interface UserDao : BaseDao<User> {
@Query("SELECT * FROM users WHERE relationship = 'FRIEND' AND app_id IS NULL ORDER BY full_name, identity_number ASC")
fun findContacts(): LiveData<List<User>>

@Query("SELECT rowid FROM users WHERE user_id = :userId AND relationship != 'FRIEND'")
suspend fun notFriend(userId: String): Long?

@Query("SELECT * FROM users WHERE relationship = 'FRIEND' ORDER BY full_name, identity_number ASC")
suspend fun getFriends(): List<User>

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/one/mixin/android/job/InitializeJob.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import one.mixin.android.db.insertUpdate
class InitializeJob(val botId: String, private val botName: String) :
BaseJob(Params(PRIORITY_UI_HIGH).groupBy(GROUP_ID).requireWebSocketConnected().persist()) {
companion object {
private var serialVersionUID: Long = 1L
private var serialVersionUID: Long = 1L
private const val GROUP_ID = "InitializeJob"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import one.mixin.android.db.ParticipantDao
import one.mixin.android.db.ParticipantSessionDao
import one.mixin.android.db.PinMessageDao
import one.mixin.android.db.TranscriptMessageDao
import one.mixin.android.db.UserDao
import one.mixin.android.db.batchMarkReadAndTake
import one.mixin.android.db.deleteMessageByConversationId
import one.mixin.android.db.deleteMessageById
Expand Down Expand Up @@ -89,6 +90,7 @@ class ConversationRepository
internal constructor(
private val appDatabase: MixinDatabase,
private val messageDao: MessageDao,
private val userDao: UserDao,
private val conversationDao: ConversationDao,
private val circleConversationDao: CircleConversationDao,
private val participantDao: ParticipantDao,
Expand Down Expand Up @@ -353,6 +355,15 @@ internal constructor(
suspend fun isSilence(conversationId: String, userId: String): Int =
messageDao.isSilence(conversationId, userId) ?: 0

suspend fun findInviterId(conversationId: String, userId: String): String? {
return messageDao.findInviterId(conversationId, userId)
}

suspend fun invitationFromStranger(conversationId: String, userId: String, inviterId: String?): Boolean {
inviterId ?: return false
return userDao.notFriend(inviterId) != null && messageDao.isSilence(conversationId, userId) == null
}

suspend fun findNextAudioMessage(conversationId: String, createdAt: String, messageId: String) =
messageDao.findNextAudioMessage(conversationId, createdAt, messageId)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,10 @@ class ConversationFragment() :
openBotHome()
}

override fun onExitAndReport(inviterId: String) {
chatViewModel.exitGroupAndReport(conversationId, inviterId)
}

override fun onLocationClick(messageItem: MessageItem) {
val location = GsonHelper.customGson.fromJson(messageItem.content, LocationPayload::class.java)
LocationActivity.show(requireContext(), location)
Expand Down Expand Up @@ -1866,11 +1870,12 @@ class ConversationFragment() :
oldCount = list.size
}
chatViewModel.viewModelScope.launch {
conversationAdapter.hasBottomView =
recipient?.relationship == UserRelationship.STRANGER.name && chatViewModel.isSilence(
conversationId,
sender.userId
)
if (isGroup) {
conversationAdapter.inviterId = chatViewModel.findInviterId(conversationId, sender.userId)
conversationAdapter.hasBottomView = chatViewModel.invitationFromStranger(conversationId, sender.userId, conversationAdapter.inviterId)
} else {
conversationAdapter.hasBottomView = recipient?.relationship == UserRelationship.STRANGER.name && chatViewModel.isSilence(conversationId, sender.userId)
}
}
if (isFirstLoad && messageId == null && unreadCount > 0) {
conversationAdapter.unreadMsgId = unreadMessageId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import one.mixin.android.Constants.MARK_LIMIT
import one.mixin.android.Constants.PAGE_SIZE
import one.mixin.android.MixinApplication
import one.mixin.android.api.handleMixinResponse
import one.mixin.android.api.request.RelationshipAction
import one.mixin.android.api.request.RelationshipRequest
import one.mixin.android.api.request.StickerAddRequest
import one.mixin.android.extension.copyFromInputStream
Expand All @@ -35,6 +36,7 @@ import one.mixin.android.extension.isUUID
import one.mixin.android.extension.nowInUtc
import one.mixin.android.extension.putString
import one.mixin.android.job.AttachmentDownloadJob
import one.mixin.android.job.ConversationJob
import one.mixin.android.job.ConvertVideoJob
import one.mixin.android.job.MixinJobManager
import one.mixin.android.job.RefreshStickerAlbumJob
Expand Down Expand Up @@ -650,6 +652,12 @@ internal constructor(
suspend fun isSilence(conversationId: String, userId: String) =
conversationRepository.isSilence(conversationId, userId) == 0

suspend fun findInviterId(conversationId: String, userId: String) =
conversationRepository.findInviterId(conversationId, userId)

suspend fun invitationFromStranger(conversationId: String, userId: String, inviterId: String?) =
conversationRepository.invitationFromStranger(conversationId, userId, inviterId)

fun refreshUser(userId: String, forceRefresh: Boolean) {
jobManager.addJobInBackground(RefreshUserJob(listOf(userId), forceRefresh = forceRefresh))
}
Expand All @@ -662,6 +670,24 @@ internal constructor(
userRepository.suspendFindUserById(userId)
}

fun exitGroupAndReport(conversationId: String, userId: String) {
jobManager.addJobInBackground(
UpdateRelationshipJob(
RelationshipRequest(
userId,
RelationshipAction.BLOCK.name
),
true
)
)
jobManager.addJobInBackground(
ConversationJob(
conversationId = conversationId,
type = ConversationJob.TYPE_EXIT
)
)
}

suspend fun getSortMessagesByIds(messages: Set<MessageItem>): ArrayList<ForwardMessage> {
return withContext(Dispatchers.IO) {
val list = ArrayList<ForwardMessage>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ class ConversationAdapter(
private val miniMarkwon by lazy {
MarkwonUtil.getMiniMarkwon(context)
}
var inviterId: String? = null
var hasBottomView = false
@SuppressLint("NotifyDataSetChanged")
set(value) {
Expand Down Expand Up @@ -371,7 +372,7 @@ class ConversationAdapter(
)
}
STRANGER_TYPE -> {
(holder as StrangerHolder).bind(onItemListener, isBot)
(holder as StrangerHolder).bind(onItemListener, inviterId, isBot)
}
UNKNOWN_TYPE -> {
(holder as UnknownHolder).bind(
Expand Down Expand Up @@ -991,6 +992,8 @@ class ConversationAdapter(

open fun onSayHi() {}

open fun onExitAndReport(inviterId: String) {}

open fun onLocationClick(messageItem: MessageItem) {}

open fun onTextDoubleClick(messageItem: MessageItem) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,39 @@
package one.mixin.android.ui.conversation.holder

import android.view.ViewGroup
import androidx.core.view.isVisible
import one.mixin.android.R
import one.mixin.android.databinding.ItemChatStrangerBinding
import one.mixin.android.ui.conversation.adapter.ConversationAdapter
import one.mixin.android.ui.conversation.holder.base.BaseViewHolder

class StrangerHolder constructor(val binding: ItemChatStrangerBinding) : BaseViewHolder(binding.root) {

fun bind(onItemListener: ConversationAdapter.OnItemListener, isBot: Boolean) {
if (isBot) {
fun bind(onItemListener: ConversationAdapter.OnItemListener, inviterId: String?, isBot: Boolean) {
if (inviterId != null) {
binding.strangerInfo.setText(R.string.Invited_by_Stranger)
binding.strangerBlockBn.setText(R.string.Exit_group_and_report_inviter)
binding.strangerAddBn.isVisible = false
(binding.strangerBlockBn.layoutParams as ViewGroup.MarginLayoutParams).apply {
width = ViewGroup.LayoutParams.WRAP_CONTENT
marginStart = 0
marginEnd = 0
}
} else if (isBot) {
binding.strangerInfo.setText(R.string.chat_bot_reception_title)
binding.strangerBlockBn.setText(R.string.Open_Home_page)
binding.strangerAddBn.setText(R.string.Say_Hi)
binding.strangerAddBn.isVisible = true
} else {
binding.strangerInfo.setText(R.string.stranger_hint)
binding.strangerBlockBn.setText(R.string.Block)
binding.strangerAddBn.setText(R.string.Add_Contact)
binding.strangerAddBn.isVisible = true
}
binding.strangerBlockBn.setOnClickListener {
if (isBot) {
if (inviterId != null) {
onItemListener.onExitAndReport(inviterId)
} else if (isBot) {
onItemListener.onOpenHomePage()
} else {
onItemListener.onBlockClick()
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@
<string name="Exit">退出</string>
<string name="Exit_Group">退出群组</string>
<string name="exit_without_save">不保存就退出?</string>
<string name="Exit_group_and_report_inviter">退出群组并举报邀请人</string>
<string name="Expired">已过期</string>
<string name="Export_Chat">导出聊天记录</string>
<string name="Export_failed">导出失败</string>
Expand Down Expand Up @@ -475,6 +476,7 @@
<string name="Invite_to_Mixin">邀请至 Mixin</string>
<string name="is_network_available">网络已连接</string>
<string name="italic">斜体</string>
<string name="Invited_by_Stranger">邀请人不是你的联系人</string>
<string name="Join_group">加入群组</string>
<string name="Joined_in">%1$s 加入</string>
<string name="Label">标题</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@
<string name="Exit">Exit</string>
<string name="Exit_Group">Exit Group</string>
<string name="exit_without_save">Exit without save?</string>
<string name="Exit_group_and_report_inviter">Exit group and report inviter</string>
<string name="Expired">Expired</string>
<string name="Export_Chat">Export Chat</string>
<string name="Export_failed">Export failed</string>
Expand Down Expand Up @@ -484,6 +485,7 @@
<string name="Invite_to_Mixin">Invite to Mixin</string>
<string name="is_network_available">isNetworkAvailable</string>
<string name="italic">italic</string>
<string name="Invited_by_Stranger">The inviter is not in your contacts</string>
<string name="Join_group">Join Group</string>
<string name="Joined_in">Joined in %1$s</string>
<string name="Label">Label</string>
Expand Down