Skip to content

Commit

Permalink
Merge branch 'release/candidate' into ci/build-fdroid-for-regression-…
Browse files Browse the repository at this point in the history
…testing
  • Loading branch information
yamilmedina authored Jul 29, 2024
2 parents 1c78d1b + 411d97c commit 53ff0d0
Show file tree
Hide file tree
Showing 9 changed files with 199 additions and 30 deletions.
4 changes: 2 additions & 2 deletions app/src/main/kotlin/com/wire/android/ui/calling/CallState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ 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.CallStatus
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.data.call.ConversationTypeForCall
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId

Expand All @@ -38,7 +38,7 @@ data class CallState(
val isOnFrontCamera: Boolean = true,
val isSpeakerOn: Boolean = false,
val isCbrEnabled: Boolean = false,
val conversationType: ConversationType = ConversationType.OneOnOne,
val conversationTypeForCall: ConversationTypeForCall = ConversationTypeForCall.OneOnOne,
val membership: Membership = Membership.None,
val protocolInfo: Conversation.ProtocolInfo? = null,
val mlsVerificationStatus: Conversation.VerificationStatus = Conversation.VerificationStatus.NOT_VERIFIED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.android.util.ui.WireSessionImageLoader
import com.wire.kalium.logic.data.call.Call
import com.wire.kalium.logic.data.call.CallStatus
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.data.call.ConversationTypeForCall
import com.wire.kalium.logic.data.call.VideoState
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.conversation.ConversationDetails
Expand Down Expand Up @@ -128,7 +128,7 @@ class SharedCallingViewModel @AssistedInject constructor(
is ConversationDetails.Group -> {
callState.copy(
conversationName = getConversationName(details.conversation.name),
conversationType = ConversationType.Conference,
conversationTypeForCall = ConversationTypeForCall.Conference,
protocolInfo = details.conversation.protocol,
mlsVerificationStatus = details.conversation.mlsVerificationStatus,
proteusVerificationStatus = details.conversation.proteusVerificationStatus
Expand All @@ -141,7 +141,7 @@ class SharedCallingViewModel @AssistedInject constructor(
avatarAssetId = details.otherUser.completePicture?.let { assetId ->
ImageAsset.UserAvatarAsset(wireSessionImageLoader, assetId)
},
conversationType = ConversationType.OneOnOne,
conversationTypeForCall = ConversationTypeForCall.OneOnOne,
membership = userTypeMapper.toMembership(details.otherUser.userType),
protocolInfo = details.conversation.protocol,
mlsVerificationStatus = details.conversation.mlsVerificationStatus,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import com.wire.android.ui.home.conversationslist.model.Membership
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.data.call.ConversationTypeForCall
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
import java.util.Locale
Expand All @@ -61,7 +61,7 @@ fun CallerDetails(
isCameraOn: Boolean,
isCbrEnabled: Boolean,
avatarAssetId: ImageAsset.UserAvatarAsset?,
conversationType: ConversationType,
conversationTypeForCall: ConversationTypeForCall,
membership: Membership,
callingLabel: String,
protocolInfo: Conversation.ProtocolInfo?,
Expand Down Expand Up @@ -130,7 +130,7 @@ fun CallerDetails(
modifier = Modifier.padding(top = dimensions().spacing8x)
)

if (!isCameraOn && conversationType == ConversationType.OneOnOne) {
if (!isCameraOn && conversationTypeForCall == ConversationTypeForCall.OneOnOne) {
UserProfileAvatar(
avatarData = UserAvatarData(avatarAssetId),
size = dimensions().outgoingCallUserAvatarSize,
Expand All @@ -149,7 +149,7 @@ fun PreviewCallerDetails() {
isCameraOn = false,
isCbrEnabled = false,
avatarAssetId = null,
conversationType = ConversationType.OneOnOne,
conversationTypeForCall = ConversationTypeForCall.OneOnOne,
membership = Membership.Guest,
callingLabel = String.EMPTY,
protocolInfo = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ import com.wire.android.ui.common.visbility.rememberVisibilityState
import com.wire.android.ui.home.conversations.PermissionPermanentlyDeniedDialogState
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.permission.rememberRecordAudioPermissionFlow
import com.wire.kalium.logic.data.call.ConversationType
import com.wire.kalium.logic.data.call.ConversationTypeForCall
import com.wire.kalium.logic.data.id.ConversationId

@Suppress("ParameterWrapping")
Expand Down Expand Up @@ -247,7 +247,7 @@ private fun IncomingCallContent(
onVideoPreviewCreated = onVideoPreviewCreated,
onSelfClearVideoPreview = onSelfClearVideoPreview
)
val isCallingString = if (callState.conversationType == ConversationType.Conference) {
val isCallingString = if (callState.conversationTypeForCall == ConversationTypeForCall.Conference) {
stringResource(R.string.calling_label_incoming_call_someone_calling, callState.callerName ?: "")
} else stringResource(R.string.calling_label_incoming_call)

Expand All @@ -257,7 +257,7 @@ private fun IncomingCallContent(
isCameraOn = callState.isCameraOn,
isCbrEnabled = callState.isCbrEnabled,
avatarAssetId = callState.avatarAssetId,
conversationType = callState.conversationType,
conversationTypeForCall = callState.conversationTypeForCall,
membership = callState.membership,
callingLabel = isCallingString,
protocolInfo = callState.protocolInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ private fun OutgoingCallContent(
isCameraOn = callState.isCameraOn,
isCbrEnabled = callState.isCbrEnabled,
avatarAssetId = callState.avatarAssetId,
conversationType = callState.conversationType,
conversationTypeForCall = callState.conversationTypeForCall,
membership = callState.membership,
callingLabel = stringResource(id = R.string.calling_label_ringing_call),
protocolInfo = callState.protocolInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@

package com.wire.android.ui.common.topappbar

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
Expand All @@ -30,24 +33,32 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireDimensions
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.ui.PreviewMultipleThemes
import kotlin.math.ceil

@Composable
fun WireCenterAlignedTopAppBar(
title: String,
modifier: Modifier = Modifier,
titleStyle: TextStyle = MaterialTheme.wireTypography.title01,
maxLines: Int = 2,
subtitleContent: @Composable ColumnScope.() -> Unit = {},
onNavigationPressed: () -> Unit = {},
navigationIconType: NavigationIconType? = NavigationIconType.Back,
elevation: Dp = MaterialTheme.wireDimensions.topBarShadowElevation,
actions: @Composable RowScope.() -> Unit = {},
modifier: Modifier = Modifier,
bottomContent: @Composable ColumnScope.() -> Unit = {}
) {
WireCenterAlignedTopAppBar(
Expand All @@ -72,12 +83,12 @@ fun WireCenterAlignedTopAppBar(
@Composable
fun WireCenterAlignedTopAppBar(
titleContent: @Composable ColumnScope.() -> Unit,
modifier: Modifier = Modifier,
subtitleContent: @Composable ColumnScope.() -> Unit = {},
onNavigationPressed: () -> Unit = {},
navigationIconType: NavigationIconType? = NavigationIconType.Back,
elevation: Dp = MaterialTheme.wireDimensions.topBarShadowElevation,
actions: @Composable RowScope.() -> Unit = {},
modifier: Modifier = Modifier,
bottomContent: @Composable ColumnScope.() -> Unit = {}
) {
Surface(
Expand Down Expand Up @@ -106,16 +117,76 @@ fun WireCenterAlignedTopAppBar(
fun WireTopAppBarTitle(
title: String,
style: TextStyle,
modifier: Modifier = Modifier,
maxLines: Int = 2
) {
Text(
modifier = Modifier.padding(
start = dimensions().spacing6x,
end = dimensions().spacing6x
),
text = title,
style = style,
maxLines = maxLines,
overflow = TextOverflow.Ellipsis
)
// There's an ongoing issue about multiline text taking all width available instead of wrapping visible text.
// https://issuetracker.google.com/issues/206039942
// It's very noticeable on TopAppBar because due to that issue, the title is not centered, even if there are large enough empty spaces
// on both sides and all lines of text are actually shorter and could fit at the center.
// This workaround is based on this: https://stackoverflow.com/a/69947555, but instead of using SubcomposeLayout, we just measure text.
BoxWithConstraints(
modifier = modifier
) {
val textMeasurer = rememberTextMeasurer()
val textLayoutResult: TextLayoutResult = textMeasurer.measure(
text = title,
style = style,
maxLines = maxLines,
overflow = TextOverflow.Ellipsis,
constraints = Constraints(
minWidth = 0,
minHeight = 0,
maxWidth = constraints.maxWidth,
maxHeight = constraints.maxHeight
)
)
val width = with(LocalDensity.current) {
(0 until textLayoutResult.lineCount).maxOf { line ->
ceil(textLayoutResult.getLineRight(line) - textLayoutResult.getLineLeft(line)).toInt()
}.toDp()
}
Text(
modifier = Modifier
.padding(horizontal = dimensions().spacing6x)
.width(width),
text = title,
style = style,
maxLines = maxLines,
overflow = TextOverflow.Ellipsis,
)
}
}

@PreviewMultipleThemes
@Composable
fun PreviewWireCenterAlignedTopAppBarWithDefaultTitle() = WireTheme {
Box(modifier = Modifier.width(400.dp)) {
WireCenterAlignedTopAppBar(
title = "This is title",
titleStyle = MaterialTheme.wireTypography.title01
)
}
}

@PreviewMultipleThemes
@Composable
fun PreviewWireCenterAlignedTopAppBarWithDefaultTwoLinesTitle() = WireTheme {
Box(modifier = Modifier.width(400.dp)) {
WireCenterAlignedTopAppBar(
title = "This is title is very long this_is_a_very_long_word",
titleStyle = MaterialTheme.wireTypography.title01
)
}
}

@PreviewMultipleThemes
@Composable
fun PreviewWireCenterAlignedTopAppBarWithDefaultTwoLinesTooLongTitle() = WireTheme {
Box(modifier = Modifier.width(400.dp)) {
WireCenterAlignedTopAppBar(
title = "This is title is even longer than previous one this_is_a_very_long_word",
titleStyle = MaterialTheme.wireTypography.title01
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ class IsFileSharingEnabledViewModelImpl @Inject constructor(
}

private fun getIsFileSharingEnabled() = viewModelScope.launch {
state = when (isFileSharingEnabledUseCase().state) {
FileSharingStatus.Value.Disabled -> false
FileSharingStatus.Value.EnabledAll,
is FileSharingStatus.Value.EnabledSome -> true
isFileSharingEnabledUseCase().state.let {
state = when (it) {
FileSharingStatus.Value.EnabledAll,
is FileSharingStatus.Value.EnabledSome -> true
FileSharingStatus.Value.Disabled -> false
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Wire
* Copyright (C) 2024 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.wire.android.ui.home.messagecomposer.attachments

import com.wire.android.config.CoroutineTestExtension
import com.wire.kalium.logic.configuration.FileSharingStatus
import com.wire.kalium.logic.feature.user.IsFileSharingEnabledUseCase
import io.mockk.MockKAnnotations
import io.mockk.coVerify
import io.mockk.every
import io.mockk.impl.annotations.MockK
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

@ExtendWith(CoroutineTestExtension::class)
class IsFileSharingEnabledViewModelTest {

@Test
fun `given fileSharing is allowed, then state should be true`() {
val (arrangement, viewModel) = Arrangement().arrange {
withFileSharingStatus(FileSharingStatus.Value.EnabledAll)
}

assertTrue(viewModel.isFileSharingEnabled())
coVerify(exactly = 1) {
arrangement.isFileSharingEnabledUseCase()
}
}

@Test
fun `given fileSharing is disabled, then state should be false`() {
val (arrangement, viewModel) = Arrangement().arrange {
withFileSharingStatus(FileSharingStatus.Value.Disabled)
}

assertFalse(viewModel.isFileSharingEnabled())
coVerify(exactly = 1) {
arrangement.isFileSharingEnabledUseCase()
}
}

@Test
fun `given fileSharing is allowed for some, then state should be true`() {
val (arrangement, viewModel) = Arrangement().arrange {
withFileSharingStatus(FileSharingStatus.Value.EnabledSome(emptyList()))
}

assertTrue(viewModel.isFileSharingEnabled())
coVerify(exactly = 1) {
arrangement.isFileSharingEnabledUseCase()
}
}

private class Arrangement {

@MockK
lateinit var isFileSharingEnabledUseCase: IsFileSharingEnabledUseCase

private lateinit var viewModel: IsFileSharingEnabledViewModel

init {
MockKAnnotations.init(this, relaxUnitFun = true)
}

fun withFileSharingStatus(result: FileSharingStatus.Value) = apply {
every { isFileSharingEnabledUseCase() } returns FileSharingStatus(
result,
true
)
}

fun arrange(block: Arrangement.() -> Unit) = apply(block).let {
viewModel = IsFileSharingEnabledViewModelImpl(
isFileSharingEnabledUseCase
)
this to viewModel
}
}
}
2 changes: 1 addition & 1 deletion kalium
Submodule kalium updated 29 files
+1 βˆ’1 data/src/commonMain/kotlin/com/wire/kalium/logic/data/call/ConversationTypeForCall.kt
+5 βˆ’0 logic/src/androidInstrumentedTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt
+3 βˆ’4 logic/src/androidInstrumentedTest/kotlin/com/wire/kalium/logic/feature/call/scenario/OnIncomingCallTest.kt
+2 βˆ’0 logic/src/appleMain/kotlin/com/wire/kalium/logic/feature/call/CallManagerImpl.kt
+2 βˆ’0 logic/src/appleMain/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+8 βˆ’9 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/CallManagerImpl.kt
+3 βˆ’0 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+2 βˆ’2 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnIncomingCall.kt
+2 βˆ’2 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallRepository.kt
+44 βˆ’28 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/mapper/CallMapper.kt
+6 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt
+8 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt
+1 βˆ’1 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigMapper.kt
+24 βˆ’12 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt
+2 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/CallManager.kt
+10 βˆ’7 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/CallsScope.kt
+2 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+71 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/usecase/GetCallConversationTypeProvider.kt
+6 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/usecase/StartCallUseCase.kt
+17 βˆ’7 logic/src/commonTest/kotlin/com/wire/kalium/logic/data/call/CallMapperTest.kt
+10 βˆ’10 logic/src/commonTest/kotlin/com/wire/kalium/logic/data/call/CallRepositoryTest.kt
+259 βˆ’0 logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/GetCallConversationTypeProviderTest.kt
+21 βˆ’4 logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/StartCallUseCaseTest.kt
+1 βˆ’1 ...del/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/featureConfigs/FeatureConfigResponse.kt
+3 βˆ’0 persistence/src/commonMain/db_user/com/wire/kalium/persistence/Conversations.sq
+2 βˆ’2 persistence/src/commonMain/db_user/com/wire/kalium/persistence/Notification.sq
+1 βˆ’0 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAO.kt
+5 βˆ’0 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAOImpl.kt
+24 βˆ’5 persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/message/MessageNotificationsTest.kt

0 comments on commit 53ff0d0

Please sign in to comment.