fix(ImmichElias): bottom-only UI like Bible, fullscreen bg, tap to toggle chrome, dynamic 480x320, cache, random, slideshow 60s, crash fixes

This commit is contained in:
Adolfo
2026-07-25 15:47:08 -04:00
parent 349034b8ba
commit 995297314d
+25 -62
View File
@@ -471,18 +471,14 @@ static void detect_display_size(AppCtx* ctx, lv_obj_t* parent) {
static void hide_chrome(AppCtx* ctx) {
if (!ctx) return;
if (!tt_lvgl_lock(pdMS_TO_TICKS(500))) return;
if (ctx->header_bar) lv_obj_add_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
// Bible-style: only bottom controls, no top header
if (ctx->ctrl_bar) lv_obj_add_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
if (ctx->lbl_info) lv_obj_add_flag(ctx->lbl_info, LV_OBJ_FLAG_HIDDEN);
tt_lvgl_unlock();
}
static void show_chrome(AppCtx* ctx) {
if (!ctx) return;
if (!tt_lvgl_lock(pdMS_TO_TICKS(500))) return;
if (ctx->header_bar) lv_obj_remove_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
if (ctx->ctrl_bar) lv_obj_remove_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
if (ctx->lbl_info) lv_obj_remove_flag(ctx->lbl_info, LV_OBJ_FLAG_HIDDEN);
if (ctx->lbl_status) lv_obj_remove_flag(ctx->lbl_status, LV_OBJ_FLAG_HIDDEN);
tt_lvgl_unlock();
if (tt_lvgl_lock(pdMS_TO_TICKS(300))) {
if (ctx->autohide_timer) { lv_timer_reset(ctx->autohide_timer); lv_timer_resume(ctx->autohide_timer); }
@@ -660,7 +656,8 @@ static void on_image_click(lv_event_t* e) {
if (!ctx) return;
bool is_hidden = false;
if (tt_lvgl_lock(pdMS_TO_TICKS(200))) {
if (ctx->header_bar) is_hidden = lv_obj_has_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
if (ctx->ctrl_bar) is_hidden = lv_obj_has_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
else if (ctx->header_bar) is_hidden = lv_obj_has_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
tt_lvgl_unlock();
}
if (is_hidden) show_chrome(ctx); else hide_chrome(ctx);
@@ -724,6 +721,7 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
lv_obj_set_style_bg_color(parent, lv_color_hex(0x121212), LV_PART_MAIN);
lv_obj_set_style_bg_opa(parent, LV_OPA_COVER, LV_PART_MAIN);
// Fullscreen player like Bible app - image background, only bottom controls
ctx->player_wrapper = lv_obj_create(parent);
lv_obj_set_size(ctx->player_wrapper, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_border_width(ctx->player_wrapper, 0, 0);
@@ -732,9 +730,10 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
lv_obj_set_style_bg_color(ctx->player_wrapper, lv_color_hex(0x121212), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ctx->player_wrapper, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_remove_flag(ctx->player_wrapper, LV_OBJ_FLAG_SCROLLABLE);
// Only image is clickable to avoid double-toggle on wrapper
// Image covers entire background
ctx->img_page = lv_image_create(ctx->player_wrapper);
lv_obj_set_size(ctx->img_page, LV_PCT(100), LV_PCT(100));
lv_obj_align(ctx->img_page, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_bg_opa(ctx->img_page, LV_OPA_TRANSP, 0);
lv_obj_set_style_pad_all(ctx->img_page, 0, 0);
@@ -743,71 +742,35 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
lv_obj_add_flag(ctx->img_page, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(ctx->img_page, on_image_click, LV_EVENT_CLICKED, ctx);
ctx->header_bar = lv_obj_create(ctx->player_wrapper);
lv_obj_set_size(ctx->header_bar, LV_PCT(100), 36);
lv_obj_align(ctx->header_bar, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_set_style_radius(ctx->header_bar, 0, 0);
lv_obj_set_style_bg_color(ctx->header_bar, lv_color_hex(0x11111B), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ctx->header_bar, LV_OPA_80, LV_PART_MAIN);
lv_obj_set_style_border_color(ctx->header_bar, lv_color_hex(0x313244), LV_PART_MAIN);
lv_obj_set_style_border_width(ctx->header_bar, 1, LV_PART_MAIN);
lv_obj_remove_flag(ctx->header_bar, LV_OBJ_FLAG_SCROLLABLE);
ctx->btn_back = lv_btn_create(ctx->header_bar);
lv_obj_set_size(ctx->btn_back, 44, 26);
lv_obj_align(ctx->btn_back, LV_ALIGN_LEFT_MID, 4, 0);
lv_obj_set_style_radius(ctx->btn_back, 6, 0);
lv_obj_set_style_bg_color(ctx->btn_back, lv_color_hex(0x313244), LV_PART_MAIN);
lv_obj_t* lbl_back = lv_label_create(ctx->btn_back); lv_label_set_text(lbl_back, LV_SYMBOL_LEFT); lv_obj_center(lbl_back);
lv_obj_add_event_cb(ctx->btn_back, back_event_cb, LV_EVENT_CLICKED, ctx);
ctx->lbl_book_title = lv_label_create(ctx->header_bar);
lv_obj_align(ctx->lbl_book_title, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_width(ctx->lbl_book_title, 160);
lv_obj_set_style_text_align(ctx->lbl_book_title, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(ctx->lbl_book_title, lv_color_hex(0xCDD6F4), LV_PART_MAIN);
lv_obj_set_style_text_font(ctx->lbl_book_title, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
lv_label_set_long_mode(ctx->lbl_book_title, LV_LABEL_LONG_DOT);
ctx->lbl_indicator = lv_label_create(ctx->header_bar);
lv_obj_align(ctx->lbl_indicator, LV_ALIGN_RIGHT_MID, -6, 0);
lv_obj_set_style_text_color(ctx->lbl_indicator, lv_color_hex(0xA6ADC8), LV_PART_MAIN);
lv_obj_set_style_text_font(ctx->lbl_indicator, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
lv_label_set_text(ctx->lbl_indicator, "0/0");
ctx->lbl_info = lv_label_create(ctx->player_wrapper);
lv_obj_align(ctx->lbl_info, LV_ALIGN_TOP_MID, 0, 50);
lv_obj_set_width(ctx->lbl_info, LV_PCT(90));
lv_obj_set_style_text_align(ctx->lbl_info, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(ctx->lbl_info, lv_color_hex(0xAAAAAA), LV_PART_MAIN);
lv_obj_set_style_text_font(ctx->lbl_info, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
lv_label_set_long_mode(ctx->lbl_info, LV_LABEL_LONG_WRAP);
lv_obj_set_style_bg_color(ctx->lbl_info, lv_color_hex(0x11111B), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ctx->lbl_info, LV_OPA_60, LV_PART_MAIN);
lv_obj_set_style_radius(ctx->lbl_info, 6, LV_PART_MAIN);
lv_obj_set_style_pad_all(ctx->lbl_info, 6, LV_PART_MAIN);
ctx->lbl_status = lv_label_create(ctx->player_wrapper);
lv_obj_align(ctx->lbl_status, LV_ALIGN_BOTTOM_MID, 0, -50);
lv_obj_set_width(ctx->lbl_status, LV_PCT(80));
lv_obj_set_style_text_align(ctx->lbl_status, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(ctx->lbl_status, lv_color_hex(0x888888), LV_PART_MAIN);
lv_obj_set_style_text_font(ctx->lbl_status, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
lv_label_set_long_mode(ctx->lbl_status, LV_LABEL_LONG_WRAP);
// Bottom-only controls like Bible app - no top header, no info/status text
ctx->header_bar = NULL;
ctx->lbl_book_title = NULL;
ctx->lbl_indicator = NULL;
ctx->lbl_info = NULL;
ctx->lbl_status = NULL;
ctx->btn_back = NULL;
ctx->ctrl_bar = lv_obj_create(ctx->player_wrapper);
lv_obj_set_size(ctx->ctrl_bar, LV_PCT(100), 44);
lv_obj_align(ctx->ctrl_bar, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_style_radius(ctx->ctrl_bar, 0, 0);
lv_obj_set_style_bg_color(ctx->ctrl_bar, lv_color_hex(0x11111B), LV_PART_MAIN);
lv_obj_set_style_bg_color(ctx->ctrl_bar, lv_color_hex(0x0E0E14), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ctx->ctrl_bar, LV_OPA_80, LV_PART_MAIN);
lv_obj_set_style_border_width(ctx->ctrl_bar, 0, 0);
lv_obj_set_style_pad_all(ctx->ctrl_bar, 4, 0);
lv_obj_set_style_pad_gap(ctx->ctrl_bar, 6, 0);
lv_obj_set_style_pad_all(ctx->ctrl_bar, 6, 0);
lv_obj_set_style_pad_gap(ctx->ctrl_bar, 8, 0);
lv_obj_set_flex_flow(ctx->ctrl_bar, LV_FLEX_FLOW_ROW);
lv_obj_set_flex_align(ctx->ctrl_bar, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_set_flex_align(ctx->ctrl_bar, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_remove_flag(ctx->ctrl_bar, LV_OBJ_FLAG_SCROLLABLE);
// Left close button (like Bible app X)
ctx->btn_back = lv_btn_create(ctx->ctrl_bar);
lv_obj_set_size(ctx->btn_back, 44, 32);
lv_obj_set_style_radius(ctx->btn_back, 8, 0);
lv_obj_set_style_bg_color(ctx->btn_back, lv_color_hex(0x252538), LV_PART_MAIN);
lv_obj_t* lbl_back = lv_label_create(ctx->btn_back); lv_label_set_text(lbl_back, LV_SYMBOL_CLOSE); lv_obj_center(lbl_back);
lv_obj_add_event_cb(ctx->btn_back, back_event_cb, LV_EVENT_CLICKED, ctx);
ctx->btn_prev = lv_btn_create(ctx->ctrl_bar);
lv_obj_set_size(ctx->btn_prev, 54, 32);
lv_obj_set_style_radius(ctx->btn_prev, 16, 0);