diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2bb2e64..c344a19 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -32,7 +32,18 @@ "Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\onboarding-preview.html\")", "Bash(flutter emulators:*)", "Bash(flutter gen-l10n:*)", - "Bash(/proc/$PPID/fd/0)" + "Bash(/proc/$PPID/fd/0)", + "Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\docs\\index.html\")", + "Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\docs\\terms-of-service.html\")", + "Bash(findstr:*)", + "Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\docs\\privacy-policy.html\")", + "Bash(flutter build:*)", + "Bash(.gradlew.bat:*)", + "Bash(flutter pub cache:*)", + "Bash(flutter clean:*)", + "Bash(start ms-settings:developers)", + "Bash(gradlew.bat --stop:*)", + "Bash(call gradlew.bat:*)" ], "deny": [], "ask": [] diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000..89ed2f9 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png new file mode 100644 index 0000000..758d99f Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/102.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000..c54a6ad Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png new file mode 100644 index 0000000..264c4f6 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/108.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000..13cb599 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000..664da54 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 0000000..48826f1 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000..be0beaa Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000..ce80e59 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000..bc934f5 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000..3634366 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png new file mode 100644 index 0000000..50313c4 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/172.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000..f16c29d Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png new file mode 100644 index 0000000..e594fb7 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/196.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000..f097ead Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png new file mode 100644 index 0000000..3e863b7 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/216.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png new file mode 100644 index 0000000..965f7e8 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/234.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000..93c055c Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png new file mode 100644 index 0000000..106d80a Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/258.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000..b52c342 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000..d1f3d97 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000..8201d0b Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png new file mode 100644 index 0000000..da8185b Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/48.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000..5ea7553 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000..7a48699 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png new file mode 100644 index 0000000..5d1cd05 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/55.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000..4f8bbc2 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000..9c7f33d Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000..e54be81 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 0000000..12b6583 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/64.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png new file mode 100644 index 0000000..0f97691 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/66.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000..8ef6380 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000..84c26b6 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000..6650c6d Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000..04f9e79 Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png new file mode 100644 index 0000000..b1e5a5a Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/88.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png b/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png new file mode 100644 index 0000000..3929a3a Binary files /dev/null and b/AppIcons/Assets.xcassets/AppIcon.appiconset/92.png differ diff --git a/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json b/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1319290 --- /dev/null +++ b/AppIcons/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"51x51","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"108.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"54x54","expected-size":"108","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"234.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"117x117","expected-size":"234","role":"quickLook"},{"idiom":"watch","filename":"258.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"129x129","expected-size":"258","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/AppIcons/android/mipmap-hdpi/focusBuddyIcon.png b/AppIcons/android/mipmap-hdpi/focusBuddyIcon.png new file mode 100644 index 0000000..8ef6380 Binary files /dev/null and b/AppIcons/android/mipmap-hdpi/focusBuddyIcon.png differ diff --git a/AppIcons/android/mipmap-hdpi/ic_launcher.png b/AppIcons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..8ef6380 Binary files /dev/null and b/AppIcons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/AppIcons/android/mipmap-mdpi/focusBuddyIcon.png b/AppIcons/android/mipmap-mdpi/focusBuddyIcon.png new file mode 100644 index 0000000..da8185b Binary files /dev/null and b/AppIcons/android/mipmap-mdpi/focusBuddyIcon.png differ diff --git a/AppIcons/android/mipmap-mdpi/ic_launcher.png b/AppIcons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..da8185b Binary files /dev/null and b/AppIcons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/AppIcons/android/mipmap-xhdpi/focusBuddyIcon.png b/AppIcons/android/mipmap-xhdpi/focusBuddyIcon.png new file mode 100644 index 0000000..5f51c04 Binary files /dev/null and b/AppIcons/android/mipmap-xhdpi/focusBuddyIcon.png differ diff --git a/AppIcons/android/mipmap-xhdpi/ic_launcher.png b/AppIcons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..5f51c04 Binary files /dev/null and b/AppIcons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/AppIcons/android/mipmap-xxhdpi/focusBuddyIcon.png b/AppIcons/android/mipmap-xxhdpi/focusBuddyIcon.png new file mode 100644 index 0000000..be0beaa Binary files /dev/null and b/AppIcons/android/mipmap-xxhdpi/focusBuddyIcon.png differ diff --git a/AppIcons/android/mipmap-xxhdpi/ic_launcher.png b/AppIcons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..be0beaa Binary files /dev/null and b/AppIcons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/AppIcons/android/mipmap-xxxhdpi/focusBuddyIcon.png b/AppIcons/android/mipmap-xxxhdpi/focusBuddyIcon.png new file mode 100644 index 0000000..feb9738 Binary files /dev/null and b/AppIcons/android/mipmap-xxxhdpi/focusBuddyIcon.png differ diff --git a/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png b/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..feb9738 Binary files /dev/null and b/AppIcons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/AppIcons/appstore.png b/AppIcons/appstore.png new file mode 100644 index 0000000..c54a6ad Binary files /dev/null and b/AppIcons/appstore.png differ diff --git a/AppIcons/playstore.png b/AppIcons/playstore.png new file mode 100644 index 0000000..7a48699 Binary files /dev/null and b/AppIcons/playstore.png differ diff --git a/FIGMA_ICON_TUTORIAL_CN.md b/FIGMA_ICON_TUTORIAL_CN.md new file mode 100644 index 0000000..1c5cc1f --- /dev/null +++ b/FIGMA_ICON_TUTORIAL_CN.md @@ -0,0 +1,373 @@ +# FocusBuddy 图标设计教程 - Figma 完整指南 + +> **设计目标**: 制作"温柔专注伙伴"图标 (Design 1: Gentle Focus Buddy) +> **工具**: Figma (免费版即可) +> **时间**: 约 30-45 分钟 +> **难度**: ⭐⭐☆☆☆ (适合初学者) + +--- + +## 📋 准备工作 + +### 1. 注册 Figma 账号 +1. 访问 [figma.com](https://www.figma.com) +2. 点击右上角 **"Sign up"** 注册免费账号 +3. 可以使用 Google 账号快速登录 + +### 2. 创建新文件 +1. 登录后点击左上角 **"+ New design file"** +2. 等待加载完成,进入空白画布 + +--- + +## 🎨 第一步: 创建画布和背景 + +### 1.1 创建 1024×1024 画布 + +1. **创建 Frame (画布框架)** + - 按键盘 `F` 键 (或点击顶部工具栏的方框图标) + - 在右侧面板找到 **"Frame"** 区域 + - 在 **"W"** (宽度) 输入 `1024` + - 在 **"H"** (高度) 输入 `1024` + - 在画布上点击创建 + +2. **重命名 Frame** + - 双击左侧图层面板的 "Frame 1" + - 重命名为 `FocusBuddy Icon` + +### 1.2 添加圆角矩形背景 + +1. **创建背景矩形** + - 按键盘 `R` 键选择矩形工具 + - 在 Frame 内点击并拖动,创建一个完全覆盖 Frame 的矩形 + - 在右侧面板确保尺寸是: + - **W**: `1024` + - **H**: `1024` + - **X**: `0` + - **Y**: `0` + +2. **添加圆角** + - 选中矩形 + - 在右侧找到 **"Corner radius"** (圆角半径) + - 输入 `180` + +3. **添加渐变色** + - 选中矩形 + - 在右侧 **"Fill"** 区域,点击颜色方块 + - 点击 **"Solid"** 下拉菜单,选择 **"Linear"** (线性渐变) + - 调整渐变: + - **顶部颜色** (第一个色标): `#A7C4BC` + - **底部颜色** (第二个色标): `#88C9A1` + - 确保渐变方向是从上到下 (拖动渐变线可调整) + +4. **重命名图层** + - 在左侧图层面板,双击矩形图层 + - 重命名为 `Background` + +--- + +## 🔵 第二步: 创建外圆环 + +### 2.1 绘制外圆环 + +1. **创建圆形** + - 按键盘 `O` 键 (或点击工具栏椭圆工具) + - 按住 `Shift` 键,在画布中心拖动创建正圆 + - 在右侧面板设置: + - **W**: `800` (半径 400 × 2) + - **H**: `800` + - 按 `Option/Alt + H` 水平居中 + - 按 `Option/Alt + V` 垂直居中 + +2. **设置为描边样式** + - 选中圆形 + - 点击右侧 **"Fill"** 右边的 `-` 号删除填充 + - 点击 **"Stroke"** 旁边的 `+` 号添加描边 + - 点击描边颜色,输入 `#F8F6F2` + - 设置描边粗细: + - 在 **"Stroke"** 下方输入 `60` + - 设置透明度: + - 在右侧顶部找到 **"Layer"** 区域 + - **"Opacity"** (不透明度) 调整为 `90%` + +3. **重命名图层** + - 重命名为 `Outer Ring` + +--- + +## ⚪ 第三步: 创建内圆 + +### 3.1 绘制内圆 + +1. **创建圆形** + - 按键盘 `O` 键 + - 按住 `Shift` 创建正圆 + - 设置尺寸: + - **W**: `560` (半径 280 × 2) + - **H**: `560` + - 居中对齐: `Option/Alt + H` 和 `Option/Alt + V` + +2. **设置填充色** + - 选中圆形 + - **"Fill"**: `#F8F6F2` + - **"Opacity"**: `95%` + +3. **重命名图层** + - 重命名为 `Inner Circle` + +--- + +## 😊 第四步: 绘制友好的笑脸 + +### 4.1 绘制左眼 + +1. **创建圆形** + - 按 `O` 键创建圆形 + - 设置尺寸: + - **W**: `48` (半径 24 × 2) + - **H**: `48` + - 设置位置 (相对于整个 Frame): + - **X**: `428` (中心点 452 - 半径 24) + - **Y**: `456` (中心点 480 - 半径 24) + +2. **设置颜色** + - **"Fill"**: `#5B6D6D` + - **"Opacity"**: `70%` + +3. **重命名**: `Left Eye` + +### 4.2 绘制右眼 + +1. **复制左眼** + - 选中左眼 + - 按 `Cmd/Ctrl + D` 复制 + - 设置新位置: + - **X**: `548` (中心点 572 - 半径 24) + - **Y**: 保持 `456` + +2. **重命名**: `Right Eye` + +### 4.3 绘制微笑曲线 + +1. **使用钢笔工具** + - 按键盘 `P` 键 (钢笔工具) + - 在画布上点击三个点创建曲线: + - **起点**: X: `432`, Y: `560` + - **中间控制点**: X: `512`, Y: `600` + - **终点**: X: `592`, Y: `560` + +2. **调整为平滑曲线** + - 选中钢笔工具创建的路径 + - 按键盘 `Enter` 键进入编辑模式 + - 选中中间的点,在顶部工具栏点击 **"Bend tool"** (弯曲工具) + - 向下拖动中间点,创建向下的弧形 + + **提示**: 如果钢笔工具太复杂,可以使用简化方法: + - 创建椭圆 (W: `160`, H: `80`) + - 位置: X: `432`, Y: `560` + - 选中椭圆,按 `Enter` 进入编辑模式 + - 选中顶部两个点并删除 (保留底部半圆) + - 旋转 180° 形成微笑 + +3. **设置描边样式** + - 删除填充 (点击 Fill 的 `-`) + - 添加描边 (点击 Stroke 的 `+`) + - **"Stroke"** 颜色: `#5B6D6D` + - **"Stroke"** 粗细: `16` + - **"Opacity"**: `70%` + - 在描边选项中,选择 **"Round cap"** (圆形端点) + +4. **重命名**: `Smile` + +--- + +## 🎯 第五步: 添加中心点 (可选装饰) + +### 5.1 绘制中心圆点 + +1. **创建小圆** + - 按 `O` 键 + - 创建圆形: + - **W**: `80` (半径 40 × 2) + - **H**: `80` + - 居中对齐 + +2. **设置颜色** + - **"Fill"**: `#A7C4BC` + - **"Opacity"**: `30%` + +3. **重命名**: `Center Dot` + +--- + +## 📐 第六步: 整理图层结构 + +### 6.1 调整图层顺序 + +在左侧图层面板,从上到下的顺序应该是: +``` +FocusBuddy Icon (Frame) + ├── Center Dot + ├── Smile + ├── Right Eye + ├── Left Eye + ├── Inner Circle + ├── Outer Ring + └── Background +``` + +如果顺序不对,拖动图层调整位置。 + +### 6.2 创建图层分组 (可选) + +1. **选中所有脸部元素** + - 按住 `Shift` 点击: Left Eye, Right Eye, Smile + - 右键点击,选择 **"Group selection"** + - 重命名为 `Face` + +--- + +## 💾 第七步: 导出图标 + +### 7.1 导出 1024×1024 PNG + +1. **选中整个 Frame** + - 点击左侧图层面板的 `FocusBuddy Icon` + +2. **设置导出选项** + - 在右侧底部找到 **"Export"** 区域 + - 点击 `+` 号添加导出设置 + - 格式选择 **"PNG"** + - 倍数选择 **"1x"** + - 点击 **"Export FocusBuddy Icon"** 按钮 + - 选择保存位置,保存为 `focusbuddy-icon-1024.png` + +### 7.2 生成所有尺寸 + +1. **访问 AppIcon.co** + - 打开浏览器访问 [https://www.appicon.co](https://www.appicon.co) + +2. **上传图标** + - 点击 **"Choose File"** 或拖动刚才导出的 PNG 文件 + - 等待处理完成 + +3. **下载图标包** + - 点击 **"Download"** 按钮 + - 会下载包含 iOS 和 Android 所有尺寸的图标包 + +--- + +## 🎨 调整和优化技巧 + +### 微调笑脸表情 + +如果觉得笑容太大或太小: +- 选中 `Smile` 图层 +- 调整起点和终点的 Y 坐标 (往上=笑容变小,往下=笑容变大) +- 或调整中间控制点的 Y 坐标 (往上=笑容变小,往下=笑容变大) + +### 调整眼睛位置 + +如果觉得眼睛间距太宽或太窄: +- 选中两只眼睛 +- 使用键盘方向键微调位置 +- 或直接修改 X 坐标值 + +### 改变颜色主题 + +如果想尝试其他配色: +1. 选中 `Background` +2. 修改渐变颜色 +3. 保持柔和的莫兰迪色系风格 + +--- + +## ✅ 检查清单 + +完成后,检查以下项目: + +- [ ] Frame 尺寸是 1024×1024 +- [ ] 背景圆角半径是 180 +- [ ] 背景渐变从 #A7C4BC 到 #88C9A1 +- [ ] 外圆环描边粗细 60,颜色 #F8F6F2,透明度 90% +- [ ] 内圆填充 #F8F6F2,透明度 95% +- [ ] 两只眼睛大小相同,对称分布 +- [ ] 微笑曲线居中,端点圆润 +- [ ] 导出的 PNG 文件清晰无锯齿 + +--- + +## 🚀 下一步 + +1. **应用到 Flutter 项目** + - 解压 AppIcon.co 下载的文件 + - iOS: 将 `AppIcon.appiconset` 文件夹放到 `ios/Runner/Assets.xcassets/` + - Android: 将对应尺寸的图标放到 `android/app/src/main/res/` 各个 `mipmap-*` 文件夹 + +2. **测试效果** + - 在真机或模拟器上运行应用 + - 检查桌面图标显示效果 + +--- + +## 🆘 常见问题 + +### Q: 钢笔工具太难用怎么办? +**A**: 使用椭圆工具替代: +1. 创建椭圆 W: 160, H: 80 +2. 按 Enter 进入编辑模式 +3. 删除顶部两个锚点 +4. 保留底部弧线即可 + +### Q: 图层无法居中? +**A**: 确保选中了 Frame 内的图层,然后: +- Mac: `Option + H` (水平居中), `Option + V` (垂直居中) +- Windows: `Alt + H`, `Alt + V` +- 或使用右侧 **"Alignment"** 对齐工具 + +### Q: 导出的图标边缘有白边? +**A**: 确保 Background 图层完全覆盖了 Frame,且没有透明间隙。 + +### Q: 颜色看起来不够柔和? +**A**: 检查所有元素的不透明度 (Opacity) 设置,适当降低可以让设计更柔和。 + +--- + +## 📚 扩展学习 + +### Figma 快捷键 + +| 功能 | Mac | Windows | +|------|-----|---------| +| 矩形 | R | R | +| 圆形 | O | O | +| 钢笔 | P | P | +| Frame | F | F | +| 复制 | Cmd + D | Ctrl + D | +| 水平居中 | Option + H | Alt + H | +| 垂直居中 | Option + V | Alt + V | +| 缩放视图 | Cmd + 滚轮 | Ctrl + 滚轮 | + +### 推荐资源 + +- [Figma 官方教程](https://help.figma.com/hc/en-us/categories/360002051613-Get-started) (中文) +- [Figma 中文社区](https://www.figma.cool/) +- [YouTube: Figma 入门教程](https://www.youtube.com/results?search_query=figma+tutorial+chinese) + +--- + +## 🎉 完成! + +恭喜您完成了 FocusBuddy 图标的设计!这个图标传达了: +- ✨ **温柔友好** - 柔和的颜色和圆润的形状 +- 😊 **情感支持** - 友好的笑脸象征陪伴 +- 🎯 **专注** - 同心圆代表专注的中心 +- 🌿 **无压力** - 莫兰迪色系带来平静感 + +如果有任何问题,欢迎随时提问! + +--- + +**文档版本**: 1.0 +**最后更新**: 2025年11月24日 +**作者**: FocusBuddy 开发团队 diff --git a/GITHUB_PAGES_SETUP.md b/GITHUB_PAGES_SETUP.md new file mode 100644 index 0000000..57a5cb1 --- /dev/null +++ b/GITHUB_PAGES_SETUP.md @@ -0,0 +1,109 @@ +# GitHub Pages 部署指南 + +## 📝 已创建的文件 + +在 `docs/` 文件夹中已经创建了以下文件: + +- ✅ `index.html` - 首页 +- ✅ `privacy-policy.html` - 隐私政策 +- ✅ `terms-of-service.html` - 服务条款 +- ✅ `README.md` - 文档说明 + +## 🚀 部署步骤 + +### 1. 更新个人信息(重要!) + +在发布前,你需要检查以下信息是否已更新: + +**在所有 HTML 文件中**: +- ✅ 邮箱已更新为 `focusbuddy.app@outlook.com` + +**在 `terms-of-service.html` 中**: +- ✅ 国家/地区已更新为 `the People's Republic of China` +- ✅ 法律管辖区已更新为 `the People's Republic of China` + +所有占位符都已替换完成! + +### 2. 推送到 GitHub + +```bash +# 添加所有文件 +git add docs/ + +# 提交 +git commit -m "Add GitHub Pages documentation" + +# 推送到 GitHub +git push origin main +``` + +### 3. 在 GitHub 上启用 GitHub Pages + +1. 打开你的 GitHub 仓库页面 +2. 点击 **Settings**(设置) +3. 在左侧菜单找到 **Pages** +4. 在 "Source" 下: + - Branch: 选择 `main` + - Folder: 选择 `/docs` +5. 点击 **Save** +6. 等待 1-2 分钟,页面会显示部署状态 + +### 4. 获取 URL + +部署成功后,你会看到类似这样的 URL: + +``` +https://yourusername.github.io/focusbuddy/ +``` + +你的文档链接将是: +- 隐私政策: `https://yourusername.github.io/focusbuddy/privacy-policy.html` +- 服务条款: `https://yourusername.github.io/focusbuddy/terms-of-service.html` + +## 📱 在应用商店使用这些 URL + +当你提交应用到 Google Play 或 App Store 时: + +### Google Play Console: +1. 进入 "Store presence" → "App content" +2. 找到 "Privacy policy" +3. 粘贴你的隐私政策 URL + +### App Store Connect: +1. 在 "App Information" 部分 +2. 找到 "Privacy Policy URL" +3. 粘贴你的隐私政策 URL + +## ✅ 测试 + +部署后,在浏览器中打开以下 URL 测试: +- `https://yourusername.github.io/focusbuddy/` +- `https://yourusername.github.io/focusbuddy/privacy-policy.html` +- `https://yourusername.github.io/focusbuddy/terms-of-service.html` + +确保所有页面都能正常访问,且内容显示正确。 + +## 🔄 更新文档 + +如果你需要更新隐私政策或服务条款: + +1. 编辑 `docs/` 中的相应 HTML 文件 +2. 更新 "Last Updated" 日期 +3. 提交并推送到 GitHub +4. 等待几分钟,更改会自动生效 + +## 💡 提示 + +- GitHub Pages 是完全免费的 +- 支持 HTTPS(自动启用) +- 无需域名(使用 github.io 子域名) +- 可以绑定自定义域名(可选) + +## ❓ 问题排查 + +如果页面无法访问: +1. 确认 GitHub Pages 已在设置中启用 +2. 检查文件是否在 `docs/` 文件夹中 +3. 确认分支是 `main` +4. 等待 5-10 分钟(首次部署可能需要更长时间) +5. 清除浏览器缓存后重试 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c16be3c..a1d9692 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/android/gradle.properties b/android/gradle.properties index 21dbfa5..67d6eb8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,6 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true + +# Use Aliyun mirrors for faster downloads in China +systemProp.org.gradle.internal.http.connectionTimeout=180000 +systemProp.org.gradle.internal.http.socketTimeout=180000 diff --git a/android/init.gradle.kts b/android/init.gradle.kts new file mode 100644 index 0000000..9b40756 --- /dev/null +++ b/android/init.gradle.kts @@ -0,0 +1,20 @@ +// Global Gradle init script to use Aliyun mirrors for faster downloads in China +allprojects { + buildscript { + repositories { + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/public") } + maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } + google() + mavenCentral() + gradlePluginPortal() + } + } + + repositories { + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/public") } + google() + mavenCentral() + } +} diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 4dcef4b..51d7c0d 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -11,6 +11,11 @@ pluginManagement { includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") repositories { + // Use Aliyun mirrors for faster downloads in China + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/public") } + maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } + // Fallback to original repos google() mavenCentral() gradlePluginPortal() diff --git a/docs b/docs new file mode 160000 index 0000000..d6ea4ef --- /dev/null +++ b/docs @@ -0,0 +1 @@ +Subproject commit d6ea4ef6628d59ab74a6adbcef6a81508238bae8 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000..89ed2f9 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png new file mode 100644 index 0000000..758d99f Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000..c54a6ad Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png new file mode 100644 index 0000000..264c4f6 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000..13cb599 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000..664da54 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 0000000..48826f1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000..be0beaa Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000..ce80e59 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000..bc934f5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000..3634366 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png new file mode 100644 index 0000000..50313c4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000..f16c29d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png new file mode 100644 index 0000000..e594fb7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000..f097ead Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png new file mode 100644 index 0000000..3e863b7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png new file mode 100644 index 0000000..965f7e8 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000..93c055c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png new file mode 100644 index 0000000..106d80a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000..b52c342 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000..d1f3d97 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000..8201d0b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png new file mode 100644 index 0000000..da8185b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000..5ea7553 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000..7a48699 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png new file mode 100644 index 0000000..5d1cd05 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000..4f8bbc2 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000..9c7f33d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000..e54be81 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 0000000..12b6583 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png new file mode 100644 index 0000000..0f97691 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000..8ef6380 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000..84c26b6 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000..6650c6d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000..04f9e79 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png new file mode 100644 index 0000000..b1e5a5a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png new file mode 100644 index 0000000..3929a3a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index 1950fd8..1319290 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"51x51","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"108.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"54x54","expected-size":"108","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"234.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"117x117","expected-size":"234","role":"quickLook"},{"idiom":"watch","filename":"258.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"129x129","expected-size":"258","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index febded7..af58def 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -58,12 +58,17 @@ "about": "حول", "privacyPolicy": "سياسة الخصوصية", + "termsOfService": "شروط الخدمة", "aboutFocusBuddy": "حول FocusBuddy", "resetOnboarding": "إعادة تعيين التعريف", "version": "الإصدار 1.0.0 (MVP)", "privacyPolicyTitle": "سياسة الخصوصية", - "privacyPolicyContent": "يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\n[عنوان URL لموقعك]/privacy", + "privacyPolicyContent": "يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "شروط الخدمة", + "termsOfServiceContent": "يتم توفير FocusBuddy \"كما هو\" بدون ضمانات. باستخدام هذا التطبيق، فإنك توافق على استخدامه على مسؤوليتك الخاصة.\n\nهذا التطبيق مصمم كأداة مؤقت تركيز ولا يضمن نتائج محددة. يتم تخزين جميع البيانات محليًا على جهازك.\n\nللحصول على شروط الخدمة الكاملة، قم بزيارة:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "إغلاق", "aboutTitle": "حول FocusBuddy", diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 71e16f5..f4b488d 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -58,12 +58,17 @@ "about": "Über", "privacyPolicy": "Datenschutzrichtlinie", + "termsOfService": "Nutzungsbedingungen", "aboutFocusBuddy": "Über FocusBuddy", "resetOnboarding": "Einführung zurücksetzen", "version": "Version 1.0.0 (MVP)", "privacyPolicyTitle": "Datenschutzrichtlinie", - "privacyPolicyContent": "FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\n[Deine Website-URL]/privacy", + "privacyPolicyContent": "FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Nutzungsbedingungen", + "termsOfServiceContent": "FocusBuddy wird \"wie besehen\" ohne Garantien bereitgestellt. Durch die Nutzung dieser App erklärst du dich damit einverstanden, sie auf eigenes Risiko zu verwenden.\n\nDiese App ist als Fokus-Timer-Tool konzipiert und garantiert keine spezifischen Ergebnisse. Alle Daten werden lokal auf deinem Gerät gespeichert.\n\nFür die vollständigen Nutzungsbedingungen besuche:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Schließen", "aboutTitle": "Über FocusBuddy", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ae90080..4daae7b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -145,12 +145,17 @@ "about": "About", "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", "aboutFocusBuddy": "About FocusBuddy", "resetOnboarding": "Reset Onboarding", "version": "Version 1.0.0 (MVP)", "privacyPolicyTitle": "Privacy Policy", - "privacyPolicyContent": "FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\n[Your website URL]/privacy", + "privacyPolicyContent": "FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Terms of Service", + "termsOfServiceContent": "FocusBuddy is provided \"as is\" without warranties. By using this app, you agree to use it at your own risk.\n\nThis app is designed as a focus timer tool and does not guarantee specific results. All data is stored locally on your device.\n\nFor the full terms of service, visit:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Close", "aboutTitle": "About FocusBuddy", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 3a542a8..4132d0b 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -58,12 +58,17 @@ "about": "Acerca de", "privacyPolicy": "Política de privacidad", + "termsOfService": "Términos de servicio", "aboutFocusBuddy": "Acerca de FocusBuddy", "resetOnboarding": "Restablecer introducción", "version": "Versión 1.0.0 (MVP)", "privacyPolicyTitle": "Política de privacidad", - "privacyPolicyContent": "FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\n[URL de tu sitio web]/privacy", + "privacyPolicyContent": "FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Términos de servicio", + "termsOfServiceContent": "FocusBuddy se proporciona \"tal cual\" sin garantías. Al usar esta aplicación, aceptas usarla bajo tu propio riesgo.\n\nEsta aplicación está diseñada como una herramienta de temporizador de concentración y no garantiza resultados específicos. Todos los datos se almacenan localmente en tu dispositivo.\n\nPara los términos de servicio completos, visita:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Cerrar", "aboutTitle": "Acerca de FocusBuddy", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index c439c5a..8890f47 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -58,12 +58,17 @@ "about": "À propos", "privacyPolicy": "Politique de confidentialité", + "termsOfService": "Conditions d'utilisation", "aboutFocusBuddy": "À propos de FocusBuddy", "resetOnboarding": "Réinitialiser l'introduction", "version": "Version 1.0.0 (MVP)", "privacyPolicyTitle": "Politique de confidentialité", - "privacyPolicyContent": "FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\n[URL de votre site web]/privacy", + "privacyPolicyContent": "FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Conditions d'utilisation", + "termsOfServiceContent": "FocusBuddy est fourni \"tel quel\" sans garanties. En utilisant cette application, vous acceptez de l'utiliser à vos propres risques.\n\nCette application est conçue comme un outil de minuteur de concentration et ne garantit pas de résultats spécifiques. Toutes les données sont stockées localement sur votre appareil.\n\nPour les conditions d'utilisation complètes, visitez:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Fermer", "aboutTitle": "À propos de FocusBuddy", diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index e6d1da8..fb996dc 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -58,12 +58,17 @@ "about": "के बारे में", "privacyPolicy": "गोपनीयता नीति", + "termsOfService": "सेवा की शर्तें", "aboutFocusBuddy": "FocusBuddy के बारे में", "resetOnboarding": "ऑनबोर्डिंग रीसेट करें", "version": "संस्करण 1.0.0 (MVP)", "privacyPolicyTitle": "गोपनीयता नीति", - "privacyPolicyContent": "FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\n[आपकी वेबसाइट URL]/privacy", + "privacyPolicyContent": "FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "सेवा की शर्तें", + "termsOfServiceContent": "FocusBuddy \"जैसा है\" बिना वारंटी के प्रदान किया जाता है। इस ऐप का उपयोग करके, आप इसे अपने जोखिम पर उपयोग करने के लिए सहमत हैं।\n\nयह ऐप एक फोकस टाइमर टूल के रूप में डिज़ाइन किया गया है और विशिष्ट परिणामों की गारंटी नहीं देता। सभी डेटा आपके डिवाइस पर स्थानीय रूप से संग्रहीत है।\n\nपूर्ण सेवा की शर्तों के लिए, यहाँ जाएं:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "बंद करें", "aboutTitle": "FocusBuddy के बारे में", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 6c57fc4..bf34c79 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -58,12 +58,17 @@ "about": "Tentang", "privacyPolicy": "Kebijakan Privasi", + "termsOfService": "Ketentuan Layanan", "aboutFocusBuddy": "Tentang FocusBuddy", "resetOnboarding": "Reset Onboarding", "version": "Versi 1.0.0 (MVP)", "privacyPolicyTitle": "Kebijakan Privasi", - "privacyPolicyContent": "FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\n[URL situs web Anda]/privacy", + "privacyPolicyContent": "FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Ketentuan Layanan", + "termsOfServiceContent": "FocusBuddy disediakan \"apa adanya\" tanpa jaminan. Dengan menggunakan aplikasi ini, Anda setuju untuk menggunakannya dengan risiko Anda sendiri.\n\nAplikasi ini dirancang sebagai alat timer fokus dan tidak menjamin hasil tertentu. Semua data disimpan secara lokal di perangkat Anda.\n\nUntuk ketentuan layanan lengkap, kunjungi:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Tutup", "aboutTitle": "Tentang FocusBuddy", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index e4ffb31..6bcb5c9 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -58,12 +58,17 @@ "about": "Informazioni", "privacyPolicy": "Informativa sulla privacy", + "termsOfService": "Termini di servizio", "aboutFocusBuddy": "Informazioni su FocusBuddy", "resetOnboarding": "Ripristina introduzione", "version": "Versione 1.0.0 (MVP)", "privacyPolicyTitle": "Informativa sulla privacy", - "privacyPolicyContent": "FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l'informativa completa sulla privacy, visita:\n[URL del tuo sito web]/privacy", + "privacyPolicyContent": "FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l'informativa completa sulla privacy, visita:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Termini di servizio", + "termsOfServiceContent": "FocusBuddy è fornito \"così com'è\" senza garanzie. Utilizzando questa app, accetti di usarla a tuo rischio.\n\nQuesta app è progettata come uno strumento timer di concentrazione e non garantisce risultati specifici. Tutti i dati sono archiviati localmente sul tuo dispositivo.\n\nPer i termini di servizio completi, visita:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Chiudi", "aboutTitle": "Informazioni su FocusBuddy", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 8da7c35..d1b309e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -58,12 +58,17 @@ "about": "について", "privacyPolicy": "プライバシーポリシー", + "termsOfService": "利用規約", "aboutFocusBuddy": "フォーカスバディについて", "resetOnboarding": "オンボーディングをリセット", "version": "バージョン 1.0.0 (MVP)", "privacyPolicyTitle": "プライバシーポリシー", - "privacyPolicyContent": "フォーカスバディは100%オフラインで動作します。氏名、メールアドレス、位置情報、使用データは一切収集しません。すべてのセッションデータはデバイスに保存されます。\n\nクラウド同期、アカウントシステム、分析トラッキングはありません。\n\n完全なプライバシーポリシーについては:\n[あなたのウェブサイトURL]/privacy", + "privacyPolicyContent": "フォーカスバディは100%オフラインで動作します。氏名、メールアドレス、位置情報、使用データは一切収集しません。すべてのセッションデータはデバイスに保存されます。\n\nクラウド同期、アカウントシステム、分析トラッキングはありません。\n\n完全なプライバシーポリシーについては:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "利用規約", + "termsOfServiceContent": "フォーカスバディは「現状のまま」で提供され、保証はありません。このアプリを使用することにより、自己責任で使用することに同意したものとみなされます。\n\nこのアプリは集中タイマーツールとして設計されており、特定の結果を保証するものではありません。すべてのデータはデバイスにローカルに保存されます。\n\n完全な利用規約については:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "閉じる", "aboutTitle": "フォーカスバディについて", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 384f56d..7c13a61 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -58,12 +58,17 @@ "about": "정보", "privacyPolicy": "개인정보 처리방침", + "termsOfService": "서비스 약관", "aboutFocusBuddy": "포커스버디 소개", "resetOnboarding": "온보딩 재설정", "version": "버전 1.0.0 (MVP)", "privacyPolicyTitle": "개인정보 처리방침", - "privacyPolicyContent": "포커스버디는 100% 오프라인으로 작동합니다. 이름, 이메일, 위치 또는 사용 데이터를 수집하지 않습니다. 모든 세션 데이터는 기기에 저장됩니다.\n\n클라우드 동기화, 계정 시스템, 분석 추적이 없습니다.\n\n전체 개인정보 처리방침은 다음을 참조하세요:\n[귀하의 웹사이트 URL]/privacy", + "privacyPolicyContent": "포커스버디는 100% 오프라인으로 작동합니다. 이름, 이메일, 위치 또는 사용 데이터를 수집하지 않습니다. 모든 세션 데이터는 기기에 저장됩니다.\n\n클라우드 동기화, 계정 시스템, 분석 추적이 없습니다.\n\n전체 개인정보 처리방침은 다음을 참조하세요:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "서비스 약관", + "termsOfServiceContent": "포커스버디는 \"있는 그대로\" 제공되며 보증이 없습니다. 이 앱을 사용함으로써 귀하는 자신의 책임 하에 사용하는 것에 동의합니다.\n\n이 앱은 집중 타이머 도구로 설계되었으며 특정 결과를 보장하지 않습니다. 모든 데이터는 기기에 로컬로 저장됩니다.\n\n전체 서비스 약관은 다음을 참조하세요:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "닫기", "aboutTitle": "포커스버디 소개", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 50be0dd..c6472b6 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -348,6 +348,12 @@ abstract class AppLocalizations { /// **'Privacy Policy'** String get privacyPolicy; + /// No description provided for @termsOfService. + /// + /// In en, this message translates to: + /// **'Terms of Service'** + String get termsOfService; + /// No description provided for @aboutFocusBuddy. /// /// In en, this message translates to: @@ -375,9 +381,21 @@ abstract class AppLocalizations { /// No description provided for @privacyPolicyContent. /// /// In en, this message translates to: - /// **'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\n[Your website URL]/privacy'** + /// **'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'** String get privacyPolicyContent; + /// No description provided for @termsOfServiceTitle. + /// + /// In en, this message translates to: + /// **'Terms of Service'** + String get termsOfServiceTitle; + + /// No description provided for @termsOfServiceContent. + /// + /// In en, this message translates to: + /// **'FocusBuddy is provided \"as is\" without warranties. By using this app, you agree to use it at your own risk.\n\nThis app is designed as a focus timer tool and does not guarantee specific results. All data is stored locally on your device.\n\nFor the full terms of service, visit:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'** + String get termsOfServiceContent; + /// No description provided for @close. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart index 6338e8c..4d6fe25 100644 --- a/lib/l10n/app_localizations_ar.dart +++ b/lib/l10n/app_localizations_ar.dart @@ -163,6 +163,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get privacyPolicy => 'سياسة الخصوصية'; + @override + String get termsOfService => 'شروط الخدمة'; + @override String get aboutFocusBuddy => 'حول FocusBuddy'; @@ -177,7 +180,14 @@ class AppLocalizationsAr extends AppLocalizations { @override String get privacyPolicyContent => - 'يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\n[عنوان URL لموقعك]/privacy'; + 'يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'شروط الخدمة'; + + @override + String get termsOfServiceContent => + 'يتم توفير FocusBuddy \"كما هو\" بدون ضمانات. باستخدام هذا التطبيق، فإنك توافق على استخدامه على مسؤوليتك الخاصة.\n\nهذا التطبيق مصمم كأداة مؤقت تركيز ولا يضمن نتائج محددة. يتم تخزين جميع البيانات محليًا على جهازك.\n\nللحصول على شروط الخدمة الكاملة، قم بزيارة:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'إغلاق'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 3167210..8f9b9da 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -165,6 +165,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get privacyPolicy => 'Datenschutzrichtlinie'; + @override + String get termsOfService => 'Nutzungsbedingungen'; + @override String get aboutFocusBuddy => 'Über FocusBuddy'; @@ -179,7 +182,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\n[Deine Website-URL]/privacy'; + 'FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Nutzungsbedingungen'; + + @override + String get termsOfServiceContent => + 'FocusBuddy wird \"wie besehen\" ohne Garantien bereitgestellt. Durch die Nutzung dieser App erklärst du dich damit einverstanden, sie auf eigenes Risiko zu verwenden.\n\nDiese App ist als Fokus-Timer-Tool konzipiert und garantiert keine spezifischen Ergebnisse. Alle Daten werden lokal auf deinem Gerät gespeichert.\n\nFür die vollständigen Nutzungsbedingungen besuche:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Schließen'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 629a31e..a57c4b8 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -164,6 +164,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get privacyPolicy => 'Privacy Policy'; + @override + String get termsOfService => 'Terms of Service'; + @override String get aboutFocusBuddy => 'About FocusBuddy'; @@ -178,7 +181,14 @@ class AppLocalizationsEn extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\n[Your website URL]/privacy'; + 'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Terms of Service'; + + @override + String get termsOfServiceContent => + 'FocusBuddy is provided \"as is\" without warranties. By using this app, you agree to use it at your own risk.\n\nThis app is designed as a focus timer tool and does not guarantee specific results. All data is stored locally on your device.\n\nFor the full terms of service, visit:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Close'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 0c62eac..f123fce 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -164,6 +164,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get privacyPolicy => 'Política de privacidad'; + @override + String get termsOfService => 'Términos de servicio'; + @override String get aboutFocusBuddy => 'Acerca de FocusBuddy'; @@ -178,7 +181,14 @@ class AppLocalizationsEs extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\n[URL de tu sitio web]/privacy'; + 'FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Términos de servicio'; + + @override + String get termsOfServiceContent => + 'FocusBuddy se proporciona \"tal cual\" sin garantías. Al usar esta aplicación, aceptas usarla bajo tu propio riesgo.\n\nEsta aplicación está diseñada como una herramienta de temporizador de concentración y no garantiza resultados específicos. Todos los datos se almacenan localmente en tu dispositivo.\n\nPara los términos de servicio completos, visita:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Cerrar'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 80bfbb0..0c33f63 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -165,6 +165,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get privacyPolicy => 'Politique de confidentialité'; + @override + String get termsOfService => 'Conditions d\'utilisation'; + @override String get aboutFocusBuddy => 'À propos de FocusBuddy'; @@ -179,7 +182,14 @@ class AppLocalizationsFr extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d\'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n\'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\n[URL de votre site web]/privacy'; + 'FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d\'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n\'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Conditions d\'utilisation'; + + @override + String get termsOfServiceContent => + 'FocusBuddy est fourni \"tel quel\" sans garanties. En utilisant cette application, vous acceptez de l\'utiliser à vos propres risques.\n\nCette application est conçue comme un outil de minuteur de concentration et ne garantit pas de résultats spécifiques. Toutes les données sont stockées localement sur votre appareil.\n\nPour les conditions d\'utilisation complètes, visitez:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Fermer'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index eca673e..03f4ea8 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -165,6 +165,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get privacyPolicy => 'गोपनीयता नीति'; + @override + String get termsOfService => 'सेवा की शर्तें'; + @override String get aboutFocusBuddy => 'FocusBuddy के बारे में'; @@ -179,7 +182,14 @@ class AppLocalizationsHi extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\n[आपकी वेबसाइट URL]/privacy'; + 'FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'सेवा की शर्तें'; + + @override + String get termsOfServiceContent => + 'FocusBuddy \"जैसा है\" बिना वारंटी के प्रदान किया जाता है। इस ऐप का उपयोग करके, आप इसे अपने जोखिम पर उपयोग करने के लिए सहमत हैं।\n\nयह ऐप एक फोकस टाइमर टूल के रूप में डिज़ाइन किया गया है और विशिष्ट परिणामों की गारंटी नहीं देता। सभी डेटा आपके डिवाइस पर स्थानीय रूप से संग्रहीत है।\n\nपूर्ण सेवा की शर्तों के लिए, यहाँ जाएं:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'बंद करें'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 92fdf0a..fb29d56 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -165,6 +165,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get privacyPolicy => 'Kebijakan Privasi'; + @override + String get termsOfService => 'Ketentuan Layanan'; + @override String get aboutFocusBuddy => 'Tentang FocusBuddy'; @@ -179,7 +182,14 @@ class AppLocalizationsId extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\n[URL situs web Anda]/privacy'; + 'FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Ketentuan Layanan'; + + @override + String get termsOfServiceContent => + 'FocusBuddy disediakan \"apa adanya\" tanpa jaminan. Dengan menggunakan aplikasi ini, Anda setuju untuk menggunakannya dengan risiko Anda sendiri.\n\nAplikasi ini dirancang sebagai alat timer fokus dan tidak menjamin hasil tertentu. Semua data disimpan secara lokal di perangkat Anda.\n\nUntuk ketentuan layanan lengkap, kunjungi:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Tutup'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 7f89c34..2aaf4cf 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -165,6 +165,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get privacyPolicy => 'Informativa sulla privacy'; + @override + String get termsOfService => 'Termini di servizio'; + @override String get aboutFocusBuddy => 'Informazioni su FocusBuddy'; @@ -179,7 +182,14 @@ class AppLocalizationsIt extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l\'informativa completa sulla privacy, visita:\n[URL del tuo sito web]/privacy'; + 'FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l\'informativa completa sulla privacy, visita:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Termini di servizio'; + + @override + String get termsOfServiceContent => + 'FocusBuddy è fornito \"così com\'è\" senza garanzie. Utilizzando questa app, accetti di usarla a tuo rischio.\n\nQuesta app è progettata come uno strumento timer di concentrazione e non garantisce risultati specifici. Tutti i dati sono archiviati localmente sul tuo dispositivo.\n\nPer i termini di servizio completi, visita:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Chiudi'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 8f8c90c..57ff4e7 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -162,6 +162,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get privacyPolicy => 'プライバシーポリシー'; + @override + String get termsOfService => '利用規約'; + @override String get aboutFocusBuddy => 'フォーカスバディについて'; @@ -176,7 +179,14 @@ class AppLocalizationsJa extends AppLocalizations { @override String get privacyPolicyContent => - 'フォーカスバディは100%オフラインで動作します。氏名、メールアドレス、位置情報、使用データは一切収集しません。すべてのセッションデータはデバイスに保存されます。\n\nクラウド同期、アカウントシステム、分析トラッキングはありません。\n\n完全なプライバシーポリシーについては:\n[あなたのウェブサイトURL]/privacy'; + 'フォーカスバディは100%オフラインで動作します。氏名、メールアドレス、位置情報、使用データは一切収集しません。すべてのセッションデータはデバイスに保存されます。\n\nクラウド同期、アカウントシステム、分析トラッキングはありません。\n\n完全なプライバシーポリシーについては:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => '利用規約'; + + @override + String get termsOfServiceContent => + 'フォーカスバディは「現状のまま」で提供され、保証はありません。このアプリを使用することにより、自己責任で使用することに同意したものとみなされます。\n\nこのアプリは集中タイマーツールとして設計されており、特定の結果を保証するものではありません。すべてのデータはデバイスにローカルに保存されます。\n\n完全な利用規約については:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => '閉じる'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index e0ab065..b5471bc 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -162,6 +162,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get privacyPolicy => '개인정보 처리방침'; + @override + String get termsOfService => '서비스 약관'; + @override String get aboutFocusBuddy => '포커스버디 소개'; @@ -176,7 +179,14 @@ class AppLocalizationsKo extends AppLocalizations { @override String get privacyPolicyContent => - '포커스버디는 100% 오프라인으로 작동합니다. 이름, 이메일, 위치 또는 사용 데이터를 수집하지 않습니다. 모든 세션 데이터는 기기에 저장됩니다.\n\n클라우드 동기화, 계정 시스템, 분석 추적이 없습니다.\n\n전체 개인정보 처리방침은 다음을 참조하세요:\n[귀하의 웹사이트 URL]/privacy'; + '포커스버디는 100% 오프라인으로 작동합니다. 이름, 이메일, 위치 또는 사용 데이터를 수집하지 않습니다. 모든 세션 데이터는 기기에 저장됩니다.\n\n클라우드 동기화, 계정 시스템, 분석 추적이 없습니다.\n\n전체 개인정보 처리방침은 다음을 참조하세요:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => '서비스 약관'; + + @override + String get termsOfServiceContent => + '포커스버디는 \"있는 그대로\" 제공되며 보증이 없습니다. 이 앱을 사용함으로써 귀하는 자신의 책임 하에 사용하는 것에 동의합니다.\n\n이 앱은 집중 타이머 도구로 설계되었으며 특정 결과를 보장하지 않습니다. 모든 데이터는 기기에 로컬로 저장됩니다.\n\n전체 서비스 약관은 다음을 참조하세요:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => '닫기'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 8969845..c51e4f3 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -164,6 +164,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get privacyPolicy => 'Política de Privacidade'; + @override + String get termsOfService => 'Termos de Serviço'; + @override String get aboutFocusBuddy => 'Sobre FocusBuddy'; @@ -178,7 +181,14 @@ class AppLocalizationsPt extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\n[URL do seu site]/privacy'; + 'FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Termos de Serviço'; + + @override + String get termsOfServiceContent => + 'FocusBuddy é fornecido \"como está\" sem garantias. Ao usar este aplicativo, você concorda em usá-lo por sua própria conta e risco.\n\nEste aplicativo é projetado como uma ferramenta de temporizador de foco e não garante resultados específicos. Todos os dados são armazenados localmente no seu dispositivo.\n\nPara os termos de serviço completos, visite:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Fechar'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 7e6ac10..06ca88e 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -169,6 +169,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get privacyPolicy => 'Политика конфиденциальности'; + @override + String get termsOfService => 'Условия использования'; + @override String get aboutFocusBuddy => 'О FocusBuddy'; @@ -183,7 +186,14 @@ class AppLocalizationsRu extends AppLocalizations { @override String get privacyPolicyContent => - 'FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\n[URL вашего сайта]/privacy'; + 'FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => 'Условия использования'; + + @override + String get termsOfServiceContent => + 'FocusBuddy предоставляется \"как есть\" без гарантий. Используя это приложение, вы соглашаетесь использовать его на свой риск.\n\nЭто приложение разработано как инструмент таймера концентрации и не гарантирует конкретных результатов. Все данные хранятся локально на вашем устройстве.\n\nПолные условия использования см.:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => 'Закрыть'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index ddb1257..4c16bbe 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -162,6 +162,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get privacyPolicy => '隐私政策'; + @override + String get termsOfService => '服务条款'; + @override String get aboutFocusBuddy => '关于专注伙伴'; @@ -176,7 +179,14 @@ class AppLocalizationsZh extends AppLocalizations { @override String get privacyPolicyContent => - '专注伙伴 100% 离线运行。我们不收集您的姓名、电子邮件、位置或使用数据。所有会话数据都保存在您的设备上。\n\n没有云同步,没有账户系统,没有分析追踪。\n\n完整隐私政策请访问:\n[您的网站 URL]/privacy'; + '专注伙伴 100% 离线运行。我们不收集您的姓名、电子邮件、位置或使用数据。所有会话数据都保存在您的设备上。\n\n没有云同步,没有账户系统,没有分析追踪。\n\n完整隐私政策请访问:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html'; + + @override + String get termsOfServiceTitle => '服务条款'; + + @override + String get termsOfServiceContent => + '专注伙伴按\"现状\"提供,不提供任何保证。使用本应用即表示您同意自行承担风险。\n\n本应用是一款专注计时工具,不保证特定结果。所有数据均存储在您的设备本地。\n\n完整服务条款请访问:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html'; @override String get close => '关闭'; diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 397b67b..b683248 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -58,12 +58,17 @@ "about": "Sobre", "privacyPolicy": "Política de Privacidade", + "termsOfService": "Termos de Serviço", "aboutFocusBuddy": "Sobre FocusBuddy", "resetOnboarding": "Redefinir introdução", "version": "Versão 1.0.0 (MVP)", "privacyPolicyTitle": "Política de Privacidade", - "privacyPolicyContent": "FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\n[URL do seu site]/privacy", + "privacyPolicyContent": "FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Termos de Serviço", + "termsOfServiceContent": "FocusBuddy é fornecido \"como está\" sem garantias. Ao usar este aplicativo, você concorda em usá-lo por sua própria conta e risco.\n\nEste aplicativo é projetado como uma ferramenta de temporizador de foco e não garante resultados específicos. Todos os dados são armazenados localmente no seu dispositivo.\n\nPara os termos de serviço completos, visite:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Fechar", "aboutTitle": "Sobre FocusBuddy", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 4973e34..ba20f9e 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -58,12 +58,17 @@ "about": "О программе", "privacyPolicy": "Политика конфиденциальности", + "termsOfService": "Условия использования", "aboutFocusBuddy": "О FocusBuddy", "resetOnboarding": "Сбросить введение", "version": "Версия 1.0.0 (MVP)", "privacyPolicyTitle": "Политика конфиденциальности", - "privacyPolicyContent": "FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\n[URL вашего сайта]/privacy", + "privacyPolicyContent": "FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "Условия использования", + "termsOfServiceContent": "FocusBuddy предоставляется \"как есть\" без гарантий. Используя это приложение, вы соглашаетесь использовать его на свой риск.\n\nЭто приложение разработано как инструмент таймера концентрации и не гарантирует конкретных результатов. Все данные хранятся локально на вашем устройстве.\n\nПолные условия использования см.:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "Закрыть", "aboutTitle": "О FocusBuddy", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 457f2ac..1e1ebf2 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -58,12 +58,17 @@ "about": "关于", "privacyPolicy": "隐私政策", + "termsOfService": "服务条款", "aboutFocusBuddy": "关于专注伙伴", "resetOnboarding": "重置引导", "version": "版本 1.0.0 (MVP)", "privacyPolicyTitle": "隐私政策", - "privacyPolicyContent": "专注伙伴 100% 离线运行。我们不收集您的姓名、电子邮件、位置或使用数据。所有会话数据都保存在您的设备上。\n\n没有云同步,没有账户系统,没有分析追踪。\n\n完整隐私政策请访问:\n[您的网站 URL]/privacy", + "privacyPolicyContent": "专注伙伴 100% 离线运行。我们不收集您的姓名、电子邮件、位置或使用数据。所有会话数据都保存在您的设备上。\n\n没有云同步,没有账户系统,没有分析追踪。\n\n完整隐私政策请访问:\nhttps://ytc1012.github.io/focusbuddy-site/privacy-policy.html", + + "termsOfServiceTitle": "服务条款", + "termsOfServiceContent": "专注伙伴按\"现状\"提供,不提供任何保证。使用本应用即表示您同意自行承担风险。\n\n本应用是一款专注计时工具,不保证特定结果。所有数据均存储在您的设备本地。\n\n完整服务条款请访问:\nhttps://ytc1012.github.io/focusbuddy-site/terms-of-service.html", + "close": "关闭", "aboutTitle": "关于专注伙伴", diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index daec959..e3a0958 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -142,6 +142,22 @@ class _SettingsScreenState extends State { }, ), const Divider(color: AppColors.divider), + ListTile( + contentPadding: EdgeInsets.zero, + title: Text( + l10n.termsOfService, + style: AppTextStyles.bodyText, + ), + trailing: const Icon( + Icons.arrow_forward_ios, + size: 16, + color: AppColors.textSecondary, + ), + onTap: () { + _showTermsOfService(); + }, + ), + const Divider(color: AppColors.divider), ListTile( contentPadding: EdgeInsets.zero, title: Text( @@ -385,6 +401,29 @@ class _SettingsScreenState extends State { ); } + void _showTermsOfService() { + final l10n = AppLocalizations.of(context)!; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(l10n.termsOfServiceTitle), + content: SingleChildScrollView( + child: Text( + l10n.termsOfServiceContent, + style: AppTextStyles.bodyText, + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(l10n.close), + ), + ], + ), + ); + } + void _showAboutDialog() { final l10n = AppLocalizations.of(context)!; diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index d5a8370..d2eb056 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -1,5 +1,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter/foundation.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'dart:io' show Platform; /// Notification Service - Handles local notifications class NotificationService { @@ -64,21 +66,40 @@ class NotificationService { // TODO: Navigate to appropriate screen if needed } - /// Request notification permissions (iOS only, Android auto-grants) + /// Request notification permissions (iOS and Android 13+) Future requestPermissions() async { if (kIsWeb) return false; try { - final result = await _notifications - .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: true, - badge: true, - sound: true, - ); + // Check if we're on Android or iOS + if (Platform.isAndroid) { + // Android 13+ requires runtime permission + final status = await Permission.notification.request(); - return result ?? true; // Android always returns true + if (kDebugMode) { + print('Android notification permission status: $status'); + } + + return status.isGranted; + } else if (Platform.isIOS) { + // iOS permission request + final result = await _notifications + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + + if (kDebugMode) { + print('iOS notification permission result: $result'); + } + + return result ?? false; + } + + return true; // Other platforms } catch (e) { if (kDebugMode) { print('Failed to request permissions: $e'); @@ -87,6 +108,27 @@ class NotificationService { } } + /// Check if notification permission is granted + Future hasPermission() async { + if (kIsWeb) return false; + + try { + if (Platform.isAndroid) { + final status = await Permission.notification.status; + return status.isGranted; + } else if (Platform.isIOS) { + // For iOS, we can't easily check without requesting, so we assume granted after request + return true; + } + return true; + } catch (e) { + if (kDebugMode) { + print('Failed to check permission status: $e'); + } + return false; + } + } + /// Show focus session completed notification Future showFocusCompletedNotification({ required int minutes, diff --git a/privacy-policy.md b/privacy-policy.md index f1633e2..8502d98 100644 --- a/privacy-policy.md +++ b/privacy-policy.md @@ -1,8 +1,8 @@ # Privacy Policy for FocusBuddy -**Last Updated**: November 22, 2025 -**Developer**: [Your Name or Studio] -**Contact**: [your-email@example.com] +**Last Updated**: November 22, 2025 +**Developer**: FocusBuddy Team +**Contact**: focusbuddy.app@outlook.com This Privacy Policy describes how **FocusBuddy** (the “App”) handles your information. The App is designed to be **100% offline and privacy-first**. We do not collect, store, or transmit any personal data from your device. @@ -40,10 +40,10 @@ This Privacy Policy describes how **FocusBuddy** (the “App”) handles your in ## 6. Questions? -If you have any questions about this Privacy Policy or how your data is handled, please contact us at: -📧 **[your-email@example.com]** +If you have any questions about this Privacy Policy or how your data is handled, please contact us at: +📧 **focusbuddy.app@outlook.com** — -> Made with care by [Your Name]. +> Made with care by FocusBuddy Team. > We believe focus should feel kind — not punishing. \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index d6be813..aa47028 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -525,6 +525,54 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.flutter-io.cn" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.flutter-io.cn" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.flutter-io.cn" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 135c3b3..20e4950 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: hive: ^2.2.3 # Local storage hive_flutter: ^1.1.0 # Hive Flutter integration flutter_local_notifications: ^17.0.0 # Notifications + permission_handler: ^11.0.0 # Runtime permissions (Android 13+) path_provider: ^2.1.0 # File paths shared_preferences: ^2.2.0 # Simple key-value storage (for onboarding) intl: ^0.20.2 # Date formatting and i18n diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..48de52b 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..0e69e40 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST