Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -21,6 +21,14 @@ package com.wire.android.mapper
import com.wire.android.R
import com.wire.android.ui.home.conversations.findUser
import com.wire.android.ui.home.conversations.model.UIMessageContent
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.ConversationStartedWithMembers
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.FederationMemberRemoved
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.MemberAdded
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.MemberFailedToAdd
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.MemberJoined
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.MemberLeft
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.MemberRemoved
import com.wire.android.ui.home.conversations.model.UIMessageContent.SystemMessage.TeamMemberRemoved
import com.wire.android.ui.home.conversations.selfdeletion.SelfDeletionMapper.toSelfDeletionDuration
import com.wire.android.util.formatFullDateShortTime
import com.wire.android.util.orDefault
Expand Down Expand Up @@ -245,9 +253,9 @@ class SystemMessageContentMapper @Inject constructor(
return when (content) {
is Added ->
if (isAuthorSelfAction) {
UIMessageContent.SystemMessage.MemberJoined(author = authorName, isSelfTriggered = isSelfTriggered)
MemberJoined(author = authorName, isSelfTriggered = isSelfTriggered)
} else {
UIMessageContent.SystemMessage.MemberAdded(
MemberAdded(
author = authorName,
memberNames = memberNameList,
isSelfTriggered = isSelfTriggered
Expand All @@ -256,20 +264,20 @@ class SystemMessageContentMapper @Inject constructor(

is Removed ->
if (isAuthorSelfAction) {
UIMessageContent.SystemMessage.MemberLeft(author = authorName, isSelfTriggered = isSelfTriggered)
MemberLeft(author = authorName, isSelfTriggered = isSelfTriggered)
} else {
UIMessageContent.SystemMessage.MemberRemoved(
MemberRemoved(
author = authorName,
memberNames = memberNameList,
isSelfTriggered = isSelfTriggered
)
}

is CreationAdded -> {
UIMessageContent.SystemMessage.ConversationStartedWithMembers(memberNames = memberNameList)
ConversationStartedWithMembers(memberNames = memberNameList)
}

is FailedToAdd -> UIMessageContent.SystemMessage.MemberFailedToAdd(
is FailedToAdd -> MemberFailedToAdd(
memberNames = memberNameList,
type = when (content.type) {
FailedToAdd.Type.Federation -> UIMessageContent.SystemMessage.MemberFailedToAdd.Type.Federation
Expand All @@ -279,11 +287,11 @@ class SystemMessageContentMapper @Inject constructor(
}
)

is MemberChange.FederationRemoved -> UIMessageContent.SystemMessage.FederationMemberRemoved(
is MemberChange.FederationRemoved -> FederationMemberRemoved(
memberNames = memberNameList
)

is MemberChange.RemovedFromTeam -> UIMessageContent.SystemMessage.TeamMemberRemoved(
is MemberChange.RemovedFromTeam -> TeamMemberRemoved(
author = authorName,
memberNames = memberNameList
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.ramcosta.composedestinations.spec.Direction
import com.wire.android.BuildConfig
import com.wire.android.R
import com.wire.android.util.EmailComposer
import com.wire.android.util.externalShareChooserIntent
import com.wire.android.util.getDeviceIdString
import com.wire.android.util.getGitBuildId
import com.wire.android.util.sha256
Expand Down Expand Up @@ -100,7 +101,7 @@ object GiveFeedbackDestination : IntentDirection {
)
)
intent.selector = Intent(Intent.ACTION_SENDTO).setData(Uri.parse("mailto:"))
return Intent.createChooser(intent, context.getString(R.string.send_feedback_choose_email))
return context.externalShareChooserIntent(intent, context.getString(R.string.send_feedback_choose_email))
}

override val route: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import com.ramcosta.composedestinations.generated.app.destinations.OtherUserProf
import com.ramcosta.composedestinations.generated.app.destinations.WelcomeScreenDestination
import com.wire.android.ui.authentication.login.LoginPasswordPath
import com.wire.android.ui.newauthentication.login.NewLoginViewModel
import com.wire.android.ui.sharing.ImportMediaNavArgs
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
Expand Down Expand Up @@ -86,10 +87,10 @@ private fun openConversation(action: OpenConversation, navigator: Navigator) {

private fun openImportMediaScreen(navigator: Navigator) {
navigator.navigate(
NavigationCommand(
ImportMediaScreenDestination,
BackStackMode.UPDATE_EXISTED
)
NavigationCommand(
ImportMediaScreenDestination(ImportMediaNavArgs(arrayListOf())),
BackStackMode.UPDATE_EXISTED
)
)
}

Expand Down
32 changes: 29 additions & 3 deletions app/src/main/kotlin/com/wire/android/ui/debug/DebugScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.wire.android.ui.debug

import android.annotation.SuppressLint
import android.content.Context
import android.net.Uri
import android.widget.Toast
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
Expand Down Expand Up @@ -53,10 +54,12 @@ import com.wire.android.ui.common.topappbar.NavigationIconType
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.ramcosta.composedestinations.generated.app.destinations.ConversationCryptoStatsScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.DebugFeatureFlagsScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ImportMediaScreenDestination
import com.wire.android.ui.common.rowitem.SectionHeader
import com.wire.android.ui.home.settings.SettingsItem
import com.wire.android.ui.home.settings.backup.BackupAndRestoreDialog
import com.wire.android.ui.home.settings.backup.rememberBackUpAndRestoreStateHolder
import com.wire.android.ui.sharing.ImportMediaNavArgs
import com.wire.android.ui.theme.WireTheme
import com.wire.android.util.AppNameUtil
import com.wire.android.util.logging.LogShareLauncher
Expand All @@ -82,7 +85,14 @@ fun DebugScreen(
},
onShowCryptoStats = {
navigator.navigate(NavigationCommand(ConversationCryptoStatsScreenDestination))
}
},
onShareLogsViaWire = { uri ->
navigator.navigate(
NavigationCommand(
ImportMediaScreenDestination(ImportMediaNavArgs(arrayListOf(uri)))
)
)
},
)
}

Expand All @@ -94,6 +104,7 @@ internal fun UserDebugContent(
onDatabaseLoggerEnabledChanged: (Boolean) -> Unit,
onDeleteLogs: () -> Unit,
onFlushLogs: () -> Deferred<Unit>,
onShareLogsViaWire: (Uri) -> Unit,
onShowFeatureFlags: () -> Unit,
onShowCryptoStats: () -> Unit,
) {
Expand All @@ -120,7 +131,8 @@ internal fun UserDebugContent(
isLoggingEnabled = isLoggingEnabled,
onLoggingEnabledChange = onLoggingEnabledChange,
onDeleteLogs = onDeleteLogs,
onShareLogs = { debugContentState.shareLogs(onFlushLogs) },
onShareLogsExternally = { debugContentState.shareLogsExternally(onFlushLogs) },
onShareLogsViaWire = { debugContentState.shareLogsViaWire(onFlushLogs, onShareLogsViaWire) },
isDBLoggerEnabled = state.isDBLoggingEnabled,
onDBLoggerEnabledChange = onDatabaseLoggerEnabledChanged,
isPrivateBuild = BuildConfig.PRIVATE_BUILD,
Expand Down Expand Up @@ -226,7 +238,7 @@ data class DebugContentState(
).show()
}

fun shareLogs(onFlushLogs: () -> Deferred<Unit>) {
fun shareLogsExternally(onFlushLogs: () -> Deferred<Unit>) {
val dir = File(logPath).parentFile
if (dir != null && dir.exists()) {
logShareLauncher.shareLogs(dir) {
Expand All @@ -235,6 +247,19 @@ data class DebugContentState(
}
}
}

fun shareLogsViaWire(onFlushLogs: () -> Deferred<Unit>, onShareUri: (Uri) -> Unit) {
val dir = File(logPath).parentFile
if (dir != null && dir.exists()) {
logShareLauncher.shareLogsViaWire(
logsDirectory = dir,
onShareUri = onShareUri
) {
// Flush any buffered logs before sharing to ensure completeness.
onFlushLogs().await()
}
}
}
}

@Preview(heightDp = 1400)
Expand All @@ -249,6 +274,7 @@ internal fun PreviewUserDebugContent() = WireTheme {
onLoggingEnabledChange = {},
onDeleteLogs = {},
onFlushLogs = { CompletableDeferred(Unit) },
onShareLogsViaWire = {},
onDatabaseLoggerEnabledChanged = {},
onShowFeatureFlags = {},
onShowCryptoStats = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package com.wire.android.ui.debug

import com.ramcosta.composedestinations.generated.app.destinations.ImportMediaScreenDestination
import com.wire.android.navigation.annotation.app.WireRootDestination
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -27,11 +28,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import com.wire.android.R
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.Navigator
import com.wire.android.ui.common.dimensions
import com.wire.android.ui.common.scaffold.WireScaffold
import com.wire.android.ui.common.topappbar.NavigationIconType
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.sharing.ImportMediaNavArgs

@WireRootDestination
@Composable
Expand Down Expand Up @@ -64,7 +67,16 @@ fun LogManagementScreen(
isLoggingEnabled = state.isLoggingEnabled,
onLoggingEnabledChange = viewModel::setLoggingEnabledState,
onDeleteLogs = viewModel::deleteLogs,
onShareLogs = { contentState.shareLogs(viewModel::flushLogs) },
onShareLogsExternally = { contentState.shareLogsExternally(viewModel::flushLogs) },
onShareLogsViaWire = {
contentState.shareLogsViaWire(viewModel::flushLogs) { uri ->
navigator.navigate(
NavigationCommand(
ImportMediaScreenDestination(ImportMediaNavArgs(arrayListOf(uri)))
)
)
}
},
isDBLoggerEnabled = false,
onDBLoggerEnabledChange = {},
isPrivateBuild = false
Expand Down
75 changes: 71 additions & 4 deletions app/src/main/kotlin/com/wire/android/ui/debug/LogOptions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ import androidx.compose.ui.res.stringResource
import com.wire.android.R
import com.wire.android.model.Clickable
import com.wire.android.ui.common.SurfaceBackgroundWrapper
import com.wire.android.ui.common.bottomsheet.MenuBottomSheetItem
import com.wire.android.ui.common.bottomsheet.MenuItemIcon
import com.wire.android.ui.common.bottomsheet.MenuModalSheetHeader
import com.wire.android.ui.common.bottomsheet.WireMenuModalSheetContent
import com.wire.android.ui.common.bottomsheet.WireModalSheetLayout
import com.wire.android.ui.common.bottomsheet.rememberWireModalSheetState
import com.wire.android.ui.common.bottomsheet.show
import com.wire.android.ui.common.button.WireSwitch
import com.wire.android.ui.common.colorsScheme
import com.wire.android.ui.common.dimensions
Expand All @@ -53,10 +60,13 @@ fun LogOptions(
isDBLoggerEnabled: Boolean,
onDBLoggerEnabledChange: (Boolean) -> Unit,
onDeleteLogs: () -> Unit,
onShareLogs: () -> Unit,
onShareLogsExternally: () -> Unit,
onShareLogsViaWire: () -> Unit,
isPrivateBuild: Boolean,
modifier: Modifier = Modifier
) {
val shareLogsSheetState = rememberWireModalSheetState<Unit>()

Column(modifier = modifier) {
SectionHeader(stringResource(R.string.label_logs_option_title))
EnableLoggingSwitch(
Expand All @@ -74,9 +84,13 @@ fun LogOptions(
SettingsItem(
text = stringResource(R.string.label_share_logs),
trailingIcon = R.drawable.ic_entypo_share,
onRowPressed = Clickable(
enabled = true,
onClick = { shareLogsSheetState.show() }
),
onIconPressed = Clickable(
enabled = true,
onClick = onShareLogs
onClick = { shareLogsSheetState.show() }
)
)

Expand All @@ -90,6 +104,57 @@ fun LogOptions(
)
}
}

WireModalSheetLayout(
sheetState = shareLogsSheetState,
sheetContent = {
WireMenuModalSheetContent(
header = MenuModalSheetHeader.Visible(
title = stringResource(R.string.label_share_logs)
),
menuItems = listOf(
{
ShareLogsInWireOption {
shareLogsSheetState.hide { onShareLogsViaWire() }
}
},
{
ShareLogsExternallyOption {
shareLogsSheetState.hide { onShareLogsExternally() }
}
}
)
)
}
)
}

@Composable
private fun ShareLogsInWireOption(onClick: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_share_file,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share_logs_via_wire),
onItemClick = onClick
)
}

@Composable
private fun ShareLogsExternallyOption(onClick: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_entypo_share,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share_logs_externally),
onItemClick = onClick
)
}

@Composable
Expand Down Expand Up @@ -172,7 +237,8 @@ fun PreviewLoggingOptionsPublicBuild() {
isDBLoggerEnabled = true,
onDBLoggerEnabledChange = {},
onDeleteLogs = {},
onShareLogs = {},
onShareLogsExternally = {},
onShareLogsViaWire = {},
isPrivateBuild = false,
)
}
Expand All @@ -186,7 +252,8 @@ fun PreviewLoggingOptionsPrivateBuild() {
isDBLoggerEnabled = true,
onDBLoggerEnabledChange = {},
onDeleteLogs = {},
onShareLogs = {},
onShareLogsExternally = {},
onShareLogsViaWire = {},
isPrivateBuild = true,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,33 @@ import com.wire.android.ui.common.bottomsheet.MenuItemIcon

@Composable
fun ShareAssetMenuOption(onShareAsset: () -> Unit) {
ShareAssetExternallyMenuOption(onShareAsset)
}

@Composable
fun ShareAssetViaWireMenuOption(onShareAsset: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_share_file,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share_via_wire),
onItemClick = onShareAsset
)
}

@Composable
fun ShareAssetExternallyMenuOption(onShareAsset: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_share_file,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share),
title = stringResource(R.string.label_share_externally),
onItemClick = onShareAsset
)
}
Expand Down
Loading
Loading