From 7b8a175fa516fa244b0cbd8059f7ed21b9d592b0 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 19 Dec 2025 03:26:36 +0000
Subject: [PATCH 1/8] Initial plan
From 4171ac103b1722aeab7790adf26a21c23c20ad43 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 19 Dec 2025 03:33:44 +0000
Subject: [PATCH 2/8] Convert to Flutter app - add core Flutter files and
structure
Co-authored-by: markrcote <131299+markrcote@users.noreply.github.com>
---
.gitignore | 94 +++++-
README.md | 98 +++++-
analysis_options.yaml | 8 +
android/app/build.gradle | 38 +++
android/app/src/main/AndroidManifest.xml | 29 ++
.../app/src/main/ic_launcher-playstore.png | Bin 0 -> 12941 bytes
.../com/markrcote/gvtimer/MainActivity.kt | 5 +
.../main/res/drawable/launch_background.xml | 4 +
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +
.../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1888 bytes
.../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 308 bytes
.../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3418 bytes
.../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1696 bytes
.../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 246 bytes
.../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2388 bytes
.../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1968 bytes
.../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 154 bytes
.../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 4020 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2838 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 276 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 6642 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3162 bytes
.../ic_launcher_foreground.webp | Bin 0 -> 148 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 8388 bytes
.../app/src/main/res/values-night/styles.xml | 9 +
android/app/src/main/res/values/styles.xml | 9 +
android/build.gradle | 31 ++
android/settings.gradle | 29 ++
ios/Podfile | 44 +++
ios/Runner/AppDelegate.swift | 13 +
ios/Runner/Info.plist | 49 +++
ios/Runner/Runner-Bridging-Header.h | 1 +
lib/main.dart | 318 ++++++++++++++++++
pubspec.yaml | 20 ++
35 files changed, 791 insertions(+), 18 deletions(-)
create mode 100644 analysis_options.yaml
create mode 100644 android/app/build.gradle
create mode 100644 android/app/src/main/AndroidManifest.xml
create mode 100644 android/app/src/main/ic_launcher-playstore.png
create mode 100644 android/app/src/main/kotlin/com/markrcote/gvtimer/MainActivity.kt
create mode 100644 android/app/src/main/res/drawable/launch_background.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
create mode 100644 android/app/src/main/res/values-night/styles.xml
create mode 100644 android/app/src/main/res/values/styles.xml
create mode 100644 android/build.gradle
create mode 100644 android/settings.gradle
create mode 100644 ios/Podfile
create mode 100644 ios/Runner/AppDelegate.swift
create mode 100644 ios/Runner/Info.plist
create mode 100644 ios/Runner/Runner-Bridging-Header.h
create mode 100644 lib/main.dart
create mode 100644 pubspec.yaml
diff --git a/.gitignore b/.gitignore
index 726fe3a..82b5173 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,78 @@
-*.iml
-.gradle
-/local.properties
-/.idea/caches
-/.idea/gradle.xml
-/.idea/libraries
-/.idea/misc.xml
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
.DS_Store
-/build
-/captures
-.externalNativeBuild
-.cxx
-local.properties
-/app/release
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# 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/XCode 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/.last_build_id
+**/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.*
+
+# Old Android app files
+/app/
+/gradle/
+gradlew
+gradlew.bat
+build.gradle.kts
+settings.gradle.kts
+gradle.properties
diff --git a/README.md b/README.md
index 35499a0..4c7d67a 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,97 @@
-A simple app to track German Volume Training (10x10) sessions.
\ No newline at end of file
+# GVTimer
+
+A simple app to track German Volume Training (10x10) sessions.
+
+Built with Flutter for cross-platform support on Android and iOS.
+
+## Features
+
+- Track sets (0-10) for German Volume Training
+- Automatic 60-second rest timer between sets
+- Audio notification when rest period is complete
+- Dark mode support
+- Clean, simple interface
+
+## Prerequisites
+
+- [Flutter SDK](https://flutter.dev/docs/get-started/install) (3.0.0 or higher)
+- For Android development:
+ - Android Studio or Android SDK
+ - Android device or emulator
+- For iOS development (macOS only):
+ - Xcode 14.0 or higher
+ - CocoaPods
+ - iOS device or simulator
+
+## Building and Running
+
+### Install Dependencies
+
+```bash
+flutter pub get
+```
+
+### Run on Android
+
+```bash
+flutter run -d android
+```
+
+### Run on iOS (macOS only)
+
+```bash
+cd ios
+pod install
+cd ..
+flutter run -d ios
+```
+
+### Build for Release
+
+#### Android APK
+```bash
+flutter build apk --release
+```
+
+The APK will be available at: `build/app/outputs/flutter-apk/app-release.apk`
+
+#### Android App Bundle (for Play Store)
+```bash
+flutter build appbundle --release
+```
+
+The bundle will be available at: `build/app/outputs/bundle/release/app-release.aab`
+
+#### iOS (macOS only)
+```bash
+flutter build ios --release
+```
+
+Then open the project in Xcode to archive and distribute:
+```bash
+open ios/Runner.xcworkspace
+```
+
+## Development
+
+### Run in Debug Mode
+
+```bash
+flutter run
+```
+
+### Run Tests
+
+```bash
+flutter test
+```
+
+### Check for Issues
+
+```bash
+flutter doctor
+```
+
+## License
+
+See LICENSE file for details.
\ No newline at end of file
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..5d1b809
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,8 @@
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ rules:
+ prefer_const_constructors: true
+ prefer_const_literals_to_create_immutables: true
+ prefer_final_fields: true
+ avoid_print: true
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..a40862e
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,38 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+android {
+ namespace = "com.markrcote.gvtimer"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ applicationId = "com.markrcote.gvtimer"
+ minSdk = flutter.minSdkVersion
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ buildTypes {
+ release {
+ signingConfig = signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..ca691fc
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000000000000000000000000000000000000..3da3abbf0a8edcbb6ef256fe4073216effb2afc3
GIT binary patch
literal 12941
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
h#--!GDf
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..c4a603d
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..c4a603d
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..3192692718455d76c505bfeaa9a05261a4e22d04
GIT binary patch
literal 1888
zcmV-m2cP&-Nk&Fk2LJ$9MM6+kP&iCW2LJ#sN5Byf^-!Are~sHHWoGV)nYkzCH__<}
z;Pw_yj%DWdPGM$d=FN(VZ^L8#f0ne`&{1J#Mk$=4Aq<8v(@&L|wBfZ?a@1Kz(-}$H
zwjFl##kMw)4P*%#X90zwQZ|bPDTmjv_Kt{;a$*%
z<+e3p-92)5_XpH$+meMXIK5u9654i6y^^1s(xb1c^(WA9W-Ead2MZl%uLFOFq0njnA}0)Ulc&Enj_X6wR355!m@QVnI3!OjS#thCgZ1D1e?0<;j(A
zwWozKV>%mNC*2#yx2Ajxf|j`03&j?Wm$64X_lyF>Q=0H
z6hMD-p4}^xtc&c5j%y#0s5#H8@~Rg=FRpEPW^2o{M|++<-uExC_29olf0tJ!$91G?
z5x^R&NaIX`tw6kOnZO?2)J)SX)lfMl@>hXGAZq!1(==0ARWbp6vq{i&8d_BRtXw^bz-;Dfnuk*BI^>CP#qMEw$PSZ`HTcdSr>ak@(I5)11(m1>)=
zRLullleh4dpF1Vu7vgcTtrMgF0R0j71?4SNbX`}mp4;41M?t`P|5t2gnFSP^S<=(5
zg@QFsm1u^9p$TFS?>Yv+sS0mfhGCRysx1$%_{us1D89T7ae1a;7&@mZ29UJJAQ&bK
zqbZe;?@HA|*EQZUSdqseQg=82?^xe>p5r*B+a?K>Sl{FTCDu0x{pUDN_F)Iuk?IgU
zPs2J^rP`|7?HtytUJFguI9;PT7MtKy>6^-&4RD5*WZQPB=Em~yimz_4f#R#{5SOpE
zZ96H~27cmH$tD<w~mWz
zh4)V?P-1NZVoLA){CL_g@V1c(EX++M7?FputxDBZ*XM;!x^nN`B}7Eg1;CgnV|5R?
zTi)JjO=ZN#yVg`@bq~4SoN3S^4og&%1sp&SLr`j_k5tuIZ
z{r7F*t-fg_ISa6#6kFY(6$cb{k^!>eV@Yl&D>4;^Lq0kkCG9Ysi}~
zrD{kFkL+%$u1lZwO#6Iz!Fyd(&iVfd@w~sEjC-H1J#v4k6msMh8@TuRnsFF${}N~I
zq6ptxnd99{2fMTrWBzDIB>=?7?k-L2;(4B$3LQWWk@QVv&H;W(a)<+|U640%9pYpy
zPg@pYypuWpK6|hWex;tcI!DG|fYUYJGz@?@wMhn`FE)lD5EEhimAUZD))v^~XQzCd
zm-dDI8)3El`WKs7_Ez7tpT4N}d@JXtpUnPBq}5T7Wm&!@(6#QO&Sa#HBGgfk{?y3<
z#1mp#rP|ju^p*%3H*ILru`K{JZrRkNZA$J8#nqcK97=+ntvjTonC|3?bRm~YpwF6AMy`brsHhn6Vdr`1U0
zEfD70GUoqv9ZOR_ZILklm$5)Tv{SOXotM`q=KO*o*H{%L%8!nT*@dX-G8UQ%tO|=6
zqo5dAg`n$5)q*g_k2r`MxIAm(|tTkmNct@<-deSdb19
z_j>=_`H>HMmIuTN3xOUAppODrsTXwL9z0Z6#+(@amja29CR
z;$%dXhyv)j?ajp~1+Yv3Y)}B36u_3^vKCMPOERj9+Jccu0Sj?W_JV
zao>x6drW5i`b%ulZ;y%hhFlPjg2W4o+bW?h9}@&M{{Az(PBgzno@jl)5cTIdgrkyh
zL2*%_<@J=H_a*AD;m{pbLRl^pmw?cm39YP4QJuooCdQKksuIl@Xnj33D9aM9?2)Js
zH_8sh0U;O&&(nYwtltgnSpnKufT$m514niUm(vY&vS1o$XU{O3JN*6kg{1AwZSAq!
GmjD2q-jCA&
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..60ae02b2e86993eeed99d2d2ee182fc0fedbe72d
GIT binary patch
literal 3418
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
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..6e5ec16fc4d09a4ee055e61c3633733d064b814a
GIT binary patch
literal 1696
zcmV;R24DG7Nk&GP1^@t8MM6+kP&iDB1^@srFTe{B)libt!A))W1=&|WWiK&rV7&*7K
z9eeb=h@Hw#IwxKJg37cXU)%5d+5TcXV|S`-+jcvZXV#LOZF^#6Un8uv04`Qs?6n4$
z9YxTAYXvz;CZ2J{-JRdvUFXOpNs=T*l9-v9nO-q-?e7i#fOq#*n4Q_j1s7%DwvnRb
zXhw_2Z;*c$2PVnjm*HZ_vA&pr@bth2`5QO@O%H4k4MEC9EMKHHvO}C`yGCfaU8`Bj
z5gKie)o%XTy?sn?%hm4+{6)V?RpcpLGo`Wm%yZDaeJ3Mi{vpl4F*fL=1Z%j059@
z=V6ASn&EMo*MljC=XpdB2rqay{pfOZ;t=<}6Tf)se~()t4C8s;50ZQ~0Q6_?eEGF%
zmX_f3r?M
zAdJvjPZ7$YdsyvTJ@K8d@Lg!b@0()Xe0A?4Q#PB|lgSCf
zaMuo6W72^+PU{@pyL)gc0Fk(k4O-Kt$CXL9B_iohAEdv0)C|Kg{rRJ2n75>r=@IVtFNsh9wa!N_nDc%pb^e`y!zg`B#=V&8h@er}IQo`XZ4$
zmjwb;(eh;?3SE}l?%I2PCD`OjzdV(K?MfS3UcYtj-Dl#s<<(n5uqsDz*WSY`2kefN
zT2m3Nb!#$`LaY9~ygs#Yf+Sg)61
z3h?Wz$Lrj_XvDN!b*8JBn$jEa+FggwuLPSVB(4g%ae_cq0xq+xZNV$knarjw9See>
zH66=rRw9hR1W^mPRMjx;2$o|E>k@eT3oEi7F{~0vA{+~0xoDJmJQ3Fng}QX(Ytwjg
za~tfAR<%!Mq9|&c&h3trpgB2ihC>mT`8-sTqL{KwmtmXWzFLoHR*4`GhKA6N!3kzs
zgIqJQnx2MEcVQg6A%@4WdXT9EWKdOgU76nl7c(
zWXJNRmbdRf`pZYELPbd_HA59eHDS&2Nu?Ast+gsoD5^`j{3H&wu{f>r*M;_X~t!eBU1=Jm>p@YWM|9XqzsAHnX5E}l2xbH_XuHFT(M
zxMzI(1OUM8PbHeJ>zaO#>GQa*YkFP7uIo1YQz;h!VAS=Qu4SIPTtNr`VCTJ;ed@E)
zxjFalGg{k1>-dkrSGvwcS06d|?lb%R{|k<)ZFXthpd`7hZOoVWfTI(K>>2?;3aO@TD%b6?
zO>|#jigXFXyq8LoLQ1ehce|Z?I_x_!#Wu_Toq-fmrZtu5l2jAC=id&8XC?2wXp|IO
zg2RbbYn-?RQgE5pXsC;2?cVL9>n!-k=fRD=twogco8Z`cvG~unS(T8(h?N|fIEoXe
z|K1I*{%MN@zU6tj^5p%29LfG}8UV&V^Z74JNTQL4!^t&ACyzO?4EcBCq1H(BVE`Dn
zem4yOgQvcEfBAkg`TElIdUrRZ+M87Y?J&no@5n&jbK;?nnKr8udb`2Z?p-_k-%ft}
z{(9{OX;};a;|75J<34=5*$&h?MiF#&>F(_8-q+J{;)?uS0JrNv^x@xd!PDyz1HhyK
qV8*elkA4CpIsPTCKc5d70ERc6JUlskGQK+O#PLlAfFb!OQ33$&V^8V;
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..9d2fbdf6722c4103f826c2db3d6d7279035133a0
GIT binary patch
literal 246
zcmV8X;^MA!B&GN
wG61U)pm*&ht9g3e?KI^tYF?7`QP&hWdCe;zU2|XF;QW2a>A%5M6AfQm0BF~86aWAK
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..e07b9192759bf98fc44328a8bd82a0fbbc4ff626
GIT binary patch
literal 2388
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
GCIA3LvyA=#
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..e4225309976a6bd2d04bce9a2bd50c352bebf9a8
GIT binary patch
literal 1968
zcmV;h2T%A?Nk&Gf2LJ$9MM6+kP&iDR2LJ#sU%(d-)llC4KW!r^Pj54`%*@Ourt=w)CPQu~8%Wl+9dF*+
zT|n2+(%xq)V#>GD13cSt9+PIjjv*
z`}^_Pw!hf6Z54840Z`~A`h{ftpfZA2v`Y#Mh#tJ|dVM
z3v+AJzY8mYsvs>W!s#%GR1}qSw54R@)d--Q~05Q%4&T3bX76z%E
zOPlC7!2A6QnV`F5CAA@A)I%Age##gXWsLft&1RE~85I>1WsHi*xIu_Xs}i%=q(hI2
zmXBHLA@pLzUisY)$_7fJ8DRf_d{R?JUgw
zCb+)-g;aWEl71WEE(mjpy+8QGL4>=IfvF5X$0XHULCP8~CmmX@U{i@!mM|(;sE1H_
z#$Nu?o*x8>6;YhNtq`<7c;)>tm#Bt$1ZXP57nRib
zNJ+~}P&yx*OtQsrnom{vaQRCI5Yyj^vwA%r+7{-O_rn_2hgR(l2PJW1`d(v?gP
zt>PQOS;51oXNQeACvuYKd3UU|;K#2>B;yMtJwJ2wu1%D*Kfi&vAmQ}ywlHU*=m%NY
z=u>sDzTsP=@aKk-WKOu65J2T|%3g>OOtKQ+8pX}4OR}>BP|=0}YVJ#R7A?g$MloGn
zQ=IG3h5%}B&+w01if>HP=J|Dt%Q>TYIN3D4cU=(7UOF;kWLto2DF#8{Sc@R!4;%)D
zb5G^+@dTr%OkpgU=9E;b3t88>A)Ot-1(}jeZNm!iOtV)`@UR91mHKdDu^ksQ*Azs4
zNOLwX?$}=D;hs$ExTNNiY!F1H)zXVh=SE@#0~g3hmQ1vPXPQ2=iHA-Qw6q@={i?F&f*E~$qSAv1|h}m8cE9*Ny9-_mu6%n
z!3A-~l+Fr(XPPmwi}6@N2*%j#BNt^0>o4R>%%i=N*_mrf^<5nf5
z(mV>Km$*ZREF}_bxFD4ks4mZeXPPyCi1B1~4#$i!JdhAf;+VD)E>I}FWKvz)l@G6&oq1K2;-^xML4F!D1wBt
zk7L$vzy-PLEZ+}F)@Cyg_hbggC7qBIi!6pyC5F+EnZksmHDXN+vKZ9AP4kj)YsxxU-B?G~^UezLaUIu75sHfmlPWa3Gv
zwqZpoJAku#OJJ(P^36*|T>zT^{tGJbUA+M0+KNO#W$gO-fdx1`I04lK-!#=To@0)0
z;h##Yu6?&^-9jbTRwP=FyMJ-a>7CXsTz;`>hs_%=T4nmkx44eO*w8wD-2IDIPiALjPI}zcN(b49ku<||C@$;G55TTRjB0Orj57zAAgSK
zo@7^Qg_d{Z7xe_t`Ho$`8&$I+Tw*`WC92lo4<1n+_(jjVFE6^cWWCUa0NPGnxjOTS
zP5byepD^%9l6esFN1<-dDwTt%yqM-h3-#e->tLYrYNGY|_?^dP0%*UaVWUAC0;rs_
zde=q(qvuVXUVDo%KmTYDJ(?F7q;4P8?+|*CX|@bfAI%T_WDvZR?0h+Q;r!O*@tgPU
z1&$MY1W>pC`FkG$%$~4)d*SxN%*VecML#Z5^POw@h=CMu+?m
z3%3?0502h{xY)bz#e08Q2#!w#(0IV{!$>ayEN%7izgFdrOI7Z;UgeH!#c2Vp*R~7l
zy=Iyd#p2)Vw)*&AFZV8KDF_}3poRdN_PY8Q+~M&%5Wpbt@gBC4eCU7$$%bmv}dfO!00UG0jQW&5!-xI8qSY7IFkoH)6WwTtO^WQUCx*
CQOq^~
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..600d53272fedc19dc406bae71b06c5509ab66244
GIT binary patch
literal 154
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
aDpEc>TxwW|1gVN5Nn0ExNl{dCVE_OPrqhD}
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..024ef144a987dedadc0fa3d2fa8c7457617c2f86
GIT binary patch
literal 2838
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
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..ed0faf57ab455fdfce149d796de32e97966fc333
GIT binary patch
literal 276
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
A>Hq)$
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000000000000000000000000000000000000..c7fa659d85e8f279027cfe64b9d692b831e64d20
GIT binary patch
literal 148
zcmV;F0BiqJNk&GD00012MM6+kP&iD00000lufb~&7a$NwVe2dwOlFY(ov4r?!T*Pi
z^B++CfpKK3ZMe{%bLubBCd!g;{zF9nCxB`fKYgJM3yzE5Oa{m2gh-6Z+nN8YN!{#?
z(G0*SA^4j8shn`Do4rgKJEa+A&3-CUIZ+l<(H+3*X74FQA4)U0l1j~g=D&ZqnjsW>
C3q&*k
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..9660c6e10278c3e989228846c316193313528a8b
GIT binary patch
literal 8388
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
aI1x2FTK1l*g|LRQ09ix1y1F_gdmI2x*jU;C
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..c6e7031
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..ff81bae
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..880c967
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.9.0'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath "com.android.tools.build:gradle:8.1.0"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = "../build"
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..ce58f5c
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,29 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }()
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+
+ plugins {
+ id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
+ }
+}
+
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version "8.1.0" apply false
+ id "org.jetbrains.kotlin.android" version "1.9.0" apply false
+}
+
+include ":app"
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 0000000..164df53
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..70693e4
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 0000000..5d1d9f6
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ GVTimer
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ gvtimer
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/lib/main.dart b/lib/main.dart
new file mode 100644
index 0000000..15583fd
--- /dev/null
+++ b/lib/main.dart
@@ -0,0 +1,318 @@
+import 'package:flutter/material.dart';
+import 'dart:async';
+import 'package:audioplayers/audioplayers.dart';
+
+void main() {
+ runApp(const GVTimerApp());
+}
+
+class GVTimerApp extends StatelessWidget {
+ const GVTimerApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'GVTimer',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(
+ seedColor: const Color(0xFF21808D),
+ brightness: Brightness.light,
+ ).copyWith(
+ surface: const Color(0xFFFFFFFD),
+ primary: const Color(0xFF21808D),
+ ),
+ scaffoldBackgroundColor: const Color(0xFFFCFCF9),
+ useMaterial3: true,
+ ),
+ darkTheme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(
+ seedColor: const Color(0xFF32B8C6),
+ brightness: Brightness.dark,
+ ).copyWith(
+ surface: const Color(0xFF262828),
+ primary: const Color(0xFF32B8C6),
+ ),
+ scaffoldBackgroundColor: const Color(0xFF1F2121),
+ useMaterial3: true,
+ ),
+ themeMode: ThemeMode.system,
+ home: const TimerPage(),
+ );
+ }
+}
+
+class TimerPage extends StatefulWidget {
+ const TimerPage({super.key});
+
+ @override
+ State createState() => _TimerPageState();
+}
+
+class _TimerPageState extends State {
+ int _setCount = 0;
+ int _timeRemaining = 60;
+ bool _isResting = false;
+ Timer? _timer;
+ final AudioPlayer _audioPlayer = AudioPlayer();
+
+ String _formatTime(int seconds) {
+ final mins = seconds ~/ 60;
+ final secs = seconds % 60;
+ return '${mins.toString().padLeft(2, '0')}:${secs.toString().padLeft(2, '0')}';
+ }
+
+ Future _playBeep() async {
+ try {
+ // Create a simple beep using a BytesSource with a generated tone
+ // For simplicity, we'll use a URL source with a data URL
+ await _audioPlayer.play(
+ UrlSource('data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAA='),
+ );
+ } catch (e) {
+ // If audio fails, that's okay - just continue silently
+ debugPrint('Audio playback failed: $e');
+ }
+ }
+
+ void _startRestTimer() {
+ setState(() {
+ _isResting = true;
+ _timeRemaining = 60;
+ });
+
+ _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
+ setState(() {
+ _timeRemaining--;
+ });
+
+ if (_timeRemaining <= 0) {
+ timer.cancel();
+ setState(() {
+ _isResting = false;
+ });
+ _playBeep();
+ }
+ });
+ }
+
+ void _completeSet() {
+ if (_isResting) return;
+
+ setState(() {
+ _setCount++;
+ });
+
+ if (_setCount >= 10) {
+ // Exercise complete
+ _timer?.cancel();
+ _playBeep();
+ } else {
+ // Start rest timer
+ _startRestTimer();
+ }
+ }
+
+ void _resetExercise() {
+ _timer?.cancel();
+ setState(() {
+ _setCount = 0;
+ _timeRemaining = 60;
+ _isResting = false;
+ });
+ }
+
+ @override
+ void dispose() {
+ _timer?.cancel();
+ _audioPlayer.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ final textColor = theme.colorScheme.onSurface;
+ final textSecondaryColor = theme.colorScheme.onSurface.withOpacity(0.6);
+ final primaryColor = theme.colorScheme.primary;
+
+ return Scaffold(
+ body: Center(
+ child: Container(
+ constraints: const BoxConstraints(maxWidth: 400),
+ padding: const EdgeInsets.all(20),
+ child: Card(
+ elevation: 4,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(20),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 40),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text(
+ 'German Volume Training',
+ style: TextStyle(
+ fontSize: 24,
+ fontWeight: FontWeight.w600,
+ color: textColor,
+ ),
+ ),
+ const SizedBox(height: 30),
+ // Set display
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ 'Set',
+ style: TextStyle(
+ fontSize: 24,
+ fontWeight: FontWeight.w500,
+ color: textSecondaryColor,
+ ),
+ ),
+ const SizedBox(width: 12),
+ Text(
+ _setCount.toString(),
+ style: TextStyle(
+ fontSize: 64,
+ fontWeight: FontWeight.w600,
+ color: primaryColor,
+ fontFeatures: const [FontFeature.tabularFigures()],
+ ),
+ ),
+ const SizedBox(width: 12),
+ Text(
+ '/ 10',
+ style: TextStyle(
+ fontSize: 24,
+ fontWeight: FontWeight.w500,
+ color: textSecondaryColor,
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 20),
+ // Buttons
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (_setCount < 10) ...[
+ Expanded(
+ child: FilledButton(
+ onPressed: _isResting ? null : _completeSet,
+ style: FilledButton.styleFrom(
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(12),
+ ),
+ ),
+ child: const Text(
+ 'Complete Set',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ),
+ ] else ...[
+ Expanded(
+ child: FilledButton.tonal(
+ onPressed: _resetExercise,
+ style: FilledButton.styleFrom(
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(12),
+ ),
+ ),
+ child: const Text(
+ 'Reset for Next Exercise',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ],
+ ),
+ const SizedBox(height: 12),
+ SizedBox(
+ width: double.infinity,
+ child: FilledButton.tonal(
+ onPressed: _resetExercise,
+ style: FilledButton.styleFrom(
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(12),
+ ),
+ ),
+ child: const Text(
+ 'Reset',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ),
+ // Timer display
+ SizedBox(
+ height: 110,
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (_setCount >= 10) ...[
+ Text(
+ 'Done!',
+ style: TextStyle(
+ fontSize: 56,
+ fontWeight: FontWeight.w300,
+ color: textColor,
+ fontFeatures: const [FontFeature.tabularFigures()],
+ letterSpacing: 0.05,
+ ),
+ ),
+ const SizedBox(height: 10),
+ Text(
+ 'Exercise Complete',
+ style: TextStyle(
+ fontSize: 14,
+ color: textSecondaryColor,
+ ),
+ ),
+ ] else if (_isResting) ...[
+ const SizedBox(height: 20),
+ Text(
+ _formatTime(_timeRemaining),
+ style: TextStyle(
+ fontSize: 56,
+ fontWeight: FontWeight.w300,
+ color: textColor,
+ fontFeatures: const [FontFeature.tabularFigures()],
+ letterSpacing: 0.05,
+ ),
+ ),
+ const SizedBox(height: 10),
+ Text(
+ 'Rest Timer',
+ style: TextStyle(
+ fontSize: 14,
+ color: textSecondaryColor,
+ ),
+ ),
+ ],
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
new file mode 100644
index 0000000..d30f0f0
--- /dev/null
+++ b/pubspec.yaml
@@ -0,0 +1,20 @@
+name: gvtimer
+description: A simple app to track German Volume Training (10x10) sessions.
+publish_to: 'none'
+version: 1.0.0+1
+
+environment:
+ sdk: '>=3.0.0 <4.0.0'
+
+dependencies:
+ flutter:
+ sdk: flutter
+ audioplayers: ^6.0.0
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ flutter_lints: ^5.0.0
+
+flutter:
+ uses-material-design: true
From b9431a5950d015eeaec1fcfad55439eba02559b2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 19 Dec 2025 03:36:27 +0000
Subject: [PATCH 3/8] Clean up old Android files and finalize Flutter
implementation
Co-authored-by: markrcote <131299+markrcote@users.noreply.github.com>
---
.gitignore | 5 +-
.metadata | 33 ++
.../gradle}/wrapper/gradle-wrapper.properties | 3 +-
app/.gitignore | 1 -
app/build.gradle.kts | 60 ----
app/proguard-rules.pro | 21 --
app/release/app-release.apk | Bin 6539908 -> 0 bytes
app/release/baselineProfiles/0/app-release.dm | Bin 7567 -> 0 bytes
app/release/baselineProfiles/1/app-release.dm | Bin 7488 -> 0 bytes
app/release/output-metadata.json | 37 --
.../gvtimer/ExampleInstrumentedTest.kt | 24 --
app/src/main/AndroidManifest.xml | 27 --
app/src/main/assets/index.html | 337 ------------------
app/src/main/ic_launcher-playstore.png | Bin 12941 -> 0 bytes
.../com/markrcote/gvtimer/MainActivity.kt | 39 --
.../com/markrcote/gvtimer/ui/theme/Color.kt | 11 -
.../com/markrcote/gvtimer/ui/theme/Theme.kt | 58 ---
.../com/markrcote/gvtimer/ui/theme/Type.kt | 34 --
.../res/drawable/ic_launcher_background.xml | 74 ----
.../res/drawable/ic_launcher_foreground.xml | 30 --
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 -
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 -
app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1888 -> 0 bytes
.../mipmap-hdpi/ic_launcher_foreground.webp | Bin 308 -> 0 bytes
.../res/mipmap-hdpi/ic_launcher_round.webp | Bin 3418 -> 0 bytes
app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 1696 -> 0 bytes
.../mipmap-mdpi/ic_launcher_foreground.webp | Bin 246 -> 0 bytes
.../res/mipmap-mdpi/ic_launcher_round.webp | Bin 2388 -> 0 bytes
.../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1968 -> 0 bytes
.../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 154 -> 0 bytes
.../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 4020 -> 0 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2838 -> 0 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 276 -> 0 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 6642 -> 0 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3162 -> 0 bytes
.../ic_launcher_foreground.webp | Bin 148 -> 0 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 8388 -> 0 bytes
app/src/main/res/values/colors.xml | 10 -
app/src/main/res/values/strings.xml | 3 -
app/src/main/res/values/themes.xml | 5 -
app/src/main/res/xml/backup_rules.xml | 13 -
.../main/res/xml/data_extraction_rules.xml | 19 -
.../com/markrcote/gvtimer/ExampleUnitTest.kt | 17 -
build.gradle.kts | 6 -
gradle.properties | 23 --
gradle/libs.versions.toml | 32 --
gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes
gradlew | 185 ----------
gradlew.bat | 89 -----
lib/main.dart | 16 +-
pubspec.yaml | 1 -
settings.gradle.kts | 23 --
test/widget_test.dart | 34 ++
53 files changed, 75 insertions(+), 1205 deletions(-)
create mode 100644 .metadata
rename {gradle => android/gradle}/wrapper/gradle-wrapper.properties (80%)
delete mode 100644 app/.gitignore
delete mode 100644 app/build.gradle.kts
delete mode 100644 app/proguard-rules.pro
delete mode 100644 app/release/app-release.apk
delete mode 100644 app/release/baselineProfiles/0/app-release.dm
delete mode 100644 app/release/baselineProfiles/1/app-release.dm
delete mode 100644 app/release/output-metadata.json
delete mode 100644 app/src/androidTest/java/com/markrcote/gvtimer/ExampleInstrumentedTest.kt
delete mode 100644 app/src/main/AndroidManifest.xml
delete mode 100644 app/src/main/assets/index.html
delete mode 100644 app/src/main/ic_launcher-playstore.png
delete mode 100644 app/src/main/java/com/markrcote/gvtimer/MainActivity.kt
delete mode 100644 app/src/main/java/com/markrcote/gvtimer/ui/theme/Color.kt
delete mode 100644 app/src/main/java/com/markrcote/gvtimer/ui/theme/Theme.kt
delete mode 100644 app/src/main/java/com/markrcote/gvtimer/ui/theme/Type.kt
delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml
delete mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml
delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp
delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp
delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp
delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
delete mode 100644 app/src/main/res/values/colors.xml
delete mode 100644 app/src/main/res/values/strings.xml
delete mode 100644 app/src/main/res/values/themes.xml
delete mode 100644 app/src/main/res/xml/backup_rules.xml
delete mode 100644 app/src/main/res/xml/data_extraction_rules.xml
delete mode 100644 app/src/test/java/com/markrcote/gvtimer/ExampleUnitTest.kt
delete mode 100644 build.gradle.kts
delete mode 100644 gradle.properties
delete mode 100644 gradle/libs.versions.toml
delete mode 100644 gradle/wrapper/gradle-wrapper.jar
delete mode 100755 gradlew
delete mode 100644 gradlew.bat
delete mode 100644 settings.gradle.kts
create mode 100644 test/widget_test.dart
diff --git a/.gitignore b/.gitignore
index 82b5173..f3a7ef5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,7 +68,10 @@ app.*.map.json
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
-# Old Android app files
+# Android local properties
+android/local.properties
+
+# Old Android app files (no longer needed)
/app/
/gradle/
gradlew
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..adafc45
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,33 @@
+# 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.
+
+version:
+ revision: "d211f42860350d914a5ad8102f9ec32764dc6d06"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+ base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+ - platform: android
+ create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+ base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+ - platform: ios
+ create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+ base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate command.
+ #
+ # 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/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
similarity index 80%
rename from gradle/wrapper/gradle-wrapper.properties
rename to android/gradle/wrapper/gradle-wrapper.properties
index 297607e..7bb2df6 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Sat Nov 22 19:27:29 EST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
diff --git a/app/.gitignore b/app/.gitignore
deleted file mode 100644
index 42afabf..0000000
--- a/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
deleted file mode 100644
index 616412b..0000000
--- a/app/build.gradle.kts
+++ /dev/null
@@ -1,60 +0,0 @@
-plugins {
- alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.android)
- alias(libs.plugins.kotlin.compose)
-}
-
-android {
- namespace = "com.markrcote.gvtimer"
- compileSdk = 36
-
- defaultConfig {
- applicationId = "com.markrcote.gvtimer"
- minSdk = 24
- targetSdk = 36
- versionCode = 1
- versionName = "1.0"
-
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- isMinifyEnabled = false
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro"
- )
- }
- }
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_11
- targetCompatibility = JavaVersion.VERSION_11
- }
- kotlinOptions {
- jvmTarget = "11"
- }
- buildFeatures {
- compose = true
- }
-}
-
-dependencies {
-
- implementation(libs.androidx.core.ktx)
- implementation(libs.androidx.lifecycle.runtime.ktx)
- implementation(libs.androidx.activity.compose)
- implementation(platform(libs.androidx.compose.bom))
- implementation(libs.androidx.compose.ui)
- implementation(libs.androidx.compose.ui.graphics)
- implementation(libs.androidx.compose.ui.tooling.preview)
- implementation(libs.androidx.compose.material3)
- testImplementation(libs.junit)
- androidTestImplementation(libs.androidx.junit)
- androidTestImplementation(libs.androidx.espresso.core)
- androidTestImplementation(platform(libs.androidx.compose.bom))
- androidTestImplementation(libs.androidx.compose.ui.test.junit4)
- debugImplementation(libs.androidx.compose.ui.tooling)
- debugImplementation(libs.androidx.compose.ui.test.manifest)
- implementation("com.google.accompanist:accompanist-insets:0.30.1")
-}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
deleted file mode 100644
index 481bb43..0000000
--- a/app/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/release/app-release.apk b/app/release/app-release.apk
deleted file mode 100644
index 84ec5e16a0000052aff0d19a2eab2b045c61d437..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 6539908
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