diff --git a/app.c b/app.c index 1d354cb..bbf9dc9 100644 --- a/app.c +++ b/app.c @@ -8,6 +8,8 @@ * 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API。 */ #include "hello_internal.h" +#include "meow_ui_nav.h" /* ①:App 侧 M3 导航上报封装(上报页面深度/顶层) */ +#include "meow_ui_media.h" /* ②:媒体会话封装(demo 页按钮上报 META + 收 PLAYCTL) */ #include /* Dialog / BottomSheet(阻塞模态;非控件,main() 创建一次,demo 页打开/关) */ @@ -20,6 +22,24 @@ static meow_view *g_demo_view; static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); } +/* ② 媒体会话播放控制回调(launcher 下发 MSG_PLAYCTL 到最活跃媒体会话)。 */ +static void demo_media_playctl(int cmd, int64_t seek_ms) +{ + meow_log(MEOW_LOG_INFO, "media playctl cmd=%d seek=%lld", cmd, (long long)seek_ms); +} + +/* ① 导航上报:把当前 Activity 栈深/顶层报给 launcher(M3 导航栈)。每个页面 on_enter 时调用 + * (view_page_push/pop 会同步触发新页 on_enter),保证 pop/push 后 launcher 的 nav_stack 跟随。 + * depth 取 meow_ui_activity_depth()(实际 push 页数,≥1);top 取 activity id 映射的字符串。 */ +void hello_nav_report(void) +{ + int depth = meow_ui_activity_depth(); + if (depth <= 0) depth = 1; + int id = meow_ui_activity_active(); + const char *top = (id == ACT_FULL) ? "full" : (id == ACT_DEMO) ? "demo" : "home"; + meow_ui_nav_report((uint32_t)depth, top); +} + /* ============================================================ */ /* 事件分发:meow_ui_run 平铺回调 → 当前页 */ /* ============================================================ */ @@ -79,6 +99,11 @@ int main(void) meow_ui_opts o = { 480, 720 }; if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; } meow_theme_add_listener(NULL); + meow_ui_nav_init(); /* ① 读 MEOW_ACTIVITY/MEOW_CHAIN 初始化导航栈 */ + meow_ui_media_init(NULL); /* ② app_id=env MEOW_LOG_APP */ + + /* ② 注册播放控制回调(launcher 经媒体会话下发 MSG_PLAYCTL):hello 只打日志验证。 */ + meow_ui_media_on_playctl(demo_media_playctl); signal(SIGTERM, on_sigterm); diff --git a/hello b/hello index ce5a24a..d81603e 100755 Binary files a/hello and b/hello differ diff --git a/hello_internal.h b/hello_internal.h index 2c2d52f..1c66f55 100644 --- a/hello_internal.h +++ b/hello_internal.h @@ -114,4 +114,7 @@ extern rect_t r_tb, r_nav, r_fab; void chrome_create(void); /* 建 chrome(调用方须先 push ACT_DEMO 使 owner=ACT_DEMO) */ void chrome_free(void); /* 释放 chrome(demo on_destroy 调) */ +/* ---- App 级导航/媒体接线(app.c)---- */ +void hello_nav_report(void); /* 上报当前 Activity 栈深/顶层(各页 on_enter 调) */ + #endif /* HELLO_INTERNAL_H */ diff --git a/ui/demo/demo.c b/ui/demo/demo.c index ae5175a..f2615b5 100644 --- a/ui/demo/demo.c +++ b/ui/demo/demo.c @@ -14,12 +14,14 @@ * UI→业务只经 logic_* / notify_*。页面进入/离开经 meow_view_page_push/pop 驱动。 */ #include "hello_internal.h" +#include "meow_ui_media.h" /* ② demo 页按钮上报媒体 META + 收 PLAYCTL */ #include #include #include /* 供 demo_content_tap / touch 回调用的前向声明 */ static void demo_slider_drag(int x); +static void demo_media_send(void); static demo_ctrl g_demo_ctrl; @@ -86,6 +88,8 @@ static meow_widget *g_dbadge; /* Badge */ static meow_widget *g_dtab; static rect_t r_tab; /* TabBar */ static meow_widget *g_dbtn_dlg; static rect_t r_dlg; /* 打开 Dialog 的按钮 */ static meow_widget *g_dbtn_sheet; static rect_t r_sheet;/* 打开 BottomSheet 的按钮 */ +/* ② 媒体会话上报按钮(demo 页演示):点按 → meow_ui_media_meta 上报一条播放中元数据。 */ +static meow_widget *g_dbtn_media; static rect_t r_media; /* LazyColumn:g_dlc/r_list 已迁 list.c(列表区 CONTAINER 子视图),此处仅 extern 引用。 */ /* ---- demo 分区标题/slider 值文本:注册为 CUSTOM 绘制物(§6.2 区域重画会重画它们)---- @@ -235,6 +239,10 @@ static void demo_build_at(int scroll) r_sheet = RX(DCR_X, SY(yb), DCW, DBH); g_dbtn_sheet = meow_btn_create_variant(r_sheet.x, r_sheet.y, r_sheet.w, r_sheet.h, "SHEET", MEOW_BTN_OUTLINED); SLOT(g_dbtn_sheet, r_sheet.x, r_sheet.y, r_sheet.w, r_sheet.h); yb += DCH; + /* ---- Media Session(② demo 按钮上报媒体 META,验证 SDK 封装) ---- */ + d_title(DCL_X, SY(yb), "MEDIA SESSION (meta)"); yb += 26; + r_media = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_media = meow_btn_create_variant(r_media.x, r_media.y, r_media.w, r_media.h, "SEND META", MEOW_BTN_FILLED); SLOT(g_dbtn_media, r_media.x, r_media.y, r_media.w, r_media.h); yb += DCH; + /* ---- LazyColumn(100 项列表滚动) ---- * 本区块标题改由列表区 CONTAINER 子视图(ui/demo/list/list.c)的 on_draw 绘制(注册表→ * invalidate 链路);列表滚动/选中由 list_view_bind 从子视图持有态恢复(不再经 g_ds)。 */ @@ -310,9 +318,21 @@ static int demo_content_tap(int x, int y) } if (meow_widget_hit(g_dbtn_dlg, x, y)) { meow_dialog_show(g_dlg); meow_log(MEOW_LOG_INFO, "dialog result=%d", meow_dialog_result(g_dlg)); meow_ui_invalidate(r_dlg.x, r_dlg.y, r_dlg.w, r_dlg.h); return 1; } if (meow_widget_hit(g_dbtn_sheet, x, y)) { int r = meow_sheet_open(g_sheet); meow_log(MEOW_LOG_INFO, "sheet result=%d", r); meow_ui_invalidate(r_sheet.x, r_sheet.y, r_sheet.w, r_sheet.h); return 1; } + if (meow_widget_hit(g_dbtn_media, x, y)) { demo_media_send(); meow_ui_invalidate(r_media.x, r_media.y, r_media.w, r_media.h); return 1; } return 0; /* 列表区分发已由顶部 list_view_hit 处理(子>父) */ } +/* ② 经 SDK 媒体会话封装上报一条「播放中」元数据(best-effort:无 launcher 静默降级)。 + * 上报后 launcher(通知中心媒体卡片/主界面 Now Playing 页)可显示;demo 在 on_playctl 回调 + * 打日志验证 receive 侧。 */ +static void demo_media_send(void) +{ + meow_ui_media_meta(1 /* playing */, 0, 180000, + "MeowOS Demo Track", "SDK", "meow_ui_media", + NULL, NULL); + meow_log(MEOW_LOG_INFO, "demo: media meta sent (playing, 0/180000)"); +} + /* demo 页 on_tap 分发(chrome → 内容) */ void demo_on_tap(int x, int y) { @@ -408,6 +428,7 @@ static void demo_page_enter(meow_view *v, void *ctx) ((demo_ctrl *)ctx)->active = 1; g_demo = 1; g_demo_focus = 0; + hello_nav_report(); /* ① 上报 demo 栈深/顶层 */ /* 列表区 CONTAINER 子视图随本页进入由 SDK view_enter 递归驱动(其 on_draw 在 demo_rebuild_to * →demo_paint 中经注册表绘制;meow_draw_view_entered 含祖先已进入判定,首批可见)。 */ demo_rebuild_to(0); diff --git a/ui/full.c b/ui/full.c index c54547f..eca2b6e 100644 --- a/ui/full.c +++ b/ui/full.c @@ -27,6 +27,7 @@ static void full_page_enter(meow_view *v, void *ctx) g_full = 1; meow_ui_set_fullscreen(1); meow_ui_statusbar_set_collapsed(1); + hello_nav_report(); /* ① 上报 full 栈深/顶层 */ full_draw(); meow_log(MEOW_LOG_INFO, "fullscreen ON (collapsed), activity->%d", meow_ui_activity_active()); } diff --git a/ui/home/home.c b/ui/home/home.c index 307c5fb..e743ed6 100644 --- a/ui/home/home.c +++ b/ui/home/home.c @@ -86,6 +86,7 @@ static void home_page_enter(meow_view *v, void *ctx) { (void)v; ((home_ctrl *)ctx)->active = 1; + hello_nav_report(); /* ① 上报 home 栈深/顶层(pop 回 home / 首次进入) */ home_redraw(); }