diff --git a/APP_ICON_DESIGN.md b/APP_ICON_DESIGN.md deleted file mode 100644 index 4b796be..0000000 --- a/APP_ICON_DESIGN.md +++ /dev/null @@ -1,443 +0,0 @@ -# 🎨 FocusBuddy App Icon Design - -**Date**: 2025-11-22 -**Status**: Design specification ready - ---- - -## 🎯 Design Concept - -### Core Message -The icon should convey: -- **Focus**: Centered, calm attention -- **Gentleness**: Soft, non-intimidating -- **Support**: A friendly companion, not a strict taskmaster - -### Design Direction -**"Gentle Focus Circle"** - A minimalist icon featuring concentric circles representing focused attention, with a soft color palette matching the app's Morandi aesthetic. - ---- - -## 🎨 Visual Design - -### Primary Design Option: Focused Circle - -``` -┌─────────────────────┐ -│ │ -│ ╭───────╮ │ -│ ╭─────────────╮ │ -│ │ ◉ ◉ │ │ <- Friendly "buddy" face -│ │ ⌣ │ │ (subtle, optional) -│ ╰─────────────╯ │ -│ ╰───────╯ │ -│ │ -└─────────────────────┘ -``` - -**Elements**: -1. **Outer circle**: Soft gradient (#A7C4BC to #88C9A1) -2. **Inner circle**: Lighter shade (#F8F6F2) -3. **Center dot**: Primary color (#A7C4BC) -4. **Optional**: Subtle friendly face (two dots for eyes, gentle curve for smile) - -### Alternative Design: Timer Symbol - -``` -┌─────────────────────┐ -│ │ -│ ⏰ │ -│ ╱ ╲ │ -│ │ 12 │ │ <- Minimalist clock -│ ╲___╱ │ showing focus time -│ │ -└─────────────────────┘ -``` - ---- - -## 🎨 Color Specifications - -### Primary Palette (from app_colors.dart) -```dart -Background: #F8F6F2 // Warm off-white -Primary: #A7C4BC // Calm green -Success: #88C9A1 // Encouraging green -Text: #5B6D6D // Soft gray -``` - -### Icon Color Strategy -**Option A - Gradient Background**: -- Background: Gradient from #A7C4BC (top) to #88C9A1 (bottom) -- Center: #F8F6F2 -- Details: #5B6D6D - -**Option B - Solid Background**: -- Background: #A7C4BC -- Center circle: #F8F6F2 -- Accent: #88C9A1 - ---- - -## 📐 Technical Requirements - -### iOS Requirements -| Size | Usage | File Name | -|------|-------|-----------| -| 1024×1024 | App Store | `AppIcon-1024.png` | -| 180×180 | iPhone 3x | `AppIcon-180.png` | -| 120×120 | iPhone 2x | `AppIcon-120.png` | -| 167×167 | iPad Pro | `AppIcon-167.png` | -| 152×152 | iPad 2x | `AppIcon-152.png` | -| 76×76 | iPad 1x | `AppIcon-76.png` | - -### Android Requirements -| Size | Density | Folder | -|------|---------|--------| -| 192×192 | xxxhdpi | `mipmap-xxxhdpi` | -| 144×144 | xxhdpi | `mipmap-xxhdpi` | -| 96×96 | xhdpi | `mipmap-xhdpi` | -| 72×72 | hdpi | `mipmap-hdpi` | -| 48×48 | mdpi | `mipmap-mdpi` | -| 512×512 | Play Store | `playstore-icon.png` | - -### Design Guidelines -- **iOS**: No transparency, no rounded corners (iOS adds them automatically) -- **Android**: Can have transparency, adaptive icons recommended -- **Safe area**: Keep important elements within 80% of canvas (avoid edges) -- **Contrast**: Ensure icon is visible on both light and dark backgrounds - ---- - -## 🛠️ Design Tools & Resources - -### Option 1: Figma (Recommended) -**Steps**: -1. Go to [Figma](https://www.figma.com) (free account) -2. Create new file (1024×1024 canvas) -3. Use the design specifications above -4. Export all required sizes - -**Figma Template** (you can recreate): -``` -Frame: 1024×1024 -├─ Background Rectangle (fill: linear gradient #A7C4BC → #88C9A1) -├─ Outer Circle (800×800, center aligned) -│ ├─ Fill: #A7C4BC -│ └─ Opacity: 90% -├─ Inner Circle (600×600, center aligned) -│ ├─ Fill: #F8F6F2 -│ └─ Shadow: 0 4 20 rgba(0,0,0,0.1) -└─ Center Dot (200×200, center aligned) - ├─ Fill: #A7C4BC - └─ Optional: Friendly face elements -``` - -### Option 2: Canva -**Steps**: -1. Go to [Canva](https://www.canva.com) -2. Create custom size: 1024×1024 -3. Search templates: "app icon minimal" -4. Customize with FocusBuddy colors -5. Download as PNG - -### Option 3: Icon Generator Tools -**Online Tools**: -- [App Icon Generator](https://appicon.co/) - Upload 1024×1024, generates all sizes -- [IconKitchen](https://icon.kitchen/) - Android adaptive icons -- [MakeAppIcon](https://makeappicon.com/) - Generates iOS and Android sets - ---- - -## 🎨 Detailed Design Specs - -### Design 1: Minimalist Focus Circle - -**SVG-like Description**: -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -### Design 2: Timer with Focus - -**Description**: -``` -- Background: Solid #A7C4BC -- Clock circle: #F8F6F2, 700×700 -- Clock hands: #5B6D6D - - Hour hand pointing at 12 (straight up) - - Minute hand at 25 (Pomodoro reference) -- Center dot: Small circle #A7C4BC -- Shadow: Subtle drop shadow for depth -``` - ---- - -## 📝 Design Checklist - -### Before Creating -- [ ] Review app's color scheme (app_colors.dart) -- [ ] Decide on primary design concept -- [ ] Sketch rough ideas on paper (optional) - -### During Design -- [ ] Create 1024×1024 master file -- [ ] Use exact color codes from app -- [ ] Ensure visibility at small sizes (test at 48×48) -- [ ] Keep design simple and recognizable -- [ ] Test on light and dark backgrounds - -### After Design -- [ ] Export 1024×1024 PNG (for iOS App Store) -- [ ] Generate all required iOS sizes -- [ ] Generate all required Android sizes -- [ ] Test icon appearance on real devices (if possible) -- [ ] Update Xcode assets (ios/Runner/Assets.xcassets) -- [ ] Update Android resources (android/app/src/main/res) - ---- - -## 🚀 Quick Start Guide - -### Fastest Method: Use Figma - -1. **Create Master Icon** (15 minutes) - ``` - 1. Go to figma.com → New file - 2. Press 'F' for frame tool - 3. Enter dimensions: 1024×1024 - 4. Create the design using shapes (circles, rectangles) - 5. Apply colors from the spec above - ``` - -2. **Export Master** (2 minutes) - ``` - 1. Select the frame - 2. Right panel → Export - 3. Format: PNG, 1x - 4. Click Export - 5. Save as: icon-1024.png - ``` - -3. **Generate All Sizes** (5 minutes) - ``` - 1. Go to appicon.co - 2. Upload icon-1024.png - 3. Select iOS and Android - 4. Download generated assets - 5. Unzip the files - ``` - -4. **Install Icons** (10 minutes) - - See installation instructions below - ---- - -## 📦 Installation Instructions - -### iOS Installation - -1. **Locate Assets Folder**: - ``` - ios/Runner/Assets.xcassets/AppIcon.appiconset/ - ``` - -2. **Replace Files**: - - Copy all generated iOS icons to this folder - - Ensure file names match Contents.json - -3. **Update Contents.json** (if needed): - ```json - { - "images": [ - { - "size": "20x20", - "idiom": "iphone", - "filename": "Icon-20@2x.png", - "scale": "2x" - }, - // ... more entries - ] - } - ``` - -4. **Build and Test**: - ```bash - flutter clean - flutter build ios - ``` - -### Android Installation - -1. **Locate Resource Folders**: - ``` - android/app/src/main/res/ - ├── mipmap-mdpi/ - ├── mipmap-hdpi/ - ├── mipmap-xhdpi/ - ├── mipmap-xxhdpi/ - └── mipmap-xxxhdpi/ - ``` - -2. **Replace ic_launcher.png**: - - Copy the corresponding size to each folder - - Name all files: `ic_launcher.png` - -3. **Update for Adaptive Icons** (Optional): - - Create `mipmap-anydpi-v26/ic_launcher.xml` - - Reference foreground and background layers - -4. **Build and Test**: - ```bash - flutter clean - flutter build apk - ``` - ---- - -## 🎨 Design Recommendations - -### Do's ✅ -- Keep it simple and recognizable -- Use the app's color palette -- Test visibility at small sizes -- Ensure contrast with backgrounds -- Make it friendly and approachable - -### Don'ts ❌ -- Don't use text (hard to read at small sizes) -- Don't use complex gradients (may not scale well) -- Don't use thin lines (invisible at 48×48) -- Don't copy other apps' icons -- Don't use photos or realistic images - ---- - -## 🔍 Testing Your Icon - -### Visual Tests -1. **Size Test**: View at 48×48 - is it still recognizable? -2. **Background Test**: Place on white, black, and colored backgrounds -3. **Neighboring Test**: View alongside other popular apps -4. **Quick Glance Test**: Can you identify it in 1 second? - -### Technical Tests -```bash -# iOS: Check in simulator -flutter run -d "iPhone 15 Pro" - -# Android: Check on device -flutter install -``` - ---- - -## 💡 Design Philosophy - -**FocusBuddy Icon Should Feel**: -- 🧘 **Calm**: Soft colors, rounded shapes -- 🤝 **Supportive**: Friendly, non-threatening -- 🎯 **Focused**: Clear center point, minimal distractions -- 💚 **Gentle**: Morandi palette, no harsh contrasts - -**Avoid**: -- ⚠️ Aggressive colors (bright red, harsh orange) -- ⚠️ Sharp angles (intimidating) -- ⚠️ Complicated details (confusing) -- ⚠️ Dark/depressing tones (discouraging) - ---- - -## 📚 Resources - -### Color Inspiration -- Current app palette: Morandi tones, calm greens -- Reference: Calm app, Headspace (but make it unique!) - -### Design Inspiration -- Search "minimalist app icon" on Dribbble -- Look at productivity app icons on App Store -- Browse "focus timer" apps for ideas - -### Tools -- **Figma**: https://www.figma.com (free) -- **Canva**: https://www.canva.com (free) -- **AppIcon.co**: https://appicon.co (free generator) -- **IconKitchen**: https://icon.kitchen (Android adaptive) - ---- - -## 🎯 Next Steps - -1. **Design the Icon** (20-30 minutes) - - Use Figma or Canva - - Follow the specifications above - - Export 1024×1024 PNG - -2. **Generate All Sizes** (5 minutes) - - Use AppIcon.co to generate all required sizes - - Download the zip file - -3. **Install in Project** (10 minutes) - - Replace iOS assets - - Replace Android resources - - Test on simulators/devices - -4. **Document** (5 minutes) - - Save master file for future updates - - Note any design decisions - - Take screenshots for app store - ---- - -## 📝 Final Checklist - -- [ ] Master icon created (1024×1024) -- [ ] All iOS sizes generated -- [ ] All Android sizes generated -- [ ] iOS assets installed -- [ ] Android resources installed -- [ ] Tested on iOS simulator -- [ ] Tested on Android emulator/device -- [ ] Icon looks good at small size (48×48) -- [ ] Icon matches app's design language -- [ ] Master file saved for future updates - ---- - -**Time Estimate**: 30-60 minutes total -**Difficulty**: Beginner-friendly -**Tools Needed**: Browser (Figma/Canva), no design experience required - -**Ready to design?** Follow the "Quick Start Guide" section above! diff --git a/FINAL_SUMMARY.md b/FINAL_SUMMARY.md deleted file mode 100644 index 342fba4..0000000 --- a/FINAL_SUMMARY.md +++ /dev/null @@ -1,511 +0,0 @@ -# 🎉 FocusBuddy - 最终开发总结 - -**完成日期**: 2025年11月22日 -**状态**: ✅ MVP 已完成 99%! - ---- - -## 🏆 成就解锁 - -### ✅ 已完成的所有功能 - -#### 1. **核心专注功能** -- ⏱️ 倒计时器(精确到秒) -- ⏸️ 暂停/恢复 -- 🛑 提前停止(友好确认) -- 🔄 可配置时长(15/25/45分钟) - -#### 2. **分心追踪系统** -- 🤚 "I got distracted" 按钮(不中断计时!) -- 📊 4种分心类型分类 -- 💬 温柔鼓励反馈 -- 📈 分心统计记录 - -#### 3. **数据管理** -- 💾 本地持久化存储(Hive) -- 📅 按日期分组查看 -- 📊 今日统计汇总 -- 🔢 会话详细记录 - -#### 4. **完整页面系统** -- 🏠 Home Screen(动态时长显示) -- ⏰ Focus Screen(计时器 + 分心追踪) -- ✨ Complete Screen(统计 + 鼓励) -- 📜 History Screen(历史记录) -- ⚙️ Settings Screen(设置管理) - -#### 5. **用户体验** -- 🎨 莫兰迪配色(温柔柔和) -- 💬 15条随机鼓励文案 -- 🚀 流畅页面导航 -- 📱 响应式设计 - -#### 6. **本地通知系统** ✨ 新增 -- 🔔 专注完成通知 -- 📱 Android 13+ 权限支持 -- 🍎 iOS 运行时权限请求 -- 🌐 Web 平台优雅降级 -- 📊 基于分心次数的智能文案 - -#### 7. **字体优化** ✨ 新增 -- 🎨 Google Fonts (Nunito) 集成 -- 📦 自动从 CDN 下载并缓存 -- 🔤 5种字重支持(Light/Regular/SemiBold/Bold/ExtraBold) -- 🌍 跨平台一致性 - ---- - -## 📊 项目统计 - -``` -总代码行数: 1,680+ 行 (+400) -文件数量: 15 个 (+1 notification_service.dart) -页面数量: 5 个 -数据模型: 2 个 -服务类: 4 个 (+1) -依赖包: 8 个 (+1 google_fonts) -``` - -### 代码质量 -- ✅ 结构清晰(models/services/screens/theme) -- ✅ 注释完整 -- ✅ 遵循 Flutter 最佳实践 -- ✅ Material 3 设计 - ---- - -## 🎯 MVP 完成度 - -``` -███████████████████▓ 99% -``` - -### 已实现(99%) -- ✅ 所有核心功能 -- ✅ 所有核心页面 -- ✅ 数据持久化 -- ✅ 设置系统 -- ✅ 历史记录 -- ✅ 本地通知系统(Android/iOS) -- ✅ Google Fonts (Nunito) 字体 - -### 待完成(1%) -- 🎨 自定义应用图标 - **设计规格已完成,等待实现** - - ✅ 3个设计选项已创建 - - ✅ 可视化预览 (icon-preview.html) - - ✅ 完整技术文档 - - ⏳ 需要在 Figma/Canva 中创建(30分钟) -- ⏳ 应用商店截图 -- ⏳ 真机测试 - ---- - -## 🚀 如何运行 - -### 方式1: Web版(推荐,最快) -```bash -cd f:\cursor-auto\focusBuddy -flutter run -d edge -``` - -### 方式2: Windows 桌面版 -**注意**: 需要启用 Windows 开发者模式 - -1. 打开设置: `start ms-settings:developers` -2. 启用"开发者模式" -3. 运行: `flutter run -d windows` - -### 方式3: Android/iOS -需要连接真机或模拟器: -```bash -flutter devices # 查看可用设备 -flutter run -d -``` - ---- - -## 🧪 完整测试流程 - -### 1. 设置功能测试 -``` -1. 打开 App -2. 点击 "Settings" -3. 选择 15 分钟 -4. 返回首页 -5. ✅ 验证: 显示 "15 minutes" -``` - -### 2. 专注流程测试 -``` -1. 点击 "Start Focusing" -2. 等待几秒 -3. 点击 "I got distracted" -4. 选择 "📱 Scrolling social media" -5. 看到提示: "It happens. Let's gently come back." -6. 再点击几次分心按钮 -7. 点击 "Stop session" -8. 确认停止 -9. ✅ 验证: 完成页显示正确统计 -``` - -### 3. 历史记录测试 -``` -1. 完成至少2次专注 -2. 点击 "History" -3. 查看今日总结卡片 -4. 查看会话列表 -5. ✅ 验证: 数据正确累计 -``` - -### 4. 数据持久化测试 -``` -1. 完成一次专注 -2. 关闭 App -3. 重新打开 App -4. 查看 History -5. ✅ 验证: 数据仍然存在 -``` - ---- - -## 🎨 设计亮点 - -### 颜色系统 -```dart -Primary: #A7C4BC // 平静的绿色 -Background: #F8F6F2 // 温暖的米白 -Text: #5B6D6D // 柔和的灰色 -Success: #88C9A1 // 鼓励的绿色 -``` - -### 交互设计 -- 大按钮(56px 高度) -- 圆角设计(16px) -- 柔和阴影 -- 流畅动画(300ms) - -### 文案风格 -- "It happens. Let's gently come back." -- "Showing up is half the battle." -- "You came back — that's what matters." - ---- - -## 📁 项目结构 - -``` -lib/ -├── main.dart # 应用入口 -├── models/ # 数据模型 -│ ├── focus_session.dart -│ ├── focus_session.g.dart # Hive 生成 -│ └── distraction_type.dart -├── services/ # 业务逻辑 -│ ├── storage_service.dart -│ └── encouragement_service.dart -├── screens/ # 页面 -│ ├── home_screen.dart -│ ├── focus_screen.dart -│ ├── complete_screen.dart -│ ├── history_screen.dart -│ └── settings_screen.dart -├── theme/ # 主题系统 -│ ├── app_colors.dart -│ ├── app_text_styles.dart -│ └── app_theme.dart -└── widgets/ # 可复用组件(暂无) - -assets/ -└── encouragements.json # 鼓励文案数据 -``` - ---- - -## 🐛 已知问题 - -### 1. Windows 开发者模式 -**问题**: Windows 需要开发者模式才能运行桌面版 -**解决**: -- 方式A: 启用开发者模式 -- 方式B: 使用 Web 版测试(推荐) - -### 2. ✅ 字体显示 - 已修复 -**状态**: ✅ 已完成 -**方案**: 集成 Google Fonts,自动下载 Nunito -**文档**: `GOOGLE_FONTS_SETUP.md` - -### 3. ✅ 静态方法访问 - 已修复 -**状态**: ✅ 已完成 -**方案**: 将静态方法移到类开头 - -### 4. ✅ Complete Screen 导航 - 已修复 -**状态**: ✅ 已完成 -**方案**: "View Full Report" 按钮正确导航到 History -**文档**: `BUG_FIX_001.md` - ---- - -## 🎯 下一步计划 - -### 今天完成 ✅ -- ✅ 所有核心功能 -- ✅ 所有核心页面 -- ✅ 运行测试(Web 版成功) -- ✅ 添加本地通知系统 -- ✅ Google Fonts 字体集成 -- ✅ Bug 修复(Complete Screen 导航) - -### 明天任务 -1. 🎨 设计应用图标(1-2小时) -2. 📸 准备应用商店截图(1-2小时) -3. 🧪 真机测试(Android/iOS,2-3小时) - -### 本周任务 -1. 📝 完善应用描述 -2. 🌐 部署隐私政策页面 -3. 📋 填写上架表单 -4. 🚀 提交到应用商店 - ---- - -## 💡 核心价值实现 - -### ✅ "无惩罚"机制 -> 点击 "I got distracted" 不会: -> - ❌ 停止计时器 -> - ❌ 显示红色警告 -> - ❌ 扣减分数 -> - ✅ 只是温柔地记录并鼓励 - -### ✅ 情感友好 -> 所有文案都经过精心设计: -> - "It happens" (这很正常) -> - "Let's gently come back" (温柔回归) -> - "That's totally fine" (完全没问题) - -### ✅ 数据隐私 -> 100% 本地存储: -> - 无云同步 -> - 无账号系统 -> - 无数据上传 -> - 无分析追踪 - ---- - -## 🌟 项目亮点 - -### 技术实现 -1. **Hive** - 快速本地数据库 -2. **SharedPreferences** - 简单设置存储 -3. **Material 3** - 现代化 UI -4. **状态管理** - StatefulWidget(简单有效) - -### 用户体验 -1. **即时反馈** - 所有操作都有反馈 -2. **容错设计** - 提前停止有友好提示 -3. **数据可视化** - 清晰的统计展示 -4. **流畅导航** - 页面间无缝切换 - -### 产品差异化 -1. **唯一的分心按钮** - 不中断计时 -2. **温柔的文案系统** - 鼓励而非批评 -3. **完全离线** - 尊重隐私 -4. **神经多样性友好** - 为 ADHD 设计 - ---- - -## 🎊 里程碑达成 - -- ✅ Day 1: 项目初始化 + 基础架构 -- ✅ Day 1: 核心计时器 + 分心追踪 -- ✅ Day 1: 数据存储 + 完成页面 -- ✅ Day 1: 历史记录 + 设置页面 -- ✅ Day 1: **MVP 95% 完成!** - ---- - -## 🚀 准备发布 - -### 必须完成 -- [ ] 真机测试(Android + iOS) -- [ ] 修复关键 Bug -- [ ] 准备应用图标(1024×1024) -- [ ] 编写应用描述 - -### 建议完成 -- [ ] 添加本地通知 -- [ ] 下载 Nunito 字体 -- [ ] 准备宣传截图 -- [ ] 编写用户指南 - -### 可选完成 -- [ ] Onboarding 引导页 -- [ ] 深色模式 -- [ ] 更多成就徽章 -- [ ] 导出 PDF 报告 - ---- - -## 📚 相关文档 - -| 文档 | 用途 | -|------|------| -| [README.md](README.md) | 项目总览 | -| [QUICK_START.md](QUICK_START.md) | 快速启动指南 | -| [PROGRESS_UPDATE.md](PROGRESS_UPDATE.md) | 进度更新 | -| [mvp-launch-checklist.md](mvp-launch-checklist.md) | 上线清单 | -| [product-design.md](product-design.md) | 产品设计 | -| [ui-design-spec.md](ui-design-spec.md) | UI 规范 | -| [NOTIFICATION_IMPLEMENTATION.md](NOTIFICATION_IMPLEMENTATION.md) | 本地通知实现 ✨ | -| [GOOGLE_FONTS_SETUP.md](GOOGLE_FONTS_SETUP.md) | Google Fonts 配置 ✨ | -| [BUG_FIX_001.md](BUG_FIX_001.md) | Bug 修复记录 ✨ | -| [TESTING_START_HERE.md](TESTING_START_HERE.md) | 测试指南 | -| [TEST_REPORT.md](TEST_REPORT.md) | 完整测试报告 | -| [ICON_IMPLEMENTATION_GUIDE.md](ICON_IMPLEMENTATION_GUIDE.md) | App 图标实现指南 ✨ | -| [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) | App 图标设计规格 ✨ | -| [icon-preview.html](icon-preview.html) | App 图标可视化预览 ✨ | - ---- - -## 💪 团队能力证明 - -**单日开发成果**: -- 完整的 MVP 应用 -- 1,280+ 行生产级代码 -- 5 个功能完整的页面 -- 完善的数据管理系统 -- 精心设计的用户体验 - -**技术栈掌握**: -- ✅ Flutter 框架 -- ✅ Dart 语言 -- ✅ Hive 数据库 -- ✅ Material Design -- ✅ 状态管理 -- ✅ 异步编程 - ---- - -## 🎉 最终评价 - -### 产品质量: ⭐⭐⭐⭐⭐ (5/5) -- 核心功能完整 -- 用户体验优秀 -- 代码质量高 -- 设计优雅 - -### MVP 完成度: 99% -- 所有核心功能 ✅ -- 所有核心页面 ✅ -- 数据持久化 ✅ -- 本地通知系统 ✅ -- 字体优化 ✅ -- 仅差图标和截图 ⏳ - -### 上线准备度: 90% -- 功能完整 ✅ -- Web 测试通过 ✅ -- 需要真机测试 ⏳ -- 需要图标 ⏳ -- 需要截图 ⏳ - ---- - -## 🎊 恭喜! - -**FocusBuddy 从 0 到 99% 的 MVP,一天完成!** - -这是一个功能完整、设计优秀、代码质量高的应用。 - -已完成: -1. ✅ 所有核心功能实现 -2. ✅ 本地通知系统集成 -3. ✅ Google Fonts 字体优化 -4. ✅ Web 版测试通过 -5. ✅ Bug 修复完成 - -接下来只需要: -1. 🎨 设计应用图标 -2. 📸 准备应用商店截图 -3. 🧪 真机测试(Android/iOS) - -**你已经创造了一个真正有价值的产品!** 🚀 - ---- - -**当前状态**: ✅ Web 版已成功运行! -**下一步**: 按照 TESTING_START_HERE.md 进行功能测试 - ---- - -## 🧪 测试文档 - -已创建完整的测试文档: - -1. **[TESTING_START_HERE.md](TESTING_START_HERE.md)** - 快速测试指南(10分钟) - - 10个核心测试流程 - - 最关键测试:分心按钮不能暂停计时器! - - 常见问题解答 - - Hot Reload 命令 - -2. **[TEST_REPORT.md](TEST_REPORT.md)** - 完整测试报告(2-3小时) - - 20个详细测试用例 - - 每个功能的验收标准 - - Bug 追踪模板 - - 多平台测试计划 - ---- - -## 🎯 立即开始测试 - -### 最快速测试(5分钟) - -1. 打开 Edge 浏览器(应该已经自动打开) -2. 测试核心流程: - ``` - Home → Settings (改15分钟) → 返回 - Home → Start Focusing - 点击 "I got distracted" 3次 ⚠️ 确认计时器继续运行 - 点击 "Stop session" → 确认 - 查看 History → 验证数据已保存 - ``` - -3. 如果以上全部正常 → **MVP 测试通过!** ✅ - -### 测试命令(在终端中) - -```bash -r # 热重载(保持状态) -R # 完全重启(重置状态) -c # 清空控制台 -q # 退出应用 -``` - ---- - -## 📊 开发完成度更新 - -``` -███████████████████▓ 95% → 99% -``` - -### 新完成项(2025-11-22 最新) -- ✅ Web 版成功运行 -- ✅ 数据库初始化成功 -- ✅ 创建完整测试文档(30个测试用例) -- ✅ Hot Reload 已启用 -- ✅ **本地通知系统完整实现**(+200行代码) -- ✅ **Google Fonts (Nunito) 集成** -- ✅ **Complete Screen 导航 Bug 修复** -- ✅ **所有 const 关键字冲突已修复** - -### 待完成(1%) -- ⏳ 设计应用图标(1024×1024) -- ⏳ 准备应用商店截图 -- ⏳ 真机测试(Android/iOS) - ---- - -**祝贺你完成了 FocusBuddy 的核心开发!** 🎉 - -**现在可以开始测试了 →** 查看 [TESTING_START_HERE.md](TESTING_START_HERE.md) diff --git a/FONT_SETUP.md b/FONT_SETUP.md deleted file mode 100644 index 0e1e757..0000000 --- a/FONT_SETUP.md +++ /dev/null @@ -1,40 +0,0 @@ -# Nunito Font Download Instructions - -## Option 1: Download from Google Fonts (Recommended) - -1. Visit: https://fonts.google.com/specimen/Nunito -2. Click "Download family" -3. Extract the ZIP file -4. Copy these font files to `assets/fonts/`: - - Nunito-Light.ttf (weight 300) - - Nunito-Regular.ttf (weight 400) - - Nunito-SemiBold.ttf (weight 600) - - Nunito-Bold.ttf (weight 700) - - Nunito-ExtraBold.ttf (weight 800) - -## Option 2: Use Google Fonts Package (Alternative) - -If you don't want to download fonts manually, you can use the `google_fonts` package: - -1. Add to pubspec.yaml: -```yaml -dependencies: - google_fonts: ^6.1.0 -``` - -2. Update `lib/theme/app_text_styles.dart` to use GoogleFonts: -```dart -import 'package:google_fonts/google_fonts.dart'; - -static final appTitle = GoogleFonts.nunito( - fontSize: 24, - fontWeight: FontWeight.w700, - color: AppColors.textPrimary, -); -``` - -## Current Status - -⚠️ **Action Required**: Please download the Nunito font files and place them in `assets/fonts/` - -Until then, the app will use the system default font. diff --git a/GOOGLE_FONTS_SETUP.md b/GOOGLE_FONTS_SETUP.md deleted file mode 100644 index 6ba77ac..0000000 --- a/GOOGLE_FONTS_SETUP.md +++ /dev/null @@ -1,185 +0,0 @@ -# 🎨 Google Fonts (Nunito) - 实现总结 - -**日期**: 2025-11-22 -**状态**: ✅ 95% 完成(需要清理const关键字) - ---- - -## ✅ 已完成 - -### 1. 添加 Google Fonts 依赖 -```yaml -dependencies: - google_fonts: ^6.1.0 # Google Fonts (Nunito) -``` -✅ 已安装并可用 - -### 2. 更新主题文件 -- ✅ `app_text_styles.dart` - 所有样式使用 `GoogleFonts.nunito()` -- ✅ `app_theme.dart` - 默认字体族使用 Google Fonts - -### 3. 优点 -- 自动从 Google 服务器下载字体 -- 无需手动管理字体文件 -- 支持所有字重(Light, Regular, SemiBold, Bold, ExtraBold) -- 跨平台一致性 - ---- - -## ⚠️ 待修复 - -### 编译错误:const 关键字冲突 - -**问题**:Google Fonts 返回的 TextStyle 不是 const,但代码中使用了 `const Text(...style: AppTextStyles...)` - -**错误示例**: -```dart -const Text( - 'FocusBuddy', - style: AppTextStyles.appTitle, // ❌ appTitle 不是 const -) -``` - -**修复方法**:删除 const 关键字 -```dart -Text( - 'FocusBuddy', - style: AppTextStyles.appTitle, // ✅ 正确 -) -``` - -### 需要修复的文件和行数 - -根据编译器输出,以下位置仍需修复: - -#### home_screen.dart -- [ ] 第 49 行 - `const Text('FocusBuddy', style: AppTextStyles.appTitle)` -- [ ] 第 115 行 - `const Text("Tap 'I got distracted'...", style: AppTextStyles.helperText)` - -#### history_screen.dart -- [ ] 第 86 行 - `const Text('No focus sessions yet', style: AppTextStyles.headline)` -- [ ] 第 92 行 - `const Text('Start your first session...', style: AppTextStyles.helperText)` - -#### settings_screen.dart -- [ ] 第 63 行 - `const Padding(...child: Text(...style: AppTextStyles.bodyText))` -- [ ] 第 84 行 - `title: const Text('Privacy Policy', style: AppTextStyles.bodyText)` -- [ ] 第 100 行 - `title: const Text('About FocusBuddy', style: AppTextStyles.bodyText)` -- [ ] 第 251 行 - `content: const SingleChildScrollView(...style: AppTextStyles.bodyText)` -- [ ] 第 276 行 - `content: const SingleChildScrollView(...style: AppTextStyles.bodyText)` - -#### complete_screen.dart -- [ ] 第 46 行 - `const Text('You focused for', style: AppTextStyles.headline)` - ---- - -## 🛠️ 快速修复脚本 - -### 手动修复步骤 - -1. 打开每个文件 -2. 搜索 `const Text(` 或 `const Padding(` -3. 如果该 Widget 使用了 `AppTextStyles.*`,删除 `const` 关键字 -4. 保存文件 - -### 或使用正则表达式查找替换(VSCode) - -**查找**: -```regex -const (Text|Padding)\(([^)]*style: AppTextStyles\.) -``` - -**替换**: -``` -$1($2 -``` - ---- - -## 🎯 测试方法 - -修复完成后: - -```bash -# 1. 清理构建缓存 -flutter clean - -# 2. 重新获取依赖 -flutter pub get - -# 3. 运行应用 -flutter run -d edge - -# 4. 验证字体加载 -# 打开浏览器开发者工具(F12) -# 在 Network 标签查看是否有 Nunito 字体请求 -``` - ---- - -## 📊 字体配置详情 - -### 使用的字体变体 - -| 字重 | 用途 | 代码位置 | -|------|------|----------| -| Light (300) | Helper text | `helperText` | -| Regular (400) | Body text, quotes | `bodyText`, `encouragementQuote` | -| SemiBold (600) | Headlines, buttons | `headline`, `buttonText` | -| Bold (700) | App title, large numbers | `appTitle`, `largeNumber` | -| ExtraBold (800) | Timer display | `timerDisplay` | - -### Google Fonts CDN - -字体自动从以下来源加载: -``` -https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600;700;800 -``` - -首次加载后会缓存到本地,后续离线也可用。 - ---- - -## 🚀 完成清单 - -- [x] 添加 google_fonts 依赖 -- [x] 更新 app_text_styles.dart -- [x] 更新 app_theme.dart -- [ ] 删除所有const关键字(剩余10处) -- [ ] 测试字体渲染 -- [ ] 验证所有字重正确显示 - ---- - -## 💡 备用方案 - -如果 Google Fonts 在某些环境无法使用: - -### 方案 A: 手动下载字体 - -1. 从 Google Fonts 下载 Nunito -2. 放到 `assets/fonts/` 目录 -3. 在 pubspec.yaml 配置 -4. 回退到硬编码 `fontFamily: 'Nunito'` - -### 方案 B: 使用系统字体 - -1. 删除所有 `fontFamily` 设置 -2. 依赖系统默认字体 -3. 跨平台一致性降低,但功能正常 - ---- - -## 📝 当前状态 - -``` -Google Fonts 集成: ████████░░ 95% -``` - -**剩余工作**:删除 10 处 const 关键字(约5分钟) - -**预期完成时间**:今天 - ---- - -**文档版本**: 1.0 -**最后更新**: 2025-11-22 diff --git a/ICON_IMPLEMENTATION_GUIDE.md b/ICON_IMPLEMENTATION_GUIDE.md deleted file mode 100644 index 4e878ca..0000000 --- a/ICON_IMPLEMENTATION_GUIDE.md +++ /dev/null @@ -1,323 +0,0 @@ -# 🎨 App Icon Design - Implementation Guide - -**Date**: 2025-11-22 -**Status**: Ready for implementation - ---- - -## ✅ What's Been Prepared - -I've created a complete app icon design system for FocusBuddy with: - -1. **3 Design Options** - Visual previews in your browser -2. **Complete Documentation** - Technical specifications and guidelines -3. **Step-by-step Instructions** - Easy to follow guide - ---- - -## 📂 Files Created - -### 1. [icon-preview.html](icon-preview.html) -**Open this in your browser** to see: -- 3 different icon design options -- Size previews (180×180, 120×120, 48×48) -- App color palette -- Instructions for creating the icon - -### 2. [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) -Complete technical documentation including: -- Design specifications -- Color codes -- Size requirements (iOS & Android) -- Tool recommendations -- Installation instructions -- Design checklist - ---- - -## 🎨 Three Design Options - -### Design 1: Gentle Focus Buddy ⭐ Recommended -- Friendly face with gentle smile -- Concentric circles (focus rings) -- Most approachable and "buddy-like" -- **Best for**: Apps emphasizing support and encouragement - -### Design 2: Pure Focus -- Minimalist concentric circles -- No face, pure geometry -- Meditative and calming -- **Best for**: Apps emphasizing mindfulness and zen - -### Design 3: Focus Timer -- Classic timer/clock design -- Hands pointing to 25 minutes (Pomodoro) -- Clear function indicator -- **Best for**: Apps emphasizing productivity - ---- - -## 🚀 Quick Start (30 minutes total) - -### Step 1: Choose Design (2 minutes) -1. Open `icon-preview.html` in your browser -2. Look at all three designs -3. Pick your favorite - -### Step 2: Create Icon (15 minutes) - -**Option A: Use Figma (Recommended)** -``` -1. Go to figma.com (create free account) -2. Press 'F' to create frame -3. Size: 1024×1024 -4. Recreate your chosen design using: - - Circle tool (O key) - - Rectangle tool (R key) - - Colors from the preview -5. Export as PNG (1024×1024) -``` - -**Option B: Use Canva** -``` -1. Go to canva.com -2. Custom size: 1024×1024 -3. Use shapes to recreate design -4. Download as PNG -``` - -### Step 3: Generate All Sizes (5 minutes) -``` -1. Go to appicon.co -2. Upload your 1024×1024 PNG -3. Select iOS and Android -4. Download the generated zip -5. Unzip to get all icon sizes -``` - -### Step 4: Install in Project (8 minutes) - -**iOS:** -```bash -# Copy files to: -ios/Runner/Assets.xcassets/AppIcon.appiconset/ - -# Replace all existing icon files -``` - -**Android:** -```bash -# Copy files to these folders: -android/app/src/main/res/mipmap-mdpi/ic_launcher.png -android/app/src/main/res/mipmap-hdpi/ic_launcher.png -android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -``` - -### Step 5: Test -```bash -flutter clean -flutter run -d edge # See icon in browser tab -# Or test on Android/iOS device -``` - ---- - -## 🎨 App Colors (Copy-Paste Ready) - -Use these exact colors when creating the icon: - -``` -Primary Green: #A7C4BC -Success Green: #88C9A1 -Background: #F8F6F2 -Text Gray: #5B6D6D -``` - -**For gradients:** -``` -Top: #A7C4BC -Bottom: #88C9A1 -``` - ---- - -## 💡 Design Tips - -### Do's ✅ -- Keep it simple and recognizable -- Use the app's exact color codes -- Test at small size (48×48) -- Make it friendly and approachable -- Use rounded shapes (circles, soft corners) - -### Don'ts ❌ -- Don't use text (unreadable at small sizes) -- Don't use complex details -- Don't use thin lines (< 10px at 1024×1024) -- Don't use dark or aggressive colors -- Don't copy other apps - ---- - -## 🔧 Recommended Tools - -### For Design -1. **Figma** - https://www.figma.com - - Free, professional, easy to use - - Best for precise control - - ⭐ Recommended - -2. **Canva** - https://www.canva.com - - Free, very beginner-friendly - - Good for quick designs - - Has templates - -### For Size Generation -1. **AppIcon.co** - https://appicon.co - - Upload 1024×1024, get all sizes - - Free, works perfectly - - ⭐ Highly recommended - -2. **IconKitchen** - https://icon.kitchen - - Good for Android adaptive icons - - More complex, more control - ---- - -## 📋 Checklist - -### Design Phase -- [ ] Open icon-preview.html in browser -- [ ] Choose your favorite design (1, 2, or 3) -- [ ] Create 1024×1024 master icon in Figma/Canva -- [ ] Use exact color codes from above -- [ ] Test visibility at small size - -### Export Phase -- [ ] Export master as PNG (1024×1024) -- [ ] Upload to appicon.co -- [ ] Generate all iOS and Android sizes -- [ ] Download and unzip files - -### Installation Phase -- [ ] Copy files to iOS folder -- [ ] Copy files to Android folders -- [ ] Run `flutter clean` -- [ ] Test app launch - -### Verification Phase -- [ ] Icon shows in browser tab (web) -- [ ] Icon shows on device home screen -- [ ] Icon looks good at small size -- [ ] Icon matches app aesthetic - ---- - -## 📊 Technical Requirements - -### iOS Sizes Needed -``` -1024×1024 - App Store -180×180 - iPhone @3x -120×120 - iPhone @2x -167×167 - iPad Pro -152×152 - iPad @2x -76×76 - iPad @1x -``` - -### Android Sizes Needed -``` -192×192 - xxxhdpi (4x) -144×144 - xxhdpi (3x) -96×96 - xhdpi (2x) -72×72 - hdpi (1.5x) -48×48 - mdpi (1x) -512×512 - Play Store listing -``` - ---- - -## 🎯 My Recommendation - -**Use Design 1: "Gentle Focus Buddy"** - -**Why?** -1. ✅ Most aligned with app's "buddy" concept -2. ✅ Friendly and non-intimidating -3. ✅ Stands out among productivity apps -4. ✅ Instantly recognizable at small sizes -5. ✅ Appeals to ADHD and neurodiverse users - -**This design embodies your app's core value**: A supportive companion, not a strict taskmaster. - ---- - -## 🚨 Common Issues & Solutions - -### Issue: Icon looks blurry on iOS -**Solution**: Make sure you exported at exactly 1024×1024, not scaled - -### Issue: Android icon has white background -**Solution**: Use PNG with transparency, or fill background with gradient - -### Issue: Icon too complex at small size -**Solution**: Simplify - remove small details, use thicker lines - -### Issue: Colors don't match app -**Solution**: Double-check you're using exact hex codes (#A7C4BC, etc.) - ---- - -## 📱 Next Steps After Icon - -Once your icon is installed: - -1. **Test on devices** - See it on home screen -2. **Prepare screenshots** - App store needs 6 screenshots -3. **Write app description** - Using product-design.md -4. **Submit to stores** - Follow mvp-launch-checklist.md - ---- - -## 💬 Need Help? - -If you get stuck: - -1. **Check APP_ICON_DESIGN.md** - Full technical documentation -2. **Review icon-preview.html** - Visual reference -3. **Watch Figma tutorials** - YouTube: "How to design app icon in Figma" -4. **Use templates** - Canva has "app icon" templates - ---- - -## ⏱️ Time Estimate - -``` -Design creation: 15-20 minutes -Size generation: 5 minutes -Installation: 10 minutes -Testing: 5 minutes -Total: 35-40 minutes -``` - -**You can complete this in less than an hour!** - ---- - -## 🎉 Final Note - -The icon is the first thing users see. It should make them feel: -- 😌 Calm and welcomed -- 🤝 Supported, not judged -- 🎯 Clear about the app's purpose -- 💚 Positive and encouraged - -**Good luck with your design!** 🚀 - ---- - -**Status**: Ready to implement -**Next Step**: Open [icon-preview.html](icon-preview.html) and choose your design -**Documentation**: See [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) for details diff --git a/ICON_QUICK_REF.md b/ICON_QUICK_REF.md deleted file mode 100644 index 2534e71..0000000 --- a/ICON_QUICK_REF.md +++ /dev/null @@ -1,66 +0,0 @@ -# 🎨 App Icon - Quick Reference Card - -## 📸 Preview -**Open this file**: [icon-preview.html](icon-preview.html) - -## 🎯 Recommended Design -**Design 1: Gentle Focus Buddy** (with friendly face) - -## 🎨 Colors to Use -``` -#A7C4BC (Primary - calm green) -#88C9A1 (Success - bright green) -#F8F6F2 (Background - warm white) -#5B6D6D (Text - soft gray) -``` - -## ⚡ Quick Steps - -### 1. Design (15 min) -1. Go to **figma.com** -2. Create **1024×1024** frame -3. Copy Design 1 from preview -4. Export as **PNG** - -### 2. Generate (5 min) -1. Go to **appicon.co** -2. Upload your PNG -3. Select **iOS + Android** -4. Download zip - -### 3. Install (10 min) -```bash -# Unzip downloaded file - -# iOS: Copy to -ios/Runner/Assets.xcassets/AppIcon.appiconset/ - -# Android: Copy to -android/app/src/main/res/mipmap-*/ic_launcher.png -``` - -### 4. Test (2 min) -```bash -flutter clean -flutter run -``` - -## 📐 Master Size -**1024×1024 pixels** (PNG, no transparency for iOS) - -## 🔧 Tools -- **Design**: Figma (figma.com) or Canva (canva.com) -- **Generate**: AppIcon.co (appicon.co) - -## 📚 Full Docs -- **Preview**: [icon-preview.html](icon-preview.html) -- **Detailed Guide**: [ICON_IMPLEMENTATION_GUIDE.md](ICON_IMPLEMENTATION_GUIDE.md) -- **Technical Specs**: [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) - -## ⏱️ Total Time -**30-40 minutes** from start to finish - ---- - -**Status**: Ready to implement -**Next**: Open icon-preview.html and start designing! 🚀 diff --git a/NOTIFICATION_COMPLETE.md b/NOTIFICATION_COMPLETE.md deleted file mode 100644 index ce8843e..0000000 --- a/NOTIFICATION_COMPLETE.md +++ /dev/null @@ -1,208 +0,0 @@ -# ✅ 本地通知功能 - 实现完成 - -**完成时间**: 2025-11-22 -**状态**: ✅ 代码实现完成,等待真机测试 - ---- - -## 🎉 实现成果 - -### 新增功能 -- ✅ 计时完成时自动发送本地通知 -- ✅ 显示专注时长和鼓励信息 -- ✅ Android 权限配置完成 -- ✅ iOS 权限请求完成 -- ✅ Web 平台优雅降级(不报错) - -### 代码变更 -| 文件 | 状态 | 说明 | -|------|------|------| -| `lib/services/notification_service.dart` | 新增 | 200行,完整的通知服务 | -| `lib/main.dart` | 修改 | 添加通知服务初始化 | -| `lib/screens/focus_screen.dart` | 修改 | 计时完成时调用通知 | -| `android/app/src/main/AndroidManifest.xml` | 修改 | 添加Android权限 | -| `NOTIFICATION_IMPLEMENTATION.md` | 新增 | 完整实现文档 | - ---- - -## 🧪 测试状态 - -### Web 平台 -- ✅ **已测试**: 应用成功启动 -- ✅ **控制台输出**: "Notifications not supported on web platform" -- ✅ **无报错**: 优雅降级正常工作 -- ✅ **功能正常**: 计时、保存、导航都正常 - -### Android 平台 -- ⏳ **待测试**: 需要 Android 设备或模拟器 -- 📝 **测试要点**: - 1. 首次权限对话框(Android 13+) - 2. 前台通知 - 3. 后台通知 - 4. 通知内容准确性 - -### iOS 平台 -- ⏳ **待测试**: 需要 macOS + Xcode + iPhone -- 📝 **测试要点**: - 1. 启动时权限对话框 - 2. 通知样式和内容 - 3. 后台通知 - 4. 通知点击行为 - ---- - -## 🎯 通知内容示例 - -### 场景 1: 无分心完成 -``` -标题: 🎉 Focus session complete! -内容: You focused for 25 minutes without distractions! -``` - -### 场景 2: 有分心完成 -``` -标题: 🎉 Focus session complete! -内容: You focused for 15 minutes. Great effort! -``` - -**设计理念**: 永远鼓励,符合"无惩罚"产品价值观 💚 - ---- - -## 📱 平台支持 - -| 平台 | 支持状态 | 说明 | -|------|---------|------| -| ✅ Android | 完全支持 | 需要 Android 13+ 权限 | -| ✅ iOS | 完全支持 | 需要用户授权 | -| ⚠️ Web | 优雅降级 | 不报错,但无通知 | -| ❓ Windows | 未测试 | 理论支持,需测试 | -| ❓ macOS | 未测试 | 理论支持,需测试 | - ---- - -## 🚀 下一步行动 - -### 立即测试(推荐) -如果你有 Android 设备: -```bash -# 1. 连接手机并启用USB调试 -# 2. 检查设备连接 -flutter devices - -# 3. 运行到 Android 设备 -flutter run -d - -# 4. 测试流程 -# - 开始1分钟专注 -# - 等待完成 -# - 查看是否收到通知 -``` - -### 或者继续开发 -如果现在没有测试设备,可以继续其他任务: -1. **设计应用图标** (1小时) -2. **准备应用截图** (1小时) -3. **填写应用商店描述** (30分钟) - -稍后在真机测试时一并验证通知功能。 - ---- - -## 📊 MVP 完成度更新 - -``` -█████████████████████ 98% -``` - -### 已完成 -- ✅ 核心功能(5个页面) -- ✅ 数据持久化 -- ✅ 历史记录 -- ✅ 设置系统 -- ✅ 本地通知 **← NEW!** - -### 待完成(2%) -- ⏳ 应用图标设计 -- ⏳ 应用商店截图 -- ⏳ 真机测试 - ---- - -## 💡 技术亮点 - -### 1. 单例模式 -```dart -class NotificationService { - static final NotificationService _instance = NotificationService._internal(); - factory NotificationService() => _instance; - NotificationService._internal(); -} -``` -全局唯一实例,避免重复初始化。 - -### 2. 平台检测 -```dart -if (kIsWeb) { - print('Notifications not supported on web platform'); - return; -} -``` -编译时常量,零性能开销。 - -### 3. 优雅错误处理 -```dart -try { - await _notifications.show(...); -} catch (e) { - if (kDebugMode) { - print('Failed to show notification: $e'); - } - // 静默失败,不影响用户体验 -} -``` - -### 4. 异步安全导航 -```dart -void _onTimerComplete() async { - await notificationService.showFocusCompletedNotification(...); - if (!mounted) return; // 检查 Widget 是否还在 - Navigator.pushReplacement(...); -} -``` - ---- - -## 📖 相关文档 - -- [NOTIFICATION_IMPLEMENTATION.md](NOTIFICATION_IMPLEMENTATION.md) - 完整实现文档(200行) - - 架构设计 - - 代码实现 - - Android/iOS 配置 - - 测试指南(20+ 测试用例) - - 常见问题 FAQ - ---- - -## 🎊 总结 - -**通知功能已100%实现完成!** - -- ✅ 代码无错误 -- ✅ Web 平台验证通过 -- ✅ 文档完整详细 -- ⏳ 等待 Android/iOS 真机测试 - -**预计测试时间**: 15分钟(在 Android 设备上) - ---- - -**准备好继续下一个任务了吗?** 🚀 - -选择方向: -1. **设计应用图标** - 上架必需,1小时 -2. **真机测试通知** - 如果有 Android 设备 -3. **准备应用商店材料** - 截图+描述,2小时 -4. **其他改进** - 字体、UI优化等 - -告诉我你想做什么! diff --git a/QUICK_START.md b/QUICK_START.md deleted file mode 100644 index f44ebc6..0000000 --- a/QUICK_START.md +++ /dev/null @@ -1,157 +0,0 @@ -# 🚀 FocusBuddy - 快速启动指南 - -## 📱 立即运行 - -### Windows 桌面版(推荐用于开发测试) -```bash -cd f:\cursor-auto\focusBuddy -flutter run -d windows -``` - -### Web 版(最快) -```bash -cd f:\cursor-auto\focusBuddy -flutter run -d edge -``` - ---- - -## ✅ 已完成的核心功能 - -### 可以体验的完整流程: - -1. **启动 App** → 看到 FocusBuddy 首页 -2. **点击 "Start Focusing"** → 进入计时页面 -3. **观察倒计时** → 从 25:00 开始倒数 -4. **点击 "I got distracted"** → 弹出分心类型选择 -5. **选择分心原因** → 看到鼓励提示 "It happens. Let's gently come back." -6. **继续等待或点击 "Pause"** → 暂停/恢复计时 -7. **完成或提前停止** → 进入完成页面 -8. **查看今日统计** → 显示总时长和分心次数 -9. **点击 "Start Another"** → 返回首页,开始新一轮 - ---- - -## 🎯 测试重点 - -### 1. 核心价值验证 -- ✅ "I got distracted" 是否**不中断**计时? -- ✅ 鼓励文案是否足够**温柔**? -- ✅ 提前停止是否有**友好提示**? - -### 2. 数据持久化 -- ✅ 完成一次专注后,重启 app -- ✅ 再完成一次专注 -- ✅ 查看完成页的 "Total Today" 是否累加? - -### 3. UI/UX -- ✅ 按钮是否足够大? -- ✅ 文字是否清晰易读? -- ✅ 颜色是否柔和舒适? - ---- - -## 🐛 预期问题 - -### 1. 字体显示 -**现象**: 字体不是 Nunito,而是系统默认字体 -**原因**: 字体文件未下载 -**影响**: 不影响功能,仅视觉效果 -**解决**: 见 `FONT_SETUP.md` - -### 2. History/Settings 按钮 -**现象**: 点击显示 "coming soon" -**原因**: 这些页面还未实现 -**影响**: 不影响核心流程 -**解决**: 后续开发 - ---- - -## 📊 当前完成度 - -``` -核心功能: ████████████████░░ 70% -MVP 总体: ████████████░░░░░░ 60% -``` - -**可以上线吗?** 还不能,需要补充: -- History 页面(显示历史记录) -- Settings 页面(时长选择) -- 本地通知(计时完成提醒) -- 字体配置 -- 应用图标 - -**预计完成 MVP**: 本周末(2-3天) - ---- - -## 🎨 已实现的设计细节 - -### 配色(莫兰迪色系) -- 主色: `#A7C4BC` (Calm Green) -- 背景: `#F8F6F2` (Warm Off-White) -- 文字: `#5B6D6D` (Dark Gray) -- 分心按钮: `#E0E0E0` (Light Gray) - -### 交互 -- ✅ 大按钮(56px 高度) -- ✅ 圆角设计(16px) -- ✅ 底部弹窗(分心类型选择) -- ✅ Toast 提示(鼓励文案) -- ✅ 确认对话框(提前停止) - -### 文案 -- 15 条随机鼓励文案 -- "It happens. Let's gently come back." -- "That's totally fine — you still focused for X minutes!" - ---- - -## 💻 开发环境信息 - -``` -Flutter: 3.38.0 (stable) -Dart: 3.10.0 -Platform: Windows 10 -IDE: VS Code / Cursor -``` - -### 已安装的包: -- ✅ hive: ^2.2.3 -- ✅ hive_flutter: ^1.1.0 -- ✅ flutter_local_notifications: ^17.0.0 -- ✅ path_provider: ^2.1.0 -- ✅ shared_preferences: ^2.2.0 - ---- - -## 📝 下一步开发任务 - -### 今天可以完成: -- [ ] 体验完整流程,记录问题 -- [ ] 下载 Nunito 字体(或使用 google_fonts 包) -- [ ] 优化 UI 细节 - -### 明天任务: -- [ ] 实现 History Screen(简单列表) -- [ ] 实现 Settings Screen(3个时长选项) - -### 后天任务: -- [ ] 添加本地通知 -- [ ] 准备应用图标 -- [ ] 真机测试 - ---- - -## 🎉 恭喜! - -你已经完成了 **FocusBuddy 的核心功能**! - -现在运行 `flutter run -d windows` 看看效果吧! - ---- - -**有问题?查看**: -- 📖 [README.md](README.md) - 项目总览 -- 📋 [DEVELOPMENT_PROGRESS.md](DEVELOPMENT_PROGRESS.md) - 开发进度 -- 📝 [mvp-launch-checklist.md](mvp-launch-checklist.md) - MVP 清单 diff --git a/fix_const.sh b/fix_const.sh deleted file mode 100644 index d483e1d..0000000 --- a/fix_const.sh +++ /dev/null @@ -1,16 +0,0 @@ -# Font Optimization - Quick Fix Script - -# This script removes 'const' from Text widgets that use AppTextStyles -# because Google Fonts returns non-const TextStyle objects - -cd f:\cursor-auto\focusBuddy\lib\screens - -# Fix remaining files with sed-like pattern (pseudo code) -# const Text(...style: AppTextStyles...) -> Text(...style: AppTextStyles...) -# const Padding(...child: Text(...style: AppTextStyles...)) -> Padding(...child: Text(...style: AppTextStyles...)) - -echo "Manual fixes needed for:" -echo "- settings_screen.dart lines 63, 84, 100, 251, 276" -echo "- complete_screen.dart line 46" -echo "" -echo "Quick fix: Remove 'const' keyword before Text/Padding widgets that use AppTextStyles" diff --git a/pubspec.lock b/pubspec.lock index f288c6a..3a22b38 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "67.0.0" analyzer: @@ -14,7 +14,7 @@ packages: description: name: analyzer sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.4.1" args: @@ -22,7 +22,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" async: @@ -30,7 +30,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.13.0" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" build: @@ -46,7 +46,7 @@ packages: description: name: build sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" build_config: @@ -54,7 +54,7 @@ packages: description: name: build_config sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" build_daemon: @@ -62,7 +62,7 @@ packages: description: name: build_daemon sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.1" build_resolvers: @@ -70,7 +70,7 @@ packages: description: name: build_resolvers sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" build_runner: @@ -78,7 +78,7 @@ packages: description: name: build_runner sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.13" build_runner_core: @@ -86,7 +86,7 @@ packages: description: name: build_runner_core sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.3.2" built_collection: @@ -94,7 +94,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: @@ -102,7 +102,7 @@ packages: description: name: built_value sha256: "426cf75afdb23aa74bd4e471704de3f9393f3c7b04c1e2d9c6f1073ae0b8b139" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.12.1" characters: @@ -110,7 +110,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" checked_yaml: @@ -118,7 +118,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.4" clock: @@ -126,7 +126,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" code_builder: @@ -134,7 +134,7 @@ packages: description: name: code_builder sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.11.0" collection: @@ -142,7 +142,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.1" convert: @@ -150,7 +150,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" crypto: @@ -158,7 +158,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.7" cupertino_icons: @@ -166,7 +166,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" dart_style: @@ -174,7 +174,7 @@ packages: description: name: dart_style sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.6" dbus: @@ -182,7 +182,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.11" fake_async: @@ -190,7 +190,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.3" ffi: @@ -198,7 +198,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" file: @@ -206,7 +206,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" fixnum: @@ -214,7 +214,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" flutter: @@ -227,7 +227,7 @@ packages: description: name: flutter_lints sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.0" flutter_local_notifications: @@ -235,7 +235,7 @@ packages: description: name: flutter_local_notifications sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "17.2.4" flutter_local_notifications_linux: @@ -243,7 +243,7 @@ packages: description: name: flutter_local_notifications_linux sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.1" flutter_local_notifications_platform_interface: @@ -251,7 +251,7 @@ packages: description: name: flutter_local_notifications_platform_interface sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.2.0" flutter_test: @@ -269,7 +269,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" glob: @@ -277,7 +277,7 @@ packages: description: name: glob sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" google_fonts: @@ -285,7 +285,7 @@ packages: description: name: google_fonts sha256: "517b20870220c48752eafa0ba1a797a092fb22df0d89535fd9991e86ee2cdd9c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.2" graphs: @@ -293,7 +293,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" hive: @@ -301,7 +301,7 @@ packages: description: name: hive sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.3" hive_flutter: @@ -309,7 +309,7 @@ packages: description: name: hive_flutter sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" hive_generator: @@ -317,7 +317,7 @@ packages: description: name: hive_generator sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" http: @@ -325,7 +325,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.6.0" http_multi_server: @@ -333,7 +333,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" http_parser: @@ -341,7 +341,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" intl: @@ -349,7 +349,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.19.0" io: @@ -357,7 +357,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" js: @@ -365,7 +365,7 @@ packages: description: name: js sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.2" json_annotation: @@ -373,7 +373,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" leak_tracker: @@ -381,7 +381,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -389,7 +389,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.10" leak_tracker_testing: @@ -397,7 +397,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" lints: @@ -405,7 +405,7 @@ packages: description: name: lints sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.0" logging: @@ -413,7 +413,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" matcher: @@ -421,7 +421,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.17" material_color_utilities: @@ -429,7 +429,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -437,7 +437,7 @@ packages: description: name: meta sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.17.0" mime: @@ -445,7 +445,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" objective_c: @@ -453,7 +453,7 @@ packages: description: name: objective_c sha256: "1f81ed9e41909d44162d7ec8663b2c647c202317cc0b56d3d56f6a13146a0b64" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.1.0" package_config: @@ -461,7 +461,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" path: @@ -469,7 +469,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.1" path_provider: @@ -477,7 +477,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" path_provider_android: @@ -485,7 +485,7 @@ packages: description: name: path_provider_android sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.22" path_provider_foundation: @@ -493,7 +493,7 @@ packages: description: name: path_provider_foundation sha256: "6192e477f34018ef1ea790c56fffc7302e3bc3efede9e798b934c252c8c105ba" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.0" path_provider_linux: @@ -501,7 +501,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -509,7 +509,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -517,7 +517,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" petitparser: @@ -525,7 +525,7 @@ packages: description: name: petitparser sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" platform: @@ -533,7 +533,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -541,7 +541,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" pool: @@ -549,7 +549,7 @@ packages: description: name: pool sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.2" pub_semver: @@ -557,7 +557,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" pubspec_parse: @@ -565,7 +565,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" shared_preferences: @@ -573,7 +573,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.3" shared_preferences_android: @@ -581,7 +581,7 @@ packages: description: name: shared_preferences_android sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.17" shared_preferences_foundation: @@ -589,7 +589,7 @@ packages: description: name: shared_preferences_foundation sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.6" shared_preferences_linux: @@ -597,7 +597,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -605,7 +605,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_web: @@ -613,7 +613,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" shared_preferences_windows: @@ -621,7 +621,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shelf: @@ -629,7 +629,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.2" shelf_web_socket: @@ -637,7 +637,7 @@ packages: description: name: shelf_web_socket sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" sky_engine: @@ -650,7 +650,7 @@ packages: description: name: source_gen sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" source_helper: @@ -658,7 +658,7 @@ packages: description: name: source_helper sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.5" source_span: @@ -666,7 +666,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.1" stack_trace: @@ -674,7 +674,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.1" stream_channel: @@ -682,7 +682,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" stream_transform: @@ -690,7 +690,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" string_scanner: @@ -698,7 +698,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" term_glyph: @@ -706,7 +706,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" test_api: @@ -714,7 +714,7 @@ packages: description: name: test_api sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.7" timezone: @@ -722,7 +722,7 @@ packages: description: name: timezone sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.4" timing: @@ -730,7 +730,7 @@ packages: description: name: timing sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" typed_data: @@ -738,7 +738,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" vector_math: @@ -746,7 +746,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" vm_service: @@ -754,7 +754,7 @@ packages: description: name: vm_service sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "15.0.2" watcher: @@ -762,7 +762,7 @@ packages: description: name: watcher sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.4" web: @@ -770,7 +770,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" web_socket: @@ -778,7 +778,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" web_socket_channel: @@ -786,7 +786,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" xdg_directories: @@ -794,7 +794,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -802,7 +802,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" yaml: @@ -810,7 +810,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" sdks: diff --git a/terms-of-service.md b/terms-of-service.md deleted file mode 100644 index bb7105e..0000000 --- a/terms-of-service.md +++ /dev/null @@ -1,250 +0,0 @@ -# Terms of Service - FocusBuddy - -**Last Updated:** November 22, 2025 -**Effective Date:** November 22, 2025 -**Contact:** focusbuddy.support@gmail.com - ---- - -## 1. Acceptance of Terms - -By downloading, installing, or using FocusBuddy (the "App"), you agree to be bound by these Terms of Service ("Terms"). If you do not agree to these Terms, please do not use the App. - -These Terms apply to all users of the App, regardless of location. - ---- - -## 2. Description of Service - -FocusBuddy is a **focus timer application** designed to help users track their focus sessions in a gentle, non-judgmental way. - -**Key Features:** -- Focus session timer (default 25 minutes) -- Distraction tracking with optional categorization -- Daily statistics and simple achievements -- Encouragement messages -- 100% offline functionality - -**What FocusBuddy is NOT:** -- FocusBuddy is **not a medical device**. -- It is **not intended to diagnose, treat, cure, or prevent** any medical condition, including ADHD, ADD, or anxiety. -- It does **not provide medical advice** or replace consultation with a healthcare professional. - ---- - -## 3. User Eligibility - -FocusBuddy is intended for users **aged 13 and above**. - -- Users under 13: We do not knowingly collect data from children under 13. If you are under 13, please do not use this App. -- Users 13-17: Parental or guardian consent is recommended. - ---- - -## 4. Privacy & Data - -**Your data stays on your device.** - -- We do **not collect** any personal information (name, email, location, etc.). -- We do **not upload** your focus session data to any server. -- We do **not use** analytics or tracking tools (e.g., Google Analytics, Firebase Analytics). -- All data is stored **locally on your device only**. - -**Third-Party Services:** -- The App may display ads via **Google AdMob** (in future versions). AdMob may collect limited device information (e.g., device model, OS version, approximate IP address) to serve ads. See [Google's Privacy Policy](https://policies.google.com/privacy) for details. -- You can opt out of personalized ads via your device settings. - -For full details, see our [Privacy Policy](privacy-policy.md). - ---- - -## 5. User Conduct - -You agree to use FocusBuddy only for its intended purpose — tracking focus sessions. - -**Prohibited Uses:** -- Modifying, reverse-engineering, or decompiling the App -- Using the App for any illegal or unauthorized purpose -- Attempting to access or interfere with the App's code or infrastructure -- Removing or obscuring any copyright, trademark, or proprietary notices - ---- - -## 6. Intellectual Property - -**Ownership:** -- The App, including all code, design, text, graphics, and trademarks, is owned by [Your Name / Your Studio Name] (the "Developer"). -- These Terms grant you a limited, non-exclusive, non-transferable license to use the App for personal, non-commercial purposes. - -**Your Data:** -- You retain ownership of any data you create within the App (e.g., focus session logs). -- Since all data is stored locally, you are responsible for backing it up if desired. - ---- - -## 7. Disclaimer of Warranties - -**The App is provided "AS IS" and "AS AVAILABLE" without warranties of any kind.** - -We do not guarantee that: -- The App will be error-free, uninterrupted, or secure -- The App will meet your specific requirements -- Any bugs or defects will be corrected - -**No Medical Claims:** -- FocusBuddy is **not a substitute for professional medical advice, diagnosis, or treatment**. -- If you have concerns about ADHD, anxiety, or other conditions, consult a qualified healthcare provider. - ---- - -## 8. Limitation of Liability - -**To the fullest extent permitted by law:** - -The Developer shall not be liable for any: -- Indirect, incidental, consequential, or punitive damages -- Loss of data, profits, or business opportunities -- Damages arising from your use or inability to use the App - -**Maximum Liability:** -- In jurisdictions that do not allow the exclusion of certain liabilities, our liability is limited to the amount you paid for the App (i.e., $0 if you downloaded it for free). - ---- - -## 9. In-App Purchases & Subscriptions - -**(Applicable if/when added)** - -If the App offers in-app purchases (e.g., "Remove Ads" for $2.99): -- All purchases are final and non-refundable, except as required by law. -- Refund requests should be made through the platform where you purchased (Apple App Store or Google Play Store). -- Purchases are tied to your device and cannot be transferred. - ---- - -## 10. Ads & Third-Party Content - -**(Applicable if/when added)** - -If the App displays ads: -- We are not responsible for the content of third-party ads. -- Clicking on ads may redirect you to external websites or apps — we are not liable for their content or privacy practices. -- You can remove ads via an in-app purchase (when available). - ---- - -## 11. Changes to the App - -We reserve the right to: -- Modify, update, or discontinue any feature of the App at any time -- Add or remove functionality in future versions -- Discontinue the App entirely (with reasonable notice if feasible) - -**Updates:** -- App updates may be required for continued use. -- New features may be subject to additional terms. - ---- - -## 12. Changes to These Terms - -We may update these Terms from time to time. - -**How We Notify You:** -- The "Last Updated" date at the top will be revised. -- Major changes will be announced via an in-app notice (if technically feasible). -- Continued use of the App after changes means you accept the new Terms. - -**Your Options:** -- If you do not agree to the updated Terms, stop using the App and uninstall it. - ---- - -## 13. Termination - -**Your Rights:** -- You may stop using the App at any time by uninstalling it. - -**Our Rights:** -- We may terminate or restrict your access if you violate these Terms. -- We may discontinue the App at any time without liability. - -**Effect of Termination:** -- Upon termination, you must stop using the App and delete it from your device. -- Any provisions that should survive (e.g., disclaimers, limitations of liability) will remain in effect. - ---- - -## 14. Governing Law - -These Terms are governed by the laws of **[Your Country/State]**, without regard to conflict-of-law principles. - -**Dispute Resolution:** -- Any disputes will be resolved in the courts of **[Your Jurisdiction]**. -- If legally required, you may be entitled to resolve disputes through arbitration or small claims court. - -*(Note: Update this section with your actual location — e.g., "California, USA" or "England, UK")* - ---- - -## 15. Severability - -If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions will continue in full force and effect. - ---- - -## 16. Entire Agreement - -These Terms, together with our [Privacy Policy](privacy-policy.md), constitute the entire agreement between you and the Developer regarding the App. - ---- - -## 17. No Waiver - -Our failure to enforce any right or provision of these Terms does not constitute a waiver of that right or provision. - ---- - -## 18. Contact Us - -If you have questions about these Terms, please contact us: - -**Email:** focusbuddy.support@gmail.com -**Developer:** [Your Name / Studio Name] -**Website:** [your-website-url] *(optional)* - ---- - -## 19. Platform-Specific Terms - -**iOS (Apple App Store):** -- These Terms are between you and the Developer, not Apple. -- Apple has no obligation to provide support for the App. -- In case of failure to conform to any warranty, you may notify Apple for a refund (if applicable), and Apple's liability is limited to the purchase price. -- Apple is not responsible for addressing any claims related to the App. -- You represent that you are not located in a country subject to U.S. embargo or designated as a "terrorist supporting" country, and you are not on any U.S. prohibited party list. - -**Android (Google Play Store):** -- These Terms are between you and the Developer, not Google. -- Google has no obligation to provide support for the App. -- Google is not responsible for the App or its content. - ---- - -## Summary (Plain English) - -**What you're agreeing to:** -1. FocusBuddy is just a focus timer — not medical advice. -2. Your data stays on your device; we don't collect anything. -3. The app is provided "as is" — we're not liable if something breaks. -4. Don't misuse the app or try to hack it. -5. We can update the app or these terms anytime. -6. If you don't like it, just uninstall — no hard feelings! - -**Questions?** Email focusbuddy.support@gmail.com - ---- - -**Document Status:** ✅ Ready to publish -**Host this at:** [your-website-url]/terms or as a GitHub Pages link -**Required for:** App Store & Play Store submissions (must be publicly accessible)