opt: fetch rgba positively for sessions on flutter
This commit is contained in:
parent
d416d7d965
commit
491932cda1
@ -1376,7 +1376,12 @@ class FFI {
|
||||
debugPrint('json.decode fail1(): $e, ${message.field0}');
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}();
|
||||
|
@ -110,6 +110,7 @@ pub unsafe extern "C" fn free_c_args(ptr: *mut *mut c_char, len: c_int) {
|
||||
#[derive(Default, Clone)]
|
||||
pub struct FlutterHandler {
|
||||
pub event_stream: Arc<RwLock<Option<StreamSink<EventToUI>>>>,
|
||||
pub rgba: Arc<RwLock<Option<Vec<u8>>>>
|
||||
}
|
||||
|
||||
impl FlutterHandler {
|
||||
@ -290,7 +291,8 @@ impl InvokeUiSession for FlutterHandler {
|
||||
|
||||
fn on_rgba(&self, data: &[u8]) {
|
||||
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) {
|
||||
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.
|
||||
|
@ -20,6 +20,7 @@ use std::{
|
||||
os::raw::c_char,
|
||||
str::FromStr,
|
||||
};
|
||||
use crate::ui_session_interface::InvokeUiSession;
|
||||
|
||||
// use crate::hbbs_http::account::AuthResult;
|
||||
|
||||
@ -47,7 +48,7 @@ fn initialize(app_dir: &str) {
|
||||
|
||||
pub enum EventToUI {
|
||||
Event(String),
|
||||
Rgba(ZeroCopyBuffer<Vec<u8>>),
|
||||
Rgba,
|
||||
}
|
||||
|
||||
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> {
|
||||
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||
Some(session.get_toggle_option(arg))
|
||||
|
@ -282,6 +282,11 @@ impl InvokeUiSession for SciterHandler {
|
||||
fn on_voice_call_incoming(&self) {
|
||||
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>);
|
||||
|
@ -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_waiting(&self);
|
||||
fn on_voice_call_incoming(&self);
|
||||
fn get_rgba(&self) -> Option<Vec<u8>>;
|
||||
}
|
||||
|
||||
impl<T: InvokeUiSession> Deref for Session<T> {
|
||||
|
Loading…
x
Reference in New Issue
Block a user