pub struct OtaView {
id: Id,
rect: Rectangle,
children: Vec<Box<dyn View>>,
view_id: ViewId,
github_token: Option<SecretString>,
keyboard_index: Option<usize>,
pending_download: Option<PendingDownload>,
status_label_index: Option<usize>,
progress_bar_index: Option<usize>,
}Expand description
UI view for downloading and installing OTA updates from GitHub.
Manages two screens:
- Source selection dialog - asks where to download from (Stable Release, Main Branch, or PR Build)
- PR input screen - prompts for PR number input (only for PR Build)
Once a download starts, the view transitions to a full-screen progress
screen showing a status label and a ProgressBar. On successful
deployment the label updates to “Rebooting…” and the app reboots
automatically via Event::Select with EntryId::Reboot.
When a GitHub token is required but not present, the view pushes a
DeviceAuthView child to guide the user through device flow
authentication. Once authorized, the pending download resumes automatically.
§Security
The GitHub token is securely stored using SecretString to prevent
accidental exposure in logs or debug output.
Fields§
§id: Id§rect: Rectangle§children: Vec<Box<dyn View>>§view_id: ViewId§github_token: Option<SecretString>§keyboard_index: Option<usize>§pending_download: Option<PendingDownload>§status_label_index: Option<usize>Index into children of the status Label shown during download.
progress_bar_index: Option<usize>Index into children of the ProgressBar shown during download.
Implementations§
Source§impl OtaView
impl OtaView
Sourcepub fn new(context: &mut Context) -> OtaView
pub fn new(context: &mut Context) -> OtaView
Creates a new OTA view.
Attempts to load a previously saved GitHub token from disk. If none is found the view will prompt for device flow authentication when a token-gated download is requested.
Initially displays the source selection dialog asking where to download updates from.
§Arguments
context- Application context containing fonts and device information
Sourcefn build_source_selection_dialog(context: &mut Context) -> Dialog
fn build_source_selection_dialog(context: &mut Context) -> Dialog
Builds the source selection dialog.
Sourcefn build_pr_input_screen(&mut self, context: &mut Context)
fn build_pr_input_screen(&mut self, context: &mut Context)
Builds the PR input screen with title, input field, and keyboard.
Sourcefn build_progress_screen(&mut self, status: &str, context: &mut Context)
fn build_progress_screen(&mut self, status: &str, context: &mut Context)
Builds the full-screen progress screen shown during download/deployment.
Clears all existing children and adds:
- A white full-screen
Fillerbackground - A centered
Labelwith the given status text - A centered
ProgressBarbelow the label
The indices of the label and progress bar are stored so they can be updated incrementally as progress events arrive.
Sourcefn toggle_keyboard(
&mut self,
visible: bool,
hub: &Hub,
rq: &mut RenderQueue,
context: &mut Context,
)
fn toggle_keyboard( &mut self, visible: bool, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, )
Toggles keyboard visibility based on focus state.
Sourcefn handle_pr_submission(
&mut self,
text: &str,
hub: &Hub,
rq: &mut RenderQueue,
context: &mut Context,
)
fn handle_pr_submission( &mut self, text: &str, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, )
Handles submission of PR number from input field.
Validates the input, transitions to the progress screen, and initiates the download. The view stays alive so it can receive progress events and handle token-invalid errors.
Sourcefn handle_outside_tap(&self, tap_position: Point, context: &Context, hub: &Hub)
fn handle_outside_tap(&self, tap_position: Point, context: &Context, hub: &Hub)
Handles tap gesture outside the dialog and keyboard areas.
Closes the view when user taps outside to dismiss.
§Arguments
tap_position- The position where the tap occurredcontext- Application context containing keyboard rectanglehub- Event hub for sending close event
Sourcefn require_github_token(
&mut self,
pending: PendingDownload,
hub: &Hub,
rq: &mut RenderQueue,
context: &mut Context,
) -> bool
fn require_github_token( &mut self, pending: PendingDownload, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, ) -> bool
Checks that a GitHub token is available.
Returns true if a token is present and the caller may proceed.
If no token is found, pushes a DeviceAuthView child to guide the
user through device flow authentication and returns false.
Sourcefn start_pr_download(&mut self, pr_number: u32, hub: &Hub)
fn start_pr_download(&mut self, pr_number: u32, hub: &Hub)
Initiates the PR artifact download in a background thread.
Sends Event::OtaDownloadProgress during the download. On success,
updates the status label to “Rebooting…” and sends
Event::Select with EntryId::Reboot to trigger an automatic reboot.
On a 401 response, sends Event::Github with GithubEvent::TokenInvalid without closing
the view so re-authentication can proceed.
Sourcefn start_default_branch_download(&mut self, hub: &Hub)
fn start_default_branch_download(&mut self, hub: &Hub)
Initiates the default branch download in a background thread.
Sends Event::OtaDownloadProgress during the download. On success,
updates the status label to “Rebooting…” and sends
Event::Select with EntryId::Reboot to trigger an automatic reboot.
On a 401 response, sends Event::Github with GithubEvent::TokenInvalid without closing
the view so re-authentication can proceed.
Sourcefn start_stable_release_download(&mut self, hub: &Hub)
fn start_stable_release_download(&mut self, hub: &Hub)
Initiates the stable release download in a background thread.
Sends Event::OtaDownloadProgress during the download. On success,
updates the status label to “Rebooting…” and sends
Event::Select with EntryId::Reboot to trigger an automatic reboot.
On a 401 response, sends Event::Github with GithubEvent::TokenInvalid without closing
the view so re-authentication can proceed.
GitHub authentication is not required for this operation.
§Arguments
hub- Event hub for sending notifications and status updates
Source§impl OtaView
impl OtaView
fn on_select_default_branch( &mut self, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, ) -> bool
fn on_select_stable_release(&mut self, hub: &Hub) -> bool
fn on_show_pr_input( &mut self, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, ) -> bool
fn on_download_progress( &mut self, label: &str, percent: u8, rq: &mut RenderQueue, ) -> bool
fn on_device_auth_complete( &mut self, token: &SecretString, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, ) -> bool
fn on_token_invalid( &mut self, hub: &Hub, rq: &mut RenderQueue, context: &mut Context, ) -> bool
fn on_device_auth_expired(&mut self, hub: &Hub) -> bool
fn on_device_auth_error(&mut self, msg: &str, hub: &Hub) -> bool
Trait Implementations§
Source§impl View for OtaView
impl View for OtaView
fn handle_event( &mut self, evt: &Event, hub: &Hub, _bus: &mut Bus, rq: &mut RenderQueue, context: &mut Context, ) -> bool
fn render( &self, _fb: &mut dyn Framebuffer, _rect: Rectangle, _fonts: &mut Fonts, )
fn rect(&self) -> &Rectangle
fn rect_mut(&mut self) -> &mut Rectangle
fn children(&self) -> &Vec<Box<dyn View>>
fn children_mut(&mut self) -> &mut Vec<Box<dyn View>>
fn id(&self) -> Id
fn view_id(&self) -> Option<ViewId>
fn resize( &mut self, _rect: Rectangle, _hub: &Hub, _rq: &mut RenderQueue, _context: &mut Context, )
fn render_rect(&self, _rect: &Rectangle) -> Rectangle
fn child(&self, index: usize) -> &dyn View
fn child_mut(&mut self, index: usize) -> &mut dyn View
fn len(&self) -> usize
fn might_skip(&self, _evt: &Event) -> bool
fn might_rotate(&self) -> bool
fn is_background(&self) -> bool
Auto Trait Implementations§
impl Freeze for OtaView
impl !RefUnwindSafe for OtaView
impl !Send for OtaView
impl !Sync for OtaView
impl Unpin for OtaView
impl !UnwindSafe for OtaView
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more