Release Notes - Version 1.1.0
Phạm vi: Commit 1fb1d579 → a3ab89e1
Tổng số commit: 12
1. Tính năng mới
1.1 Daily Engagement Notification
- Bổ sung thông báo Daily Engagement dạng fullscreen (lock-screen style) nhằm kéo user quay lại app hằng ngày.
- Đi kèm 8 ảnh teaser khác nhau cho nội dung thông báo.
1.2 App Shortcut & Uninstall Survey
- Thêm shortcut "AI Photo Maker" trên launcher để user truy cập nhanh.
- Tích hợp Uninstall Feedback Survey khi user gỡ app.
1.3 Màn hình chọn ảnh trong app (In-app Photo Picker)
- Màn hình picker riêng thay cho system gallery.
- Hỗ trợ: chọn album, lưới ảnh tùy chỉnh, yêu cầu permission có UI hướng dẫn riêng.
1.4 Dịch vụ Qwen - Image Editing
- Tích hợp thêm Qwen làm AI service mới cho image editing, mở rộng nguồn tạo ảnh.
1.5 Lịch mới (Neon Calendar)
- Component lịch mới phong cách neon dùng cho:
- Chọn ngày sinh trong Couple Profile.
- Thêm cột mốc (milestone) trong Timeline.
2. Cải tiến Generation Flow
2.1 Flow tạo ảnh đa dịch vụ
- Cho phép mỗi style chọn AI service riêng (Face Combine, Image Combine, Qwen).
- Cập nhật bộ style (
couple_styles.json) với nhiều style/dịch vụ mới. - Logic điều phối generation tập trung, đồng nhất giữa các flow (Choose Picture, Future Baby, Generating).
2.2 UI Generating mới
- Trải nghiệm mới khi đang tạo ảnh: hiệu ứng "scanning" trên ảnh + danh sách các phase rõ ràng để user thấy tiến trình.
3. UI/UX Updates
3.1 Refresh giao diện toàn app
- Cập nhật design system: màu, typography, tokens.
- Home tab mới: bottom tab bar, category section, profile reminder banner, banner pager mới.
- Bộ icon tab mới: Create, Gallery, Profile, Story.
3.2 Cải tiến màn Future Baby & Home
- Redesign Age Selector, Gender Selector, Face Slot.
- Cập nhật Home Header, Home Loading, Style Browser (có loading state mới).
4. Thư viện & SDK
4.1 First Open SDK 4.3.0 + Ads SDK 9.0.4
- Nâng cấp First Open SDK lên 4.3.0, Ads SDK lên 9.0.4.
- Splash / Language / Onboarding chuyển sang SDK mới quản lý → đồng bộ với chuẩn Apero.
4.2 Rate App - thư viện mới
- Chuyển sang lib Rate App mới (Apero Module Rate) thay cho implement cũ.
5. Cập nhật cấu hình
5.1 Ad IDs & Strings
- Cập nhật bộ Ad IDs production.
- Chuẩn hoá & dọn dẹp strings cho 10 ngôn ngữ: DE, ES, FR, HI, JA, KO, PT, TH, VI, ZH.
6. Mô tả UI các màn hình trong app
Lưu ý: 6.1 Splash / 6.2 Language (First Open) / 6.3 Onboarding do First Open SDK 4.3.0 render — không có Composable trong repo, chỉ có config XML (
fo_config.xml,fo_config_color.xml,fo_config_ads.xml). Mockup mang tính tham khảo theo chuẩn template SDK.
6.1 Splash (SDK render)
- Layout XML:
activity_splash.xml. - Logo app
fo_ic_logo_app.webptrung tâm, nền theo brand color. - SDK quản lý load Ad Splash (Resume / Splash Inter) trước khi navigate sang Language hoặc Home theo
FirstOpenNextAction.
┌──────────────────────────────┐
│ │
│ │
│ ╭─────╮ │
│ │ LOGO│ │
│ ╰─────╯ │
│ AI Couple │
│ │
│ ▓▓▓▓▓▓░░░░░ loading │
│ │
│ (Ad Splash by SDK) │
└──────────────────────────────┘
6.2 Language
Có 2 màn Language khác nhau:
(a) Language (First Open) — SDK render
- Layout do First Open SDK 4.3.0 quản lý, list ngôn ngữ + Native Ad theo config.
┌──────────────────────────────┐
│ Language Next →│
├──────────────────────────────┤
│ ╔══════════════════════════╗ │
│ ║ English ◉ ║ │
│ ╚══════════════════════════╝ │
│ ┌──────────────────────────┐ │
│ │ Tiếng Việt ○ │ │
│ ├──────────────────────────┤ │
│ │ 日本語 ○ │ │
│ └──────────────────────────┘ │
│ ┌──────────────────────────┐ │
│ │ [Native Ad] │ │
│ └──────────────────────────┘ │
└──────────────────────────────┘
(b) Language (Settings > Language) — LanguageScreen.kt in-app
- Header: back button (trái) + title "LANGUAGE" uppercase, font SpaceGrotesk, canh giữa (không có Next button).
- LazyColumn các card
nativeNamengôn ngữ; card chọn có viền gradient hồng-tím + chữ hồng + icon check tròn gradient bên phải. - Không có cờ, không có Native Ad.
┌──────────────────────────────┐
│ ← LANGUAGE │
├──────────────────────────────┤
│ ┌──────────────────────────┐ │
│ │ English │ │
│ └──────────────────────────┘ │
│ ╔══════════════════════════╗ │
│ ║ Tiếng Việt (✓) ║ │ ← border gradient + chữ hồng
│ ╚══════════════════════════╝ │
│ ┌──────────────────────────┐ │
│ │ 日本語 │ │
│ └──────────────────────────┘ │
│ ┌──────────────────────────┐ │
│ │ 한국어 │ │
│ └──────────────────────────┘ │
└──────────────────────────────┘
6.3 Onboarding (First Open)
- 3 trang giới thiệu tính năng chính, ảnh minimal/illustration full-bleed.
- Indicator dạng dot dưới cùng, nút Next/Get Started kiểu CTA neon.
- Native Ad fullscreen có thể hiển thị giữa các bước theo config.
┌──────────────────────────┐
│ │
│ ┌────────────────────┐ │
│ │ │ │
│ │ [Hero Image] │ │
│ │ couple illustr. │ │
│ │ │ │
│ └────────────────────┘ │
│ │
│ Create magic with │
│ your partner ✨ │
│ │
│ Generate stunning AI │
│ photos together │
│ │
│ ● ○ ○ │
│ ╔════════════════════╗ │
│ ║ Next → ║ │
│ ╚════════════════════╝ │
└──────────────────────────┘
6.4 Home (AI Studio tab)
- Shell: App shell dùng
HorizontalPager(swipe disabled) chứa 4 tab, chuyển tab bằng bottom tab bar. - Header:
- Trái: 2 avatar cặp đôi (chỉ hiện khi đã set up profile) — avatar A border gradient sweep hồng, avatar B gradient tím→cyan. Tap mở Couple Profile.
- Phải: icon Crown PRO (mở Paywall) + icon Settings (gear, mở Settings).
- Không hiển thị tên cặp đôi trong header.
- Banner Pager (Hero): Carousel side-peeking, item active scale 1.0, các item bên cạnh scale 0.8 + alpha 0.5 + blur 10px (API 31+). Auto-scroll 3s, pause khi user kéo. Dot indicator neon dưới banner.
- Category Sections: Mỗi category là 1 section riêng theo style:
- ROW layout:
LazyRowcác card 130×162 đồng đều, có label đè gradient ở đáy card. - GROUP layout: 1 hero card 190×238 bên trái + nhiều cột phụ (2 card 90×113 xếp dọc) scroll ngang.
- Header section: title trái + link "See all" hồng bên phải.
- ROW layout:
- Loading state: Shimmer skeleton thay cho spinner khi
isLoadinghoặccategoriesrỗng. - Profile Reminder Banner: Nằm ngay trên bottom tab bar (không phải đầu màn) — chỉ hiện khi
showProfileReminder = true. - Bottom Tab Bar: 4 tab — AI Studio / Baby Gen / Our Story / Gallery (không có tab Profile). Tab active: icon + label hồng, font Bold.
- Banner Ad: Pin dưới bottom tab bar, persist qua tất cả các tab.
┌──────────────────────────────┐
│ (◔)(◔) 👑 ⚙ │ ← Header: 2 avatars | PRO + Settings
├──────────────────────────────┤
│ │
│ ┌────────────────────┐ │
│ ░ │ [Hero Banner] │ ░ │ ← side-peek: side cards scale 0.8 + blur
│ ░ │ ✨ neon glow ✨ │ ░ │
│ └────────────────────┘ │
│ ● ○ ○ │ ← neon dots indicator
├──────────────────────────────┤
│ Wedding See all│
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ ← ROW: 130×162 cards
│ │ img│ │ img│ │ img│ │ img│ →│
│ │name│ │name│ │name│ │name│ │
│ └────┘ └────┘ └────┘ └────┘ │
├──────────────────────────────┤
│ Travel See all│
│ ┌────────┐ ┌──┐ ┌──┐ ┌──┐ │ ← GROUP: hero 190×238 + cột 2 card
│ │ │ │S1│ │S3│ │S5│ │
│ │ Hero │ ├──┤ ├──┤ ├──┤ → │
│ │190×238 │ │S2│ │S4│ │S6│ │
│ │ name │ └──┘ └──┘ └──┘ │
│ └────────┘ │
├──────────────────────────────┤
│ ⚠ Set up couple profile → │ ← Profile Reminder (sát tab bar)
├──────────────────────────────┤
│ ✨ 👶 💞 🖼│
│AI Studio BabyGen OurStory Gal│ ← 4 tab; active = hồng bold
├──────────────────────────────┤
│ [ Banner Ad ] │ ← pin dưới tab bar, persist
└──────────────────────────────┘
6.5 Style Browser
- Header: Back button (trái) + title (giữa). Nền gradient VoidBlack.
- Tab Chips: Hàng chip category scroll ngang phía trên — chip active có gradient border neon.
- Content:
HorizontalPagerhiển thịStyleGridcủa category đang chọn, vuốt ngang để chuyển category. - Style Card: Thumbnail + badge "PRO" overlay (nếu là style premium).
- Loading: shimmer card grid. Empty: message khi không có style.
┌──────────────────────────────┐
│ ← Style Browser │
├──────────────────────────────┤
│ ╔══════╗┌──────┐┌──────┐┌────│
│ ║Weddi.║│Travel││Casual││Date│ → chip tabs
│ ╚══════╝└──────┘└──────┘└────│
├──────────────────────────────┤
│ ┌────────┐ ┌────────┐ │
│ │ img │ │ img │ PRO │
│ │ name │ │ name │ │
│ └────────┘ └────────┘ │
│ ┌────────┐ ┌────────┐ │
│ │ img │ │ img │ │
│ │ name │ │ name │ │
│ └────────┘ └────────┘ │
└──────────────────────────────┘
6.6 Choose Picture
- Header: Chỉ có back button + title "CHOOSE PHOTOS" (uppercase), không có nút confirm.
- Photo Slots: Tùy service yêu cầu 1 hay 2 ảnh:
- 1 slot: 1 card lớn 140dp chiếm full width, hiện glyph
+khi rỗng. - 2 slots: 2 card 90dp side-by-side label "YOU" (accent hồng) + "PARTNER" (accent tím). Slot đã có ảnh: thumbnail + icon edit ở góc trên-phải.
- 1 slot: 1 card lớn 140dp chiếm full width, hiện glyph
- Embedded Cropper: Vùng crop ảnh lớn ngay trong màn (3:4) với viền màu accent theo slot active. Khi user kéo handle xong, auto-crop debounce.
- Bottom area: Hint text + counter free-generation còn lại (nếu chưa Premium) + CTA "GENERATE" (gradient khi enabled, dark khi disabled).
- Banner Ad: Dưới CTA.
┌──────────────────────────────┐
│ ← CHOOSE PHOTOS │
├──────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ │
│ │ + YOU │ │+PARTNER │ │ ← 2 slots (hoặc 1 slot full width)
│ │ ♡ pink │ │ ♡ purpl │ │
│ └─────────┘ └─────────┘ │
├──────────────────────────────┤
│ ╔═════════════════════════╗ │
│ ║ ║ │
│ ║ [Embedded Cropper] ║ │
│ ║ 3:4, accent border ║ │
│ ║ ║ │
│ ╚═════════════════════════╝ │
├──────────────────────────────┤
│ Crop your photo • 3 left │
│ ╔═════════════════════════╗ │
│ ║ GENERATE ║ │
│ ╚═════════════════════════╝ │
│ [ Banner Ad ] │
└──────────────────────────────┘
6.7 Select Photo (Photo Picker mới)
- Header: Back button (trái) + title
select_photo_title(giữa) + icon Camera trong card surface tối (phải) — tap mở camera chụp ảnh trực tiếp. - Album Tab Row: Hàng
AlbumTabRowscroll ngang, đồng bộ vớiHorizontalPagerbên dưới. - Content:
HorizontalPagermỗi page là 1PhotoGridcủa album tương ứng — vuốt ngang để chuyển album. - Trạng thái permission: Khi chưa có quyền →
PermissionRequestViewoverlay giữa màn với CTA xin quyền. - Trạng thái loading / empty: Spinner khi đang load, message khi album rỗng.
┌──────────────────────────────┐
│ ← Select Photo [📷] │ ← back | title | Camera button
├──────────────────────────────┤
│ ╔════╗┌─────┐┌──────┐┌──────┐│
│ ║All ║│Camer││Screen││Saved │ → AlbumTabRow (sync pager)
│ ╚════╝└─────┘└──────┘└──────┘│
├──────────────────────────────┤
│ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │
│ │📷│ │📷│ │📷│ │📷│ │
│ └──┘ └──┘ └──┘ └──┘ │
│ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │ ← swipe ngang để đổi album
│ │📷│ │📷│ │📷│ │📷│ │
│ └──┘ └──┘ └──┘ └──┘ │
│ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │
│ │📷│ │📷│ │📷│ │📷│ │
│ └──┘ └──┘ └──┘ └──┘ │
└──────────────────────────────┘
Permission state (overlay):
┌────────────────────┐
│ 🔒 │
│ Allow access to │
│ your photos… │
│ ╔════════════════╗ │
│ ║ Grant Access ║ │
│ ╚════════════════╝ │
└────────────────────┘
6.8 Crop
- Header (CropHeader): Back button (trái) + nút "Auto" (phải) — chỉ hiện khi detect được face.
- Instruction: Text hint giữa header, đổi nội dung khi đã detect face ("Face detected" variant).
- Cropper Box: Cropper lớn chính giữa (weight 1f), tỉ lệ 3:4, handle 20dp. Có placeholder cho các state: loading, analyzing, error, no image.
- Bottom area: Counter free-generation (nếu chưa Premium) +
CropBottomBarvới nút "Continue". - Banner Ad: Dưới cùng.
┌──────────────────────────────┐
│ ← [Auto] │ ← Auto chỉ hiện khi detect face
├──────────────────────────────┤
│ Crop your photo │ ← hint (đổi khi face detected)
├──────────────────────────────┤
│ │
│ ╔══════════════════════╗ │
│ ║ ║ │
│ ║ ║ │
│ ║ [Cropper 3:4] ║ │
│ ║ handles 20dp ║ │
│ ║ ║ │
│ ╚══════════════════════╝ │
│ │
├──────────────────────────────┤
│ 2 free left │
│ ╔═════════════════════════╗ │
│ ║ Continue ║ │
│ ╚═════════════════════════╝ │
│ [ Banner Ad ] │
└──────────────────────────────┘
6.9 Generating
- Top: Nút X (close) ở góc trái trên — mở
NeonCancelDialog. - ScanningImageRow: Hàng frame ảnh input với hiệu ứng scanning beam (số frame = số ảnh user upload, 1 hoặc 2).
- Progress Display:
- Số phần trăm lớn 44sp bold ở giữa.
- Subtitle "please wait" 13sp.
NeonProgressBarcao 6dp, fill gradient neon.
- Phase List (
GenerationPhaseList): Danh sách phase với icon, nội dung thay đổi theoserviceType(FaceCombine / ImageCombine / Qwen). - Banner Ad:
GeneratingBannerViewdưới cùng. - Error overlay:
NeonErrorDialogkhi sinh ảnh lỗi.
┌──────────────────────────────┐
│ ✕ │
│ │
│ ┌────────┐ ┌────────┐ │
│ │▓scan▓ │ │▓scan▓ │ │ ← ScanningImageRow (1 hoặc 2 frame)
│ │ │ │ │ │
│ │ [You] │ │[Partner│ │
│ │ │ │ ] │ │
│ └────────┘ └────────┘ │
│ │
│ 65% │ ← 44sp bold
│ please wait │ ← 13sp
│ ▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░ │ ← NeonProgressBar 6dp
│ │
│ ✓ Phase 1 │
│ ✓ Phase 2 │ ← GenerationPhaseList
│ ● Phase 3 │ (icon theo serviceType)
│ ○ Phase 4 │
├──────────────────────────────┤
│ [ Banner Ad ] │
└──────────────────────────────┘
6.10 Result
- ResultTopBar: Back button (trái, trong surface card) + tên style (giữa) + spacer cân chỉnh (phải).
- Image Display: Box giữa màn chứa ảnh kết quả, viền NeonPink (alpha 0.15), giữ nguyên aspect ratio. Watermark chữ ở góc dưới-phải (chỉ với non-premium).
- Actions Bar: Tối đa 5 action (hiện theo context):
- Save (ẩn nếu vào từ Gallery), Share (luôn có), Report (disable sau khi đã submit), Discard (chỉ với kết quả mới), Delete (chỉ khi vào từ Gallery).
- Mỗi action = column: icon box + label.
- Banner Ad:
ResultBannerViewdưới cùng. - Dialogs: AlertDialog xác nhận delete/discard, overlay spinner khi save,
ReportBottomSheetFragmentkhi report.
┌──────────────────────────────┐
│ [←] Sunset Romance │ ← back trong surface | style name
├──────────────────────────────┤
│ │
│ ┌──────────────────────┐ │
│ │ ╔════════════════╗ │ │
│ │ ║ ║ │ │
│ │ ║ [Result Image] ║ │ │ ← NeonPink border 0.15a
│ │ ║ ║ │ │
│ │ ║ logo🅰 │ │ │ ← watermark (non-premium)
│ │ ╚════════════════╝ │ │
│ └──────────────────────┘ │
│ │
├──────────────────────────────┤
│ 💾 ↗ ⚠ 🗑 │ ← Save Share Report Discard/Delete
│ Save Share Report Discard │ (hiển thị tuỳ context)
├──────────────────────────────┤
│ [ Banner Ad ] │
└──────────────────────────────┘
6.11 Future Baby (Baby Gen tab)
- Header: Title "FUTURE BABY" canh trái (uppercase) — embedded trong Home tab, không có back button.
- 2 Face Slot side-by-side: 150dp height, accent color riêng (1 slot girl tone / 1 slot boy tone). Slot rỗng =
+, có ảnh = thumbnail + edit. - Gender Selector: SectionLabel + 2 button toggle (không phải 3 — không có Random).
- Age Selector: SectionLabel + control dạng dropdown-like (chọn 1 độ tuổi).
- BabyResultSection: Khi có kết quả hiển thị ảnh baby + actions.
- Error text: Inline error (nếu có).
- Free-generation counter + CTA Generate.
┌──────────────────────────────┐
│ FUTURE BABY │ ← title canh trái, no back
├──────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ │
│ │ + Mom │ │ + Dad │ │ ← 2 slot 150dp side-by-side
│ │ (girl │ │ (boy │ │
│ │ tone) │ │ tone) │ │
│ └──────────┘ └──────────┘ │
├──────────────────────────────┤
│ Gender │
│ ┌────────┐ ┌────────┐ │ ← 2 button (không có Random)
│ │ 👦 Boy │ │ 👧 Girl│ │
│ └────────┘ └────────┘ │
├──────────────────────────────┤
│ Age │
│ ┌────────────────────────┐ │ ← dropdown-like
│ │ 3 years ▾ │ │
│ └────────────────────────┘ │
├──────────────────────────────┤
│ 2 free left │
│ ╔═════════════════════════╗ │
│ ║ Generate ║ │
│ ╚═════════════════════════╝ │
└──────────────────────────────┘
6.12 Couple Profile
- Header: Back button (chỉ hiện khi không phải first launch) + title
set_up_your_duocanh giữa. - 2 GradientAvatarCircles side-by-side, cách nhau 40dp:
- Avatar A: sweep gradient hồng/tím.
- Avatar B: sweep gradient tím/cyan.
- 2 NeonLabeledFields: Tên partner A + tên partner B (lần lượt).
- NeonDateField: Ngày kỷ niệm (anniversary). Tap mở NeonCalendarDialog.
- CoupleProfileContinueButton: "Continue" hoặc "Skip" tuỳ trạng thái fill.
┌──────────────────────────────┐
│ ← Set up your duo │
├──────────────────────────────┤
│ │
│ ╭───╮ ╭───╮ │
│ ╱ + ╲ ╱ + ╲ │ ← GradientAvatarCircle A | B
│ ╲___╱ ╲___╱ │ (sweep gradient pink/purple/cyan)
│ │
├──────────────────────────────┤
│ Your name │
│ ┌────────────────────────┐ │
│ │ Alex │ │
│ └────────────────────────┘ │
│ Partner's name │
│ ┌────────────────────────┐ │
│ │ Mia │ │
│ └────────────────────────┘ │
│ Anniversary │
│ ┌────────────────────────┐ │
│ │ 📅 Mar 5, 2024 │ │ ← tap → NeonCalendarDialog
│ └────────────────────────┘ │
├──────────────────────────────┤
│ ╔═════════════════════════╗ │
│ ║ Continue ║ │
│ ╚═════════════════════════╝ │
└──────────────────────────────┘
NeonCalendarDialog:
┌─────────────────────┐
│ ‹ May 2026 › │
├─────────────────────┤
│ Mo Tu We Th Fr Sa Su│
│ 1 2 3 4│
│ 5 6 7 8 9 10 11│
│ 12 13 14 ╔══╗ 17 18 │
│ 19 20 21 ║15║ 24 25 │
│ 26 27 28 ╚══╝ 31 │
├─────────────────────┤
│ Cancel Confirm │
└─────────────────────┘
6.13 Timeline (Our Story tab)
- Header: Title "OUR STORY" canh trái, uppercase 18sp bold (không có back button — embedded trong Home tab).
- Timeline:
LazyColumncácTimelineNode— đường gradient dọc bên trái, dot màu cho từng event. Mỗi node là card hiện title + date + caption + icon thùng rác (xoá). - Empty state:
EmptyTimelinemessage khi chưa có event. - FAB: Góc dưới-phải, tròn 56dp, nền NeonGradient, icon
+, có bounce animation + soft glow khi press. - Dialogs:
AddMilestoneSheet(modal bottom sheet thêm event) + AlertDialog xác nhận delete.
┌──────────────────────────────┐
│ OUR STORY │ ← title canh trái, uppercase
├──────────────────────────────┤
│ ●─┐ │
│ │ ┌──────────────────┐ │
│ │ │ First Date 🗑 │ │
│ │ │ Feb 14, 2024 │ │
│ │ │ Our first date… │ │
│ │ └──────────────────┘ │
│ ●─┤ │
│ │ ┌──────────────────┐ │
│ │ │ Engagement 🗑 │ │
│ │ │ Dec 24, 2024 │ │
│ │ └──────────────────┘ │
│ ●─┤ │
│ │ ┌──────────────────┐ │
│ │ │ Anniversary 🗑 │ │
│ │ │ Feb 14, 2026 │ │
│ │ └──────────────────┘ │
│ ● │
│ │
│ ┌────┐ │ ← FAB 56dp, glow
│ │ + │ │
│ └────┘ │
└──────────────────────────────┘
AddMilestoneSheet (bottom modal):
┌──────────────────────┐
│ ── │
│ Add Milestone │
├──────────────────────┤
│ Title │
│ ┌────────────────┐ │
│ │ │ │
│ └────────────────┘ │
│ Date │
│ ┌────────────────┐ │
│ │ 📅 Pick date │ │ ← mở NeonCalendarDialog
│ └────────────────┘ │
│ Caption (optional) │
│ ┌────────────────┐ │
│ │ │ │
│ └────────────────┘ │
│ ╔════════════════╗ │
│ ║ Save ║ │
│ ╚════════════════╝ │
└──────────────────────┘
6.14 Gallery (Gallery tab)
- Header (động): Có 2 mode:
- Normal: title "GALLERY" (uppercase).
- Selection mode (sau khi long-press): nút close + số item đã chọn + icon delete (đỏ) bên phải.
- Content:
GalleryGridlưới ảnh thumbnail. Long-press → selection mode. - Empty state: Message + CTA "Create Now" khi gallery rỗng.
- FAB: Góc dưới-phải (chỉ hiện khi có item và không ở selection mode), NeonPink, icon
+→ mở Style Browser.
Normal mode:
┌──────────────────────────────┐
│ GALLERY │
├──────────────────────────────┤
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ img │ │ img │ │ img │ │
│ └──────┘ └──────┘ └──────┘ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ img │ │ img │ │ img │ │
│ └──────┘ └──────┘ └──────┘ │
│ ┌──────┐ ┌──────┐ │
│ │ img │ │ img │ │
│ └──────┘ └──────┘ │
│ │
│ ┌────┐ │
│ │ + │ │ ← FAB
│ └────┘ │
└──────────────────────────────┘
Selection mode:
┌──────────────────────────────┐
│ ✕ 3 selected 🗑 │
├──────────────────────────────┤
│ ╔══════╗ ┌──────┐ ╔══════╗ │
│ ║ img✓ ║ │ img │ ║ img✓ ║ │
│ ╚══════╝ └──────┘ ╚══════╝ │
│ ┌──────┐ ╔══════╗ ┌──────┐ │
│ │ img │ ║ img✓ ║ │ img │ │
│ └──────┘ ╚══════╝ └──────┘ │
└──────────────────────────────┘
6.15 Saved Result (sau khi save thành công)
- Top: Emoji 🎉 48sp + success title 26sp bold + subtitle 14sp.
- Image: Ảnh kết quả ở giữa, crop fit, viền NeonPink 1.5dp, chiếm flex weight.
- Actions:
- Full-width button "Share" (NeonPink gradient).
- Row 2 button outlined dưới: "Gallery" (CyberAqua border) + "Create Another" (grey border).
- Bottom padding 32dp.
┌──────────────────────────────┐
│ 🎉 │ ← 48sp
│ Saved Successfully │ ← 26sp bold
│ You can find it in Gallery │ ← 14sp
├──────────────────────────────┤
│ │
│ ┌────────────────────┐ │
│ │ [Result Image] │ │ ← NeonPink border 1.5dp
│ │ │ │
│ └────────────────────┘ │
│ │
├──────────────────────────────┤
│ ╔═════════════════════════╗ │
│ ║ ↗ Share ║ │ ← NeonPink gradient
│ ╚═════════════════════════╝ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Gallery │ │ Create │ │ ← outlined
│ │ (cyan) │ │ Another │ │
│ └──────────┘ └──────────┘ │
└──────────────────────────────┘
6.16 Settings
- SettingsHeader: Back button + title "SETTINGS" uppercase.
- ProfileCard: Card đầu — 2 avatar gradient chồng nhau + tên cặp đôi + badge PRO (nếu Premium). Tap → Couple Profile.
- SettingsCard sections:
- Language (hiện ngôn ngữ hiện tại) + Notifications (toggle switch).
- Rate / Share / Terms of Service / Privacy Policy — đều có chevron
>. - Version footer (text nhỏ).
- Card có nền SurfaceDark, border 1dp.
- Rate dùng popup của Apero Module Rate (5 sao + comment).
┌──────────────────────────────┐
│ ← SETTINGS │
├──────────────────────────────┤
│ ┌──────────────────────────┐ │
│ │ (◔)(◔) Alex & Mia PRO │ │ ← ProfileCard
│ │ Tap to edit > │ │
│ └──────────────────────────┘ │
├──────────────────────────────┤
│ ┌──────────────────────────┐ │
│ │ 🌐 Language EN > │ │
│ │ 🔔 Notifications ⬤── │ │ ← toggle
│ └──────────────────────────┘ │
├──────────────────────────────┤
│ ┌──────────────────────────┐ │
│ │ ⭐ Rate App > │ │
│ │ ↗ Share App > │ │
│ │ 📄 Terms of Service > │ │
│ │ 🔒 Privacy Policy > │ │
│ └──────────────────────────┘ │
│ │
│ Version 1.1.0 │
└──────────────────────────────┘
Rate Popup (Apero Module Rate):
┌────────────────────┐
│ Rate AI Couple │
│ │
│ ☆ ☆ ☆ ☆ ☆ │
│ │
│ ╔════════════════╗ │
│ ║ Submit ║ │
│ ╚════════════════╝ │
│ Later │
└────────────────────┘
6.17 Paywall
- Top Half (50% chiều cao): Hero image full width, crop.
- Close Button: Góc trên-phải (36dp circle, nền semi-transparent, border).
- Bottom Half (overlay gradient transparent → VoidBlack):
- Title "UNLOCK PRO" 32sp bold.
- Subtitle 15sp.
- 2 PriceCards (Weekly + Yearly) — layout ngang: tên gói + chu kỳ trái, giá + per-month phải. Card chọn = NeonGradient border + tinted background.
- Badge "BEST VALUE" đính trên card Yearly.
- Benefits section: 4 dòng dấu ✓.
- Continue button: NeonGradient, có pulsing scale animation.
- "Cancel anytime" text nhỏ.
- Row link Terms · Privacy ở giữa.
- Lưu ý: chỉ có 2 gói (Weekly + Yearly), không có Monthly.
┌──────────────────────────────┐
│ ┌──────────────────────────┐ │
│ │ ✕ │ │
│ │ [Hero Image] │ │ ← 50% chiều cao
│ │ crop │ │
│ │ │ │
│ └──────────────────────────┘ │
│ ░░░░░ gradient overlay ░░░ │
├──────────────────────────────┤
│ UNLOCK PRO │ ← 32sp bold
│ Create unlimited magic │ ← 15sp
│ │
│ ┌──────────────────────┐ │
│ │ Weekly $4.99/wk │ │
│ └──────────────────────┘ │
│ ┏━━━━━━━━━━━━━━━━━━━━━━┓BEST│
│ ┃ Yearly $29.99/yr┃VALUE│ ← gradient border
│ ┃ ~$2.50/mo┃ │
│ ┗━━━━━━━━━━━━━━━━━━━━━━┛ │
│ │
│ ✓ Unlimited generations │
│ ✓ No ads │
│ ✓ HD download │
│ ✓ Exclusive styles │
│ │
│ ╔═════════════════════════╗ │
│ ║ Continue ║ │ ← pulsing animation
│ ╚═════════════════════════╝ │
│ Cancel anytime │
│ Terms · Privacy │
└──────────────────────────────┘
6.18 Daily Engagement Fullscreen Notification
- Layout: Activity fullscreen kiểu lock-screen (XML layout
activity_daily_engagement_fullscreen). - Time Display: Giờ / phút / ngày hiển thị ở các góc kiểu lock-screen.
- Hero Image: Ảnh teaser lớn ở giữa (1 trong 8 ảnh
daily_engagement_lock_img_*.webp). - Text: Title + body bên dưới hero.
- Close Button: Icon X góc trên-phải → dismiss notification + finish activity.
- Tap anywhere else: Launch
SplashActivity(mở app).
┌──────────────────────────────┐
│ 20:45 ✕ │ ← time | close
│ Mon, 19 May │
│ │
│ ┌────────────────────┐ │
│ │ │ │
│ │ [Hero Teaser] │ │ ← 1/8 webp
│ │ daily_engagement │ │
│ │ _lock_img_N.webp │ │
│ │ │ │
│ └────────────────────┘ │
│ │
│ Your daily couple │
│ moment is ready ✨ │
│ Tap to create now │
│ │
│ ───────────────────────── │
│ Tap anywhere → SplashActivity│
└──────────────────────────────┘
Tổng kết PO quan tâm
| Hạng mục | Số lượng / Mô tả |
|---|---|
| Tính năng mới | 5 (Daily Notification, Shortcut+Uninstall, Photo Picker, Qwen, Calendar) |
| AI service mới | Qwen Editing |
| SDK upgrade | First Open 4.3.0, Ads 9.0.4, Rate (Apero Module Rate mới) |
| Ngôn ngữ rà soát text | 10 (DE, ES, FR, HI, JA, KO, PT, TH, VI, ZH) |
| UI redesign | Home, Future Baby, Style Browser, Generating, Calendar |
Lưu ý cho PO / QA
- Cần QA full flow First-Open (Splash → Language → Onboarding) sau khi nâng SDK 4.3.0 trên tất cả locale đã rà soát strings.
- Cần verify Daily Engagement Notification hoạt động đúng schedule và có tracking event đầy đủ.
- Cần kiểm tra Uninstall Survey trigger đúng khi user gỡ app.
- Cần verify Ad IDs production trước khi release.
Unresolved questions
- Có cần viết changelog public (Play Console release notes) song song không?
- Daily Engagement Notification đã có analytics event tracking chưa?
- Qwen service đã có quota / fallback khi fail chưa?