diff --git a/CHANGELOG.md b/CHANGELOG.md index c5c3bb0d..307ce68f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ ## 0.2.9 +- Improved: Make contact avatars clickable - Fix: Messages occasionally not received until app restart +- Fix: Complete setup would sometimes get stuck ## 0.2.8 diff --git a/lib/main.dart b/lib/main.dart index 89789de3..ddd6f46f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -193,6 +193,21 @@ Future postStartupTasks() async { unawaited(finishStartedPreprocessing()); unawaited(createPushAvatars()); + if (userService.currentUser.userDiscoveryInitializationError) { + unawaited(() async { + try { + await UserDiscoveryService.initializeOrUpdate( + threshold: userService.currentUser.userDiscoveryThreshold, + sharePromotion: userService.currentUser.userDiscoverySharePromotion, + ); + } catch (e) { + Log.error( + 'Failed to retry UserDiscovery initialization on startup: $e', + ); + } + }()); + } + await Future.delayed(const Duration(seconds: 10)); unawaited(initializeBackgroundTaskManager()); // 3. Delayed tasks (Wait for app to settle) diff --git a/lib/src/model/json/userdata.model.dart b/lib/src/model/json/userdata.model.dart index 07a44b81..52b9857b 100644 --- a/lib/src/model/json/userdata.model.dart +++ b/lib/src/model/json/userdata.model.dart @@ -109,6 +109,9 @@ class UserData { @JsonKey(defaultValue: true) bool userDiscoverySharePromotion = true; + @JsonKey(defaultValue: false) + bool userDiscoveryInitializationError = false; + // -- Custom DATA -- @JsonKey(defaultValue: 100_000) diff --git a/lib/src/services/user_discovery.service.dart b/lib/src/services/user_discovery.service.dart index d7d61504..0161c1f0 100644 --- a/lib/src/services/user_discovery.service.dart +++ b/lib/src/services/user_discovery.service.dart @@ -75,30 +75,27 @@ class UserDiscoveryService { required int threshold, required bool sharePromotion, }) async { - try { - Log.info('UserDiscoveryService: initializeOrUpdate started'); - final userId = userService.currentUser.userId; - final publicKey = await getUserPublicKey(); - Log.info('UserDiscoveryService: initializing Rust bridge'); - await FlutterUserDiscovery.initializeOrUpdate( - threshold: threshold, - userId: userId, - publicKey: publicKey, - sharePromotion: sharePromotion, - ); - Log.info( - 'UserDiscoveryService: Rust bridge initialized, updating UserService', - ); - await UserService.update( - (u) => u - ..isUserDiscoveryEnabled = true - ..userDiscoverySharePromotion = sharePromotion - ..userDiscoveryThreshold = threshold, - ); - Log.info('UserDiscoveryService: initializeOrUpdate finished'); - } catch (e) { - Log.error('UserDiscoveryService: initializeOrUpdate error: $e'); - } + Log.info('UserDiscoveryService: initializeOrUpdate started'); + final userId = userService.currentUser.userId; + final publicKey = await getUserPublicKey(); + Log.info('UserDiscoveryService: initializing Rust bridge'); + await FlutterUserDiscovery.initializeOrUpdate( + threshold: threshold, + userId: userId, + publicKey: publicKey, + sharePromotion: sharePromotion, + ).timeout(const Duration(seconds: 8)); + Log.info( + 'UserDiscoveryService: Rust bridge initialized, updating UserService', + ); + await UserService.update( + (u) => u + ..isUserDiscoveryEnabled = true + ..userDiscoverySharePromotion = sharePromotion + ..userDiscoveryThreshold = threshold + ..userDiscoveryInitializationError = false, + ); + Log.info('UserDiscoveryService: initializeOrUpdate finished'); } static Future getCurrentVersion() async { diff --git a/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_setup.comp.dart b/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_setup.comp.dart index d00c331f..11fde673 100644 --- a/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_setup.comp.dart +++ b/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_setup.comp.dart @@ -55,12 +55,20 @@ class UserDiscoverySetupState { Future initializeOrUpdate() async { try { Log.info('UserDiscoverySetupState: initializeOrUpdate started'); + var hasError = false; if (isUserDiscoveryEnabled) { Log.info('UserDiscoverySetupState: initializing UserDiscoveryService'); - await UserDiscoveryService.initializeOrUpdate( - threshold: threshold, - sharePromotion: sharePromotion, - ); + try { + await UserDiscoveryService.initializeOrUpdate( + threshold: threshold, + sharePromotion: sharePromotion, + ); + } catch (e) { + Log.error( + 'UserDiscoverySetupState: UserDiscoveryService failed or timed out: $e', + ); + hasError = true; + } } Log.info('UserDiscoverySetupState: updating UserService'); @@ -68,7 +76,8 @@ class UserDiscoverySetupState { u ..isUserDiscoveryEnabled = isUserDiscoveryEnabled ..requiredSendImages = requiredSendImages - ..userDiscoveryRequiresManualApproval = isManualApprovalEnabled; + ..userDiscoveryRequiresManualApproval = isManualApprovalEnabled + ..userDiscoveryInitializationError = hasError; }); Log.info('UserDiscoverySetupState: initializeOrUpdate finished'); @@ -474,7 +483,7 @@ class _ExampleLabel extends StatelessWidget { ), child: Text( context.lang.onboardingExampleLabel, - style: const TextStyle(fontSize: 10, color: Colors.white), + style: const TextStyle(fontSize: 10), ), ), ), diff --git a/rust_dependencies/protocols/src/user_discovery.rs b/rust_dependencies/protocols/src/user_discovery.rs index 30675e55..68bccd63 100644 --- a/rust_dependencies/protocols/src/user_discovery.rs +++ b/rust_dependencies/protocols/src/user_discovery.rs @@ -91,10 +91,8 @@ impl UserDiscovery, share_promotion: bool, ) -> Result<()> { - tracing::info!("Protocols: initialize_or_update started, getting config_lock"); - let config_lock = self.config_lock.lock().await; - tracing::info!("Protocols: got config_lock, getting config from store"); - let mut config = match self.store.get_config().await { + tracing::info!("Protocols: initialize_or_update started, getting config from store"); + let config = match self.store.get_config().await { Ok(config) => { let mut config: UserDiscoveryConfig = serde_json::from_str(&config)?; config.threshold = threshold; @@ -127,13 +125,25 @@ impl UserDiscovery serde_json::from_str(&c)?, + Err(_) => UserDiscoveryConfig { + threshold, + user_id, + ..Default::default() + }, + }; + + final_config.public_id = public_id; + final_config.announcement_version += 1; + final_config.verification_shares = verification_shares; + final_config.share_promotion = share_promotion; + final_config.threshold = threshold; + + self.update_config(final_config, config_lock).await?; tracing::info!("Protocols: initialize_or_update finished"); Ok(())