Files
ink-board/main/ui/apps/travel/app.cpp
GW_MC c4635948e4 feat(travel): Implement settings UI and web server for MTR route configuration
- 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.
2026-02-03 19:26:53 +08:00

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();
}
}