diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 5cce43cff..c5870243b 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -351,6 +351,8 @@ class FfiModel with ChangeNotifier { showElevationError(sessionId, type, title, text, dialogManager); } else if (type == 'relay-hint') { showRelayHintDialog(sessionId, type, title, text, dialogManager, peerId); + } else if (text == 'Connected, waiting for image...') { + showConnectedWaitingForImage(dialogManager, sessionId, type, title, text); } else { var hasRetry = evt['hasRetry'] == 'true'; showMsgBox(sessionId, type, title, text, link, hasRetry, dialogManager); @@ -416,6 +418,25 @@ class FfiModel with ChangeNotifier { }); } + void showConnectedWaitingForImage(OverlayDialogManager dialogManager, + SessionID sessionId, String type, String title, String text) { + onClose() { + closeConnection(); + } + + dialogManager.show( + (setState, close, context) => CustomAlertDialog( + title: null, + content: SelectionArea(child: msgboxContent(type, title, text)), + actions: [ + dialogButton("Cancel", onPressed: onClose, isOutline: true) + ], + onCancel: onClose), + tag: '$sessionId-waiting-for-image', + ); + _waitForImage[sessionId] = true; + } + _updateSessionWidthHeight(SessionID sessionId) { parent.target?.canvasModel.updateViewStyle(); if (display.width <= 0 || display.height <= 0) { @@ -478,13 +499,7 @@ class FfiModel with ChangeNotifier { _updateSessionWidthHeight(sessionId); } if (displays.isNotEmpty) { - parent.target?.dialogManager.showLoading( - translate('Connected, waiting for image...'), - onCancel: closeConnection, - tag: '$peerId-waiting-for-image'); - _waitForImage[sessionId] = true; _reconnects = 1; - bind.sessionOnWaitingForImageDialogShow(sessionId: sessionId); } Map features = json.decode(evt['features']); _pi.features.privacyMode = features['privacy_mode'] == 1; @@ -638,7 +653,7 @@ class ImageModel with ChangeNotifier { if (waitforImage == true) { _waitForImage[sessionId] = false; parent.target?.dialogManager.dismissAll(); - clearWaitingForImage(parent.target?.dialogManager, id); + clearWaitingForImage(parent.target?.dialogManager, sessionId); if (isDesktop) { for (final cb in callbacksOnFirstImage) { @@ -1687,7 +1702,7 @@ class FFI { } } else if (message is EventToUI_Rgba) { if (useTextureRender) { - if (_waitForImage[sessionId]!) { + if (_waitForImage[sessionId] != false) { _waitForImage[sessionId] = false; dialogManager.dismissAll(); for (final cb in imageModel.callbacksOnFirstImage) { @@ -1695,7 +1710,7 @@ class FFI { } await canvasModel.updateViewStyle(); await canvasModel.updateScrollStyle(); - clearWaitingForImage(dialogManager, id); + clearWaitingForImage(dialogManager, sessionId); } } else { // Fetch the image buffer from rust codes. @@ -1891,11 +1906,11 @@ Future initializeCursorAndCanvas(FFI ffi) async { ffi.canvasModel.update(xCanvas, yCanvas, scale); } -clearWaitingForImage(OverlayDialogManager? dialogManager, String id) { +clearWaitingForImage(OverlayDialogManager? dialogManager, SessionID sessionId) { final durations = [100, 500, 1000, 2000]; for (var duration in durations) { Future.delayed(Duration(milliseconds: duration), () { - dialogManager?.dismissByTag('$id-waiting-for-image'); + dialogManager?.dismissByTag('$sessionId-waiting-for-image'); }); } } diff --git a/src/flutter.rs b/src/flutter.rs index c0766c008..ef455e8fb 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -238,6 +238,13 @@ impl VideoRenderer { // It is also Ok to skip this check. if self.width != rgba.w || self.height != rgba.h { + log::error!( + "width/height mismatch: ({},{}) != ({},{})", + self.width, + self.height, + rgba.w, + rgba.h + ); return; } @@ -338,14 +345,6 @@ impl FlutterHandler { *self.notify_rendered.write().unwrap() = false; self.renderer.write().unwrap().set_size(width, height); } - - pub fn on_waiting_for_image_dialog_show(&self) { - #[cfg(any(feature = "flutter_texture_render"))] - { - *self.notify_rendered.write().unwrap() = false; - } - // rgba array render will notify every frame - } } impl InvokeUiSession for FlutterHandler { diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 74806915f..4b0ffc262 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1257,12 +1257,6 @@ pub fn session_change_prefer_codec(session_id: SessionID) { } } -pub fn session_on_waiting_for_image_dialog_show(session_id: SessionID) { - if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { - session.ui_handler.on_waiting_for_image_dialog_show(); - } -} - pub fn main_set_home_dir(_home: String) { #[cfg(any(target_os = "android", target_os = "ios"))] { diff --git a/src/ui_interface.rs b/src/ui_interface.rs index bcc2ab54f..2979f4ceb 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -3,9 +3,7 @@ use hbb_common::password_security; use hbb_common::{ allow_err, config::{self, Config, LocalConfig, PeerConfig}, - directories_next, log, - sodiumoxide::base64, - tokio, + directories_next, log, tokio, }; use hbb_common::{ bytes::Bytes, @@ -615,6 +613,7 @@ pub fn peer_to_map(id: String, p: PeerConfig) -> HashMap<&'static str, String> { #[cfg(feature = "flutter")] pub fn peer_to_map_ab(id: String, p: PeerConfig) -> HashMap<&'static str, String> { + use hbb_common::sodiumoxide::base64; let mut m = peer_to_map(id, p.clone()); m.insert( "hash",