Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
938f1d5
feat: Restrict access to upload for Viewers profile
ohassine May 20, 2026
247ed5b
Merge branch 'develop' into Restrict-access-to-upload-for-Viewers-pro…
ohassine May 20, 2026
63ba58a
feat: color for disabled secondary button
ohassine May 20, 2026
63d0739
Merge remote-tracking branch 'origin/Restrict-access-to-upload-for-Vi…
ohassine May 20, 2026
34d3829
feat: cleanup
ohassine May 21, 2026
17d356e
Merge remote-tracking branch 'origin/develop' into Restrict-access-to…
ohassine May 21, 2026
abaea77
chore: address comments
ohassine Jun 4, 2026
9821979
Merge remote-tracking branch 'origin/develop' into Restrict-access-to…
ohassine Jun 4, 2026
f11cbc9
chore: cleanup
ohassine Jun 4, 2026
d7d788a
chore: rename use case
ohassine Jun 4, 2026
c5fada6
Merge remote-tracking branch 'origin/develop' into Restrict-access-to…
ohassine Jun 8, 2026
6dfc187
chore: cleanup
ohassine Jun 8, 2026
4f66d31
Merge branch 'develop' into Restrict-access-to-upload-for-Viewers-pro…
ohassine Jun 8, 2026
0936fcf
chore: detekt
ohassine Jun 9, 2026
5074c6e
Merge remote-tracking branch 'origin/Restrict-access-to-upload-for-Vi…
ohassine Jun 9, 2026
c7ca9e9
Merge branch 'develop' into Restrict-access-to-upload-for-Viewers-pro…
ohassine Jun 9, 2026
0dc4f52
Merge branch 'develop' into Restrict-access-to-upload-for-Viewers-pro…
ohassine Jun 11, 2026
69ad7f6
Merge remote-tracking branch 'origin/develop' into Restrict-access-to…
ohassine Jun 11, 2026
cf8cfff
Merge branch 'develop' into Restrict-access-to-upload-for-Viewers-pro…
ohassine Jun 12, 2026
4c0b04f
feat: detekt
ohassine Jun 12, 2026
4e509d6
Merge remote-tracking branch 'origin/Restrict-access-to-upload-for-Vi…
ohassine Jun 12, 2026
a78bcef
feat: cleanup
ohassine Jun 12, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import com.wire.kalium.logic.feature.conversation.MembersToMentionUseCase
import com.wire.kalium.logic.feature.conversation.ObserveEligibleMembersForConversationAdminRoleUseCase
import com.wire.kalium.logic.feature.conversation.PromoteAdminAndLeaveConversationUseCase
import com.wire.kalium.logic.feature.conversation.NotifyConversationIsOpenUseCase
import com.wire.kalium.logic.feature.conversation.IsSelfUserViewerOnConversationUseCase
import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationInteractionAvailabilityUseCase
Expand Down Expand Up @@ -367,4 +368,9 @@ class ConversationModule {
conversationScope: ConversationScope
): ChangeAccessForAppsInConversationUseCase =
conversationScope.changeAccessForAppsInConversation

@Provides
fun provideIsSelfUserViewerOnConversationUseCase(
conversationScope: ConversationScope
): IsSelfUserViewerOnConversationUseCase = conversationScope.isSelfUserViewerOnConversation
}
33 changes: 28 additions & 5 deletions app/src/main/kotlin/com/wire/android/ui/common/AttachmentButton.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,42 @@ import com.wire.android.ui.theme.wireDimensions
import com.wire.android.ui.theme.wireTypography

