Skip to content

Commit 91794a5

Browse files
feat(search): Show different text is filtering leads to empty list than no server items
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent 0626280 commit 91794a5

3 files changed

Lines changed: 66 additions & 12 deletions

File tree

app/src/main/java/com/nextcloud/talk/openconversations/OpenConversationsScreen.kt

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* SPDX-License-Identifier: GPL-3.0-or-later
77
*/
88

9+
@file:Suppress("TooManyFunctions")
10+
911
package com.nextcloud.talk.openconversations
1012

1113
import android.content.res.Configuration
@@ -19,11 +21,11 @@ import androidx.compose.foundation.layout.WindowInsets
1921
import androidx.compose.foundation.layout.WindowInsetsSides
2022
import androidx.compose.foundation.layout.asPaddingValues
2123
import androidx.compose.foundation.layout.fillMaxSize
24+
import androidx.compose.foundation.layout.fillMaxWidth
2225
import androidx.compose.foundation.layout.imePadding
2326
import androidx.compose.foundation.layout.navigationBars
2427
import androidx.compose.foundation.layout.navigationBarsPadding
2528
import androidx.compose.foundation.layout.only
26-
import androidx.compose.foundation.layout.fillMaxWidth
2729
import androidx.compose.foundation.layout.padding
2830
import androidx.compose.foundation.layout.safeDrawing
2931
import androidx.compose.foundation.layout.size
@@ -39,17 +41,17 @@ import androidx.compose.material3.Icon
3941
import androidx.compose.material3.IconButton
4042
import androidx.compose.material3.MaterialTheme
4143
import androidx.compose.material3.Scaffold
44+
import androidx.compose.material3.SearchBar
45+
import androidx.compose.material3.SearchBarDefaults
46+
import androidx.compose.material3.SearchBarState
4247
import androidx.compose.material3.SnackbarHost
4348
import androidx.compose.material3.SnackbarHostState
4449
import androidx.compose.material3.Surface
4550
import androidx.compose.material3.Text
46-
import androidx.compose.material3.SearchBar
47-
import androidx.compose.material3.SearchBarDefaults
48-
import androidx.compose.material3.SearchBarState
4951
import androidx.compose.material3.TopAppBar
50-
import androidx.compose.material3.rememberSearchBarState
5152
import androidx.compose.material3.darkColorScheme
5253
import androidx.compose.material3.lightColorScheme
54+
import androidx.compose.material3.rememberSearchBarState
5355
import androidx.compose.runtime.Composable
5456
import androidx.compose.runtime.LaunchedEffect
5557
import androidx.compose.runtime.getValue
@@ -262,7 +264,9 @@ private fun OpenConversationsSearchBar(
262264
modifier = Modifier.focusRequester(focusRequester)
263265
)
264266
},
265-
modifier = Modifier.fillMaxWidth().padding(end = 16.dp)
267+
modifier = Modifier
268+
.fillMaxWidth()
269+
.padding(end = 16.dp)
266270
)
267271
}
268272

