- Added MainUIHandler class to manage the main UI and polling for arrival data. - Introduced SettingsUI class for displaying QR code and configuration options. - Created SettingsUIHandler to manage settings UI lifecycle and web server interactions. - Developed WebHandler to handle HTTP requests for MTR route settings, including adding and removing routes. - Implemented web endpoints for fetching MTR lines, routes, and saving settings. - Enhanced UI with responsive design for e-ink displays and added error handling for web interactions.
132 lines
3.7 KiB
C++
132 lines
3.7 KiB
C++
#include "ui/apps/travel/app.h"
|
|
#include "ui/apps/travel/ui/main_handler.h"
|
|
#include "ui/apps/travel/ui/settings_handler.h"
|
|
#include "common/system_context.h"
|
|
#include "esp_log.h"
|
|
|
|
static const char* TAG = "TravelApp";
|
|
|
|
TravelApp::TravelApp()
|
|
: main_ui_handler_(nullptr)
|
|
, settings_ui_handler_(nullptr)
|
|
, current_page_(Page::MAIN)
|
|
, setting_handler_(nullptr)
|
|
, network_handler_(nullptr)
|
|
, interaction_handler_(nullptr) {
|
|
setting_handler_ = std::make_unique<travel::SettingHandler>(
|
|
std::make_unique<NVSStorageHandler>(TravelApp::NVS_NAMESPACE)
|
|
);
|
|
}
|
|
|
|
TravelApp::~TravelApp() { }
|
|
|
|
esp_err_t TravelApp::init(lv_obj_t* container, InteractionHandler* interaction_handler) {
|
|
ESP_LOGI(TAG, "Initializing Travel app");
|
|
|
|
container_ = container;
|
|
interaction_handler_ = interaction_handler;
|
|
|
|
// Initialize storage
|
|
setting_handler_->init(nullptr);
|
|
|
|
// Load saved settings
|
|
setting_handler_->load_settings();
|
|
|
|
// Get network handler from system context
|
|
network_handler_ = SystemContext::instance().get_network_handler();
|
|
|
|
// Create main UI handler
|
|
main_ui_handler_ = std::make_unique<travel::MainUIHandler>();
|
|
main_ui_handler_->init(container, interaction_handler_, setting_handler_.get(), network_handler_);
|
|
|
|
// Register settings button callback
|
|
main_ui_handler_->register_on_settings_button_clicked(on_settings_button_clicked_static, this);
|
|
|
|
current_page_ = Page::MAIN;
|
|
|
|
return ESP_OK;
|
|
}
|
|
|
|
esp_err_t TravelApp::deinit() {
|
|
ESP_LOGI(TAG, "Deinitializing Travel app");
|
|
|
|
// Clean up UI handlers
|
|
if (settings_ui_handler_) {
|
|
settings_ui_handler_->deinit();
|
|
settings_ui_handler_.reset();
|
|
}
|
|
|
|
if (main_ui_handler_) {
|
|
main_ui_handler_->deinit();
|
|
main_ui_handler_.reset();
|
|
}
|
|
|
|
return ESP_OK;
|
|
}
|
|
|
|
std::string TravelApp::get_name() const {
|
|
return "Travel";
|
|
}
|
|
|
|
bool TravelApp::on_back_button_pressed() {
|
|
// If on settings page, go back to main page
|
|
if (current_page_ == Page::SETTINGS) {
|
|
// Clean up settings handler
|
|
if (settings_ui_handler_) {
|
|
settings_ui_handler_->deinit();
|
|
settings_ui_handler_.reset();
|
|
}
|
|
|
|
// Reload settings in case they were updated
|
|
setting_handler_->load_settings();
|
|
|
|
// Recreate main UI handler with updated settings
|
|
if (!main_ui_handler_) {
|
|
main_ui_handler_ = std::make_unique<travel::MainUIHandler>();
|
|
main_ui_handler_->init(container_, interaction_handler_, setting_handler_.get(), network_handler_);
|
|
main_ui_handler_->register_on_settings_button_clicked(on_settings_button_clicked_static, this);
|
|
}
|
|
|
|
current_page_ = Page::MAIN;
|
|
return true;
|
|
}
|
|
|
|
// Let system handle back (return to app icons)
|
|
return false;
|
|
}
|
|
|
|
void TravelApp::set_network_handler(NetworkHandler* network_handler) {
|
|
network_handler_ = network_handler;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Private Methods
|
|
// ============================================================================
|
|
|
|
void TravelApp::show_settings_page() {
|
|
ESP_LOGI(TAG, "Showing settings page");
|
|
|
|
// Hide main UI handler
|
|
if (main_ui_handler_) {
|
|
main_ui_handler_->deinit();
|
|
main_ui_handler_.reset();
|
|
}
|
|
|
|
// Create settings UI handler
|
|
settings_ui_handler_ = std::make_unique<travel::SettingsUIHandler>();
|
|
settings_ui_handler_->init(container_, interaction_handler_, setting_handler_.get(), network_handler_);
|
|
|
|
current_page_ = Page::SETTINGS;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Static Callbacks
|
|
// ============================================================================
|
|
|
|
void TravelApp::on_settings_button_clicked_static(void* user_data) {
|
|
TravelApp* app = static_cast<TravelApp*>(user_data);
|
|
if (app) {
|
|
app->show_settings_page();
|
|
}
|
|
}
|