opt: fetch rgba positively for sessions on flutter

This commit is contained in:
Kingtous 2023-02-11 09:57:27 +08:00
parent d416d7d965
commit 491932cda1
5 changed files with 31 additions and 3 deletions

View File

@ -1376,7 +1376,12 @@ class FFI {
debugPrint('json.decode fail1(): $e, ${message.field0}'); debugPrint('json.decode fail1(): $e, ${message.field0}');
} }
} else if (message is EventToUI_Rgba) { } else if (message is EventToUI_Rgba) {
imageModel.onRgba(message.field0); // Fetch the image buffer from rust codes.
bind.sessionGetRgba(id: id).then((rgba) {
if (rgba != null) {
imageModel.onRgba(rgba);
}
});
} }
} }
}(); }();

View File

@ -110,6 +110,7 @@ pub unsafe extern "C" fn free_c_args(ptr: *mut *mut c_char, len: c_int) {
#[derive(Default, Clone)] #[derive(Default, Clone)]
pub struct FlutterHandler { pub struct FlutterHandler {
pub event_stream: Arc<RwLock<Option<StreamSink<EventToUI>>>>, pub event_stream: Arc<RwLock<Option<StreamSink<EventToUI>>>>,
pub rgba: Arc<RwLock<Option<Vec<u8>>>>
} }
impl FlutterHandler { impl FlutterHandler {
@ -290,7 +291,8 @@ impl InvokeUiSession for FlutterHandler {
fn on_rgba(&self, data: &[u8]) { fn on_rgba(&self, data: &[u8]) {
if let Some(stream) = &*self.event_stream.read().unwrap() { if let Some(stream) = &*self.event_stream.read().unwrap() {
stream.add(EventToUI::Rgba(ZeroCopyBuffer(data.to_owned()))); drop(self.rgba.write().unwrap().replace(data.to_owned()));
stream.add(EventToUI::Rgba);
} }
} }
@ -409,6 +411,10 @@ impl InvokeUiSession for FlutterHandler {
fn on_voice_call_incoming(&self) { fn on_voice_call_incoming(&self) {
self.push_event("on_voice_call_incoming", [].into()); self.push_event("on_voice_call_incoming", [].into());
} }
fn get_rgba(&self) -> Option<Vec<u8>> {
self.rgba.write().unwrap().take()
}
} }
/// Create a new remote session with the given id. /// Create a new remote session with the given id.

View File

@ -20,6 +20,7 @@ use std::{
os::raw::c_char, os::raw::c_char,
str::FromStr, str::FromStr,
}; };
use crate::ui_session_interface::InvokeUiSession;
// use crate::hbbs_http::account::AuthResult; // use crate::hbbs_http::account::AuthResult;
@ -47,7 +48,7 @@ fn initialize(app_dir: &str) {
pub enum EventToUI { pub enum EventToUI {
Event(String), Event(String),
Rgba(ZeroCopyBuffer<Vec<u8>>), Rgba,
} }
pub fn start_global_event_stream(s: StreamSink<String>, app_type: String) -> ResultType<()> { pub fn start_global_event_stream(s: StreamSink<String>, app_type: String) -> ResultType<()> {
@ -103,6 +104,16 @@ pub fn session_get_remember(id: String) -> Option<bool> {
} }
} }
pub fn session_get_rgba(id: String) -> Option<ZeroCopyBuffer<Vec<u8>>> {
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
return match session.get_rgba() {
Some(buf) => Some(ZeroCopyBuffer(buf)),
_ => None
};
}
None
}
pub fn session_get_toggle_option(id: String, arg: String) -> Option<bool> { pub fn session_get_toggle_option(id: String, arg: String) -> Option<bool> {
if let Some(session) = SESSIONS.read().unwrap().get(&id) { if let Some(session) = SESSIONS.read().unwrap().get(&id) {
Some(session.get_toggle_option(arg)) Some(session.get_toggle_option(arg))

View File

@ -282,6 +282,11 @@ impl InvokeUiSession for SciterHandler {
fn on_voice_call_incoming(&self) { fn on_voice_call_incoming(&self) {
self.call("onVoiceCallIncoming", &make_args!()); self.call("onVoiceCallIncoming", &make_args!());
} }
/// RGBA is directly rendered by [on_rgba]. No need to store the rgba for the sciter ui.
fn get_rgba(&self) -> Option<Vec<u8>> {
None
}
} }
pub struct SciterSession(Session<SciterHandler>); pub struct SciterSession(Session<SciterHandler>);

View File

@ -722,6 +722,7 @@ pub trait InvokeUiSession: Send + Sync + Clone + 'static + Sized + Default {
fn on_voice_call_closed(&self, reason: &str); fn on_voice_call_closed(&self, reason: &str);
fn on_voice_call_waiting(&self); fn on_voice_call_waiting(&self);
fn on_voice_call_incoming(&self); fn on_voice_call_incoming(&self);
fn get_rgba(&self) -> Option<Vec<u8>>;
} }
impl<T: InvokeUiSession> Deref for Session<T> { impl<T: InvokeUiSession> Deref for Session<T> {