mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-04-18 16:12:52 +00:00
fix issue with contact request
This commit is contained in:
parent
074211a815
commit
90f5424aae
8 changed files with 49 additions and 53 deletions
|
|
@ -131,10 +131,6 @@ PODS:
|
||||||
- google_mlkit_commons (0.11.1):
|
- google_mlkit_commons (0.11.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- MLKitVision (~> 10.0.0)
|
- MLKitVision (~> 10.0.0)
|
||||||
- google_mlkit_face_detection (0.13.2):
|
|
||||||
- Flutter
|
|
||||||
- google_mlkit_commons
|
|
||||||
- GoogleMLKit/FaceDetection (~> 9.0.0)
|
|
||||||
- GoogleAdsOnDeviceConversion (3.2.0):
|
- GoogleAdsOnDeviceConversion (3.2.0):
|
||||||
- GoogleUtilities/Environment (~> 8.1)
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
- GoogleUtilities/Logger (~> 8.1)
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
|
|
@ -168,9 +164,6 @@ PODS:
|
||||||
- GoogleMLKit/BarcodeScanning (9.0.0):
|
- GoogleMLKit/BarcodeScanning (9.0.0):
|
||||||
- GoogleMLKit/MLKitCore
|
- GoogleMLKit/MLKitCore
|
||||||
- MLKitBarcodeScanning (~> 8.0.0)
|
- MLKitBarcodeScanning (~> 8.0.0)
|
||||||
- GoogleMLKit/FaceDetection (9.0.0):
|
|
||||||
- GoogleMLKit/MLKitCore
|
|
||||||
- MLKitFaceDetection (~> 8.0.0)
|
|
||||||
- GoogleMLKit/MLKitCore (9.0.0):
|
- GoogleMLKit/MLKitCore (9.0.0):
|
||||||
- MLKitCommon (~> 14.0.0)
|
- MLKitCommon (~> 14.0.0)
|
||||||
- GoogleToolboxForMac/Defines (4.2.1)
|
- GoogleToolboxForMac/Defines (4.2.1)
|
||||||
|
|
@ -253,9 +246,6 @@ PODS:
|
||||||
- GoogleUtilities/Logger (~> 8.0)
|
- GoogleUtilities/Logger (~> 8.0)
|
||||||
- GoogleUtilities/UserDefaults (~> 8.0)
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
|
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
|
||||||
- MLKitFaceDetection (8.0.0):
|
|
||||||
- MLKitCommon (~> 14.0)
|
|
||||||
- MLKitVision (~> 10.0)
|
|
||||||
- MLKitVision (10.0.0):
|
- MLKitVision (10.0.0):
|
||||||
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
|
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
|
||||||
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
|
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
|
||||||
|
|
@ -360,7 +350,6 @@ DEPENDENCIES:
|
||||||
- gal (from `.symlinks/plugins/gal/darwin`)
|
- gal (from `.symlinks/plugins/gal/darwin`)
|
||||||
- google_mlkit_barcode_scanning (from `.symlinks/plugins/google_mlkit_barcode_scanning/ios`)
|
- google_mlkit_barcode_scanning (from `.symlinks/plugins/google_mlkit_barcode_scanning/ios`)
|
||||||
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
|
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
|
||||||
- google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`)
|
|
||||||
- GoogleUtilities
|
- GoogleUtilities
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
|
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
|
||||||
|
|
@ -403,7 +392,6 @@ SPEC REPOS:
|
||||||
- MLImage
|
- MLImage
|
||||||
- MLKitBarcodeScanning
|
- MLKitBarcodeScanning
|
||||||
- MLKitCommon
|
- MLKitCommon
|
||||||
- MLKitFaceDetection
|
|
||||||
- MLKitVision
|
- MLKitVision
|
||||||
- nanopb
|
- nanopb
|
||||||
- PromisesObjC
|
- PromisesObjC
|
||||||
|
|
@ -457,8 +445,6 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/google_mlkit_barcode_scanning/ios"
|
:path: ".symlinks/plugins/google_mlkit_barcode_scanning/ios"
|
||||||
google_mlkit_commons:
|
google_mlkit_commons:
|
||||||
:path: ".symlinks/plugins/google_mlkit_commons/ios"
|
:path: ".symlinks/plugins/google_mlkit_commons/ios"
|
||||||
google_mlkit_face_detection:
|
|
||||||
:path: ".symlinks/plugins/google_mlkit_face_detection/ios"
|
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
in_app_purchase_storekit:
|
in_app_purchase_storekit:
|
||||||
|
|
@ -524,7 +510,6 @@ SPEC CHECKSUMS:
|
||||||
gal: baecd024ebfd13c441269ca7404792a7152fde89
|
gal: baecd024ebfd13c441269ca7404792a7152fde89
|
||||||
google_mlkit_barcode_scanning: 12d8422d8f7b00726dedf9cac00188a2b98750c2
|
google_mlkit_barcode_scanning: 12d8422d8f7b00726dedf9cac00188a2b98750c2
|
||||||
google_mlkit_commons: a5e4ffae5bc59ea4c7b9025dc72cb6cb79dc1166
|
google_mlkit_commons: a5e4ffae5bc59ea4c7b9025dc72cb6cb79dc1166
|
||||||
google_mlkit_face_detection: ee4b72cfae062b4c972204be955d83055a4bfd36
|
|
||||||
GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f
|
GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f
|
||||||
GoogleAppMeasurement: fce7c1c90640d2f9f5c56771f71deacb2ba3f98c
|
GoogleAppMeasurement: fce7c1c90640d2f9f5c56771f71deacb2ba3f98c
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
|
|
@ -540,7 +525,6 @@ SPEC CHECKSUMS:
|
||||||
MLImage: 0de5c6c2bf9e93b80ef752e2797f0836f03b58c0
|
MLImage: 0de5c6c2bf9e93b80ef752e2797f0836f03b58c0
|
||||||
MLKitBarcodeScanning: 39de223e7b1b8a8fbf10816a536dd292d8a39343
|
MLKitBarcodeScanning: 39de223e7b1b8a8fbf10816a536dd292d8a39343
|
||||||
MLKitCommon: 47d47b50a031d00db62f1b0efe5a1d8b09a3b2e6
|
MLKitCommon: 47d47b50a031d00db62f1b0efe5a1d8b09a3b2e6
|
||||||
MLKitFaceDetection: 32549f1e70e6e7731261bf9cea2b74095e2531cb
|
|
||||||
MLKitVision: 39a5a812db83c4a0794445088e567f3631c11961
|
MLKitVision: 39a5a812db83c4a0794445088e567f3631c11961
|
||||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||||
no_screenshot: 5e345998c43ffcad5d6834f249590483fcc037bd
|
no_screenshot: 5e345998c43ffcad5d6834f249590483fcc037bd
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ class ContactsDao extends DatabaseAccessor<TwonlyDB> with _$ContactsDaoMixin {
|
||||||
return query.map((row) => row.read(count)).watchSingle();
|
return query.map((row) => row.read(count)).watchSingle();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<int?> watchContactsRequested() {
|
Stream<int?> watchContactsRequestedCount() {
|
||||||
final count = contacts.requested.count(distinct: true);
|
final count = contacts.requested.count(distinct: true);
|
||||||
final query = selectOnly(contacts)
|
final query = selectOnly(contacts)
|
||||||
..where(
|
..where(
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,15 @@ Future<bool> handleNewContactRequest(int fromUserId) async {
|
||||||
.getContactByUserId(fromUserId)
|
.getContactByUserId(fromUserId)
|
||||||
.getSingleOrNull();
|
.getSingleOrNull();
|
||||||
if (contact != null) {
|
if (contact != null) {
|
||||||
if (contact.accepted) {
|
// Either the contact has accepted the fromUserId already: Then just blindly accept the request.
|
||||||
|
// Or the user has also requested fromUserId. This means that both user have requested each other (while been
|
||||||
|
// offline for example): In this case the contact can also be accepted blindly.
|
||||||
|
if (contact.accepted || (!contact.requested && !contact.deletedByUser)) {
|
||||||
|
if (!contact.accepted) {
|
||||||
|
// User has also requested the fromUserId, so mark the user as accepted.
|
||||||
|
await handleContactAccept(fromUserId);
|
||||||
|
}
|
||||||
|
|
||||||
// contact was already accepted, so just accept the request in the background.
|
// contact was already accepted, so just accept the request in the background.
|
||||||
await sendCipherText(
|
await sendCipherText(
|
||||||
contact.userId,
|
contact.userId,
|
||||||
|
|
@ -50,6 +58,28 @@ Future<bool> handleNewContactRequest(int fromUserId) async {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> handleContactAccept(int fromUserId) async {
|
||||||
|
await twonlyDB.contactsDao.updateContact(
|
||||||
|
fromUserId,
|
||||||
|
const ContactsCompanion(
|
||||||
|
requested: Value(false),
|
||||||
|
accepted: Value(true),
|
||||||
|
deletedByUser: Value(false),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final contact = await twonlyDB.contactsDao
|
||||||
|
.getContactByUserId(fromUserId)
|
||||||
|
.getSingleOrNull();
|
||||||
|
if (contact != null) {
|
||||||
|
await twonlyDB.groupsDao.createNewDirectChat(
|
||||||
|
fromUserId,
|
||||||
|
GroupsCompanion(
|
||||||
|
groupName: Value(getContactDisplayName(contact)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<bool> handleContactRequest(
|
Future<bool> handleContactRequest(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
EncryptedContent_ContactRequest contactRequest,
|
EncryptedContent_ContactRequest contactRequest,
|
||||||
|
|
@ -60,25 +90,7 @@ Future<bool> handleContactRequest(
|
||||||
return handleNewContactRequest(fromUserId);
|
return handleNewContactRequest(fromUserId);
|
||||||
case EncryptedContent_ContactRequest_Type.ACCEPT:
|
case EncryptedContent_ContactRequest_Type.ACCEPT:
|
||||||
Log.info('Got a contact accept from $fromUserId');
|
Log.info('Got a contact accept from $fromUserId');
|
||||||
await twonlyDB.contactsDao.updateContact(
|
await handleContactAccept(fromUserId);
|
||||||
fromUserId,
|
|
||||||
const ContactsCompanion(
|
|
||||||
requested: Value(false),
|
|
||||||
accepted: Value(true),
|
|
||||||
deletedByUser: Value(false),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
final contact = await twonlyDB.contactsDao
|
|
||||||
.getContactByUserId(fromUserId)
|
|
||||||
.getSingleOrNull();
|
|
||||||
if (contact != null) {
|
|
||||||
await twonlyDB.groupsDao.createNewDirectChat(
|
|
||||||
fromUserId,
|
|
||||||
GroupsCompanion(
|
|
||||||
groupName: Value(getContactDisplayName(contact)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
case EncryptedContent_ContactRequest_Type.REJECT:
|
case EncryptedContent_ContactRequest_Type.REJECT:
|
||||||
Log.info('Got a contact reject from $fromUserId');
|
Log.info('Got a contact reject from $fromUserId');
|
||||||
await twonlyDB.contactsDao.updateContact(
|
await twonlyDB.contactsDao.updateContact(
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import 'package:twonly/src/services/api/client2client/text_message.c2c.dart';
|
||||||
import 'package:twonly/src/services/api/messages.dart';
|
import 'package:twonly/src/services/api/messages.dart';
|
||||||
import 'package:twonly/src/services/group.services.dart';
|
import 'package:twonly/src/services/group.services.dart';
|
||||||
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
||||||
|
import 'package:twonly/src/services/signal/session.signal.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
|
|
||||||
|
|
@ -94,6 +95,11 @@ Future<void> handleClient2ClientMessage(NewMessage newMessage) async {
|
||||||
var retry = false;
|
var retry = false;
|
||||||
if (message.hasPlaintextContent()) {
|
if (message.hasPlaintextContent()) {
|
||||||
if (message.plaintextContent.hasDecryptionErrorMessage()) {
|
if (message.plaintextContent.hasDecryptionErrorMessage()) {
|
||||||
|
if (message.plaintextContent.decryptionErrorMessage.type ==
|
||||||
|
PlaintextContent_DecryptionErrorMessage_Type.PREKEY_UNKNOWN) {
|
||||||
|
// Get a new prekey from the server, and establish a new signal session.
|
||||||
|
await handleSessionResync(fromUserId);
|
||||||
|
}
|
||||||
Log.info(
|
Log.info(
|
||||||
'Got decryption error: ${message.plaintextContent.decryptionErrorMessage.type} for $receiptId',
|
'Got decryption error: ${message.plaintextContent.decryptionErrorMessage.type} for $receiptId',
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ class _ChatListViewState extends State<ChatListView> {
|
||||||
actions: [
|
actions: [
|
||||||
const FeedbackIconButton(),
|
const FeedbackIconButton(),
|
||||||
StreamBuilder(
|
StreamBuilder(
|
||||||
stream: twonlyDB.contactsDao.watchContactsRequested(),
|
stream: twonlyDB.contactsDao.watchContactsRequestedCount(),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
var count = 0;
|
var count = 0;
|
||||||
if (snapshot.hasData && snapshot.data != null) {
|
if (snapshot.hasData && snapshot.data != null) {
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,9 @@ class GroupMemberContextMenu extends StatelessWidget {
|
||||||
await twonlyDB.contactsDao.updateContact(
|
await twonlyDB.contactsDao.updateContact(
|
||||||
member.contactId,
|
member.contactId,
|
||||||
const ContactsCompanion(
|
const ContactsCompanion(
|
||||||
requested: Value(true),
|
accepted: Value(false),
|
||||||
|
requested: Value(false),
|
||||||
|
deletedByUser: Value(false),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await sendCipherText(
|
await sendCipherText(
|
||||||
|
|
|
||||||
16
pubspec.lock
16
pubspec.lock
|
|
@ -341,18 +341,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cryptography_flutter_plus
|
name: cryptography_flutter_plus
|
||||||
sha256: "35a8c270aae0abaac7125a6b6b33c2b3daa0ea90d85320aa7d588b6dd6c2edc9"
|
sha256: "65bc0a78c2104cdb02f4b69e3a03abef093e660d9d9208bc81942b058b49deb2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.4"
|
version: "3.0.0"
|
||||||
cryptography_plus:
|
cryptography_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cryptography_plus
|
name: cryptography_plus
|
||||||
sha256: "34db787df4f4740a39474b6fb0a610aa6dc13a5b5b68754b4787a79939ac0454"
|
sha256: edf96fc96518368b11bb1ba33b515f59aa5a55b0aa7533c0e1813399cf81130e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.7.1"
|
version: "3.0.0"
|
||||||
csslib:
|
csslib:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1080,14 +1080,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.14.2"
|
version: "0.14.2"
|
||||||
js:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: js
|
|
||||||
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.7.2"
|
|
||||||
json_annotation:
|
json_annotation:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,8 @@ dependencies:
|
||||||
avatar_maker: ^0.4.0
|
avatar_maker: ^0.4.0
|
||||||
background_downloader: ^9.4.0
|
background_downloader: ^9.4.0
|
||||||
cached_network_image: ^3.4.1
|
cached_network_image: ^3.4.1
|
||||||
cryptography_flutter_plus: ^2.3.4
|
cryptography_flutter_plus: ^3.0.0
|
||||||
cryptography_plus: ^2.7.0
|
cryptography_plus: ^3.0.0
|
||||||
flutter_android_volume_keydown: ^1.0.1
|
flutter_android_volume_keydown: ^1.0.1
|
||||||
flutter_image_compress: ^2.4.0
|
flutter_image_compress: ^2.4.0
|
||||||
flutter_volume_controller: ^1.3.4
|
flutter_volume_controller: ^1.3.4
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue