Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 13,
"identityHash": "a521f027909f69f4c7d1855f84a2e67f",
"identityHash": "b3d3d5405b220baf1819c1397f935f95",
"entities": [
{
"tableName": "User",
Expand Down Expand Up @@ -738,12 +738,64 @@
]
}
]
},
{
"tableName": "user_circles",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `displayName` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "displayName",
"columnName": "displayName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "user_groups",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groups` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "groups",
"columnName": "groups",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a521f027909f69f4c7d1855f84a2e67f')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b3d3d5405b220baf1819c1397f935f95')"
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ class MainActivity : BaseActivity(), ActionBarProvider {
super.onStop()
}

override fun onDestroy() {
super.onDestroy()
}

private fun openConversationList() {
val intent = Intent(this, ConversationsListActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ class IncomingLinkPreviewMessageViewHolder(incomingView: View, payload: Any) :
viewThemeUtils,
processedMessageText!!,
message,
itemView
itemView,
null,
null
)

binding.messageText.text = processedMessageText
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ public void onBind(@NonNull ChatMessage message) {
viewThemeUtils,
processedMessageText,
message,
binding.incomingPreviewMessageBubble);
binding.incomingPreviewMessageBubble,
null,
null);
}
binding.incomingPreviewMessageBubble.setOnClickListener(null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.ChatMessageRepository
import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository
import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.ApiUtils
Expand All @@ -43,6 +44,8 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.Date
Expand Down Expand Up @@ -74,6 +77,11 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :

lateinit var commonMessageInterface: CommonMessageInterface

@Inject
lateinit var userGroupsCirclesRepository: UserGroupsCirclesRepository

private val coroutineScope = CoroutineScope(Dispatchers.Main)

@Inject
lateinit var chatRepository: ChatMessageRepository

Expand All @@ -86,15 +94,32 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
colorizeMessageBubble(message)
itemView.isSelected = false
val user = currentUserProvider.currentUser.blockingGet()
val hasCheckboxes = processCheckboxes(
message,
user
)
processMessage(message, hasCheckboxes)
lateinit var userGroups: List<String>
lateinit var userCircles: List<String>
coroutineScope.launch {
userGroups = userGroupsCirclesRepository.getUserGroups()
.map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList()

userCircles = userGroupsCirclesRepository.getUserCircles()
.map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList()

val hasCheckboxes = processCheckboxes(
message,
user
)
processMessage(message, hasCheckboxes, userGroups, userCircles)
}
}

