3 phần: mỗi tab trong Store là gì, toàn bộ event Analytics đi kèm, và bản cập nhật Control Center — dùng để đối chiếu QA và báo cáo dữ liệu.
Version app: 1.0.10 · Update ngày 22/07/2026
apply_complete — 48 → 49
Cửa hàng giao diện được thiết kế lại theo Figma mới, đổi sang dữ liệu API v2.
Trước đây Store chỉ có Trending · Wallpaper · Themes. Bản mới có 6 tab ở thanh dưới: Trending · Themes · Wallpaper · Icons · Widgets · Me. Ba tab đầu được làm mới giao diện, ba tab sau là hoàn toàn mới.
Trang chủ Store. Banner nổi bật, khối "Trending Today", "Featured".
Bộ giao diện (hình nền + icon + widget đi kèm).
Kho hình nền (194 ảnh, 4 bộ sưu tập).
Bộ icon iOS thay cho icon mặc định của máy.
Widget trang trí (ảnh) tải từ Store về màn hình chính.
Trang cá nhân — tổng hợp món đã sở hữu.
48 sự kiện Firebase Analytics, phủ toàn bộ luồng Store, Coin & đường dẫn lên Premium — đã đối chiếu lại vị trí bắn (line số) và bổ sung 6 event từng bị bỏ sót so với bản báo cáo trước.
Các dòng tô tím nhạt + có nhãn ★ Trọng tâm trong bảng bên dưới là 5 nhóm hành vi hay được dùng để trả lời câu hỏi thực tế: (1) chạm tab nào, (2) chọn category/item nào, (3) bấm Apply món nào + có thấy màn Success hay không, (4) bấm icon coin ở màn nào, (5) mua gói coin nào tại màn Coin. Các event còn lại (điều hướng phụ, share, favorite, billing…) giữ nền trắng như cũ để không làm loãng bảng.
Analytics.log(event, Bundle) (file
analytics/Analytics.kt) — bọc try/catch nên
không bao giờ crash app dù Firebase lỗi, có echo
Log.d khi debug. Tên event & tham số khai báo tập trung ở
analytics/AnalyticsEvents.kt (object
ThemeStore + object Coin) — không rải rác hardcode string khắp nơi. Event
Ads & Default Launcher (ad_displayed,
default_launcher_*…) nằm ở báo cáo riêng:
Đo lường Ads & Default Launcher →
| Event | Vị trí | Tham số | Khi nào bắn |
|---|---|---|---|
theme_store_apply_sheet |
ThemeStoreRoot.kt:986, WallpaperPreviewScreen.kt:170, WallpaperDevicePreviewScreen.kt:134 | surface |
Chạm nút "Apply" mở bottom sheet chọn Lock/Home/Both |
theme_store_apply_target |
ApplyWallpaperSheet.kt:77 | target |
Chọn radio Lock Screen / Home Screen / Both trong sheet |
theme_store_wallpaper_apply
★ Apply
|
ThemeStoreViewModel.kt:716 (source=wallpaper_tab), :1045 (source=themes_tab)
|
target, source, id (chỉ có ở nguồn themes_tab)
|
Bắn lúc bắt đầu tải wallpaper để apply (chưa xong):
theme_store_apply_complete bên dưới.
|
theme_store_theme_apply |
ThemeStoreViewModel.kt:895 (tự gọi lại ở :956) | id, target |
SỬA
Chỉ là retry nội bộ của applyTheme() khi tải lại icon pack lỗi — không còn nút UI nào gọi trực tiếp (bước 1 wizard hiện bắn theme_store_wallpaper_apply ở trên thay vì event này)
|
theme_store_icon_pack_apply
★ Apply
|
ThemeStoreViewModel.kt:987/998 (source=icons_tab), :1099 (source=themes_tab), ThemeStoreRoot.kt:1023 (source=icons_tab)
|
id, source |
Bắn khi apply 1 icon pack:
|
theme_store_widget_add
★ Apply
|
ThemeStoreViewModel.kt:1145, ThemeStoreRoot.kt:1237/1257/1278 | id, source |
Bắn khi thêm 1 widget vào Home:
|
theme_store_wallpaper_save
MỚI trong report
|
ThemeStoreViewModel.kt:751 | id |
Chạm nút tải/lưu ảnh gốc về thư viện máy (Pictures/iOSLauncher) ở Wallpaper Preview — có trong code (AnalyticsEvents.ThemeStore) nhưng bản báo cáo cũ bỏ sót, chưa từng liệt kê |
theme_store_item_favorite |
ThemeStoreViewModel.kt:773 | kind, id, value=1/0 |
Chạm icon trái tim trên bất kỳ màn Preview nào |
theme_store_wallpaper_share |
ThemeStoreViewModel.kt:820 | id |
Chạm nút share trên Wallpaper Preview (chia sẻ ảnh thật) |
theme_store_theme_share / theme_store_icon_pack_share |
ThemeStoreRoot.kt:978 / :1096 | id |
Chạm nút share trên Theme Preview / Icon Pack Preview (chia sẻ lời mời text) |
theme_store_apply_complete
★ Apply completed
MỚI
|
ApplySuccessScreen.kt | kind |
Bắn ngay lúc màn Apply Success hiện ra (không đợi user bấm nút) — màn này chỉ hiện ra sau khi apply đã thành công thật (tải xong + set xong mới navigate tới), nên đây là tín hiệu "apply completed" chuẩn xác, tính cả trường hợp user bấm Back thoát ngang không đụng tới 2 nút CTA bên dưới |
theme_store_success_action
|
ThemeStoreRoot.kt:1435/1443 | action, kind |
CTA "Go To Home Screen" / "Explore More" trên màn Apply Success — đo tiếp người dùng làm gì sau khi đã completed (không phải tín hiệu completed, dùng theme_store_apply_complete ở trên cho việc đó)
|
| Event | Vị trí | Tham số | Khi nào bắn |
|---|---|---|---|
theme_store_my_content_open |
ThemeStoreRoot.kt:744 | kind |
Chạm 1 trong 4 ô "My Themes/Icons/Wallpapers/Widgets" |
theme_store_favorites_open |
ThemeStoreRoot.kt:750 | — | Chạm menu "Favorites" |
theme_store_me_menu |
ThemeStoreRoot.kt:755/762/769 | action |
Chạm "Privacy" / "About" / "Help" trong menu Me |
theme_store_premium_click |
ThemeStoreRoot.kt:567/739/1467 | — | Bấm crown ở header, "Get Premium" ở tab Me, hoặc "Unlock All" ở dialog Hết coin |
theme_store_notify_click |
ThemeStoreRoot.kt:571 | — | Bấm chuông ở header → xin quyền thông báo |
| Event | Vị trí | Tham số | Khi nào bắn |
|---|---|---|---|
coin_screen_view
★ Coin icon click
|
ThemeStoreRoot.kt:577/617/660/699/731/778/854/1120/1245 | source |
Click icon coin pill:
|
coin_earn_ad |
ThemeStoreRoot.kt:298 |
value = số coin thưởng ·
reward_no
MỚI = lượt 1/2/3 trong ngày
|
Xem xong rewarded ad "Watch Ads" trên My Coin |
coin_checkin_claim |
MyCoinScreen.kt:234 | value = ngày 1-7 |
Chạm ô điểm danh đang mở (claimable) |
coin_earn_notification |
ThemeStoreRoot.kt:322/337 | — | "Enable notification" trên My Coin, thưởng 1 lần |
coin_spend_unlock |
ThemeStoreViewModel.kt:311 | kind, id, value=giá |
Apply 1 món tính coin, đủ số dư → trừ coin thành công |
coin_out_of_coin |
ThemeStoreViewModel.kt:320 | kind, id, value=giá |
Apply 1 món tính coin nhưng không đủ số dư → mở dialog Hết coin |
coin_pack_buy
★ Coin purchase
|
ThemeStoreViewModel.kt:361 | plan = productId |
Click 1 gói coin trên My Coin → mở luồng mua billing.
Lưu ý: event không lưu "vào màn Coin từ đâu" — muốn biết nguồn phải tự nối chéo với coin_screen_view bắn ngay trước đó cùng phiên (theo timestamp/user), code hiện chưa tự gắn 2 event này với nhau.
|
theme_store)
| Event | Vị trí | Tham số | Khi nào bắn |
|---|---|---|---|
sub_paywall_view |
LauncherViewModel.kt:2788 (gọi từ MainActivity.kt:622/791) | source=theme_store |
Bất kỳ CTA Premium nào trong Store mở paywall của launcher |
sub_price_loaded
MỚI trong report
|
LauncherViewModel.kt:2883 | has_month, has_year |
Query xong giá 2 gói Play Billing ngay sau khi paywall mở (không có source riêng — chỉ suy ra qua thời điểm mở từ Store) |
sub_plan_selected
MỚI trong report
|
LauncherViewModel.kt:2826 | plan=month/year |
Chọn gói Tháng/Năm trên màn paywall |
sub_checkout_start
MỚI trong report
|
LauncherViewModel.kt:2943 | plan, source=theme_store |
Bấm nút mua trên paywall, đã resolve xong ProductDetails → mở luồng Play Billing |
sub_restore_start |
ThemeStoreViewModel.kt:386 (My Coin), LauncherViewModel.kt:2803 (paywall) | — | Bấm "Restore" trên My Coin, hoặc "Restore" trên màn paywall Premium |
sub_restore_result |
BillingManager.kt:185 | active (bool) |
Kết quả query purchase sau khi restore |
sub_purchase_success |
BillingManager.kt:225 (coin), :240 (credit chat_ai), :271 (subscription) | plan, source=theme_store/theme_store_coin |
Mua thành công gói Premium (subscription) hoặc gói coin từ My Coin |
sub_purchase_failed
MỚI trong report
|
BillingManager.kt:68 | code = BillingResponseCode |
Play Billing trả lỗi (không phải do người dùng huỷ) |
sub_purchase_cancelled
MỚI trong report
|
BillingManager.kt:65 | — | Người dùng tự đóng luồng mua Play Billing (USER_CANCELED) |
sub_paywall_dismissed
MỚI trong report
|
LauncherViewModel.kt:2809 | — | Đóng paywall (nút back/close/"Continue with Ads") dù mua hay không |
| Event | Vị trí | Tham số | Khi nào bắn |
|---|---|---|---|
widget_added |
LauncherViewModel.kt:1899/2213/2239 | kind, source |
Sau khi tải xong PNG ở Widget Preview và đặt lên home grid — source dùng chung 1 event cho cả 3 nguồn: theme_store / builtin_picker / dailyopen |
widget_added với
source="theme_store". Nhưng nếu người dùng thêm widget
"sống" built-in (Pin/Ảnh/Clock/Calendar) từ cùng bảng "Add Widget", path đó lại gắn
source="builtin_picker"
dù cũng mở từ tab Widgets — hai nguồn khác nhau dù giao diện gộp chung, cần lưu ý khi lọc báo cáo theo source.
theme_store_unlock_* và
theme_store_wallpaper_favorite không còn call-site nào trong code hiện tại — chỉ còn ghi chú lịch sử, không xuất hiện trong dashboard analytics kể từ bản này.
Tinh chỉnh lại kích thước/bo góc toàn bộ tile, và thay khối Now Playing từ dữ liệu giả sang lấy thẳng từ media session của app nhạc đang phát trên máy.
Bo lại góc + tinh chỉnh khoảng cách toàn bộ tile cho gọn mắt, đỡ nặng hơn bản cũ.
Trước đây khối Now Playing chỉ hiện dữ liệu giả (tên bài/nghệ sĩ cố định). Giờ đọc thẳng session nhạc đang phát trên máy.