Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: media gallery [WPB-4989] #2490

Merged
merged 16 commits into from
Dec 4, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,9 @@ package com.wire.android.di.accountScoped

import com.wire.android.di.CurrentAccount
import com.wire.android.di.KaliumCoreLogic
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.asset.GetAssetMessagesForConversationUseCase
import com.wire.kalium.logic.feature.asset.GetMessageAssetUseCase
import com.wire.kalium.logic.feature.asset.ScheduleNewAssetMessageUseCase
import com.wire.kalium.logic.feature.asset.UpdateAssetMessageDownloadStatusUseCase
Expand All @@ -47,6 +45,9 @@ import com.wire.kalium.logic.feature.message.ephemeral.EnqueueMessageSelfDeletio
import com.wire.kalium.logic.feature.message.getPaginatedFlowOfMessagesByConversation
import com.wire.kalium.logic.feature.message.getPaginatedFlowOfMessagesBySearchQueryAndConversation
import com.wire.kalium.logic.feature.sessionreset.ResetSessionUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.scopes.ViewModelScoped

Expand Down Expand Up @@ -151,6 +152,11 @@ class MessageModule {
fun provideGetPaginatedMessagesUseCase(messageScope: MessageScope): GetPaginatedFlowOfMessagesByConversationUseCase =
messageScope.getPaginatedFlowOfMessagesByConversation

@ViewModelScoped
@Provides
fun provideGetAssetMessagesUseCase(messageScope: MessageScope): GetAssetMessagesForConversationUseCase =
messageScope.getAssetMessagesByConversation

@ViewModelScoped
@Provides
fun provideGetPaginatedFlowOfMessagesBySearchQueryAndConversation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
message: Message.Regular,
sender: User?,
userList: List<User>
) = when (val content = message.content) {
): UIMessageContent = when (val content = message.content) {

Check warning on line 62 in app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt#L62

Added line #L62 was not covered by tests
is Asset -> {
when (val metadata = content.value.metadata) {
is AssetContent.AssetMetadata.Audio -> {
Expand Down
41 changes: 41 additions & 0 deletions app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Wire
* Copyright (C) 2023 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.mapper

import com.wire.android.R
import com.wire.android.ui.home.conversations.model.messagetypes.asset.UIAsset
import com.wire.android.util.ui.UIText
import com.wire.kalium.logic.data.asset.AssetMessage
import javax.inject.Inject

class UIAssetMapper @Inject constructor() {

Check warning on line 26 in app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt#L26

Added line #L26 was not covered by tests

fun toUIAsset(assetMessage: AssetMessage): UIAsset {
saleniuk marked this conversation as resolved.
Show resolved Hide resolved
return UIAsset(
assetId = assetMessage.assetId,
time = assetMessage.time,

Check warning on line 31 in app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt#L29-L31

Added lines #L29 - L31 were not covered by tests
username = assetMessage.username?.let { UIText.DynamicString(it) }
?: UIText.StringResource(R.string.username_unavailable_label),
conversationId = assetMessage.conversationId,
messageId = assetMessage.messageId,
assetPath = assetMessage.assetPath,
downloadStatus = assetMessage.downloadStatus,
isSelfAsset = assetMessage.isSelfAsset

Check warning on line 38 in app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/UIAssetMapper.kt#L33-L38

Added lines #L33 - L38 were not covered by tests
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.topappbar.WireTopAppBarTitle
import com.wire.android.ui.common.visbility.rememberVisibilityState
import com.wire.android.ui.destinations.AddMembersSearchScreenDestination
import com.wire.android.ui.destinations.ConversationMediaScreenDestination
import com.wire.android.ui.destinations.EditConversationNameScreenDestination
import com.wire.android.ui.destinations.EditGuestAccessScreenDestination
import com.wire.android.ui.destinations.EditSelfDeletingMessagesScreenDestination
Expand Down Expand Up @@ -142,6 +143,16 @@ fun GroupConversationDetailsScreen(
)
}

val onConversationMediaClick: () -> Unit = {
navigator.navigate(
NavigationCommand(
ConversationMediaScreenDestination(
conversationId = viewModel.conversationId
)
)
)
}

GroupConversationDetailsContent(
conversationSheetContent = viewModel.conversationSheetContent,
bottomSheetEventsHandler = viewModel,
Expand Down Expand Up @@ -222,7 +233,8 @@ fun GroupConversationDetailsScreen(
navigator.navigate(NavigationCommand(EditConversationNameScreenDestination(viewModel.conversationId)))
},
isLoading = viewModel.requestInProgress,
onSearchConversationMessagesClick = onSearchConversationMessagesClick
onSearchConversationMessagesClick = onSearchConversationMessagesClick,
onConversationMediaClick = onConversationMediaClick
)

val tryAgainSnackBarMessage = stringResource(id = R.string.error_unknown_message)
Expand Down Expand Up @@ -263,7 +275,8 @@ private fun GroupConversationDetailsContent(
onDeleteGroup: (GroupDialogState) -> Unit,
groupParticipantsState: GroupConversationParticipantsState,
isLoading: Boolean,
onSearchConversationMessagesClick: () -> Unit
onSearchConversationMessagesClick: () -> Unit,
onConversationMediaClick: () -> Unit
) {
val scope = rememberCoroutineScope()
val resources = LocalContext.current.resources
Expand Down Expand Up @@ -332,7 +345,8 @@ private fun GroupConversationDetailsContent(
conversationId = it.conversationId,
totalParticipants = groupParticipantsState.data.allCount,
isLoading = isLoading,
onSearchConversationMessagesClick = onSearchConversationMessagesClick
onSearchConversationMessagesClick = onSearchConversationMessagesClick,
onConversationMediaClick = onConversationMediaClick
)
}
WireTabRow(
Expand Down Expand Up @@ -539,7 +553,8 @@ fun PreviewGroupConversationDetails() {
onEditGroupName = {},
onEditSelfDeletingMessages = {},
onEditGuestAccess = {},
onSearchConversationMessagesClick = {}
onSearchConversationMessagesClick = {},
onConversationMediaClick = {}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import com.wire.android.R
import com.wire.android.ui.common.colorsScheme
import com.wire.android.ui.common.conversationColor
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.home.conversations.search.messages.SearchConversationMessagesButton
import com.wire.android.ui.common.spacers.VerticalSpace
import com.wire.android.ui.home.conversationslist.common.GroupConversationAvatar
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
Expand All @@ -52,6 +52,7 @@ fun GroupConversationDetailsTopBarCollapsing(
totalParticipants: Int,
isLoading: Boolean,
onSearchConversationMessagesClick: () -> Unit,
onConversationMediaClick: () -> Unit,
modifier: Modifier = Modifier
) {
Column(
Expand Down Expand Up @@ -123,8 +124,10 @@ fun GroupConversationDetailsTopBarCollapsing(
}
}

SearchConversationMessagesButton(
onSearchConversationMessagesClick = onSearchConversationMessagesClick
VerticalSpace.x24()
SearchAndMediaRow(
onSearchConversationMessagesClick = onSearchConversationMessagesClick,
onConversationMediaClick = onConversationMediaClick
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Wire
* Copyright (C) 2023 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.conversations.details

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.common.spacers.HorizontalSpace
import com.wire.android.ui.home.conversations.media.ConversationMediaButton
import com.wire.android.ui.home.conversations.search.messages.SearchConversationMessagesButton

@Composable
fun SearchAndMediaRow(
onSearchConversationMessagesClick: () -> Unit,
onConversationMediaClick: () -> Unit
) {
Row(modifier = Modifier.padding(horizontal = dimensions().spacing16x)) {
SearchConversationMessagesButton(
modifier = Modifier.weight(1F),
onClick = onSearchConversationMessagesClick
)
HorizontalSpace.x8()
ConversationMediaButton(
modifier = Modifier.weight(1F),
onClick = onConversationMediaClick
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* Wire
* Copyright (C) 2023 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.conversations.media

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.wire.android.mapper.UIAssetMapper
import com.wire.android.navigation.SavedStateViewModel
import com.wire.android.ui.home.conversations.ConversationNavArgs
import com.wire.android.ui.navArgs
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.data.message.Message
import com.wire.kalium.logic.feature.asset.GetAssetMessagesForConversationUseCase
import com.wire.kalium.logic.feature.asset.GetMessageAssetUseCase
import com.wire.kalium.logic.feature.asset.MessageAssetResult
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject

@HiltViewModel
@Suppress("LongParameterList", "TooManyFunctions")
class ConversationAssetMessagesViewModel @Inject constructor(
override val savedStateHandle: SavedStateHandle,
private val dispatchers: DispatcherProvider,
private val getAssets: GetAssetMessagesForConversationUseCase,
private val getPrivateAsset: GetMessageAssetUseCase,
private val assetMapper: UIAssetMapper,
) : SavedStateViewModel(savedStateHandle) {

Check warning on line 50 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L44-L50

Added lines #L44 - L50 were not covered by tests

private val conversationNavArgs: ConversationNavArgs = savedStateHandle.navArgs()
val conversationId: QualifiedID = conversationNavArgs.conversationId

Check warning on line 53 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L52-L53

Added lines #L52 - L53 were not covered by tests

var viewState by mutableStateOf(ConversationAssetMessagesViewState())

Check warning on line 55 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L55

Added line #L55 was not covered by tests
private set

private var continueLoading by mutableStateOf(true)
private var isLoading by mutableStateOf(false)

Check warning on line 59 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L58-L59

Added lines #L58 - L59 were not covered by tests
saleniuk marked this conversation as resolved.
Show resolved Hide resolved

init {
loadAssets()
}

Check warning on line 63 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L61-L63

Added lines #L61 - L63 were not covered by tests

fun continueLoading(shouldContinue: Boolean) {
if (shouldContinue) {
if (!continueLoading) {
continueLoading = true
loadAssets()

Check warning on line 69 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L68-L69

Added lines #L68 - L69 were not covered by tests
}
} else {
continueLoading = false

Check warning on line 72 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L72

Added line #L72 was not covered by tests
}
}

Check warning on line 74 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L74

Added line #L74 was not covered by tests
saleniuk marked this conversation as resolved.
Show resolved Hide resolved

private fun loadAssets() = viewModelScope.launch {

Check warning on line 76 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L76

Added line #L76 was not covered by tests
if (isLoading) {
return@launch

Check warning on line 78 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L78

Added line #L78 was not covered by tests
}
isLoading = true
try {

Check warning on line 81 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L80-L81

Added lines #L80 - L81 were not covered by tests
while (continueLoading) {
val currentOffset = viewState.currentOffset
val uiAssetList = withContext(dispatchers.io()) {
getAssets.invoke(
conversationId = conversationId,
limit = BATCH_SIZE,
offset = currentOffset
).map(assetMapper::toUIAsset)

Check warning on line 89 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L83-L89

Added lines #L83 - L89 were not covered by tests
}

// imitate loading new asset batch
viewState = viewState.copy(messages = viewState.messages.plus(uiAssetList.map {
it.copy(

Check warning on line 94 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L93-L94

Added lines #L93 - L94 were not covered by tests
downloadStatus = if (it.assetPath == null && it.downloadStatus != Message.DownloadStatus.FAILED_DOWNLOAD) {
Message.DownloadStatus.DOWNLOAD_IN_PROGRESS

Check warning on line 96 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L96

Added line #L96 was not covered by tests
} else {
it.downloadStatus

Check warning on line 98 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L98

Added line #L98 was not covered by tests
}
)
}).toImmutableList())

Check warning on line 101 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L101

Added line #L101 was not covered by tests

if (uiAssetList.size >= BATCH_SIZE) {
val uiMessages = uiAssetList.map { uiAsset ->

Check warning on line 104 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L104

Added line #L104 was not covered by tests
if (uiAsset.assetPath == null) {
val assetPath = withContext(dispatchers.io()) {
when (val asset = getPrivateAsset.invoke(uiAsset.conversationId, uiAsset.messageId).await()) {

Check warning on line 107 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L106-L107

Added lines #L106 - L107 were not covered by tests
is MessageAssetResult.Failure -> null
is MessageAssetResult.Success -> asset.decodedAssetPath

Check warning on line 109 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L109

Added line #L109 was not covered by tests
}
}
uiAsset.copy(assetPath = assetPath)

Check warning on line 112 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L112

Added line #L112 was not covered by tests
} else {
uiAsset

Check warning on line 114 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L114

Added line #L114 was not covered by tests
}
}

viewState = viewState.copy(
messages = viewState.messages.dropLast(uiMessages.size).plus(uiMessages).toImmutableList(),
currentOffset = viewState.currentOffset + BATCH_SIZE

Check warning on line 120 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L118-L120

Added lines #L118 - L120 were not covered by tests
)
} else {
continueLoading = false

Check warning on line 123 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L123

Added line #L123 was not covered by tests
}
}
} finally {
isLoading = false

Check warning on line 127 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L127

Added line #L127 was not covered by tests
}
}

Check warning on line 129 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewModel.kt#L129

Added line #L129 was not covered by tests

companion object {
const val BATCH_SIZE = 5
saleniuk marked this conversation as resolved.
Show resolved Hide resolved
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Wire
* Copyright (C) 2023 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.conversations.media

import androidx.compose.runtime.Stable
import com.wire.android.ui.home.conversations.model.messagetypes.asset.UIAsset
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf

@Stable
data class ConversationAssetMessagesViewState(
val messages: ImmutableList<UIAsset> = persistentListOf(),
val currentOffset: Int = 0
saleniuk marked this conversation as resolved.
Show resolved Hide resolved
)

Check warning on line 32 in app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewState.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationAssetMessagesViewState.kt#L28-L32

Added lines #L28 - L32 were not covered by tests