del md
This commit is contained in:
@@ -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
|
||||
<svg viewBox="0 0 1024 1024">
|
||||
<!-- Background gradient -->
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#A7C4BC"/>
|
||||
<stop offset="100%" style="stop-color:#88C9A1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="1024" height="1024" fill="url(#bg)"/>
|
||||
|
||||
<!-- Outer circle (focus ring) -->
|
||||
<circle cx="512" cy="512" r="400"
|
||||
fill="none" stroke="#F8F6F2" stroke-width="60"/>
|
||||
|
||||
<!-- Inner circle -->
|
||||
<circle cx="512" cy="512" r="280" fill="#F8F6F2" opacity="0.95"/>
|
||||
|
||||
<!-- Center dot (the "focus point") -->
|
||||
<circle cx="512" cy="512" r="80" fill="#A7C4BC"/>
|
||||
|
||||
<!-- Optional: Friendly face -->
|
||||
<!-- Left eye -->
|
||||
<circle cx="452" cy="480" r="20" fill="#5B6D6D" opacity="0.7"/>
|
||||
<!-- Right eye -->
|
||||
<circle cx="572" cy="480" r="20" fill="#5B6D6D" opacity="0.7"/>
|
||||
<!-- Gentle smile (arc) -->
|
||||
<path d="M 452 540 Q 512 570 572 540"
|
||||
stroke="#5B6D6D" stroke-width="12"
|
||||
fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
</svg>
|
||||
```
|
||||
|
||||
### 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!
|
||||
511
FINAL_SUMMARY.md
511
FINAL_SUMMARY.md
@@ -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 <device-id>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 完整测试流程
|
||||
|
||||
### 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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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! 🚀
|
||||
@@ -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 <device-id>
|
||||
|
||||
# 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优化等
|
||||
|
||||
告诉我你想做什么!
|
||||
157
QUICK_START.md
157
QUICK_START.md
@@ -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 清单
|
||||
16
fix_const.sh
16
fix_const.sh
@@ -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"
|
||||
198
pubspec.lock
198
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:
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user