Skip to content

Commit dc36877

Browse files
committed
chore: add diagnostic logging for recents number mismatch (#970)
Add hash-based and raw value logging to trace why recent calls list shows two different phone numbers per entry. Raw values are visible when Logz.io anonymization is disabled, hashes work with it enabled.
1 parent 679b18b commit dc36877

2 files changed

Lines changed: 66 additions & 5 deletions

File tree

lib/features/call/bloc/call_bloc.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,11 +2826,25 @@ class CallBloc extends Bloc<CallEvent, CallState> with WidgetsBindingObserver im
28262826
}
28272827

28282828
void _addToRecents(ActiveCall activeCall) {
2829+
final number = activeCall.handle.value;
2830+
final username = activeCall.displayName;
2831+
2832+
_logger.info(
2833+
'[Recents:store] '
2834+
'direction=${activeCall.direction.name} '
2835+
'number=$number '
2836+
'number.hash=${number.hashCode} '
2837+
'username=$username '
2838+
'username.hash=${username?.hashCode} '
2839+
'numberEqualsUsername=${number == username} '
2840+
'usernameIsNull=${username == null}',
2841+
);
2842+
28292843
NewCall call = (
28302844
direction: activeCall.direction,
2831-
number: activeCall.handle.value,
2845+
number: number,
28322846
video: activeCall.video,
2833-
username: activeCall.displayName,
2847+
username: username,
28342848
createdTime: activeCall.createdTime,
28352849
acceptedTime: activeCall.acceptedTime,
28362850
hungUpTime: activeCall.hungUpTime,

lib/repositories/recents/recents_repository.dart

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,65 @@
11
import 'dart:async';
22

3+
import 'package:logging/logging.dart';
4+
35
import 'package:webtrit_phone/data/data.dart';
46
import 'package:webtrit_phone/mappers/mappers.dart';
57
import 'package:webtrit_phone/models/models.dart';
68

9+
final _logger = Logger('RecentsRepository');
10+
711
class RecentsRepository with PresenceInfoDriftMapper, CallLogsDriftMapper, ContactsDriftMapper, RecentsDriftMapper {
812
RecentsRepository({required AppDatabase appDatabase}) : _appDatabase = appDatabase;
913

1014
final AppDatabase _appDatabase;
1115

1216
Stream<List<Recent>> watchRecents() {
13-
return _appDatabase.recentsDao.watchLastRecents().map(
14-
(callLogsExt) => callLogsExt.map(recentFromDrift).toList(growable: false),
15-
);
17+
return _appDatabase.recentsDao.watchLastRecents().map((callLogsExt) {
18+
return callLogsExt
19+
.map((data) {
20+
final recent = recentFromDrift(data);
21+
final entry = recent.callLogEntry;
22+
final contact = recent.contact;
23+
24+
final numberHash = entry.number.hashCode;
25+
final usernameHash = entry.username?.hashCode;
26+
final contactNameHash = contact?.maybeName?.hashCode;
27+
final resolvedNameHash = recent.name.hashCode;
28+
29+
final nameSource = contact?.maybeName != null
30+
? 'contact.maybeName'
31+
: entry.username != null
32+
? 'callLog.username'
33+
: 'callLog.number';
34+
35+
final mismatch = recent.name != entry.number;
36+
37+
if (mismatch) {
38+
_logger.warning(
39+
'[Recents:mismatch] '
40+
'id=${entry.id} '
41+
'direction=${entry.direction.name} '
42+
'number=${entry.number} '
43+
'number.hash=$numberHash '
44+
'username=${entry.username} '
45+
'username.hash=$usernameHash '
46+
'contactName=${contact?.maybeName} '
47+
'contactName.hash=$contactNameHash '
48+
'resolvedName=${recent.name} '
49+
'resolvedName.hash=$resolvedNameHash '
50+
'nameSource=$nameSource '
51+
'hasContact=${contact != null} '
52+
'contactId=${contact?.id} '
53+
'contactSourceType=${contact?.sourceType} '
54+
'contactPhonesCount=${contact?.phones.length ?? 0} '
55+
'numberEqualsUsername=${entry.number == entry.username}',
56+
);
57+
}
58+
59+
return recent;
60+
})
61+
.toList(growable: false);
62+
});
1663
}
1764

1865
Future<void> deleteByCallId(int id) async {

0 commit comments

Comments
 (0)