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_noContactsFound": "No contacts or groups found",
"contacts_deleteContact": "Delete Contact",
@ -2132,6 +2143,7 @@
"listFilter_users": "Users",
"listFilter_repeaters": "Repeaters",
"listFilter_roomServers": "Room servers",
"listFilter_sensors": "Sensors",
"listFilter_unreadOnly": "Unread only",
"listFilter_newGroup": "New group",
"pathTrace_you": "You",

@ -1924,6 +1924,12 @@ abstract class AppLocalizations {
/// **'Search {number}{str} Room servers...'**
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.
///
/// In en, this message translates to:
@ -6710,6 +6716,12 @@ abstract class AppLocalizations {
/// **'Room servers'**
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.
///
/// In en, this message translates to:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,3 +1,3 @@
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,
checked: typeFilter == ContactTypeFilter.rooms,
),
SortFilterMenuOption(
value: _TypeFilterAction(ContactTypeFilter.sensors),
label: l10n.listFilter_sensors,
checked: typeFilter == ContactTypeFilter.sensors,
),
SortFilterMenuOption(
value: const _ToggleUnreadAction(),
label: l10n.listFilter_unreadOnly,

Loading…
Cancel
Save

Powered by TurnKey Linux.