Compare commits
2 Commits
b1bdacb834
...
5e797d6b54
Author | SHA1 | Date | |
---|---|---|---|
5e797d6b54 | |||
1b3dd0634b |
@ -41,19 +41,25 @@ class ContactsService {
|
|||||||
final Map<String, String?> _contactDisplayNames = {};
|
final Map<String, String?> _contactDisplayNames = {};
|
||||||
|
|
||||||
Future<void> initialize() async {
|
Future<void> initialize() async {
|
||||||
if (await _canUseContactIntegration()) {
|
await enable(shouldScan: false);
|
||||||
enableDatabaseListener();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enable listening to contact database events
|
/// Enable listening to contact database events. If [shouldScan] is true, also
|
||||||
void enableDatabaseListener() {
|
/// performs a scan of the contacts database, if we're allowed.
|
||||||
|
Future<void> enable({bool shouldScan = true}) async {
|
||||||
FlutterContacts.addListener(_onContactsDatabaseUpdate);
|
FlutterContacts.addListener(_onContactsDatabaseUpdate);
|
||||||
|
|
||||||
|
if (shouldScan && await _canUseContactIntegration()) {
|
||||||
|
unawaited(scanContacts());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Disable listening to contact database events
|
/// Disable listening to contact database events. Also removes all roster items
|
||||||
void disableDatabaseListener() {
|
/// that are pseudo roster items.
|
||||||
|
Future<void> disable() async {
|
||||||
FlutterContacts.removeListener(_onContactsDatabaseUpdate);
|
FlutterContacts.removeListener(_onContactsDatabaseUpdate);
|
||||||
|
|
||||||
|
await GetIt.I.get<RosterService>().removePseudoRosterItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onContactsDatabaseUpdate() async {
|
Future<void> _onContactsDatabaseUpdate() async {
|
||||||
@ -123,7 +129,6 @@ class ContactsService {
|
|||||||
Future<Map<String, String>> _getContactIds() async {
|
Future<Map<String, String>> _getContactIds() async {
|
||||||
if (_contactIds != null) return _contactIds!;
|
if (_contactIds != null) return _contactIds!;
|
||||||
|
|
||||||
// TODO(Unknown): Can we just .cast<String, String>() here?
|
|
||||||
_contactIds = Map<String, String>.fromEntries(
|
_contactIds = Map<String, String>.fromEntries(
|
||||||
(await GetIt.I.get<DatabaseService>().database.query(contactsTable)).map(
|
(await GetIt.I.get<DatabaseService>().database.query(contactsTable)).map(
|
||||||
(item) => MapEntry(
|
(item) => MapEntry(
|
||||||
@ -276,7 +281,7 @@ class ContactsService {
|
|||||||
return cs.updateConversation(
|
return cs.updateConversation(
|
||||||
contact.jid,
|
contact.jid,
|
||||||
contactId: contact.id,
|
contactId: contact.id,
|
||||||
contactAvatarPath: contactAvatarPath,
|
contactAvatarPath: contact.thumbnail != null ? contactAvatarPath : null,
|
||||||
contactDisplayName: contact.displayName,
|
contactDisplayName: contact.displayName,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -394,13 +394,13 @@ Future<void> performSetPreferences(
|
|||||||
final css = GetIt.I.get<ContactsService>();
|
final css = GetIt.I.get<ContactsService>();
|
||||||
if (command.preferences.enableContactIntegration) {
|
if (command.preferences.enableContactIntegration) {
|
||||||
if (!oldPrefs.enableContactIntegration) {
|
if (!oldPrefs.enableContactIntegration) {
|
||||||
css.enableDatabaseListener();
|
await css.enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
unawaited(css.scanContacts());
|
unawaited(css.scanContacts());
|
||||||
} else {
|
} else {
|
||||||
if (oldPrefs.enableContactIntegration) {
|
if (oldPrefs.enableContactIntegration) {
|
||||||
css.disableDatabaseListener();
|
await css.disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,4 +257,25 @@ class RosterService {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes all roster items that are pseudo roster items.
|
||||||
|
Future<void> removePseudoRosterItems() async {
|
||||||
|
final items = await getRoster();
|
||||||
|
final removed = List<String>.empty(growable: true);
|
||||||
|
for (final item in items) {
|
||||||
|
if (!item.pseudoRosterItem) continue;
|
||||||
|
|
||||||
|
assert(
|
||||||
|
item.contactId != null,
|
||||||
|
'Only pseudo roster items that are for the contact integration should ge removed',
|
||||||
|
);
|
||||||
|
|
||||||
|
removed.add(item.jid);
|
||||||
|
await removeRosterItem(item.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
sendEvent(
|
||||||
|
RosterDiffEvent(removed: removed),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user