Update getProfile to use sound null safety
continuous-integration/drone/pr Build is passing
Details
continuous-integration/drone/pr Build is passing
Details
This commit is contained in:
parent
64d0b8ba8d
commit
cf3e3961ee
|
@ -32,7 +32,7 @@ class CwtchNotifier {
|
|||
onion: data["Identity"], nickname: data["name"], imagePath: data["picture"], contactsJson: data["ContactsJson"], serversJson: data["ServerList"], online: data["Online"] == "true"));
|
||||
break;
|
||||
case "PeerCreated":
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.add(ContactInfoState(
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(
|
||||
data["ProfileOnion"],
|
||||
data["RemotePeer"],
|
||||
nickname: data["nick"],
|
||||
|
@ -49,17 +49,17 @@ class CwtchNotifier {
|
|||
));
|
||||
break;
|
||||
case "GroupCreated":
|
||||
if (profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"]) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.add(ContactInfoState(data["ProfileOnion"], data["GroupID"],
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], data["GroupID"],
|
||||
isInvitation: false, imagePath: data["PicturePath"], nickname: data["GroupName"], server: data["GroupServer"], isGroup: true, lastMessageTime: DateTime.now()));
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
}
|
||||
break;
|
||||
case "DeleteGroup":
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.removeContact(data["GroupID"]);
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.removeContact(data["GroupID"]);
|
||||
break;
|
||||
case "PeerStateChange":
|
||||
ContactInfoState? contact = profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["RemotePeer"]);
|
||||
ContactInfoState? contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"]);
|
||||
if (contact != null) {
|
||||
if (data["ConnectionState"] != null) {
|
||||
contact.status = data["ConnectionState"];
|
||||
|
@ -69,14 +69,14 @@ class CwtchNotifier {
|
|||
contact.isBlocked = data["authorization"] == "blocked";
|
||||
}
|
||||
// contact.[status/isBlocked] might change the list's sort order
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.resort();
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.resort();
|
||||
}
|
||||
break;
|
||||
case "NewMessageFromPeer":
|
||||
notificationManager.notify("New Message From Peer!");
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["RemotePeer"])!.unreadMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["RemotePeer"])!.totalMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.updateLastMessageTime(data["RemotePeer"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.unreadMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.totalMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["RemotePeer"], DateTime.now());
|
||||
break;
|
||||
case "PeerAcknowledgement":
|
||||
// We don't use these anymore, IndexedAcknowledgement is more suited to the UI front end...
|
||||
|
@ -85,7 +85,7 @@ class CwtchNotifier {
|
|||
var idx = data["Index"];
|
||||
// We return -1 for protocol message acks if there is no message
|
||||
if (idx == "-1") break;
|
||||
var key = profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["RemotePeer"])!.getMessageKey(idx);
|
||||
var key = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.getMessageKey(idx);
|
||||
if (key == null) break;
|
||||
try {
|
||||
var message = Provider.of<MessageState>(key.currentContext!, listen: false);
|
||||
|
@ -99,13 +99,13 @@ class CwtchNotifier {
|
|||
case "NewMessageFromGroup":
|
||||
if (data["ProfileOnion"] != data["RemotePeer"]) {
|
||||
//not from me
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.unreadMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.totalMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.unreadMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.totalMessages++;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
} else {
|
||||
// from me (already displayed - do not update counter)
|
||||
var idx = data["Signature"];
|
||||
var key = profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.getMessageKey(idx);
|
||||
var key = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.getMessageKey(idx);
|
||||
if (key == null) break;
|
||||
try {
|
||||
var message = Provider.of<MessageState>(key.currentContext!, listen: false);
|
||||
|
@ -119,9 +119,9 @@ class CwtchNotifier {
|
|||
case "IndexedFailure":
|
||||
print("IndexedFailure: $data");
|
||||
var idx = data["Index"];
|
||||
var key = profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["RemotePeer"])!.getMessageKey(idx);
|
||||
var key = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.getMessageKey(idx);
|
||||
try {
|
||||
var message = Provider.of<MessageState>(key.currentContext!, listen: false);
|
||||
var message = Provider.of<MessageState>(key!.currentContext!, listen: false);
|
||||
message.error = true;
|
||||
} catch (e) {
|
||||
// ignore, we likely have an old key that has been replaced with an actual signature
|
||||
|
@ -131,7 +131,7 @@ class CwtchNotifier {
|
|||
// from me (already displayed - do not update counter)
|
||||
print("SendMessageToGroupError: $data");
|
||||
var idx = data["Signature"];
|
||||
var key = profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.getMessageKey(idx);
|
||||
var key = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.getMessageKey(idx);
|
||||
if (key == null) break;
|
||||
try {
|
||||
var message = Provider.of<MessageState>(key.currentContext!, listen: false);
|
||||
|
@ -152,21 +152,21 @@ class CwtchNotifier {
|
|||
break;
|
||||
case "SetAttribute":
|
||||
if (data["Key"] == "public.name") {
|
||||
profileCN.getProfile(data["ProfileOnion"]).nickname = data["Data"];
|
||||
profileCN.getProfile(data["ProfileOnion"])?.nickname = data["Data"];
|
||||
} else {
|
||||
print("unhandled set attribute event: $type $data");
|
||||
}
|
||||
break;
|
||||
case "NetworkError":
|
||||
var isOnline = data["Status"] == "Success";
|
||||
profileCN.getProfile(data["ProfileOnion"]).isOnline = isOnline;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.isOnline = isOnline;
|
||||
break;
|
||||
case "ACNStatus":
|
||||
print("acn status: $data");
|
||||
torStatus.handleUpdate(int.parse(data["Progress"]), data["Status"]);
|
||||
break;
|
||||
case "UpdateServerInfo":
|
||||
profileCN.getProfile(data["ProfileOnion"]).replaceServers(data["ServerList"]);
|
||||
profileCN.getProfile(data["ProfileOnion"])?.replaceServers(data["ServerList"]);
|
||||
break;
|
||||
case "NewGroup":
|
||||
print("new group invite: $data");
|
||||
|
@ -175,31 +175,31 @@ class CwtchNotifier {
|
|||
String inviteJson = new String.fromCharCodes(base64Decode(invite.substring(5)));
|
||||
dynamic groupInvite = jsonDecode(inviteJson);
|
||||
print("new group invite: $groupInvite");
|
||||
if (profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(groupInvite["GroupID"]) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.add(ContactInfoState(data["ProfileOnion"], groupInvite["GroupID"],
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(groupInvite["GroupID"]) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], groupInvite["GroupID"],
|
||||
isInvitation: true, imagePath: data["PicturePath"], nickname: groupInvite["GroupName"], server: groupInvite["ServerHost"], isGroup: true, lastMessageTime: DateTime.now()));
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.updateLastMessageTime(groupInvite["GroupID"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(groupInvite["GroupID"], DateTime.now());
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "AcceptGroupInvite":
|
||||
print("accept group invite: $data");
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.isInvitation = false;
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.isInvitation = false;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
break;
|
||||
case "ServerStateChange":
|
||||
print("server state change: $data");
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.contacts.forEach((contact) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.contacts.forEach((contact) {
|
||||
if (contact.isGroup == true && contact.server == data["GroupServer"]) {
|
||||
contact.status = data["ConnectionState"];
|
||||
}
|
||||
});
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.resort();
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.resort();
|
||||
break;
|
||||
case "SetGroupAttribute":
|
||||
if (data["Key"] == "local.name") {
|
||||
if (profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"]) != null) {
|
||||
profileCN.getProfile(data["ProfileOnion"]).contactList.getContact(data["GroupID"])!.nickname = data["Data"];
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) != null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.nickname = data["Data"];
|
||||
}
|
||||
} else {
|
||||
print("unhandled set group attribute event: $type $data");
|
||||
|
|
|
@ -50,9 +50,9 @@ class ProfileListState extends ChangeNotifier {
|
|||
|
||||
List<ProfileInfoState> get profiles => _profiles.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||
|
||||
ProfileInfoState getProfile(String onion) {
|
||||
ProfileInfoState? getProfile(String onion) {
|
||||
int idx = _profiles.indexWhere((element) => element.onion == onion);
|
||||
return idx >= 0 ? _profiles[idx] : ProfileInfoState(onion: onion);
|
||||
return idx >= 0 ? _profiles[idx] : null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -127,6 +127,7 @@ class ContactListState extends ChangeNotifier {
|
|||
int idx = _contacts.indexWhere((element) => element.onion == onion);
|
||||
if (idx >= 0) {
|
||||
_contacts.removeAt(idx);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,9 +9,9 @@ class ServerListState extends ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
ServerInfoState getServer(String onion) {
|
||||
ServerInfoState? getServer(String onion) {
|
||||
int idx = _servers.indexWhere((element) => element.onion == onion);
|
||||
return idx >= 0 ? _servers[idx] : ServerInfoState(onion: "not found", status: "not found");
|
||||
return idx >= 0 ? _servers[idx] : null;
|
||||
}
|
||||
|
||||
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||
|
|
|
@ -92,7 +92,8 @@ class _ContactRowState extends State<ContactRow> {
|
|||
Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (BuildContext builderContext) {
|
||||
var profile = Provider.of<FlwtchState>(builderContext, listen: false).profs.getProfile(profileOnion);
|
||||
// assert we have an actual profile...
|
||||
var profile = Provider.of<FlwtchState>(builderContext, listen: false).profs.getProfile(profileOnion)!;
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider.value(value: profile),
|
||||
|
|
Loading…
Reference in New Issue