Skip to content

Commit 266b63d

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 923317a commit 266b63d

13 files changed

Lines changed: 937 additions & 568 deletions

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

Lines changed: 93 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: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
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+
data class ConversationDeleteNoticeViewData(
45+
val retentionDays: Int,
46+
val isModeratorOrOwner: Boolean
47+
)
48+
49+
@Composable
50+
fun ConversationDeleteNoticeView(
51+
data: ConversationDeleteNoticeViewData,
52+
viewThemeUtils: ViewThemeUtils,
53+
onDeleteNow: () -> Unit,
54+
onKeep: () -> Unit,
55+
onDismiss: () -> Unit
56+
) {
57+
val context = LocalContext.current
58+
val colorScheme = remember { viewThemeUtils.getColorScheme(context) }
59+
Card(
60+
modifier = Modifier.fillMaxWidth(),
61+
shape = RoundedCornerShape(4.dp),
62+
colors = CardDefaults.cardColors(containerColor = colorScheme.surface),
63+
border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant)
64+
) {
65+
Row(modifier = Modifier.padding(start = 8.dp, end = 0.dp)) {
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+
data.retentionDays,
81+
data.retentionDays
82+
),
83+
style = MaterialTheme.typography.bodyMedium
84+
)
85+
}
86+
ConversationDeleteNoticeActions(
87+
isModeratorOrOwner = data.isModeratorOrOwner,
88+
onDeleteNow = onDeleteNow,
89+
onKeep = onKeep,
90+
onDismiss = onDismiss
91+
)
92+
}
93+
}
94+
}
95+
96+
@Composable
97+
private fun ConversationDeleteNoticeActions(
98+
isModeratorOrOwner: Boolean,
99+
onDeleteNow: () -> Unit,
100+
onKeep: () -> Unit,
101+
onDismiss: () -> Unit
102+
) {
103+
var expanded by remember { mutableStateOf(false) }
104+
Column {
105+
if (isModeratorOrOwner) {
106+
Box {
107+
IconButton(onClick = { expanded = true }) {
108+
Icon(
109+
imageVector = ImageVector.vectorResource(R.drawable.ic_more_vert_24px),
110+
contentDescription = null
111+
)
112+
}
113+
DropdownMenu(
114+
expanded = expanded,
115+
onDismissRequest = { expanded = false }
116+
) {
117+
DropdownMenuItem(
118+
text = { Text(stringResource(R.string.nc_delete_now)) },
119+
onClick = { expanded = false; onDeleteNow() }
120+
)
121+
DropdownMenuItem(
122+
text = { Text(stringResource(R.string.nc_keep)) },
123+
onClick = { expanded = false; onKeep() }
124+
)
125+
}
126+
}
127+
} else {
128+
IconButton(onClick = onDismiss) {
129+
Icon(
130+
imageVector = ImageVector.vectorResource(R.drawable.ic_baseline_close_24),
131+
contentDescription = stringResource(R.string.nc_common_dismiss)
132+
)
133+
}
134+
}
135+
}
136+
}
137+
138+
@Preview(name = "Dark Mode", uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
139+
@Composable
140+
fun ConversationDeleteNoticePreviewDark() {
141+
ConversationDeleteNoticePreview()
142+
}
143+
144+
@Preview(name = "R-t-L", locale = "ar")
145+
@Composable
146+
fun ConversationDeleteNoticePreviewRtl() {
147+
ConversationDeleteNoticePreview()
148+
}
149+
150+
@Preview(name = "Light Mode / Read-only")
151+
@Composable
152+
fun ConversationDeleteNoticePreviewReadOnly() {
153+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
154+
}
155+
156+
@Preview(name = "Dark Mode / Read-only", uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES)
157+
@Composable
158+
fun ConversationDeleteNoticePreviewDarkReadOnly() {
159+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
160+
}
161+
162+
@Preview(name = "R-t-L / Read-only", locale = "ar")
163+
@Composable
164+
fun ConversationDeleteNoticePreviewRtlReadOnly() {
165+
ConversationDeleteNoticePreview(isModeratorOrOwner = false)
166+
}
167+
168+
@Suppress("MagicNumber")
169+
@Preview(name = "Light Mode")
170+
@Composable
171+
fun ConversationDeleteNoticePreview(retentionDays: Int = 7, isModeratorOrOwner: Boolean = true) {
172+
val context = LocalContext.current
173+
val previewUtils = ComposePreviewUtils.getInstance(context)
174+
val viewThemeUtils = previewUtils.viewThemeUtils
175+
val colorScheme = viewThemeUtils.getColorScheme(context)
176+
177+
MaterialTheme(colorScheme = colorScheme) {
178+
ConversationDeleteNoticeView(
179+
data = ConversationDeleteNoticeViewData(
180+
retentionDays = retentionDays,
181+
isModeratorOrOwner = isModeratorOrOwner
182+
),
183+
viewThemeUtils = viewThemeUtils,
184+
onDeleteNow = {},
185+
onKeep = {},
186+
onDismiss = {}
187+
)
188+
}
189+
}

0 commit comments

Comments
 (0)