commit 6b321890c00f6d5ce13969853a7c8be9ae714b54
Author: ytc1012 <18001193130@163.com>
Date: Thu Nov 13 15:45:28 2025 +0800
first commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..535b5fc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,91 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
+
+# iOS related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Flutter.podspec
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/ephemeral
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/Flutter/flutter_export_environment.sh
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# Android related
+**/android/**/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+**/android/key.properties
+*.jks
+
+# Coverage
+coverage/
+
+# Exceptions to above rules.
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..7007e3b
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,30 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "a0e9b9dbf78c8a5ef39b45a7efd40ed2de19c1a7"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: a0e9b9dbf78c8a5ef39b45a7efd40ed2de19c1a7
+ base_revision: a0e9b9dbf78c8a5ef39b45a7efd40ed2de19c1a7
+ - platform: web
+ create_revision: a0e9b9dbf78c8a5ef39b45a7efd40ed2de19c1a7
+ base_revision: a0e9b9dbf78c8a5ef39b45a7efd40ed2de19c1a7
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d350fc1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,94 @@
+# AutoTime Tracker
+
+自动时间追踪与效率分析工具
+
+## 📱 项目简介
+
+AutoTime Tracker 是一款自动追踪应用使用时间并进行分析的效率工具。通过自动化的方式帮助用户了解自己的时间使用,提升效率。
+
+## ✨ 功能特性
+
+- ✅ **自动时间追踪** - 后台自动追踪应用使用时间
+- ✅ **智能分类** - 预设分类规则,支持手动调整
+- ✅ **数据统计** - 今日/周/月统计,丰富的图表展示
+- ✅ **效率评分** - 基于时间分配的效率评分
+- ✅ **目标设定** - 设置每日时间目标
+- ✅ **数据导出** - 导出 CSV 数据和统计报告
+- ✅ **空状态优化** - 友好的空状态和错误处理
+
+## 🛠️ 技术栈
+
+- **Flutter 3.x** - 跨平台框架
+- **Riverpod** - 状态管理
+- **fl_chart** - 图表库
+- **sqflite** - 本地数据库
+- **Google Fonts** - 字体系统
+
+## 🚀 快速开始
+
+### 安装依赖
+```bash
+flutter pub get
+```
+
+### 运行项目
+
+**Web 平台(推荐用于开发测试):**
+```bash
+flutter run -d web-server
+```
+
+**Android 设备:**
+```bash
+# 1. 连接设备并启用 USB 调试
+flutter devices
+
+# 2. 运行应用
+flutter run
+```
+
+**详细说明:** 查看 [快速启动指南.md](./快速启动指南.md)
+
+### 测试真实数据
+
+**重要:** 测试真实数据需要安装到真实手机设备上!
+
+```bash
+# 连接手机后运行
+flutter run
+```
+
+**详细测试指南:** 查看 [真实数据测试指南.md](./真实数据测试指南.md)
+
+## 📊 开发进度
+
+**当前完成度:** 98%
+
+### ✅ 已完成
+- 核心功能完整实现
+- 所有主要界面已实现
+- 数据层完整(SQLite + DAO)
+- 服务层完整(分类、统计、导出等)
+- 空状态和错误处理优化
+- Web 平台测试数据支持
+
+### ⚠️ 待完善
+- 原生 API 实际实现(需要真实设备测试)
+- iOS Screen Time API 完整实现
+- Android Usage Stats API 完整实现
+
+**详细进度:** 查看 [开发进度.md](./开发进度.md)
+
+## 📚 文档
+
+- [快速启动指南.md](./快速启动指南.md) - 如何运行和测试项目
+- [开发进度.md](./开发进度.md) - 开发进度和待办事项
+- [真实数据测试指南.md](./真实数据测试指南.md) - 真实设备测试说明
+
+## 📄 许可证
+
+MIT License
+
+---
+
+**项目状态:** MVP 基本完成,核心功能已实现,可以进行真实设备测试。
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..f9b3034
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:flutter_lints/flutter.yaml
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..045a785
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/kotlin/com/autotime/tracker/MainActivity.kt b/android/app/src/main/kotlin/com/autotime/tracker/MainActivity.kt
new file mode 100644
index 0000000..92dd10c
--- /dev/null
+++ b/android/app/src/main/kotlin/com/autotime/tracker/MainActivity.kt
@@ -0,0 +1,8 @@
+package com.autotime.tracker
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+ // MainActivity 实现
+}
+
diff --git a/android/app/src/main/kotlin/com/autotime/tracker/TimeTrackingPlugin.kt b/android/app/src/main/kotlin/com/autotime/tracker/TimeTrackingPlugin.kt
new file mode 100644
index 0000000..9e15a77
--- /dev/null
+++ b/android/app/src/main/kotlin/com/autotime/tracker/TimeTrackingPlugin.kt
@@ -0,0 +1,189 @@
+package com.autotime.tracker
+
+import android.app.AppOpsManager
+import android.app.usage.UsageStats
+import android.app.usage.UsageStatsManager
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.provider.Settings
+import io.flutter.embedding.engine.plugins.FlutterPlugin
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+import java.util.*
+
+class TimeTrackingPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
+ private lateinit var channel: MethodChannel
+ private lateinit var context: Context
+
+ override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
+ channel = MethodChannel(flutterPluginBinding.binaryMessenger, "autotime_tracker/time_tracking")
+ channel.setMethodCallHandler(this)
+ context = flutterPluginBinding.applicationContext
+ }
+
+ override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
+ channel.setMethodCallHandler(null)
+ }
+
+ override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
+ when (call.method) {
+ "hasPermission" -> hasPermission(result)
+ "requestPermission" -> requestPermission(result)
+ "getAppUsage" -> getAppUsage(call, result)
+ "startBackgroundTracking" -> startBackgroundTracking(result)
+ "stopBackgroundTracking" -> stopBackgroundTracking(result)
+ "isBackgroundTrackingActive" -> isBackgroundTrackingActive(result)
+ else -> result.notImplemented()
+ }
+ }
+
+ // MARK: - Permission Methods
+
+ private fun hasPermission(result: MethodChannel.Result) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ val appOps = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
+ val mode = appOps.checkOpNoThrow(
+ AppOpsManager.OPSTR_GET_USAGE_STATS,
+ android.os.Process.myUid(),
+ context.packageName
+ )
+ result.success(mode == AppOpsManager.MODE_ALLOWED)
+ } else {
+ result.success(false)
+ }
+ }
+
+ private fun requestPermission(result: MethodChannel.Result) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
+ intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ context.startActivity(intent)
+ result.success(true)
+ } else {
+ result.error(
+ "UNSUPPORTED_VERSION",
+ "Usage Stats API requires Android 5.0 (API 21) or later",
+ null
+ )
+ }
+ }
+
+ // MARK: - App Usage Methods
+
+ private fun getAppUsage(call: MethodCall, result: MethodChannel.Result) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ result.error(
+ "UNSUPPORTED_VERSION",
+ "Usage Stats API requires Android 5.0 (API 21) or later",
+ null
+ )
+ return
+ }
+
+ val args = call.arguments as? Map<*, *>
+ val startTimeMs = args?.get("startTime") as? Long
+ val endTimeMs = args?.get("endTime") as? Long
+
+ if (startTimeMs == null || endTimeMs == null) {
+ result.error("INVALID_ARGUMENTS", "Invalid arguments", null)
+ return
+ }
+
+ // 检查权限
+ if (!hasUsageStatsPermission()) {
+ result.error(
+ "PERMISSION_DENIED",
+ "Usage Stats permission not granted",
+ null
+ )
+ return
+ }
+
+ val usageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
+ val startTime = startTimeMs
+ val endTime = endTimeMs
+
+ // 查询应用使用统计
+ val stats = usageStatsManager.queryUsageStats(
+ UsageStatsManager.INTERVAL_DAILY,
+ startTime,
+ endTime
+ )
+
+ if (stats == null || stats.isEmpty()) {
+ result.success(emptyList