feat(sdk+launcher): SDK nav/media封装 + §10.5 App前台唤起通知中心 (agent-206) — meow_ui_nav.c(env栈初始化+report/request_exit) + meow_ui_media.c(懒连断线重连, meta上报+playctl接收) + MSG_NOTIF_OPEN=0x28/CLOSE=0x29(0x25/26已被占); SDK顶部下滑手势→IPC; launcher App前台会话叠加通知中心(SIGSTOP→读帧→接管输入→恢复SIGCONT, 面板内App崩溃即关); hello接线验证
meow_ui.a→9a8eb7ef; hello→fc299577; launcher→b33da20a; 宿主5套件+新test_notif_open+qemu分发 全过 出入: SDK符号用meow_ui_前缀防与launcher内同名冲突; 叠加会话真机待验; §10.5文档旧号段已过时
This commit is contained in:
1 parent
da5ebdcd0f
commit
a0b75a881c
6 files changed
+51
No files matched your search
@@ -8,6 +8,8 @@
|
|||||||
* 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API。
|
* 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API。
|
||||||
*/
|
*/
|
||||||
#include "hello_internal.h"
|
#include "hello_internal.h"
|
||||||
|
#include "meow_ui_nav.h" /* ①:App 侧 M3 导航上报封装(上报页面深度/顶层) */
|
||||||
|
#include "meow_ui_media.h" /* ②:媒体会话封装(demo 页按钮上报 META + 收 PLAYCTL) */
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
/* Dialog / BottomSheet(阻塞模态;非控件,main() 创建一次,demo 页打开/关) */
|
/* 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(); }
|
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 平铺回调 → 当前页 */
|
/* 事件分发:meow_ui_run 平铺回调 → 当前页 */
|
||||||
/* ============================================================ */
|
/* ============================================================ */
|
||||||
@@ -79,6 +99,11 @@ int main(void)
|
|||||||
meow_ui_opts o = { 480, 720 };
|
meow_ui_opts o = { 480, 720 };
|
||||||
if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; }
|
if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; }
|
||||||
meow_theme_add_listener(NULL);
|
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);
|
signal(SIGTERM, on_sigterm);
|
||||||
|
|
||||||
|
|||||||
@@ -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_create(void); /* 建 chrome(调用方须先 push ACT_DEMO 使 owner=ACT_DEMO) */
|
||||||
void chrome_free(void); /* 释放 chrome(demo on_destroy 调) */
|
void chrome_free(void); /* 释放 chrome(demo on_destroy 调) */
|
||||||
|
|
||||||
|
/* ---- App 级导航/媒体接线(app.c)---- */
|
||||||
|
void hello_nav_report(void); /* 上报当前 Activity 栈深/顶层(各页 on_enter 调) */
|
||||||
|
|
||||||
#endif /* HELLO_INTERNAL_H */
|
#endif /* HELLO_INTERNAL_H */
|
||||||
@@ -14,12 +14,14 @@
|
|||||||
* UI→业务只经 logic_* / notify_*。页面进入/离开经 meow_view_page_push/pop 驱动。
|
* UI→业务只经 logic_* / notify_*。页面进入/离开经 meow_view_page_push/pop 驱动。
|
||||||
*/
|
*/
|
||||||
#include "hello_internal.h"
|
#include "hello_internal.h"
|
||||||
|
#include "meow_ui_media.h" /* ② demo 页按钮上报媒体 META + 收 PLAYCTL */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/* 供 demo_content_tap / touch 回调用的前向声明 */
|
/* 供 demo_content_tap / touch 回调用的前向声明 */
|
||||||
static void demo_slider_drag(int x);
|
static void demo_slider_drag(int x);
|
||||||
|
static void demo_media_send(void);
|
||||||
|
|
||||||
static demo_ctrl g_demo_ctrl;
|
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_dtab; static rect_t r_tab; /* TabBar */
|
||||||
static meow_widget *g_dbtn_dlg; static rect_t r_dlg; /* 打开 Dialog 的按钮 */
|
static meow_widget *g_dbtn_dlg; static rect_t r_dlg; /* 打开 Dialog 的按钮 */
|
||||||
static meow_widget *g_dbtn_sheet; static rect_t r_sheet;/* 打开 BottomSheet 的按钮 */
|
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 引用。 */
|
/* LazyColumn:g_dlc/r_list 已迁 list.c(列表区 CONTAINER 子视图),此处仅 extern 引用。 */
|
||||||
|
|
||||||
/* ---- demo 分区标题/slider 值文本:注册为 CUSTOM 绘制物(§6.2 区域重画会重画它们)----
|
/* ---- 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);
|
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;
|
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 项列表滚动) ----
|
/* ---- LazyColumn(100 项列表滚动) ----
|
||||||
* 本区块标题改由列表区 CONTAINER 子视图(ui/demo/list/list.c)的 on_draw 绘制(注册表→
|
* 本区块标题改由列表区 CONTAINER 子视图(ui/demo/list/list.c)的 on_draw 绘制(注册表→
|
||||||
* invalidate 链路);列表滚动/选中由 list_view_bind 从子视图持有态恢复(不再经 g_ds)。 */
|
* 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_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_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 处理(子>父) */
|
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 → 内容) */
|
/* demo 页 on_tap 分发(chrome → 内容) */
|
||||||
void demo_on_tap(int x, int y)
|
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;
|
((demo_ctrl *)ctx)->active = 1;
|
||||||
g_demo = 1;
|
g_demo = 1;
|
||||||
g_demo_focus = 0;
|
g_demo_focus = 0;
|
||||||
|
hello_nav_report(); /* ① 上报 demo 栈深/顶层 */
|
||||||
/* 列表区 CONTAINER 子视图随本页进入由 SDK view_enter 递归驱动(其 on_draw 在 demo_rebuild_to
|
/* 列表区 CONTAINER 子视图随本页进入由 SDK view_enter 递归驱动(其 on_draw 在 demo_rebuild_to
|
||||||
* →demo_paint 中经注册表绘制;meow_draw_view_entered 含祖先已进入判定,首批可见)。 */
|
* →demo_paint 中经注册表绘制;meow_draw_view_entered 含祖先已进入判定,首批可见)。 */
|
||||||
demo_rebuild_to(0);
|
demo_rebuild_to(0);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ static void full_page_enter(meow_view *v, void *ctx)
|
|||||||
g_full = 1;
|
g_full = 1;
|
||||||
meow_ui_set_fullscreen(1);
|
meow_ui_set_fullscreen(1);
|
||||||
meow_ui_statusbar_set_collapsed(1);
|
meow_ui_statusbar_set_collapsed(1);
|
||||||
|
hello_nav_report(); /* ① 上报 full 栈深/顶层 */
|
||||||
full_draw();
|
full_draw();
|
||||||
meow_log(MEOW_LOG_INFO, "fullscreen ON (collapsed), activity->%d", meow_ui_activity_active());
|
meow_log(MEOW_LOG_INFO, "fullscreen ON (collapsed), activity->%d", meow_ui_activity_active());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ static void home_page_enter(meow_view *v, void *ctx)
|
|||||||
{
|
{
|
||||||
(void)v;
|
(void)v;
|
||||||
((home_ctrl *)ctx)->active = 1;
|
((home_ctrl *)ctx)->active = 1;
|
||||||
|
hello_nav_report(); /* ① 上报 home 栈深/顶层(pop 回 home / 首次进入) */
|
||||||
home_redraw();
|
home_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user