This commit is contained in:
ericszimmermann 2026-04-15 16:37:23 +00:00 committed by GitHub
commit 139816629f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
43 changed files with 119 additions and 11 deletions

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Потребители",
"listFilter_repeaters": "Повторители",
"listFilter_roomServers": "Сървъри на стая",
"listFilter_activeChat": "Активен чат",
"listFilter_unreadOnly": "Само непрочетените",
"listFilter_newGroup": "Нова група",
"@neighbors_errorLoading": {

View file

@ -1356,6 +1356,7 @@
"listFilter_users": "Benutzer",
"listFilter_repeaters": "Repeater",
"listFilter_roomServers": "Raumserver",
"listFilter_activeChat": "Aktiver Chat",
"listFilter_unreadOnly": "Nicht gelesen",
"listFilter_newGroup": "Neue Gruppe",
"@neighbors_errorLoading": {

View file

@ -1762,6 +1762,7 @@
"listFilter_users": "Users",
"listFilter_repeaters": "Repeaters",
"listFilter_roomServers": "Room servers",
"listFilter_activeChat": "Active chat",
"listFilter_unreadOnly": "Unread only",
"listFilter_newGroup": "New group",
"pathTrace_you": "You",

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Usuarios",
"listFilter_repeaters": "Repetidores",
"listFilter_roomServers": "Servidores de la sala",
"listFilter_activeChat": "Chat activo",
"listFilter_unreadOnly": "Solo sin leer",
"listFilter_newGroup": "Nuevo grupo",
"@neighbors_errorLoading": {

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Utilisateurs",
"listFilter_repeaters": "Répéteurs",
"listFilter_roomServers": "Room servers",
"listFilter_activeChat": "Chat actif",
"listFilter_unreadOnly": "Messages non lus seulement",
"listFilter_newGroup": "Nouveau groupe",
"@neighbors_errorLoading": {

View file

@ -1706,6 +1706,7 @@
"listFilter_users": "Felhasználók",
"listFilter_repeaters": "Újraküldők",
"listFilter_roomServers": "Szoba-szolgálatok",
"listFilter_activeChat": "Aktív chat",
"listFilter_unreadOnly": "Csak olvasatlan",
"listFilter_newGroup": "Új csoport",
"pathTrace_you": "Te",

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Utenti",
"listFilter_repeaters": "Ripetitori",
"listFilter_roomServers": "Server della stanza",
"listFilter_activeChat": "Chat attiva",
"listFilter_unreadOnly": "Solo non letto",
"listFilter_newGroup": "Nuovo gruppo",
"@neighbors_errorLoading": {

View file

@ -1706,6 +1706,7 @@
"listFilter_users": "利用者",
"listFilter_repeaters": "繰り返し送信装置",
"listFilter_roomServers": "ルーム用サーバー",
"listFilter_activeChat": "アクティブチャット",
"listFilter_unreadOnly": "未読のみ",
"listFilter_newGroup": "新しいグループ",
"pathTrace_you": "あなた",

View file

@ -1706,6 +1706,7 @@
"listFilter_users": "사용자",
"listFilter_repeaters": "다시 보내는 장치",
"listFilter_roomServers": "방 내 서버",
"listFilter_activeChat": "활성 채팅",
"listFilter_unreadOnly": "읽지 않은 항목만",
"listFilter_newGroup": "새로운 그룹",
"pathTrace_you": "당신",

View file

@ -5402,6 +5402,12 @@ abstract class AppLocalizations {
/// **'Room servers'**
String get listFilter_roomServers;
/// No description provided for @listFilter_activeChat.
///
/// In en, this message translates to:
/// **'Active chat'**
String get listFilter_activeChat;
/// No description provided for @listFilter_unreadOnly.
///
/// In en, this message translates to:

View file

@ -3094,6 +3094,9 @@ class AppLocalizationsBg extends AppLocalizations {
@override
String get listFilter_roomServers => 'Сървъри на стая';
@override
String get listFilter_activeChat => 'Активен чат';
@override
String get listFilter_unreadOnly => 'Само непрочетените';

View file

@ -3098,6 +3098,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get listFilter_roomServers => 'Raumserver';
@override
String get listFilter_activeChat => 'Aktiver Chat';
@override
String get listFilter_unreadOnly => 'Nicht gelesen';

View file

@ -3039,6 +3039,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get listFilter_roomServers => 'Room servers';
@override
String get listFilter_activeChat => 'Active chat';
@override
String get listFilter_unreadOnly => 'Unread only';

View file

@ -3091,6 +3091,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get listFilter_roomServers => 'Servidores de la sala';
@override
String get listFilter_activeChat => 'Chat activo';
@override
String get listFilter_unreadOnly => 'Solo sin leer';

View file

@ -3110,6 +3110,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get listFilter_roomServers => 'Room servers';
@override
String get listFilter_activeChat => 'Chat actif';
@override
String get listFilter_unreadOnly => 'Messages non lus seulement';

View file

@ -3105,6 +3105,9 @@ class AppLocalizationsHu extends AppLocalizations {
@override
String get listFilter_roomServers => 'Szoba-szolgálatok';
@override
String get listFilter_activeChat => 'Aktív chat';
@override
String get listFilter_unreadOnly => 'Csak olvasatlan';

View file

@ -3094,6 +3094,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get listFilter_roomServers => 'Server della stanza';
@override
String get listFilter_activeChat => 'Chat attiva';
@override
String get listFilter_unreadOnly => 'Solo non letto';

View file

@ -2953,6 +2953,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get listFilter_roomServers => 'ルーム用サーバー';
@override
String get listFilter_activeChat => 'アクティブチャット';
@override
String get listFilter_unreadOnly => '未読のみ';

View file

@ -2953,6 +2953,9 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get listFilter_roomServers => '방 내 서버';
@override
String get listFilter_activeChat => '활성 채팅';
@override
String get listFilter_unreadOnly => '읽지 않은 항목만';

View file

@ -3077,6 +3077,9 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get listFilter_roomServers => 'Roomservers';
@override
String get listFilter_activeChat => 'Actieve chat';
@override
String get listFilter_unreadOnly => 'Alleen ongelezen';

View file

@ -3103,6 +3103,9 @@ class AppLocalizationsPl extends AppLocalizations {
@override
String get listFilter_roomServers => 'Serwery pokoju';
@override
String get listFilter_activeChat => 'Aktywny czat';
@override
String get listFilter_unreadOnly => 'Tylko nieprzeczytane';

View file

@ -3092,6 +3092,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get listFilter_roomServers => 'Servidores de sala';
@override
String get listFilter_activeChat => 'Chat ativo';
@override
String get listFilter_unreadOnly => 'Apenas não lido';

View file

@ -3097,6 +3097,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get listFilter_roomServers => 'Серверы комнат';
@override
String get listFilter_activeChat => 'Активный чат';
@override
String get listFilter_unreadOnly => 'Только непрочитанные';

View file

@ -3072,6 +3072,9 @@ class AppLocalizationsSk extends AppLocalizations {
@override
String get listFilter_roomServers => 'Servéry miestnosti';
@override
String get listFilter_activeChat => 'Aktívny chat';
@override
String get listFilter_unreadOnly => 'Nezaregistrované len';

View file

@ -3073,6 +3073,9 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get listFilter_roomServers => 'Smeti za prostore';
@override
String get listFilter_activeChat => 'Aktivni klepet';
@override
String get listFilter_unreadOnly => 'Nezbrani samo';

View file

@ -3057,6 +3057,9 @@ class AppLocalizationsSv extends AppLocalizations {
@override
String get listFilter_roomServers => 'Rumservrar';
@override
String get listFilter_activeChat => 'Aktiv chatt';
@override
String get listFilter_unreadOnly => 'Endast oinlästa';

View file

@ -3099,6 +3099,9 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get listFilter_roomServers => 'Сервери кімнат';
@override
String get listFilter_activeChat => 'Активний чат';
@override
String get listFilter_unreadOnly => 'Тільки непрочитані повідомлення';

View file

@ -2878,6 +2878,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get listFilter_roomServers => '房间服务器';
@override
String get listFilter_activeChat => '活跃聊天';
@override
String get listFilter_unreadOnly => '仅显示未读';

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Gebruikers",
"listFilter_repeaters": "Repeaters",
"listFilter_roomServers": "Roomservers",
"listFilter_activeChat": "Actieve chat",
"listFilter_unreadOnly": "Alleen ongelezen",
"listFilter_newGroup": "Nieuwe groep",
"@neighbors_errorLoading": {

View file

@ -1363,6 +1363,7 @@
"listFilter_users": "Użytkownicy",
"listFilter_repeaters": "Przekaźniki",
"listFilter_roomServers": "Serwery pokoju",
"listFilter_activeChat": "Aktywny czat",
"listFilter_unreadOnly": "Tylko nieprzeczytane",
"listFilter_newGroup": "Nowa grupa",
"@neighbors_errorLoading": {

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Usuários",
"listFilter_repeaters": "Repetidores",
"listFilter_roomServers": "Servidores de sala",
"listFilter_activeChat": "Chat ativo",
"listFilter_unreadOnly": "Apenas não lido",
"listFilter_newGroup": "Novo grupo",
"@neighbors_errorLoading": {

View file

@ -759,6 +759,7 @@
"listFilter_users": "Пользователи",
"listFilter_repeaters": "Репитеры",
"listFilter_roomServers": "Серверы комнат",
"listFilter_activeChat": "Активный чат",
"listFilter_unreadOnly": "Только непрочитанные",
"listFilter_newGroup": "Новая группа",
"@chat_couldNotOpenLink": {

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Používatelia",
"listFilter_repeaters": "Opakovadlá",
"listFilter_roomServers": "Servéry miestnosti",
"listFilter_activeChat": "Aktívny chat",
"listFilter_unreadOnly": "Nezaregistrované len",
"listFilter_newGroup": "Nová skupina",
"@neighbors_errorLoading": {

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Uporabniki",
"listFilter_repeaters": "Ponovitve",
"listFilter_roomServers": "Smeti za prostore",
"listFilter_activeChat": "Aktivni klepet",
"listFilter_unreadOnly": "Nezbrani samo",
"listFilter_newGroup": "Nova skupina",
"@neighbors_errorLoading": {

View file

@ -1353,6 +1353,7 @@
"listFilter_users": "Användare",
"listFilter_repeaters": "Upprepare",
"listFilter_roomServers": "Rumservrar",
"listFilter_activeChat": "Aktiv chatt",
"listFilter_unreadOnly": "Endast oinlästa",
"listFilter_newGroup": "Ny grupp",
"@neighbors_errorLoading": {

View file

@ -1354,6 +1354,7 @@
"listFilter_users": "Користувачі",
"listFilter_repeaters": "Ретранслятори",
"listFilter_roomServers": "Сервери кімнат",
"listFilter_activeChat": "Активний чат",
"listFilter_unreadOnly": "Тільки непрочитані повідомлення",
"listFilter_newGroup": "Нова група",
"@neighbors_errorLoading": {

View file

@ -1547,6 +1547,7 @@
"listFilter_users": "用户",
"listFilter_repeaters": "转发节点",
"listFilter_roomServers": "房间服务器",
"listFilter_activeChat": "活跃聊天",
"listFilter_unreadOnly": "仅显示未读",
"listFilter_newGroup": "新建群聊",
"pathTrace_you": "我自己",

View file

@ -672,6 +672,14 @@ class _ContactsScreenState extends State<ContactsScreen>
: "",
);
break;
case ContactTypeFilter.activeChat:
hintText = context.l10n.contacts_searchContacts(
filteredAndSorted.length,
viewState.contactsShowUnreadOnly
? " ${context.l10n.contacts_unread}"
: "",
);
break;
}
final groupsByName = <String, ContactGroup>{};
@ -682,14 +690,11 @@ class _ContactsScreenState extends State<ContactsScreen>
..sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
final screenWidth = MediaQuery.sizeOf(context).width;
final searchExpandedWidth = (screenWidth * 0.52).clamp(
final searchExpandedWidth = (screenWidth * 0.72).clamp(
97.0,
double.infinity,
); // allow expansion up to 52% of screen width, but not less than the collapsed width
final searchCollapsedWidth = (screenWidth * 0.22).clamp(
97.0,
120.0,
); //two 48px icon buttons + 1px divider
); // allow expansion up to 72% of screen width, but not less than the collapsed width
final searchCollapsedWidth = 97.0; //two 48px icon buttons + 1px divider
return Column(
children: [
@ -860,8 +865,11 @@ class _ContactsScreenState extends State<ContactsScreen>
if (viewState.contactsTypeFilter != ContactTypeFilter.all) {
filtered = filtered
.where(
(contact) =>
_matchesTypeFilter(contact, viewState.contactsTypeFilter),
(contact) => _matchesTypeFilter(
contact,
viewState.contactsTypeFilter,
connector,
),
)
.toList();
}
@ -901,7 +909,11 @@ class _ContactsScreenState extends State<ContactsScreen>
return filtered;
}
bool _matchesTypeFilter(Contact contact, ContactTypeFilter typeFilter) {
bool _matchesTypeFilter(
Contact contact,
ContactTypeFilter typeFilter,
MeshCoreConnector connector,
) {
switch (typeFilter) {
case ContactTypeFilter.all:
return true;
@ -913,6 +925,8 @@ class _ContactsScreenState extends State<ContactsScreen>
return contact.type == advTypeRepeater;
case ContactTypeFilter.rooms:
return contact.type == advTypeRoom;
case ContactTypeFilter.activeChat:
return connector.getMessages(contact).isNotEmpty;
}
}

View file

@ -306,6 +306,12 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
showUnreadOnly ? " ${context.l10n.contacts_unread}" : "",
);
break;
case ContactTypeFilter.activeChat:
hintText = context.l10n.contacts_searchContacts(
filteredAndSorted.length,
showUnreadOnly ? " ${context.l10n.contacts_unread}" : "",
);
break;
}
return Column(
@ -424,6 +430,8 @@ class _DiscoveryScreenState extends State<DiscoveryScreen> {
return contact.type == advTypeRepeater;
case ContactTypeFilter.rooms:
return contact.type == advTypeRoom;
case ContactTypeFilter.activeChat:
return false;
default:
return false;
}

View file

@ -57,8 +57,9 @@ class UiViewStateService extends ChangeNotifier {
final typeStr = prefs.getString(_keyContactsTypeFilter);
if (typeStr != null) {
final normalizedTypeStr = typeStr == 'chat' ? 'activeChat' : typeStr;
_contactsTypeFilter = ContactTypeFilter.values.firstWhere(
(e) => e.name == typeStr,
(e) => e.name == normalizedTypeStr,
orElse: () => ContactTypeFilter.all,
);
}

View file

@ -1,3 +1,3 @@
enum ContactSortOption { lastSeen, recentMessages, name }
enum ContactTypeFilter { all, favorites, users, repeaters, rooms }
enum ContactTypeFilter { all, favorites, users, repeaters, rooms, activeChat }

View file

@ -157,6 +157,11 @@ class ContactsFilterMenu extends StatelessWidget {
label: l10n.listFilter_all,
checked: typeFilter == ContactTypeFilter.all,
),
SortFilterMenuOption(
value: _TypeFilterAction(ContactTypeFilter.activeChat),
label: l10n.listFilter_activeChat,
checked: typeFilter == ContactTypeFilter.activeChat,
),
SortFilterMenuOption(
value: _TypeFilterAction(ContactTypeFilter.favorites),
label: l10n.listFilter_favorites,

View file

@ -9,6 +9,7 @@ import flutter_blue_plus_darwin
import flutter_local_notifications
import mobile_scanner
import package_info_plus
import path_provider_foundation
import share_plus
import shared_preferences_foundation
import sqflite_darwin
@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))