Make loading the messages be responsibility of the state itself
This commit is contained in:
parent
11ca5019b5
commit
9daff326d1
@ -165,7 +165,7 @@ pub trait MenuItem {
|
|||||||
|
|
||||||
#[derive(Default, Debug, Clone)]
|
#[derive(Default, Debug, Clone)]
|
||||||
pub struct Menu<T: MenuItem> {
|
pub struct Menu<T: MenuItem> {
|
||||||
items: Vec<T>,
|
pub items: Vec<T>,
|
||||||
idx: usize,
|
idx: usize,
|
||||||
scroll: usize,
|
scroll: usize,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -340,27 +340,7 @@ impl State for MainMenuState {
|
|||||||
match option {
|
match option {
|
||||||
MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())),
|
MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())),
|
||||||
MainMenuItem::ReadSMS => {
|
MainMenuItem::ReadSMS => {
|
||||||
return Some(Box::new(ATCommandState::with(
|
return Some(Box::new(ListSMSMessagesState::default()));
|
||||||
"Loading\nmessages".to_owned(),
|
|
||||||
ListSMSMessages {
|
|
||||||
stat: SMSMessageStat::All,
|
|
||||||
},
|
|
||||||
|resp| match resp {
|
|
||||||
Ok(response) => match response {
|
|
||||||
ListSMSMessagesResponse::Ok(messages) => {
|
|
||||||
Box::new(ListSMSMessagesState::from(messages))
|
|
||||||
}
|
|
||||||
ListSMSMessagesResponse::Error(err) => Box::new(TextState {
|
|
||||||
text: format!("Error:\n{:?}", err),
|
|
||||||
after: MainMenuState::default(),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
Err(err) => Box::new(TextState {
|
|
||||||
text: format!("Error:\n{:?}", err),
|
|
||||||
after: MainMenuState::default(),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -388,24 +368,53 @@ impl MenuItem for MessageListing {
|
|||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
pub struct ListSMSMessagesState {
|
pub struct ListSMSMessagesState {
|
||||||
menu: Menu<MessageListing>,
|
menu: Menu<MessageListing>,
|
||||||
}
|
promise: Option<ATPromise<ListSMSMessages>>,
|
||||||
|
|
||||||
impl ListSMSMessagesState {
|
|
||||||
pub fn from(messages: Vec<SMSMessageListing>) -> ListSMSMessagesState {
|
|
||||||
let mut menu = Menu::default();
|
|
||||||
for message in &messages {
|
|
||||||
menu = menu.with_item(MessageListing {
|
|
||||||
from: message.from_addr.clone(),
|
|
||||||
text: message.text.clone(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ListSMSMessagesState { menu }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State for ListSMSMessagesState {
|
impl State for ListSMSMessagesState {
|
||||||
|
fn init(&mut self, data: &mut StateData) {
|
||||||
|
self.promise = data
|
||||||
|
.io
|
||||||
|
.send_at_command(ListSMSMessages {
|
||||||
|
stat: SMSMessageStat::All,
|
||||||
|
})
|
||||||
|
.ok()
|
||||||
|
}
|
||||||
|
|
||||||
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
||||||
|
if let Some(promise) = &self.promise {
|
||||||
|
match promise.poll(&mut data.io) {
|
||||||
|
Some(result) => {
|
||||||
|
match result {
|
||||||
|
Ok(response) => match response {
|
||||||
|
ListSMSMessagesResponse::Ok(messages) => {
|
||||||
|
for message in messages {
|
||||||
|
self.menu = self.menu.clone().with_item(MessageListing {
|
||||||
|
from: message.from_addr.clone(),
|
||||||
|
text: message.text.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ListSMSMessagesResponse::Error(err) => {
|
||||||
|
return Some(Box::new(TextState {
|
||||||
|
text: format!("Error\n{:?}", err),
|
||||||
|
after: MainMenuState::default(),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
return Some(Box::new(TextState {
|
||||||
|
text: format!("Error\n{:?}", err),
|
||||||
|
after: MainMenuState::default(),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.promise = None;
|
||||||
|
}
|
||||||
|
None => return None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(listing) = self.menu.poll(&mut data.io) {
|
if let Some(listing) = self.menu.poll(&mut data.io) {
|
||||||
return Some(Box::new(ReadMessageState {
|
return Some(Box::new(ReadMessageState {
|
||||||
message: listing.clone(),
|
message: listing.clone(),
|
||||||
@ -419,7 +428,16 @@ impl State for ListSMSMessagesState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn draw(&self, data: &mut StateData) {
|
fn draw(&self, data: &mut StateData) {
|
||||||
self.menu.draw(data);
|
data.clear_screen(Rgb565::black().as_color());
|
||||||
|
if self.menu.items.len() == 0 {
|
||||||
|
data.draw_text(
|
||||||
|
"Loading\nmessages",
|
||||||
|
Position::new(0, 0),
|
||||||
|
TextSettings::default(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
self.menu.draw(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,7 +449,7 @@ pub struct ReadMessageState {
|
|||||||
impl State for ReadMessageState {
|
impl State for ReadMessageState {
|
||||||
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
||||||
if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 {
|
if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 {
|
||||||
Some(Box::new(MainMenuState::default()))
|
Some(Box::new(ListSMSMessagesState::default()))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user