Skip to content

Commit ad99f1d

Browse files
committed
Channel creation now works
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
1 parent 13fe8ec commit ad99f1d

11 files changed

Lines changed: 117 additions & 138 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,4 @@ freeline_project_description.json
8989

9090
/gradle/verification-keyring.gpg
9191
/.claude/settings.local.json
92+
/.artifacts/

.idea/codeStyles/Project.xml

Lines changed: 0 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import com.nextcloud.talk.models.json.chatprobeattachmentfolder.ProbeConversatio
1919
import com.nextcloud.talk.models.json.conversations.RoomOverall
2020
import com.nextcloud.talk.models.json.conversations.RoomsOverall
2121
import com.nextcloud.talk.models.json.generic.GenericOverall
22+
import com.nextcloud.talk.models.json.hovercard.HoverCardOverall
2223
import com.nextcloud.talk.models.json.invitation.InvitationOverall
2324
import com.nextcloud.talk.models.json.participants.AddParticipantOverall
2425
import com.nextcloud.talk.models.json.participants.TalkBan
2526
import com.nextcloud.talk.models.json.participants.TalkBanOverall
2627
import com.nextcloud.talk.models.json.profile.ProfileOverall
27-
import com.nextcloud.talk.models.json.hovercard.HoverCardOverall
2828
import com.nextcloud.talk.models.json.reactions.ReactionsOverall
2929
import com.nextcloud.talk.models.json.status.StatusOverall
3030
import com.nextcloud.talk.models.json.status.predefined.PredefinedStatusOverall
@@ -40,6 +40,7 @@ import retrofit2.Response
4040
import retrofit2.http.Body
4141
import retrofit2.http.DELETE
4242
import retrofit2.http.Field
43+
import retrofit2.http.FieldMap
4344
import retrofit2.http.FormUrlEncoded
4445
import retrofit2.http.GET
4546
import retrofit2.http.Header
@@ -76,6 +77,14 @@ interface NcApiCoroutines {
7677
@QueryMap options: Map<String, String>?
7778
): RoomOverall
7879