private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) {
@Suppress("Detekt.LongMethod")
private fun processMessage(
message: ChatMessage,
hasCheckboxes: Boolean,
userGroups: List<String>,
userCircles: List<String>
) {
var textSize = context.resources!!.getDimension(R.dimen.chat_text_size)

if (!hasCheckboxes) {
binding.messageText.visibility = View.VISIBLE
binding.checkboxContainer.visibility = View.GONE
Expand Down Expand Up @@ -132,7 +157,9 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
viewThemeUtils,
processedMessageText,
message,
itemView
itemView,
userGroups,
userCircles
)
val messageParameters = message.messageParameters
if (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
viewThemeUtils,
processedMessageText!!,
message,
itemView
itemView,
null,
null
)

binding.messageText.text = processedMessageText
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ public void onBind(@NonNull ChatMessage message) {
viewThemeUtils,
processedMessageText,
message,
binding.outgoingPreviewMessageBubble);
binding.outgoingPreviewMessageBubble,
null,
null);
}
binding.outgoingPreviewMessageBubble.setOnClickListener(null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA
import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.ChatMessageRepository
import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.data.database.model.UserGroupsCirclesRepository
import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding
Expand All @@ -47,6 +48,8 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.Date
Expand Down Expand Up @@ -85,27 +88,47 @@ class OutcomingTextMessageViewHolder(itemView: View) :

private var job: Job? = null

@Suppress("Detekt.LongMethod")
@Inject
lateinit var userGroupsCirclesRepository: UserGroupsCirclesRepository

private val coroutineScope = CoroutineScope(Dispatchers.Main)

override fun onBind(message: ChatMessage) {
super.onBind(message)
sharedApplication!!.componentApplication.inject(this)
val user = currentUserProvider.currentUser.blockingGet()
val hasCheckboxes = processCheckboxes(
message,
user
)
processMessage(message, hasCheckboxes)
lateinit var userGroups: List<String>
lateinit var userCircles: List<String>
coroutineScope.launch {
userGroups = userGroupsCirclesRepository.getUserGroups()
.map { list -> list.mapNotNull { it.groups } }.firstOrNull() ?: emptyList()

userCircles = userGroupsCirclesRepository.getUserCircles()
.map { list -> list.mapNotNull { it.displayName } }.firstOrNull() ?: emptyList()

val hasCheckboxes = processCheckboxes(
message,
user
)
processMessage(message, hasCheckboxes, userCircles, userGroups)
}
}

@Suppress("Detekt.LongMethod")
private fun processMessage(message: ChatMessage, hasCheckboxes: Boolean) {
private fun processMessage(
message: ChatMessage,
hasCheckboxes: Boolean,
userGroups: List<String>,
userCircles: List<String>
) {
var isBubbled = true
val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
var textSize = context.resources.getDimension(R.dimen.chat_text_size)
if (!hasCheckboxes) {
realView.isSelected = false
layoutParams.isWrapBefore = false
viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)

binding.messageText.visibility = View.VISIBLE
binding.checkboxContainer.visibility = View.GONE
Expand All @@ -115,6 +138,7 @@ class OutcomingTextMessageViewHolder(itemView: View) :
message,
false,
viewThemeUtils

)

val spansFromString: Array<Any> = processedMessageText!!.getSpans(
Expand Down Expand Up @@ -144,8 +168,11 @@ class OutcomingTextMessageViewHolder(itemView: View) :
viewThemeUtils,
processedMessageText,
message,
itemView
itemView,
userGroups,
userCircles
)
binding.messageText.text = processedMessageText

if (
(message.messageParameters == null || message.messageParameters!!.size <= 0) &&
Expand All @@ -156,7 +183,6 @@ class OutcomingTextMessageViewHolder(itemView: View) :
realView.isSelected = true
isBubbled = false
}

binding.messageTime.layoutParams = layoutParams
viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT)
binding.messageText.text = processedMessageText
Expand Down Expand Up @@ -186,7 +212,10 @@ class OutcomingTextMessageViewHolder(itemView: View) :
binding.sendingProgress.visibility = View.GONE

if (message.sendingFailed) {
updateStatus(R.drawable.baseline_error_outline_24, context.resources?.getString(R.string.nc_message_failed))
updateStatus(
R.drawable.baseline_error_outline_24,
context.resources?.getString(R.string.nc_message_failed)
)
} else if (message.isTemporary) {
updateStatus(R.drawable.baseline_schedule_24, context.resources?.getString(R.string.nc_message_sending))
} else if (message.readStatus == ReadStatus.READ) {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/nextcloud/talk/api/NcApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
import com.nextcloud.talk.models.json.status.StatusOverall;
import com.nextcloud.talk.models.json.unifiedsearch.UnifiedSearchOverall;
import com.nextcloud.talk.models.json.usercircles.UserCirclesOverall;
import com.nextcloud.talk.models.json.usergroups.UserGroupsOverall;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unused imports

import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall;
import com.nextcloud.talk.models.json.userprofile.UserProfileOverall;
import com.nextcloud.talk.polls.repositories.model.PollOverall;
Expand Down Expand Up @@ -646,4 +648,5 @@ Observable<GenericOverall> acceptInvitation(@Header("Authorization") String auth
@DELETE
Observable<GenericOverall> rejectInvitation(@Header("Authorization") String authorization,
@Url String url);

}
8 changes: 8 additions & 0 deletions app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import com.nextcloud.talk.models.json.participants.TalkBanOverall
import com.nextcloud.talk.models.json.profile.ProfileOverall
import com.nextcloud.talk.models.json.testNotification.TestNotificationOverall
import com.nextcloud.talk.models.json.userAbsence.UserAbsenceOverall
import com.nextcloud.talk.models.json.usercircles.UserCirclesOverall
import com.nextcloud.talk.models.json.usergroups.UserGroupsOverall
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.http.Body
Expand Down Expand Up @@ -285,4 +287,10 @@ interface NcApiCoroutines {

@DELETE
suspend fun unbindRoom(@Header("Authorization") authorization: String, @Url url: String): GenericOverall

@GET
suspend fun getUserGroups(@Header("Authorization") authorization: String?, @Url url: String?): UserGroupsOverall

@GET
suspend fun getUserCircles(@Header("Authorization") authorization: String?, @Url url: String?): UserCirclesOverall
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM
import com.nextcloud.talk.utils.message.MessageUtils
import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
import com.nextcloud.talk.utils.rx.DisposableSet
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
Expand Down Expand Up @@ -271,6 +272,9 @@ class ChatActivity :
@Inject
lateinit var networkMonitor: NetworkMonitor

@Inject
lateinit var messageUtils: MessageUtils

lateinit var chatViewModel: ChatViewModel

lateinit var conversationInfoViewModel: ConversationInfoViewModel
Expand Down Expand Up @@ -669,6 +673,10 @@ class ChatActivity :
}
}

conversationUser?.let { user ->
chatViewModel.fetchUserData(user)
}

if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT &&
hasSpreedFeatureCapability(
conversationUser?.capabilities!!.spreedCapability!!,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,6 @@ interface ChatNetworkDataSource {
): List<ChatMessageJson>
suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference?
suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall
suspend fun getUserGroups(user: User): Set<String>
suspend fun getUserCircles(user: User): Set<String>
}
Loading
Loading