feat(#308): add Sensors to the contact type filter

Sensors were the one advert type with no filter. advTypeSensor (4) already
existed in the protocol and Contact.typeLabelRaw already returned 'Sensor',
but ContactTypeFilter stopped at rooms, so sensor contacts could not be
isolated in either the contacts list or discovery.

- ContactTypeFilter gains `sensors`. Both exhaustive switches over it were
  found by the analyzer rather than by hand: the contacts list predicate and
  the search-hint text.
- discovery_screen's predicate has a `default: return false`, so it compiled
  without a sensors case but would have silently shown an empty list. Added
  explicitly.
- New l10n strings contacts_searchSensors and listFilter_sensors, regenerated
  across all 18 locales. The 17 non-English locales fall back to the English
  text and are recorded in untranslated.json, matching how existing strings
  are handled.
- Persisted round-trip verified: UiViewStateService stores the filter by name
  with orElse -> ContactTypeFilter.all, so older persisted values cannot throw
  and `sensors` persists like the rest.

Groundwork for the Contacts filter rail (#307), but useful on its own: the
existing filter menu now offers Sensors.

flutter analyze clean, dart format clean, 445 tests pass.
pull/324/head
Strycher 3 days ago
parent e194800541
commit f1930549ed

@ -452,6 +452,17 @@
} }
} }
}, },
"contacts_searchSensors": "Search {number}{str} Sensors...",
"@contacts_searchSensors": {
"placeholders": {
"number": {
"type": "int"
},
"str": {
"type": "String"
}
}
},
"contacts_noUnreadContacts": "No unread contacts", "contacts_noUnreadContacts": "No unread contacts",
"contacts_noContactsFound": "No contacts or groups found", "contacts_noContactsFound": "No contacts or groups found",
"contacts_deleteContact": "Delete Contact", "contacts_deleteContact": "Delete Contact",
@ -2132,6 +2143,7 @@
"listFilter_users": "Users", "listFilter_users": "Users",
"listFilter_repeaters": "Repeaters", "listFilter_repeaters": "Repeaters",
"listFilter_roomServers": "Room servers", "listFilter_roomServers": "Room servers",
"listFilter_sensors": "Sensors",
"listFilter_unreadOnly": "Unread only", "listFilter_unreadOnly": "Unread only",
"listFilter_newGroup": "New group", "listFilter_newGroup": "New group",
"pathTrace_you": "You", "pathTrace_you": "You",

