Skip to content

Commit

Permalink
refactor: unify and simplify conversation lists [WPB-9433] (#3480)
Browse files Browse the repository at this point in the history
  • Loading branch information
saleniuk authored Oct 2, 2024
1 parent 864094a commit c5e2908
Show file tree
Hide file tree
Showing 22 changed files with 1,001 additions and 905 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import com.ramcosta.composedestinations.spec.Direction
import com.wire.android.R
import com.wire.android.ui.destinations.AllConversationScreenDestination
import com.wire.android.ui.destinations.AllConversationsScreenDestination
import com.wire.android.ui.destinations.ArchiveScreenDestination
import com.wire.android.ui.destinations.SettingsScreenDestination
import com.wire.android.ui.destinations.VaultScreenDestination
Expand All @@ -43,7 +43,7 @@ sealed class HomeDestination(
icon = R.drawable.ic_conversation,
isSearchable = true,
withNewConversationFab = true,
direction = AllConversationScreenDestination
direction = AllConversationsScreenDestination
)

data object Settings : HomeDestination(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package com.wire.android.ui.calling

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
Expand Down Expand Up @@ -148,9 +147,9 @@ class StartingCallActivity : CallActivity() {
}

fun getOutgoingCallIntent(
activity: Activity,
context: Context,
conversationId: String
) = Intent(activity, StartingCallActivity::class.java).apply {
) = Intent(context, StartingCallActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
putExtra(EXTRA_CONVERSATION_ID, conversationId)
putExtra(EXTRA_SCREEN_TYPE, StartingCallScreenType.Outgoing.name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
package com.wire.android.ui.calling.ongoing

import android.annotation.SuppressLint
import android.app.Activity
import android.app.PictureInPictureParams
import android.app.RemoteAction
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Icon
import android.os.Bundle
Expand Down Expand Up @@ -126,9 +126,9 @@ class OngoingCallActivity : CallActivity() {
}

fun getOngoingCallIntent(
activity: Activity,
context: Context,
conversationId: String
) = Intent(activity, OngoingCallActivity::class.java).apply {
) = Intent(context, OngoingCallActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
putExtra(EXTRA_CONVERSATION_ID, conversationId)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* 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.archive

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import com.wire.android.R
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.ui.PreviewMultipleThemes

@Composable
fun ArchiveEmptyContent(modifier: Modifier = Modifier) {
Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
modifier = Modifier.padding(
bottom = dimensions().spacing24x,
),
text = stringResource(R.string.archive_screen_empty_state_title),
style = MaterialTheme.wireTypography.title01,
color = MaterialTheme.wireColorScheme.onSurface,
)
Text(
modifier = Modifier.padding(
bottom = dimensions().spacing8x,
start = dimensions().spacing40x,
end = dimensions().spacing40x
),
text = stringResource(R.string.archive_screen_empty_state_description),
style = MaterialTheme.wireTypography.body01,
textAlign = TextAlign.Center,
color = MaterialTheme.wireColorScheme.secondaryText,
)
}
}

@PreviewMultipleThemes
@Composable
fun PreviewArchiveEmptyContent() = WireTheme {
ArchiveEmptyContent()
}
101 changes: 41 additions & 60 deletions app/src/main/kotlin/com/wire/android/ui/home/archive/ArchiveScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,87 +18,68 @@

package com.wire.android.ui.home.archive

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import com.wire.android.R
import com.wire.android.navigation.HomeNavGraph
import com.wire.android.navigation.WireDestination
import com.wire.android.ui.common.dimensions
import com.wire.android.navigation.rememberNavigator
import com.wire.android.ui.common.topappbar.search.rememberSearchbarState
import com.wire.android.ui.home.HomeStateHolder
import com.wire.android.ui.home.conversationslist.ConversationItemType
import com.wire.android.ui.home.conversationslist.ConversationRouterHomeBridge
import com.wire.android.ui.home.conversationslist.ConversationListViewModelPreview
import com.wire.android.ui.home.conversationslist.ConversationsScreenContent
import com.wire.android.ui.home.conversationslist.common.previewConversationFolders
import com.wire.android.ui.home.conversationslist.model.ConversationsSource
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.ui.theme.WireTheme
import com.wire.android.util.ui.PreviewMultipleThemes
import kotlinx.collections.immutable.persistentMapOf

/**
* ArchiveScreen composable function.
*
* This screen leverages the ConversationRouterHomeBridge to render its UI and logic.
* Reasons for using ConversationRouterHomeBridge:
* 1. **Consistency**: Ensures a uniform UI/UX between the Archive and Conversation screens.
* 2. **Code Efficiency**: Eliminates redundancy by reusing shared logic and components.
* 3. **Flexibility**: Accommodates distinct data queries while retaining core UI logic.
* 4. **Maintainability**: Centralizes updates, reducing potential bugs and inconsistencies.
* 5. **Optimization**: Speeds up the development cycle by reusing established components.
*/
@HomeNavGraph
@WireDestination
@Composable
fun ArchiveScreen(homeStateHolder: HomeStateHolder) {
with(homeStateHolder) {
ConversationRouterHomeBridge(
ConversationsScreenContent(
navigator = navigator,
conversationItemType = ConversationItemType.ALL_CONVERSATIONS,
searchBarState = searchBarState,
conversationsSource = ConversationsSource.ARCHIVE,
lazyListState = currentLazyListState,
emptyListContent = { ArchiveEmptyContent() }
)
}
}

@PreviewMultipleThemes
@Composable
fun ArchivedConversationsEmptyStateScreen(modifier: Modifier = Modifier) {
Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
modifier = Modifier.padding(
bottom = dimensions().spacing24x,
),
text = stringResource(R.string.archive_screen_empty_state_title),
style = MaterialTheme.wireTypography.title01,
color = MaterialTheme.wireColorScheme.onSurface,
)
Text(
modifier = Modifier.padding(
bottom = dimensions().spacing8x,
start = dimensions().spacing40x,
end = dimensions().spacing40x
),
text = stringResource(R.string.archive_screen_empty_state_description),
style = MaterialTheme.wireTypography.body01,
textAlign = TextAlign.Center,
color = MaterialTheme.wireColorScheme.secondaryText,
)
}
fun PreviewArchiveEmptyScreen() = WireTheme {
ConversationsScreenContent(
navigator = rememberNavigator {},
searchBarState = rememberSearchbarState(),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
conversationListViewModel = ConversationListViewModelPreview(persistentMapOf()),
)
}

@PreviewMultipleThemes
@Composable
fun PreviewArchiveEmptySearchScreen() = WireTheme {
ConversationsScreenContent(
navigator = rememberNavigator {},
searchBarState = rememberSearchbarState(searchQueryTextState = TextFieldState(initialText = "er")),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
conversationListViewModel = ConversationListViewModelPreview(persistentMapOf(), "er"),
)
}

@Preview(showBackground = false)
@PreviewMultipleThemes
@Composable
fun PreviewArchiveEmptyScreen() {
ArchivedConversationsEmptyStateScreen()
fun PreviewArchiveScreen() = WireTheme {
ConversationsScreenContent(
navigator = rememberNavigator {},
searchBarState = rememberSearchbarState(searchQueryTextState = TextFieldState(initialText = "er")),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
conversationListViewModel = ConversationListViewModelPreview(previewConversationFolders(), "er"),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,18 @@ import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.result.ResultRecipient
import com.wire.android.R
import com.wire.android.appLogger
import com.wire.android.feature.analytics.AnonymousAnalyticsManagerImpl
import com.wire.android.feature.analytics.model.AnalyticsEvent
import com.wire.android.feature.sketch.destinations.DrawingCanvasScreenDestination
import com.wire.android.feature.sketch.model.DrawingCanvasNavArgs
import com.wire.android.feature.sketch.model.DrawingCanvasNavBackArgs
import com.wire.android.feature.analytics.AnonymousAnalyticsManagerImpl
import com.wire.android.feature.analytics.model.AnalyticsEvent
import com.wire.android.mapper.MessageDateTimeGroup
import com.wire.android.media.audiomessage.AudioState
import com.wire.android.model.SnackBarMessage
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.Navigator
import com.wire.android.navigation.WireDestination
import com.wire.android.ui.LocalActivity
import com.wire.android.ui.calling.getOutgoingCallIntent
import com.wire.android.ui.calling.ongoing.getOngoingCallIntent
import com.wire.android.ui.common.bottomsheet.rememberWireModalSheetState
Expand Down Expand Up @@ -262,7 +261,7 @@ fun ConversationScreen(
// then ViewModel also detects it's removed and calls onNotFound which can execute navigateBack again and close the app
var alreadyDeletedByUser by rememberSaveable { mutableStateOf(false) }

val activity = LocalActivity.current
val context = LocalContext.current

LaunchedEffect(conversationScreenState.isAnySheetVisible) {
with(messageComposerStateHolder) {
Expand Down Expand Up @@ -308,8 +307,8 @@ fun ConversationScreen(
onDismiss = ::dismissJoinCallAnywayDialog,
onConfirm = {
joinAnyway {
getOngoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOngoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
AnonymousAnalyticsManagerImpl.sendEvent(event = AnalyticsEvent.CallJoined)
}
Expand All @@ -322,8 +321,8 @@ fun ConversationScreen(
ConversationScreenDialogType.ONGOING_ACTIVE_CALL -> {
OngoingActiveCallDialog(onJoinAnyways = {
conversationListCallViewModel.endEstablishedCallIfAny {
getOutgoingCallIntent(activity, conversationListCallViewModel.conversationId.toString()).run {
activity.startActivity(this)
getOutgoingCallIntent(context, conversationListCallViewModel.conversationId.toString()).run {
context.startActivity(this)
}
AnonymousAnalyticsManagerImpl.sendEvent(event = AnalyticsEvent.CallJoined)
}
Expand All @@ -349,13 +348,13 @@ fun ConversationScreen(
coroutineScope,
conversationInfoViewModel.conversationInfoViewState.conversationType,
onOpenOutgoingCallScreen = {
getOutgoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOutgoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
},
onOpenOngoingCallScreen = {
getOngoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOngoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
}
)
Expand Down Expand Up @@ -395,13 +394,13 @@ fun ConversationScreen(
coroutineScope,
conversationInfoViewModel.conversationInfoViewState.conversationType,
onOpenOutgoingCallScreen = {
getOutgoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOutgoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
},
onOpenOngoingCallScreen = {
getOngoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOngoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
}
)
Expand Down Expand Up @@ -480,22 +479,22 @@ fun ConversationScreen(
coroutineScope,
conversationInfoViewModel.conversationInfoViewState.conversationType,
onOpenOutgoingCallScreen = {
getOutgoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOutgoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
},
onOpenOngoingCallScreen = {
getOngoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOngoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
}
)
},
onJoinCall = {
conversationListCallViewModel.joinOngoingCall {
AnonymousAnalyticsManagerImpl.sendEvent(event = AnalyticsEvent.CallJoined)
getOngoingCallIntent(activity, it.toString()).run {
activity.startActivity(this)
getOngoingCallIntent(context, it.toString()).run {
context.startActivity(this)
}
}
},
Expand Down
Loading

0 comments on commit c5e2908

Please sign in to comment.