Skip to content

Commit a351a45

Browse files
style: Meta info display in rooms
Resolves: #5867 Resolves: #6233 AI-assistant: Claude Code v2.1.152 (Claude Sonnet 4.6) Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent 979e0e6 commit a351a45

13 files changed

Lines changed: 873 additions & 570 deletions

app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

Lines changed: 87 additions & 153 deletions
Large diffs are not rendered by default.

app/src/main/java/com/nextcloud/talk/ui/ComposeWaveformSeekbar.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp
2828

2929
const val WAVEFORM_THUMB_SIZE = 20
3030
const val WAVEFORM_SIZE = 30
31+
const val MAX_HEIGHT = 100
3132
const val OVERLAP = 0.025
3233

3334
@OptIn(ExperimentalMaterial3Api::class)
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.talk.ui
9+
10+
import androidx.compose.foundation.BorderStroke
11+
import androidx.compose.foundation.layout.Box
12+
import androidx.compose.foundation.layout.Column
13+
import androidx.compose.foundation.layout.Row
14+
import androidx.compose.foundation.layout.Spacer
15+
import androidx.compose.foundation.layout.fillMaxWidth
16+
import androidx.compose.foundation.layout.padding
17+
import androidx.compose.foundation.layout.size
18+
import androidx.compose.foundation.shape.RoundedCornerShape
19+
import androidx.compose.material3.Card
20+
import androidx.compose.material3.CardDefaults
21+
import androidx.compose.material3.DropdownMenu
22+
import androidx.compose.material3.DropdownMenuItem
23+
import androidx.compose.material3.Icon
24+
import androidx.compose.material3.IconButton
25+
import androidx.compose.material3.MaterialTheme
26+
import androidx.compose.material3.Text
27+
import androidx.compose.runtime.Composable
28+
import androidx.compose.runtime.getValue
29+
import androidx.compose.runtime.mutableStateOf
30+
import androidx.compose.runtime.remember
31+
import androidx.compose.runtime.setValue
32+
import androidx.compose.ui.Modifier
33+
import androidx.compose.ui.graphics.vector.ImageVector
34+
import androidx.compose.ui.platform.LocalContext
35+
import androidx.compose.ui.res.pluralStringResource
36+
import androidx.compose.ui.res.stringResource
37+
import androidx.compose.ui.res.vectorResource
38+
import androidx.compose.ui.tooling.preview.Preview
39+
import androidx.compose.ui.unit.dp
40+
import com.nextcloud.talk.R
41+
import com.nextcloud.talk.ui.theme.ViewThemeUtils
42+
import com.nextcloud.talk.utils.preview.ComposePreviewUtils
43+
44+
@Composable
45+
fun ConversationDeleteNoticeView(
46+
retentionDays: Int,
47+
isModeratorOrOwner: Boolean,
48+
viewThemeUtils: ViewThemeUtils,
49+
onDeleteNow: () -> Unit,
50+
onKeep: () -> Unit,
51+
onDismiss: () -> Unit
52+
) {
53+
val context = LocalContext.current
54+
val colorScheme = remember { viewThemeUtils.getColorScheme(context) }
55+
var expanded by remember { mutableStateOf(false) }
56+
57+
Card(
58+
modifier = Modifier.fillMaxWidth(),
59+
shape = RoundedCornerShape(4.dp),
60+
colors = CardDefaults.cardColors(containerColor = colorScheme.surface),
61+
border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant)
62+
) {
63+
Row(
64+
modifier = Modifier.padding(start = 8.dp, end = 0.dp),
65+
) {
66+
Icon(
67+
imageVector = ImageVector.vectorResource(R.drawable.baseline_info_24),
68+
contentDescription = null,
69+
modifier = Modifier.padding(top = 8.dp).size(24.dp)
70+
)
71+
Spacer(modifier = Modifier.size(8.dp))
72+
Column(
73+
modifier = Modifier
74+
.weight(1f)
75+
.padding(top = 8.dp, bottom = 8.dp)
76+
) {
77+
Text(
78+
text = pluralStringResource(
79+
R.plurals.nc_conversation_auto_delete_info,
80+
retentionDays,
81+
retentionDays
82+
),
83+
style = MaterialTheme.typography.bodyMedium
84+
)
85+
}
86+
Column {
87+
if (isModeratorOrOwner) {
88+
Box {
89+
IconButton(onClick = { expanded = true }) {
90+
Icon(
91+
imageVector = ImageVector.vectorResource(R.drawable.ic_more_vert_24px),
92+
contentDescription = null
93+
)
94+
}
95+
DropdownMenu(
96+
expanded = expanded,
97+
onDismissRequest = { expanded = false }
98+
) {
99+
DropdownMenuItem(
100+
text = { Text(stringResource(R.string.nc_delete_now)) },
101+
onClick = { expanded = false; onDeleteNow() }
102+
)
103+
DropdownMenuItem(
104+
text = { Text(stringResource(R.string.nc_keep)) },
105+
onClick = { expanded = false; onKeep() }
106+
)
107+
}
108+
}
109+
} else {
110+
IconButton(onClick = onDismiss) {
111+
Icon(
112+
imageVector = ImageVector.vectorResource(R.drawable.ic_baseline_close_24),
113+
contentDescription = stringResource(R.string.nc_common_dismiss)
114+
)
115+
}
116+
}
117+
}
118+
}
119+
}
120+
}
121+
122+
@Preview(name = "Dark Mode", uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
123+
@Composable
124+
fun ConversationDeleteNoticePreviewDark() {
125+
ConversationDeleteNoticePreview()
126+
}
127+
128+
@Preview(name = "R-t-L", locale = "ar")
129+
@Composable
130+
fun ConversationDeleteNoticePreviewRtl() {
131+
ConversationDeleteNoticePreview()
132+
}
133+
134+
@Preview(name = "Light Mode / Read-only")
135+
@Composable
136+
fun ConversationDeleteNoticePreviewReadOnly() {
137+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
138+
}
139+
140+
@Preview(name = "Dark Mode / Read-only", uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
141+
@Composable
142+
fun ConversationDeleteNoticePreviewDarkReadOnly() {
143+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
144+
}
145+
146+
@Preview(name = "R-t-L / Read-only", locale = "ar")
147+
@Composable
148+
fun ConversationDeleteNoticePreviewRtlReadOnly() {
149+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
150+
}
151+
152+
@Suppress("MagicNumber")
153+
@Preview(name = "Light Mode")
154+
@Composable
155+
fun ConversationDeleteNoticePreview(retentionDays: Int = 7, isModeratorOrOwner: Boolean = true) {
156+
val context = LocalContext.current
157+
val previewUtils = ComposePreviewUtils.getInstance(context)
158+
val viewThemeUtils = previewUtils.viewThemeUtils
159+
val colorScheme = viewThemeUtils.getColorScheme(context)
160+
161+
MaterialTheme(colorScheme = colorScheme) {
162+
ConversationDeleteNoticeView(
163+
retentionDays = retentionDays,
164+
isModeratorOrOwner = isModeratorOrOwner,
165+
viewThemeUtils = viewThemeUtils,
166+
onDeleteNow = {},
167+
onKeep = {},
168+
onDismiss = {}
169+
)
170+
}
171+
}

0 commit comments

Comments
 (0)