@@ -280,11 +284,16 @@ private fun ConversationsBody(
280284
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
281285
}
282286
is OpenConversationsViewModel.FetchConversationsSuccessState -> {
287+
val filtered = if (searchTerm.isBlank()) {
288+
viewState.conversations
289+
} else {
290+
viewState.conversations.filter { it.displayName.contains(searchTerm, ignoreCase = true) }
291+
}
283292
LazyColumn(
284293
modifier = Modifier.fillMaxSize(),
285294
contentPadding = WindowInsets.navigationBars.asPaddingValues()
286295
) {
287-
items(viewState.conversations) { conversation ->
296+
items(filtered) { conversation ->
288297
OpenConversationItem(
289298
conversation = conversation,
290299
userBaseUrl = userBaseUrl,
@@ -295,7 +304,19 @@ private fun ConversationsBody(
295304
}
296305
}
297306
is OpenConversationsViewModel.FetchConversationsEmptyState -> {
298-
EmptyConversationsView(modifier = Modifier.align(Alignment.Center))
307+
if (searchTerm.isNotBlank()) {
308+
EmptyConversationsView(
309+
headline = stringResource(R.string.nc_no_search_results_headline),
310+
body = stringResource(R.string.nc_no_search_results_text),
311+
modifier = Modifier.align(Alignment.Center)
312+
)
313+
} else {
314+
EmptyConversationsView(
315+
headline = stringResource(R.string.nc_no_open_conversations_headline),
316+
body = stringResource(R.string.nc_no_open_conversations_text),
317+
modifier = Modifier.align(Alignment.Center)
318+
)
319+
}
299320
}
300321
is OpenConversationsViewModel.FetchConversationsErrorState -> {
301322
// Error shown via Snackbar; no additional UI needed here
@@ -380,7 +401,7 @@ private fun highlightSearchTerm(name: String, searchTerm: String, highlightColor
380401
}
381402

382403
@Composable
383-
private fun EmptyConversationsView(modifier: Modifier = Modifier) {
404+
private fun EmptyConversationsView(headline: String, body: String, modifier: Modifier = Modifier) {
384405
Column(
385406
modifier = modifier.padding(32.dp),
386407
horizontalAlignment = Alignment.CenterHorizontally
@@ -393,13 +414,13 @@ private fun EmptyConversationsView(modifier: Modifier = Modifier) {
393414
)
394415
Spacer(modifier = Modifier.size(16.dp))
395416
Text(
396-
text = stringResource(R.string.nc_no_open_conversations_headline),
417+
text = headline,
397418
style = MaterialTheme.typography.titleLarge,
398419
color = MaterialTheme.colorScheme.onSurface
399420
)
400421
Spacer(modifier = Modifier.size(8.dp))
401422
Text(
402-
text = stringResource(R.string.nc_no_open_conversations_text),
423+
text = body,
403424
style = MaterialTheme.typography.bodyMedium,
404425
textAlign = TextAlign.Center,
405426
color = MaterialTheme.colorScheme.onSurfaceVariant
@@ -549,6 +570,37 @@ private fun PreviewOpenConversationsEmpty() {
549570
}
550571
}
551572

573+
@Preview(name = "Light – No search results", showBackground = true)
574+
@Preview(name = "Dark – No search results", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
575+
@Composable
576+
private fun PreviewOpenConversationsNoSearchResults() {
577+
val colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
578+
MaterialTheme(colorScheme = colorScheme) {
579+
Surface {
580+
OpenConversationsScreenContent(
581+
viewState = OpenConversationsViewModel.FetchConversationsSuccessState(
582+
conversations = listOf(
583+
Conversation(
584+
token = "abc1",
585+
displayName = "Design Team",
586+
description = "All design discussions",
587+
type = ConversationEnums.ConversationType.ROOM_GROUP_CALL
588+
)
589+
)
590+
),
591+
searchTerm = "xyz",
592+
userBaseUrl = null,
593+
snackbarHostState = remember { SnackbarHostState() },
594+
listenerInput = OpenConversationsScreenListenerInput(
595+
onSearchTermChange = {},
596+
onConversationClick = {},
597+
onBackClick = {}
598+
)
599+
)
600+
}
601+
}
602+
}
603+
552604
@Preview(name = "RTL – Arabic", showBackground = true, locale = "ar")
553605
@Composable
554606
private fun PreviewOpenConversationsRtl() {

app/src/main/res/drawable/baseline_info_24.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<vector xmlns:android="http://schemas.android.com/apk/res/android"
88
android:width="24dp"
99
android:height="24dp"
10-
android:tint="?attr/colorControlNormal"
10+
android:tint="@color/icon_on_bg_default"
1111
android:viewportWidth="960"
1212
android:viewportHeight="960">
1313
<path

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ How to translate with transifex:
303303
<!-- Open conversations -->
304304
<string name="nc_no_open_conversations_headline">No open conversations</string>
305305
<string name="nc_no_open_conversations_text">No open conversations that you can join.\nEither there are no open conversations or you already joined all of them.</string>
306+
<string name="nc_no_search_results_headline">No results for your search</string>
307+
<string name="nc_no_search_results_text">Please check your search term or try using a different one.</string>
306308

307309
<!-- Contacts -->
308310
<string name="nc_add_participants">Add participants</string>

0 commit comments

Comments
 (0)