@ -1924,6 +1924,12 @@ abstract class AppLocalizations {
/// **'Search {number}{str} Room servers...'** /// **'Search {number}{str} Room servers...'**
String contacts_searchRoomServers(int number, String str); String contacts_searchRoomServers(int number, String str);
/// No description provided for @contacts_searchSensors.
///
/// In en, this message translates to:
/// **'Search {number}{str} Sensors...'**
String contacts_searchSensors(int number, String str);
/// No description provided for @contacts_noUnreadContacts. /// No description provided for @contacts_noUnreadContacts.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -6710,6 +6716,12 @@ abstract class AppLocalizations {
/// **'Room servers'** /// **'Room servers'**
String get listFilter_roomServers; String get listFilter_roomServers;
/// No description provided for @listFilter_sensors.
///
/// In en, this message translates to:
/// **'Sensors'**
String get listFilter_sensors;
/// No description provided for @listFilter_unreadOnly. /// No description provided for @listFilter_unreadOnly.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

@ -1022,6 +1022,11 @@ class AppLocalizationsBg extends AppLocalizations {
return 'Търсене на $number$str сървъри в стаята...'; return 'Търсене на $number$str сървъри в стаята...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Няма непрочетени контакти'; String get contacts_noUnreadContacts => 'Няма непрочетени контакти';
@ -3885,6 +3890,9 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Сървъри на стая'; String get listFilter_roomServers => 'Сървъри на стая';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Само непрочетените'; String get listFilter_unreadOnly => 'Само непрочетените';

@ -1017,6 +1017,11 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Suche $number$str Raumserver...'; return 'Suche $number$str Raumserver...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Keine ungesehene Kontakte'; String get contacts_noUnreadContacts => 'Keine ungesehene Kontakte';
@ -3895,6 +3900,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Raumserver'; String get listFilter_roomServers => 'Raumserver';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Nicht gelesen'; String get listFilter_unreadOnly => 'Nicht gelesen';

@ -1001,6 +1001,11 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Search $number$str Room servers...'; return 'Search $number$str Room servers...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'No unread contacts'; String get contacts_noUnreadContacts => 'No unread contacts';
@ -3820,6 +3825,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Room servers'; String get listFilter_roomServers => 'Room servers';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Unread only'; String get listFilter_unreadOnly => 'Unread only';

@ -1016,6 +1016,11 @@ class AppLocalizationsEs extends AppLocalizations {
return 'Buscar $number$str servidores de sala...'; return 'Buscar $number$str servidores de sala...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'No contactos sin leer'; String get contacts_noUnreadContacts => 'No contactos sin leer';
@ -3882,6 +3887,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Servidores de la sala'; String get listFilter_roomServers => 'Servidores de la sala';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Solo sin leer'; String get listFilter_unreadOnly => 'Solo sin leer';

@ -1023,6 +1023,11 @@ class AppLocalizationsFr extends AppLocalizations {
return 'Rechercher $number$str room server...'; return 'Rechercher $number$str room server...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Aucun contact non lu'; String get contacts_noUnreadContacts => 'Aucun contact non lu';
@ -3906,6 +3911,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Serveurs de salle'; String get listFilter_roomServers => 'Serveurs de salle';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Messages non lus seulement'; String get listFilter_unreadOnly => 'Messages non lus seulement';

@ -1022,6 +1022,11 @@ class AppLocalizationsHu extends AppLocalizations {
return 'Keresés $number-ban $str...'; return 'Keresés $number-ban $str...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Nincs olvasatlan üzenetek'; String get contacts_noUnreadContacts => 'Nincs olvasatlan üzenetek';
@ -3897,6 +3902,9 @@ class AppLocalizationsHu extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Szoba-szolgálatok'; String get listFilter_roomServers => 'Szoba-szolgálatok';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Csak olvasatlan'; String get listFilter_unreadOnly => 'Csak olvasatlan';

@ -1019,6 +1019,11 @@ class AppLocalizationsIt extends AppLocalizations {
return 'Cerca $number$str server Room...'; return 'Cerca $number$str server Room...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Nessun contatto non letto'; String get contacts_noUnreadContacts => 'Nessun contatto non letto';
@ -3887,6 +3892,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Server della stanza'; String get listFilter_roomServers => 'Server della stanza';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Solo non letto'; String get listFilter_unreadOnly => 'Solo non letto';

@ -970,6 +970,11 @@ class AppLocalizationsJa extends AppLocalizations {
return '$number $str 部屋のサーバーを検索する...'; return '$number $str 部屋のサーバーを検索する...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => '未読の連絡先はありません'; String get contacts_noUnreadContacts => '未読の連絡先はありません';
@ -3694,6 +3699,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'ルーム用サーバー'; String get listFilter_roomServers => 'ルーム用サーバー';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => '未読のみ'; String get listFilter_unreadOnly => '未読のみ';

@ -965,6 +965,11 @@ class AppLocalizationsKo extends AppLocalizations {
return '$number $str 방 서버 검색'; return '$number $str 방 서버 검색';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => '읽지 않은 연락처가 없습니다.'; String get contacts_noUnreadContacts => '읽지 않은 연락처가 없습니다.';
@ -3696,6 +3701,9 @@ class AppLocalizationsKo extends AppLocalizations {
@override @override
String get listFilter_roomServers => '방 내 서버'; String get listFilter_roomServers => '방 내 서버';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => '읽지 않은 항목만'; String get listFilter_unreadOnly => '읽지 않은 항목만';

@ -1011,6 +1011,11 @@ class AppLocalizationsNl extends AppLocalizations {
return 'Zoek $number$str Room servers...'; return 'Zoek $number$str Room servers...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Geen ongelezen contacten'; String get contacts_noUnreadContacts => 'Geen ongelezen contacten';
@ -3869,6 +3874,9 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Roomservers'; String get listFilter_roomServers => 'Roomservers';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Alleen ongelezen'; String get listFilter_unreadOnly => 'Alleen ongelezen';

@ -1028,6 +1028,11 @@ class AppLocalizationsPl extends AppLocalizations {
return 'Wyszukaj $number$str serwerów Room...'; return 'Wyszukaj $number$str serwerów Room...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Brak nieprzeczytanych kontaktów'; String get contacts_noUnreadContacts => 'Brak nieprzeczytanych kontaktów';
@ -3900,6 +3905,9 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Serwery pokoju'; String get listFilter_roomServers => 'Serwery pokoju';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Tylko nieprzeczytane'; String get listFilter_unreadOnly => 'Tylko nieprzeczytane';

@ -1018,6 +1018,11 @@ class AppLocalizationsPt extends AppLocalizations {
return 'Pesquisar $number$str servidores de sala...'; return 'Pesquisar $number$str servidores de sala...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Sem contatos não lidos.'; String get contacts_noUnreadContacts => 'Sem contatos não lidos.';
@ -3882,6 +3887,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Servidores de sala'; String get listFilter_roomServers => 'Servidores de sala';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Apenas não lido'; String get listFilter_unreadOnly => 'Apenas não lido';

@ -1020,6 +1020,11 @@ class AppLocalizationsRu extends AppLocalizations {
return 'Поиск $number$str серверов комнат...'; return 'Поиск $number$str серверов комнат...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Нет непрочитанных контактов'; String get contacts_noUnreadContacts => 'Нет непрочитанных контактов';
@ -3890,6 +3895,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Серверы комнат'; String get listFilter_roomServers => 'Серверы комнат';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Только непрочитанные'; String get listFilter_unreadOnly => 'Только непрочитанные';

@ -1007,6 +1007,11 @@ class AppLocalizationsSk extends AppLocalizations {
return 'Hľadaj $number$str serverov miestností...'; return 'Hľadaj $number$str serverov miestností...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Žiadne neprečítané kontakty'; String get contacts_noUnreadContacts => 'Žiadne neprečítané kontakty';
@ -3866,6 +3871,9 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Servéry miestnosti'; String get listFilter_roomServers => 'Servéry miestnosti';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Nezaregistrované len'; String get listFilter_unreadOnly => 'Nezaregistrované len';

@ -1007,6 +1007,11 @@ class AppLocalizationsSl extends AppLocalizations {
return 'Išči $number$str strežnikov sob...'; return 'Išči $number$str strežnikov sob...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Ne prebrani stiki.'; String get contacts_noUnreadContacts => 'Ne prebrani stiki.';
@ -3861,6 +3866,9 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Smeti za prostore'; String get listFilter_roomServers => 'Smeti za prostore';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Nezbrani samo'; String get listFilter_unreadOnly => 'Nezbrani samo';

@ -1001,6 +1001,11 @@ class AppLocalizationsSv extends AppLocalizations {
return 'Sök $number$str Room-servrar...'; return 'Sök $number$str Room-servrar...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Inga oinlästa kontakter'; String get contacts_noUnreadContacts => 'Inga oinlästa kontakter';
@ -3841,6 +3846,9 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Rumservrar'; String get listFilter_roomServers => 'Rumservrar';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Endast oinlästa'; String get listFilter_unreadOnly => 'Endast oinlästa';

@ -1015,6 +1015,11 @@ class AppLocalizationsUk extends AppLocalizations {
return 'Пошук $number$str серверів кімнат...'; return 'Пошук $number$str серверів кімнат...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => 'Немає непрочитаних контактів'; String get contacts_noUnreadContacts => 'Немає непрочитаних контактів';
@ -3892,6 +3897,9 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get listFilter_roomServers => 'Сервери кімнат'; String get listFilter_roomServers => 'Сервери кімнат';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => 'Тільки непрочитані повідомлення'; String get listFilter_unreadOnly => 'Тільки непрочитані повідомлення';

@ -951,6 +951,11 @@ class AppLocalizationsZh extends AppLocalizations {
return '搜索 $number$str 房间服务器...'; return '搜索 $number$str 房间服务器...';
} }
@override
String contacts_searchSensors(int number, String str) {
return 'Search $number$str Sensors...';
}
@override @override
String get contacts_noUnreadContacts => '没有未读内容'; String get contacts_noUnreadContacts => '没有未读内容';
@ -3598,6 +3603,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get listFilter_roomServers => '房间服务器'; String get listFilter_roomServers => '房间服务器';
@override
String get listFilter_sensors => 'Sensors';
@override @override
String get listFilter_unreadOnly => '仅显示未读'; String get listFilter_unreadOnly => '仅显示未读';

@ -673,6 +673,14 @@ class _ContactsScreenState extends State<ContactsScreen>
: "", : "",
); );
break; break;
case ContactTypeFilter.sensors:
hintText = context.l10n.contacts_searchSensors(
filteredAndSorted.length,
viewState.contactsShowUnreadOnly
? " ${context.l10n.contacts_unread}"
: "",
);
break;
} }
final groupsByName = <String, ContactGroup>{}; final groupsByName = <String, ContactGroup>{};
@ -920,6 +928,8 @@ class _ContactsScreenState extends State<ContactsScreen>
return contact.type == advTypeRepeater; return contact.type == advTypeRepeater;
case ContactTypeFilter.rooms: case ContactTypeFilter.rooms:
return contact.type == advTypeRoom; return contact.type == advTypeRoom;
case ContactTypeFilter.sensors:
return contact.type == advTypeSensor;
} }
} }

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

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

@ -177,6 +177,11 @@ class ContactsFilterMenu extends StatelessWidget {
label: l10n.listFilter_roomServers, label: l10n.listFilter_roomServers,
checked: typeFilter == ContactTypeFilter.rooms, checked: typeFilter == ContactTypeFilter.rooms,
), ),
SortFilterMenuOption(
value: _TypeFilterAction(ContactTypeFilter.sensors),
label: l10n.listFilter_sensors,
checked: typeFilter == ContactTypeFilter.sensors,
),
SortFilterMenuOption( SortFilterMenuOption(
value: const _ToggleUnreadAction(), value: const _ToggleUnreadAction(),
label: l10n.listFilter_unreadOnly, label: l10n.listFilter_unreadOnly,

Loading…
Cancel
Save

Powered by TurnKey Linux.