@Composable
fun AttachmentButton(@DrawableRes icon: Int, labelStyle: TextStyle, modifier: Modifier = Modifier, text: String = "", onClick: () -> Unit) {
fun AttachmentButton(
@DrawableRes icon: Int,
labelStyle: TextStyle,
modifier: Modifier = Modifier,
text: String = "",
enabled: Boolean = true,
onClick: () -> Unit,
) {
val buttonBackgroundColor = if (enabled) {
MaterialTheme.wireColorScheme.primaryButtonEnabled
} else {
MaterialTheme.wireColorScheme.primaryButtonDisabled
}
val buttonContentColor = if (enabled) {
MaterialTheme.wireColorScheme.onPrimaryButtonEnabled
} else {
MaterialTheme.wireColorScheme.onPrimaryButtonDisabled
}
val labelColor = if (enabled) {
MaterialTheme.wireColorScheme.onBackground
} else {
MaterialTheme.wireColorScheme.secondaryText
}

Column(
modifier = modifier
.padding(dimensions().spacing4x)
.clip(RoundedCornerShape(size = MaterialTheme.wireDimensions.buttonSmallCornerSize))
.clickable { onClick() }
.clickable(enabled = enabled) { onClick() }
.padding(dimensions().spacing8x),
horizontalAlignment = Alignment.CenterHorizontally
) {
Box(
modifier = Modifier
.size(dimensions().attachmentButtonSize)
.background(MaterialTheme.wireColorScheme.primaryButtonEnabled, CircleShape)
.background(buttonBackgroundColor, CircleShape)
.padding(dimensions().spacing2x)
) {
Image(
Expand All @@ -70,7 +93,7 @@ fun AttachmentButton(@DrawableRes icon: Int, labelStyle: TextStyle, modifier: Mo
modifier = Modifier
.padding(dimensions().spacing8x)
.align(Alignment.Center),
colorFilter = ColorFilter.tint(MaterialTheme.wireColorScheme.onPrimaryButtonEnabled)
colorFilter = ColorFilter.tint(buttonContentColor)
)
}
VerticalSpace.x4()
Expand All @@ -80,7 +103,7 @@ fun AttachmentButton(@DrawableRes icon: Int, labelStyle: TextStyle, modifier: Mo
maxLines = 2,
textAlign = TextAlign.Center,
style = labelStyle,
color = MaterialTheme.wireColorScheme.onBackground,
color = labelColor,
)
Spacer(modifier = Modifier.weight(1F))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
import com.wire.kalium.logic.feature.conversation.ObserveConversationInteractionAvailabilityUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationUnderLegalHoldNotifiedUseCase
import com.wire.kalium.logic.feature.conversation.ObserveDegradedConversationNotifiedUseCase
import com.wire.kalium.logic.feature.conversation.IsSelfUserViewerOnConversationUseCase
import com.wire.kalium.logic.feature.conversation.SendTypingEventUseCase
import com.wire.kalium.logic.feature.conversation.SetNotifiedAboutConversationUnderLegalHoldUseCase
import com.wire.kalium.logic.feature.conversation.SetUserInformedAboutVerificationUseCase
Expand Down Expand Up @@ -195,6 +196,7 @@
private val featureFlags: KaliumConfigs,
private val getWireCellsConfig: GetWireCellConfigurationUseCase,
private val observeOfflineFilesByConversation: ObserveOfflineFilesByConversationUseCase,
private val isSelfUserViewerOnConversation: IsSelfUserViewerOnConversationUseCase,

Check warning on line 199 in app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt#L199

Added line #L199 was not covered by tests
private val networkStateObserver: NetworkStateObserver,
@CurrentAccount private val selfUserId: UserId,
) {
Expand Down Expand Up @@ -237,6 +239,7 @@
currentSessionFlowUseCase = currentSessionFlowUseCase,
observeEstablishedCalls = observeEstablishedCalls,
globalDataStore = globalDataStore,
isSelfUserViewerOnConversation = isSelfUserViewerOnConversation

Check warning on line 242 in app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationCoreViewModelFactory.kt#L242

Added line #L242 was not covered by tests
)

fun sendMessageViewModel(savedStateHandle: SavedStateHandle) = SendMessageViewModel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.wire.kalium.logic.data.id.MessageId

data class MessageComposerViewState(
val isFileSharingEnabled: Boolean = true,
val areAttachmentOptionsEnabled: Boolean = true,
val interactionAvailability: InteractionAvailability = InteractionAvailability.ENABLED,
val mentionSearchResult: List<Contact> = listOf(),
val mentionSearchQuery: String = String.EMPTY,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ramcosta.composedestinations.generated.app.navArgs
import com.wire.android.datastore.GlobalDataStore
import com.wire.android.mapper.ContactMapper
import com.wire.android.ui.home.conversations.ConversationNavArgs
import com.wire.android.ui.home.conversations.InvalidLinkDialogState
import com.wire.android.ui.home.conversations.MessageComposerViewState
import com.wire.android.ui.home.conversations.VisitLinkDialogState
import com.wire.android.ui.home.conversations.model.UIMessage
import com.ramcosta.composedestinations.generated.app.navArgs
import com.wire.android.util.EMPTY
import com.wire.android.util.FileManager
import com.wire.android.util.dispatchers.DispatcherProvider
Expand All @@ -45,9 +45,10 @@ import com.wire.kalium.logic.data.message.SelfDeletionTimer
import com.wire.kalium.logic.data.user.OtherUser
import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase
import com.wire.kalium.logic.feature.conversation.IsInteractionAvailableResult
import com.wire.kalium.logic.feature.conversation.IsSelfUserViewerOnConversationUseCase
import com.wire.kalium.logic.feature.conversation.MarkConversationAsReadLocallyUseCase
import com.wire.kalium.logic.feature.conversation.MembersToMentionUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationInteractionAvailabilityUseCase
import com.wire.kalium.logic.feature.conversation.MarkConversationAsReadLocallyUseCase
import com.wire.kalium.logic.feature.conversation.SendTypingEventUseCase
import com.wire.kalium.logic.feature.conversation.UpdateConversationReadDateUseCase
import com.wire.kalium.logic.feature.message.ephemeral.EnqueueMessageSelfDeletionUseCase
Expand Down Expand Up @@ -84,6 +85,7 @@ class MessageComposerViewModel(
private val currentSessionFlowUseCase: CurrentSessionFlowUseCase,
private val observeEstablishedCalls: ObserveEstablishedCallsUseCase,
private val globalDataStore: GlobalDataStore,
private val isSelfUserViewerOnConversation: IsSelfUserViewerOnConversationUseCase,
) : ViewModel() {

var messageComposerViewState = mutableStateOf(MessageComposerViewState())
Expand Down Expand Up @@ -113,6 +115,7 @@ class MessageComposerViewModel(
initTempWritableImageUri()
observeIsTypingAvailable()
setFileSharingStatus()
checkAttachmentOptionsAvailability()
getEnterToSendState()
observeCallState()
}
Expand Down Expand Up @@ -196,6 +199,15 @@ class MessageComposerViewModel(
}
}

private fun checkAttachmentOptionsAvailability() {
viewModelScope.launch {
val areAttachmentOptionsEnabled = isSelfUserViewerOnConversation(conversationId)
messageComposerViewState.value = messageComposerViewState.value.copy(
areAttachmentOptionsEnabled = areAttachmentOptionsEnabled
)
}
}

fun updateConversationReadDate(utcISO: String) {
val instant = Instant.parse(utcISO)
lastReadInstant = instant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,11 @@

package com.wire.android.ui.home.conversations.usecase

import android.os.SystemClock
import androidx.paging.LoadState
import androidx.paging.LoadStates
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.map
import com.wire.android.appLogger
import com.wire.android.mapper.UserTypeMapper
import com.wire.android.mapper.toConversationItem
import com.wire.android.ui.home.conversationslist.model.ConversationItem
Expand All @@ -33,16 +31,15 @@ import com.wire.android.util.ui.UiTextResolver
import com.wire.kalium.logic.data.conversation.ConversationDetailsWithEvents
import com.wire.kalium.logic.data.conversation.ConversationFilter
import com.wire.kalium.logic.data.conversation.ConversationQueryConfig
import com.wire.kalium.logic.data.id.TeamId
import com.wire.kalium.logic.feature.conversation.GetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase
import com.wire.kalium.logic.feature.conversation.folder.GetFavoriteFolderUseCase
import com.wire.kalium.logic.feature.conversation.folder.ObserveConversationsFromFolderUseCase
import com.wire.kalium.logic.feature.user.GetSelfTeamIdUseCase
import dev.zacsweers.metro.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import dev.zacsweers.metro.Inject

class GetConversationsFromSearchUseCase @Inject constructor(
private val useCase: GetPaginatedFlowOfConversationDetailsWithEventsBySearchQueryUseCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ fun AdditionalOptionsMenu(
isEditing: Boolean,
isMentionActive: Boolean,
isFileSharingEnabled: Boolean,
areAttachmentOptionsEnabled: Boolean,
onAdditionalOptionsMenuClicked: () -> Unit,
onMentionButtonClicked: (() -> Unit),
onPingOptionClicked: () -> Unit,
Expand Down Expand Up @@ -75,7 +76,8 @@ fun AdditionalOptionsMenu(
onRichEditingButtonClicked = onRichEditingButtonClicked,
onPingClicked = onPingOptionClicked,
onDrawingModeClicked = onDrawingModeClicked,
isFileSharingEnabled = isFileSharingEnabled
isFileSharingEnabled = isFileSharingEnabled,
areAttachmentOptionsEnabled = areAttachmentOptionsEnabled,
)
}

Expand All @@ -94,6 +96,7 @@ fun AdditionalOptionsMenu(
@Composable
fun AdditionalOptionSubMenu(
isFileSharingEnabled: Boolean,
areAttachmentOptionsEnabled: Boolean,
optionsVisible: Boolean,
onPermissionPermanentlyDenied: (type: ConversationActionPermissionType) -> Unit,
onLocationPickerClicked: () -> Unit,
Expand All @@ -115,6 +118,7 @@ fun AdditionalOptionSubMenu(
tempWritableImageUri = tempWritableImageUri,
tempWritableVideoUri = tempWritableVideoUri,
isFileSharingEnabled = isFileSharingEnabled,
areAttachmentOptionsEnabled = areAttachmentOptionsEnabled,
onRecordAudioMessageClicked = onRecordAudioMessageClicked,
onLocationPickerClicked = onLocationPickerClicked,
onPermissionPermanentlyDenied = onPermissionPermanentlyDenied,
Expand All @@ -139,6 +143,7 @@ fun AttachmentAndAdditionalOptionsMenuItems(
attachmentsVisible: Boolean,
isMentionActive: Boolean,
isFileSharingEnabled: Boolean,
areAttachmentOptionsEnabled: Boolean,
onMentionButtonClicked: () -> Unit,
onSelfDeletionOptionButtonClicked: (SelfDeletionTimer) -> Unit,
modifier: Modifier = Modifier,
Expand All @@ -163,7 +168,8 @@ fun AttachmentAndAdditionalOptionsMenuItems(
onGifButtonClicked = onGifButtonClicked,
onRichEditingButtonClicked = onRichEditingButtonClicked,
onDrawingModeClicked = onDrawingModeClicked,
isFileSharingEnabled = isFileSharingEnabled
isFileSharingEnabled = isFileSharingEnabled,
areAttachmentOptionsEnabled = areAttachmentOptionsEnabled,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
tempWritableImageUri: Uri?,
tempWritableVideoUri: Uri?,
isFileSharingEnabled: Boolean,
areAttachmentOptionsEnabled: Boolean,
onLocationPickerClicked: () -> Unit,
onPermissionPermanentlyDenied: (type: ConversationActionPermissionType) -> Unit,
modifier: Modifier = Modifier,
Expand All @@ -80,6 +81,7 @@

val attachmentOptions = buildAttachmentOptionItems(
isFileSharingEnabled = isFileSharingEnabled,
areAttachmentOptionsEnabled = areAttachmentOptionsEnabled,
tempWritableImageUri = tempWritableImageUri,
tempWritableVideoUri = tempWritableVideoUri,
onImagesPicked = onImagesPicked,
Expand Down Expand Up @@ -163,7 +165,8 @@
icon = option.icon,
labelStyle = labelStyle,
modifier = Modifier.scale(animatedScale),
text = stringResource(option.text)
text = stringResource(option.text),
enabled = option.isEnabled,
) { option.onClick() }
}
}
Expand Down Expand Up @@ -278,6 +281,7 @@
@Composable
private fun buildAttachmentOptionItems(
isFileSharingEnabled: Boolean,
areAttachmentOptionsEnabled: Boolean,
tempWritableImageUri: Uri?,
tempWritableVideoUri: Uri?,
onImagesPicked: (List<Uri>) -> Unit,
Expand Down Expand Up @@ -311,39 +315,44 @@
with(localFeatureVisibilityFlags) {
add(
AttachmentOptionItem(
isFileSharingEnabled,
R.string.attachment_share_file,
R.drawable.ic_attach_file
shouldShow = isFileSharingEnabled,
isEnabled = areAttachmentOptionsEnabled,
text = R.string.attachment_share_file,
icon = R.drawable.ic_attach_file,
) { fileFlow.launch() }
)
add(
AttachmentOptionItem(
isFileSharingEnabled,
R.string.attachment_share_image,
R.drawable.ic_gallery
shouldShow = isFileSharingEnabled,
isEnabled = areAttachmentOptionsEnabled,
text = R.string.attachment_share_image,
icon = R.drawable.ic_gallery,
) { galleryFlow.launch() }
)
add(
AttachmentOptionItem(
isFileSharingEnabled,
R.string.attachment_take_photo,
R.drawable.ic_camera
shouldShow = isFileSharingEnabled,
isEnabled = areAttachmentOptionsEnabled,
text = R.string.attachment_take_photo,
icon = R.drawable.ic_camera,
) { takePictureFlow?.launch() }
)
add(
AttachmentOptionItem(
isFileSharingEnabled,
R.string.attachment_record_video,
R.drawable.ic_video
shouldShow = isFileSharingEnabled,
isEnabled = areAttachmentOptionsEnabled,
text = R.string.attachment_record_video,
icon = R.drawable.ic_video,
) { captureVideoFlow?.launch() }
)
if (AudioMessagesIcon) {
add(
AttachmentOptionItem(
isFileSharingEnabled,
R.string.attachment_voice_message,
R.drawable.ic_mic_on,
onRecordAudioMessageClicked
shouldShow = isFileSharingEnabled,
isEnabled = areAttachmentOptionsEnabled,
text = R.string.attachment_voice_message,
icon = R.drawable.ic_mic_on,
onClick = onRecordAudioMessageClicked,
)
)
}
Expand All @@ -363,6 +372,7 @@

private data class AttachmentOptionItem(
val shouldShow: Boolean = true,
val isEnabled: Boolean = true,

Check warning on line 375 in app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/AttachmentOptions.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/AttachmentOptions.kt#L375

Added line #L375 was not covered by tests
@StringRes val text: Int,
@DrawableRes val icon: Int,
val onClick: () -> Unit
Expand All @@ -377,6 +387,7 @@
onImagesPicked = {},
onAttachmentPicked = {},
isFileSharingEnabled = true,
areAttachmentOptionsEnabled = true,
tempWritableImageUri = null,
tempWritableVideoUri = null,
onRecordAudioMessageClicked = {},
Expand All @@ -398,6 +409,7 @@
onAttachmentPicked = {},
onImagesPicked = {},
isFileSharingEnabled = true,
areAttachmentOptionsEnabled = true,
tempWritableImageUri = null,
tempWritableVideoUri = null,
onRecordAudioMessageClicked = {},
Expand All @@ -420,6 +432,7 @@
onAttachmentPicked = {},
onImagesPicked = {},
isFileSharingEnabled = true,
areAttachmentOptionsEnabled = true,
tempWritableImageUri = null,
tempWritableVideoUri = null,
onRecordAudioMessageClicked = {},
Expand All @@ -442,6 +455,7 @@
onAttachmentPicked = {},
onImagesPicked = {},
isFileSharingEnabled = true,
areAttachmentOptionsEnabled = true,
tempWritableImageUri = null,
tempWritableVideoUri = null,
onRecordAudioMessageClicked = {},
Expand Down
Loading
Loading