80+
@FormUrlEncoded
81+
@POST
82+
suspend fun createRoomForm(
83+
@Header("Authorization") authorization: String?,
84+
@Url url: String?,
85+
@FieldMap options: Map<String, String>?
86+
): RoomOverall
87+
7988
@POST
8089
suspend fun createRoomWithBody(
8190
@Header("Authorization") authorization: String?,

app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,7 @@ class OfflineFirstChatRepository @Inject constructor(
529529
val queriedMessageId = fieldMap["lastKnownMessageId"]
530530
val lookIntoFuture = fieldMap["lookIntoFuture"] == 1
531531

532-
val result = pullMessagesFlow(bundle).first()
533-
534-
when (result) {
532+
when (val result = pullMessagesFlow(bundle).first()) {
535533
is ChatPullResult.Success -> {
536534
newXChatLastCommonRead = result.lastCommonRead
537535
updateUiForLastCommonRead()
@@ -596,6 +594,10 @@ class OfflineFirstChatRepository @Inject constructor(
596594
val chatMessageEntities =
597595
persistChatMessagesAndHandleSystemMessages(chatMessagesJson, emitOnIncoming = lookIntoFuture)
598596

597+
if (chatMessageEntities.isEmpty()) {
598+
return
599+
}
600+
599601
val oldestIdFromSync = chatMessageEntities.minByOrNull { it.id }!!.id
600602
val newestIdFromSync = chatMessageEntities.maxByOrNull { it.id }!!.id
601603
Log.d(TAG, "oldestIdFromSync: $oldestIdFromSync")

app/src/main/java/com/nextcloud/talk/conversationcreation/ConversationCreationActivity.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import androidx.compose.material3.IconButton
5757
import androidx.compose.material3.MaterialTheme
5858
import androidx.compose.material3.OutlinedTextField
5959
import androidx.compose.material3.Scaffold
60+
import androidx.compose.material3.Surface
6061
import androidx.compose.material3.Switch
6162
import androidx.compose.material3.Text
6263
import androidx.compose.material3.TextButton
@@ -403,7 +404,7 @@ fun ConversationPresets(conversationCreationViewModel: ConversationCreationViewM
403404
subtitle = stringResource(R.string.default_room_preset),
404405
icon = Icons.Outlined.Chat,
405406
isSelected = preset == "default",
406-
onClick = { conversationCreationViewModel.conversationPreset.value = "default" }
407+
onClick = { conversationCreationViewModel.updateConversationPreset("default") }
407408
)
408409

409410
SelectableCard(
@@ -412,7 +413,7 @@ fun ConversationPresets(conversationCreationViewModel: ConversationCreationViewM
412413
subtitle = stringResource(R.string.voice_room_preset),
413414
icon = Icons.Outlined.VolumeUp,
414415
isSelected = preset == "voiceroom",
415-
onClick = { conversationCreationViewModel.conversationPreset.value = "voiceroom" }
416+
onClick = { conversationCreationViewModel.updateConversationPreset("voiceroom") }
416417
)
417418
}
418419

@@ -426,7 +427,7 @@ fun ConversationPresets(conversationCreationViewModel: ConversationCreationViewM
426427
subtitle = stringResource(R.string.nc_channel_description),
427428
icon = Icons.Outlined.Podcasts,
428429
isSelected = preset == "channel",
429-
onClick = { conversationCreationViewModel.conversationPreset.value = "channel" }
430+
onClick = { conversationCreationViewModel.updateConversationPreset("channel") }
430431
)
431432

432433
SelectableCard(
@@ -435,7 +436,8 @@ fun ConversationPresets(conversationCreationViewModel: ConversationCreationViewM
435436
subtitle = stringResource(R.string.nc_announcement_description),
436437
icon = Icons.Outlined.Campaign,
437438
isSelected = preset == "announcement",
438-
onClick = { conversationCreationViewModel.conversationPreset.value = "announcement" }
439+
onClick = { conversationCreationViewModel.updateConversationPreset("announcement") },
440+
badgeText = stringResource(R.string.nc_admin_only)
439441
)
440442
}
441443
}
@@ -450,7 +452,8 @@ fun SelectableCard(
450452
subtitle: String,
451453
icon: ImageVector,
452454
isSelected: Boolean,
453-
onClick: () -> Unit
455+
onClick: () -> Unit,
456+
badgeText: String? = null
454457
) {
455458
val borderColor = if (isSelected) Color.LightGray else Color.Transparent
456459
val borderWidth = 1.dp
@@ -478,10 +481,25 @@ fun SelectableCard(
478481
Text(
479482
text = title,
480483
fontWeight = FontWeight.Bold,
481-
fontSize = 15.sp
484+
fontSize = 15.sp,
485+
modifier = Modifier.weight(1f, fill = false)
482486
)
483487
}
484488

489+
if (badgeText != null) {
490+
Surface(
491+
color = MaterialTheme.colorScheme.primaryContainer,
492+
shape = RoundedCornerShape(4.dp)
493+
) {
494+
Text(
495+
text = badgeText,
496+
modifier = Modifier.padding(horizontal = 4.dp, vertical = 2.dp),
497+
style = MaterialTheme.typography.labelSmall,
498+
color = MaterialTheme.colorScheme.onPrimaryContainer
499+
)
500+
}
501+
}
502+
485503
Spacer(modifier = Modifier.height(12.dp))
486504

487505
Text(

app/src/main/java/com/nextcloud/talk/conversationcreation/data/ConversationCreationRepository.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.nextcloud.talk.conversationcreation.data
99

10+
import com.nextcloud.talk.conversationinfo.CreateRoomRequest
1011
import com.nextcloud.talk.data.user.model.User
1112
import com.nextcloud.talk.models.RetrofitBucket
1213
import com.nextcloud.talk.models.domain.ConversationModel
@@ -26,6 +27,7 @@ interface ConversationCreationRepository {
2627
suspend fun openConversation(credentials: String?, url: String, roomToken: String, scope: Int): GenericOverall
2728
suspend fun addParticipants(credentials: String?, retrofitBucket: RetrofitBucket): AddParticipantOverall
2829
suspend fun createRoom(credentials: String?, retrofitBucket: RetrofitBucket): RoomOverall
30+
suspend fun createRoomWithBody(credentials: String?, url: String, body: CreateRoomRequest): RoomOverall
2931
suspend fun setPassword(credentials: String?, url: String, roomToken: String, password: String): GenericOverall
3032
suspend fun uploadConversationAvatar(
3133
credentials: String?,

app/src/main/java/com/nextcloud/talk/conversationcreation/data/ConversationCreationRepositoryImpl.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.nextcloud.talk.conversationcreation.data
99

1010
import com.nextcloud.talk.api.NcApiCoroutines
11+
import com.nextcloud.talk.conversationinfo.CreateRoomRequest
1112
import com.nextcloud.talk.data.user.model.User
1213
import com.nextcloud.talk.models.RetrofitBucket
1314
import com.nextcloud.talk.models.domain.ConversationModel
@@ -58,14 +59,19 @@ class ConversationCreationRepositoryImpl @Inject constructor(private val ncApiCo
5859
}
5960

6061
override suspend fun createRoom(credentials: String?, retrofitBucket: RetrofitBucket): RoomOverall {
61-
val response = ncApiCoroutines.createRoom(
62+
val response = ncApiCoroutines.createRoomForm(
6263
credentials,
6364
retrofitBucket.url,
6465
retrofitBucket.queryMap
6566
)
6667
return response
6768
}
6869

70+
override suspend fun createRoomWithBody(credentials: String?, url: String, body: CreateRoomRequest): RoomOverall {
71+
val response = ncApiCoroutines.createRoomWithBody(credentials, url, body)
72+
return response
73+
}
74+
6975
override suspend fun setPassword(
7076
credentials: String?,
7177
url: String,

app/src/main/java/com/nextcloud/talk/conversationcreation/viewmodel/ConversationCreationViewModel.kt

Lines changed: 50 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,12 @@ import androidx.core.net.toFile
1414
import androidx.lifecycle.ViewModel
1515
import androidx.lifecycle.viewModelScope
1616
import com.nextcloud.talk.conversationcreation.data.ConversationCreationRepository
17+
import com.nextcloud.talk.conversationinfo.CreateRoomRequest
1718
import com.nextcloud.talk.data.user.model.User
18-
import com.nextcloud.talk.models.RetrofitBucket
1919
import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser
2020
import com.nextcloud.talk.models.json.conversations.Conversation
21-
import com.nextcloud.talk.models.json.generic.GenericMeta
22-
import com.nextcloud.talk.repositories.conversations.ConversationsRepositoryImpl.Companion.STATUS_CODE_OK
2321
import com.nextcloud.talk.utils.ApiUtils
24-
import com.nextcloud.talk.utils.ApiUtils.getRetrofitBucketForAddParticipant
25-
import com.nextcloud.talk.utils.ApiUtils.getRetrofitBucketForAddParticipantWithSource
22+
import com.nextcloud.talk.utils.ParticipantPermissions
2623
import com.nextcloud.talk.utils.database.user.CurrentUserProviderOld
2724
import kotlinx.coroutines.flow.MutableStateFlow
2825
import kotlinx.coroutines.flow.StateFlow
@@ -68,7 +65,6 @@ class ConversationCreationViewModel @Inject constructor(
6865
var isConversationAvailableForRegisteredUsers = mutableStateOf(false)
6966
val conversationPreset = mutableStateOf("default")
7067
var openForGuestAppUsers = mutableStateOf(false)
71-
private val addParticipantsViewState = MutableStateFlow<AddParticipantsUiState>(AddParticipantsUiState.None)
7268
private val allowGuestsResult = MutableStateFlow<AllowGuestsUiState>(AllowGuestsUiState.None)
7369
fun updateRoomName(roomName: String) {
7470
_roomName.value = roomName
@@ -82,6 +78,20 @@ class ConversationCreationViewModel @Inject constructor(
8278
_conversationDescription.value = conversationDescription
8379
}
8480

81+
fun updateConversationPreset(preset: String) {
82+
conversationPreset.value = preset
83+
when (preset) {
84+
"channel" -> {
85+
isConversationAvailableForRegisteredUsers.value = true
86+
openForGuestAppUsers.value = false
87+
}
88+
"announcement" -> {
89+
isConversationAvailableForRegisteredUsers.value = false
90+
openForGuestAppUsers.value = false
91+
}
92+
}
93+
}
94+
8595
@Suppress("Detekt.TooGenericExceptionCaught", "LongMethod")
8696
fun createRoomAndAddParticipants(
8797
roomType: String,
@@ -101,83 +111,31 @@ class ConversationCreationViewModel @Inject constructor(
101111
try {
102112
val apiVersion =
103113
ApiUtils.getConversationApiVersion(_currentUser, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1))
104-
val retrofitBucket: RetrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(
105-
version = apiVersion,
106-
baseUrl = _currentUser.baseUrl,
107-
roomType = roomType,
108-
preset = preset,
109-
conversationName = conversationName
110-
)
111-
val roomResult = repository.createRoom(
114+
val url = ApiUtils.getUrlForRooms(apiVersion, _currentUser.baseUrl)
115+
val body = CreateRoomRequest().apply {
116+
this.roomType = roomType
117+
this.roomName = conversationName
118+
this.preset = preset
119+
this.description = _conversationDescription.value
120+
this.listable = scope
121+
this.participants = convertAutocompleteUserToParticipants(participants)
122+
123+
if (preset == "channel" || preset == "announcement") {
124+
this.permissions = ParticipantPermissions.DEFAULT_GROUP_PERMISSIONS and
125+
ParticipantPermissions.CHAT.inv()
126+
}
127+
}
128+
val roomResult = repository.createRoomWithBody(
112129
credentials,
113-
retrofitBucket
130+
url,
131+
body
114132
)
115133
val conversation = roomResult.ocs?.data
116134

117135
if (conversation != null) {
118136
val token = conversation.token
119137
if (token != null) {
120138
try {
121-
val apiVersion = ApiUtils.getConversationApiVersion(
122-
_currentUser,
123-
intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)
124-
)
125-
val url = ApiUtils.getUrlForConversationDescription(
126-
apiVersion,
127-
_currentUser.baseUrl,
128-
token
129-
)
130-
131-
repository.setConversationDescription(
132-
credentials,
133-
url,
134-
token,
135-
_conversationDescription.value
136-
)
137-
138-
val urlForRoomPublic = ApiUtils.getUrlForRoomPublic(
139-
apiVersion,
140-
_currentUser.baseUrl!!,
141-
token
142-
)
143-
val allowGuestResultOverall = repository.allowGuests(
144-
credentials,
145-
urlForRoomPublic,
146-
token,
147-
isGuestsAllowed.value
148-
)
149-
val statusCode: GenericMeta? = allowGuestResultOverall.ocs?.meta
150-
val result = (statusCode?.statusCode == STATUS_CODE_OK)
151-
if (result) {
152-
allowGuestsResult.value = AllowGuestsUiState.Success(result)
153-
for (participant in participants) {
154-
if (participant.id != null) {
155-
val retrofitBucket: RetrofitBucket = if (participant.source!! == "users") {
156-
getRetrofitBucketForAddParticipant(
157-
apiVersion,
158-
_currentUser.baseUrl,
159-
token,
160-
participant.id!!
161-
)
162-
} else {
163-
getRetrofitBucketForAddParticipantWithSource(
164-
apiVersion,
165-
_currentUser.baseUrl,
166-
token,
167-
participant.source!!,
168-
participant.id!!
169-
)
170-
}
171-
172-
val participantOverall = repository.addParticipants(
173-
credentials,
174-
retrofitBucket
175-
).ocs?.data
176-
addParticipantsViewState.value =
177-
AddParticipantsUiState.Success(participantOverall)
178-
}
179-
}
180-
}
181139
if (_password.value.isNotEmpty()) {
182140
val url = ApiUtils.getUrlForRoomPassword(
183141
apiVersion,
@@ -236,6 +194,23 @@ class ConversationCreationViewModel @Inject constructor(
236194
}
237195
}
238196

197+
private fun convertAutocompleteUserToParticipants(
198+
autocompleteUsers: Set<AutocompleteUser>
199+
): com.nextcloud.talk.conversationinfo.Participants {
200+
val participants = com.nextcloud.talk.conversationinfo.Participants()
201+
autocompleteUsers.forEach { autocompleteUser ->
202+
when (autocompleteUser.source) {
203+
"groups" -> participants.groups.add(autocompleteUser.id!!)
204+
"emails" -> participants.emails.add(autocompleteUser.id!!)
205+
"circles" -> participants.teams.add(autocompleteUser.id!!)
206+
"federated" -> participants.federatedUsers.add(autocompleteUser.id!!)
207+
"phones" -> participants.phones.add(autocompleteUser.id!!)
208+
else -> participants.users.add(autocompleteUser.id!!)
209+
}
210+
}
211+
return participants
212+
}
213+
239214
fun getImageUri(avatarId: String, requestBigSize: Boolean, isDarkMode: Boolean): String =
240215
ApiUtils.getUrlForAvatar(_currentUser.baseUrl, avatarId, requestBigSize, darkMode = isDarkMode)
241216
}

0 commit comments

Comments
 (0)