Skip to content

Commit

Permalink
fix: security classification label [WPB-3715] (#2104)
Browse files Browse the repository at this point in the history
  • Loading branch information
Garzas committed Aug 18, 2023
1 parent 37d7257 commit 3a65370
Show file tree
Hide file tree
Showing 31 changed files with 376 additions and 152 deletions.
4 changes: 2 additions & 2 deletions app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ import com.wire.kalium.logic.feature.conversation.CreateGroupConversationUseCase
import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversationUseCase
import com.wire.kalium.logic.feature.conversation.GetConversationUnreadEventsCountUseCase
import com.wire.kalium.logic.feature.conversation.GetOrCreateOneToOneConversationUseCase
import com.wire.kalium.logic.feature.conversation.GetOtherUserSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.LeaveConversationUseCase
import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.ObserveUserListByIdUseCase
Expand Down Expand Up @@ -1118,7 +1118,7 @@ class UseCaseModule {
fun provideGetOtherUserSecurityClassificationLabelUseCase(
@KaliumCoreLogic coreLogic: CoreLogic,
@CurrentAccount currentAccount: UserId
): GetOtherUserSecurityClassificationLabelUseCase =
): ObserveOtherUserSecurityClassificationLabelUseCase =
coreLogic.getSessionScope(currentAccount).getOtherUserSecurityClassificationLabel

@ViewModelScoped
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/kotlin/com/wire/android/ui/calling/CallState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ import com.wire.android.model.ImageAsset.UserAvatarAsset
import com.wire.android.ui.calling.model.UICallParticipant
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.feature.call.CallStatus
import com.wire.kalium.logic.feature.conversation.SecurityClassificationType

data class CallState(
val conversationId: ConversationId,
val conversationName: ConversationName? = null,
val callerName: String? = null,
val callStatus: CallStatus = CallStatus.CLOSED,
Expand All @@ -39,6 +40,5 @@ data class CallState(
val isSpeakerOn: Boolean = false,
val isCbrEnabled: Boolean = false,
val conversationType: ConversationType = ConversationType.OneOnOne,
val membership: Membership = Membership.None,
val securityClassificationType: SecurityClassificationType = SecurityClassificationType.NONE,
val membership: Membership = Membership.None
)
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOnUseCase
import com.wire.kalium.logic.feature.call.usecase.UnMuteCallUseCase
import com.wire.kalium.logic.feature.call.usecase.UpdateVideoStateUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase
import com.wire.kalium.logic.util.PlatformView
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -92,15 +91,14 @@ class SharedCallingViewModel @Inject constructor(
private val wireSessionImageLoader: WireSessionImageLoader,
private val userTypeMapper: UserTypeMapper,
private val currentScreenManager: CurrentScreenManager,
private val observeSecurityClassificationLabel: ObserveSecurityClassificationLabelUseCase,
private val dispatchers: DispatcherProvider
) : ViewModel() {

var callState by mutableStateOf(CallState())

private val callingNavArgs: CallingNavArgs = savedStateHandle.navArgs()
val conversationId: QualifiedID = callingNavArgs.conversationId

var callState by mutableStateOf(CallState(conversationId))

init {
viewModelScope.launch {
val allCallsSharedFlow = allCalls().map {
Expand All @@ -123,21 +121,12 @@ class SharedCallingViewModel @Inject constructor(
launch {
observeOnSpeaker(this)
}
launch {
setClassificationType()
}
launch {
observeScreenState()
}
}
}

private suspend fun setClassificationType() {
observeSecurityClassificationLabel(conversationId).collect { classificationType ->
callState = callState.copy(securityClassificationType = classificationType)
}
}

private suspend fun observeScreenState() {
currentScreenManager.observeCurrentScreen(viewModelScope).collect {
if (it == CurrentScreen.InBackground) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ import com.wire.android.model.ImageAsset
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.calling.ConversationName
import com.wire.android.ui.common.MembershipQualifierLabel
import com.wire.android.ui.common.SecurityClassificationBanner
import com.wire.android.ui.common.UserProfileAvatar
import com.wire.android.ui.common.banner.SecurityClassificationBanner
import com.wire.android.ui.common.colorsScheme
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.common.spacers.VerticalSpace
Expand All @@ -52,19 +52,19 @@ import com.wire.android.ui.home.conversationslist.model.hasLabel
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.EMPTY
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.feature.conversation.SecurityClassificationType
import com.wire.kalium.logic.data.id.ConversationId
import java.util.Locale

@Composable
fun CallerDetails(
conversationId: ConversationId,
conversationName: ConversationName?,
isCameraOn: Boolean,
isCbrEnabled: Boolean,
avatarAssetId: ImageAsset.UserAvatarAsset?,
conversationType: ConversationType,
membership: Membership,
callingLabel: String,
securityClassificationType: SecurityClassificationType
callingLabel: String
) {
Column(
modifier = Modifier.fillMaxSize(),
Expand Down Expand Up @@ -115,7 +115,7 @@ fun CallerDetails(
}

SecurityClassificationBanner(
securityClassificationType = securityClassificationType,
conversationId = conversationId,
modifier = Modifier.padding(top = dimensions().spacing8x)
)

Expand All @@ -133,13 +133,13 @@ fun CallerDetails(
@Composable
fun PreviewCallerDetails() {
CallerDetails(
conversationId = ConversationId("value", "domain"),
conversationName = ConversationName.Known("User"),
isCameraOn = false,
isCbrEnabled = false,
avatarAssetId = null,
conversationType = ConversationType.OneOnOne,
membership = Membership.Guest,
callingLabel = String.EMPTY,
securityClassificationType = SecurityClassificationType.CLASSIFIED
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import com.wire.android.ui.destinations.OngoingCallScreenDestination
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.permission.rememberCallingRecordAudioBluetoothRequestFlow
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.data.id.ConversationId

@RootNavGraph
@Destination(
Expand Down Expand Up @@ -97,7 +98,8 @@ fun IncomingCallScreen(
)
)

is IncomingCallState.FlowState.Default -> { /* do nothing */ }
is IncomingCallState.FlowState.Default -> { /* do nothing */
}
}
}
with(sharedCallingViewModel) {
Expand Down Expand Up @@ -204,14 +206,14 @@ private fun IncomingCallContent(
} else stringResource(R.string.calling_label_incoming_call)

CallerDetails(
conversationId = callState.conversationId,
conversationName = callState.conversationName,
isCameraOn = callState.isCameraOn,
isCbrEnabled = callState.isCbrEnabled,
avatarAssetId = callState.avatarAssetId,
conversationType = callState.conversationType,
membership = callState.membership,
callingLabel = isCallingString,
securityClassificationType = callState.securityClassificationType
callingLabel = isCallingString
)
}
}
Expand All @@ -232,5 +234,5 @@ private fun AudioBluetoothPermissionCheckFlow(
@Preview
@Composable
fun PreviewIncomingCallScreen() {
IncomingCallContent(CallState(), {}, {}, {}, {}, {}, {}, {})
IncomingCallContent(CallState(ConversationId("value", "domain")), {}, {}, {}, {}, {}, {}, {})
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import com.wire.android.ui.common.bottomsheet.WireBottomSheetScaffold
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.destinations.OngoingCallScreenDestination
import com.wire.android.ui.theme.wireDimensions
import com.wire.kalium.logic.data.id.ConversationId

@RootNavGraph
@Destination(
Expand All @@ -76,7 +77,9 @@ fun InitiatingCallScreen(
InitiatingCallState.FlowState.CallClosed -> navigator.navigateBack()
InitiatingCallState.FlowState.CallEstablished ->
navigator.navigate(NavigationCommand(OngoingCallScreenDestination(navArgs.conversationId), BackStackMode.REMOVE_CURRENT))
InitiatingCallState.FlowState.Default -> { /* do nothing */ }

InitiatingCallState.FlowState.Default -> { /* do nothing */
}
}
}
with(sharedCallingViewModel) {
Expand Down Expand Up @@ -148,14 +151,14 @@ private fun InitiatingCallContent(
onSelfClearVideoPreview = onSelfClearVideoPreview
)
CallerDetails(
callState.conversationId,
conversationName = callState.conversationName,
isCameraOn = callState.isCameraOn,
isCbrEnabled = callState.isCbrEnabled,
avatarAssetId = callState.avatarAssetId,
conversationType = callState.conversationType,
membership = callState.membership,
callingLabel = stringResource(id = R.string.calling_label_ringing_call),
securityClassificationType = callState.securityClassificationType
callingLabel = stringResource(id = R.string.calling_label_ringing_call)
)
}
}
Expand All @@ -164,5 +167,5 @@ private fun InitiatingCallContent(
@Preview
@Composable
fun PreviewInitiatingCallScreen() {
InitiatingCallContent(CallState(), {}, {}, {}, {}, {}, {})
InitiatingCallContent(CallState(ConversationId("value", "domain")), {}, {}, {}, {}, {}, {})
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
Expand Down Expand Up @@ -69,7 +71,7 @@ import com.wire.android.ui.calling.ongoing.fullscreen.DoubleTapToast
import com.wire.android.ui.calling.ongoing.fullscreen.FullScreenTile
import com.wire.android.ui.calling.ongoing.fullscreen.SelectedParticipant
import com.wire.android.ui.calling.ongoing.participantsview.VerticalCallingPager
import com.wire.android.ui.common.SecurityClassificationBanner
import com.wire.android.ui.common.banner.SecurityClassificationBanner
import com.wire.android.ui.common.bottomsheet.WireBottomSheetScaffold
import com.wire.android.ui.common.colorsScheme
import com.wire.android.ui.common.dimensions
Expand All @@ -79,7 +81,7 @@ import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireDimensions
import com.wire.android.ui.theme.wireTypography
import com.wire.kalium.logic.feature.conversation.SecurityClassificationType
import com.wire.kalium.logic.data.id.ConversationId
import java.util.Locale

@RootNavGraph
Expand All @@ -102,14 +104,14 @@ fun OngoingCallScreen(
}
with(sharedCallingViewModel.callState) {
OngoingCallContent(
conversationId = conversationId,
conversationName = conversationName,
participants = participants,
isMuted = isMuted ?: true,
isCameraOn = isCameraOn,
isSpeakerOn = isSpeakerOn,
isCbrEnabled = isCbrEnabled,
isOnFrontCamera = isOnFrontCamera,
classificationType = securityClassificationType,
shouldShowDoubleTapToast = ongoingCallViewModel.shouldShowDoubleTapToast,
toggleSpeaker = sharedCallingViewModel::toggleSpeaker,
toggleMute = sharedCallingViewModel::toggleMute,
Expand All @@ -129,6 +131,7 @@ fun OngoingCallScreen(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun OngoingCallContent(
conversationId: ConversationId,
conversationName: ConversationName?,
participants: List<UICallParticipant>,
isMuted: Boolean,
Expand All @@ -137,7 +140,6 @@ private fun OngoingCallContent(
isSpeakerOn: Boolean,
isCbrEnabled: Boolean,
shouldShowDoubleTapToast: Boolean,
classificationType: SecurityClassificationType,
toggleSpeaker: () -> Unit,
toggleMute: () -> Unit,
hangUpCall: () -> Unit,
Expand All @@ -150,17 +152,10 @@ private fun OngoingCallContent(
requestVideoStreams: (participants: List<UICallParticipant>) -> Unit
) {

val sheetInitialValue =
if (classificationType == SecurityClassificationType.NONE) SheetValue.PartiallyExpanded else SheetValue.Expanded
val sheetInitialValue = SheetValue.PartiallyExpanded
val sheetState = rememberStandardBottomSheetState(
initialValue = sheetInitialValue
).also {
LaunchedEffect(Unit) {
// Same issue with expanded on other sheets, we need to use animateTo to fully expand programmatically.
if (sheetInitialValue == SheetValue.PartiallyExpanded) it.partialExpand()
else it.expand()
}
}
)

val scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = sheetState
Expand All @@ -186,11 +181,11 @@ private fun OngoingCallContent(
scaffoldState = scaffoldState,
sheetContent = {
CallingControls(
conversationId = conversationId,
isMuted = isMuted,
isCameraOn = isCameraOn,
isOnFrontCamera = isOnFrontCamera,
isSpeakerOn = isSpeakerOn,
classificationType = classificationType,
toggleSpeaker = toggleSpeaker,
toggleMute = toggleMute,
onHangUpCall = hangUpCall,
Expand Down Expand Up @@ -310,29 +305,27 @@ private fun OngoingCallTopBar(

@Composable
private fun CallingControls(
conversationId: ConversationId,
isMuted: Boolean,
isCameraOn: Boolean,
isSpeakerOn: Boolean,
isOnFrontCamera: Boolean,
classificationType: SecurityClassificationType,
toggleSpeaker: () -> Unit,
toggleMute: () -> Unit,
onHangUpCall: () -> Unit,
onToggleVideo: () -> Unit,
flipCamera: () -> Unit,
flipCamera: () -> Unit
) {
Column {
val topPadding = if (classificationType != SecurityClassificationType.NONE) {
dimensions().spacing8x
} else {
dimensions().spacing16x
}
Column(
modifier = Modifier.height(dimensions().defaultSheetPeekHeight)
) {
Spacer(modifier = Modifier.weight(1F))
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.padding(top = topPadding)
.height(dimensions().spacing56x)
) {
MicrophoneButton(isMuted = isMuted) { toggleMute() }
CameraButton(
Expand All @@ -355,7 +348,8 @@ private fun CallingControls(
onHangUpButtonClicked = onHangUpCall
)
}
SecurityClassificationBanner(classificationType, modifier = Modifier.padding(top = dimensions().spacing8x))
Spacer(modifier = Modifier.weight(1F))
SecurityClassificationBanner(conversationId)
}
}

Expand Down

0 comments on commit 3a65370

Please sign in to comment.