diff --git a/.github/workflows/build-deploy.yml b/.github/workflows/build-deploy.yml
index feed4f1..d42b46d 100644
--- a/.github/workflows/build-deploy.yml
+++ b/.github/workflows/build-deploy.yml
@@ -4,6 +4,7 @@ on:
push:
branches:
- main
+ - ryan-2025-update
pull_request:
branches:
- main
@@ -12,80 +13,80 @@ jobs:
build_web_and_apk:
name: Build Web and APK
runs-on: ubuntu-latest
-
+
steps:
- - name: Checkout code
- uses: actions/checkout@v2
-
- - name: Install Flutter
- uses: subosito/flutter-action@v1
- with:
- flutter-version: '3.x'
-
- - name: Get dependencies
- run: flutter pub get
-
- - name: Test
- run: flutter test --coverage
-
- - name: Build web release project
- run: flutter build web
-
- - name: Create CNAME file
- run: echo "mergedata.ca" > ./build/web/CNAME
-
- - name: Upload web production-ready build files
- uses: actions/upload-artifact@v2
- with:
- name: production-files
- path: ./build/web
-
- - name: Deploy to GitHub Pages
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- uses: peaceiris/actions-gh-pages@v4
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: ./build/web
-
- - name: Build APK
- run: flutter build apk --release
-
- - name: Rename APK
- run: mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/MergeData.apk
-
- - name: Upload APK
- uses: actions/upload-artifact@v2
- with:
- name: MergeData.apk
- path: build/app/outputs/flutter-apk/MergeData.apk
-
- - name: Bump version and push tag
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- id: create_tag
- uses: mathieudutour/github-tag-action@v6.2
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- default_bump: patch
-
- - name: Create Release
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- id: create_release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ steps.create_tag.outputs.new_tag }}
- release_name: Release ${{ steps.create_tag.outputs.new_tag }}
- draft: false
- prerelease: false
-
- - name: Upload Release Asset
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./build/app/outputs/flutter-apk/MergeData.apk
- asset_name: MergeData.apk
- asset_content_type: application/vnd.android.package-archive
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install Flutter
+ uses: subosito/flutter-action@v1
+ with:
+ flutter-version: "3.x"
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ - name: Test
+ run: flutter test --coverage
+
+ - name: Build web release project
+ run: flutter build web
+
+ - name: Create CNAME file
+ run: echo "mergedata.ca" > ./build/web/CNAME
+
+ - name: Upload web production-ready build files
+ uses: actions/upload-artifact@v4
+ with:
+ name: production-files
+ path: ./build/web
+
+ - name: Deploy to GitHub Pages
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ uses: peaceiris/actions-gh-pages@v4
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./build/web
+
+ - name: Build APK
+ run: flutter build apk --release
+
+ - name: Rename APK
+ run: mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/MergeData.apk
+
+ - name: Upload APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: MergeData.apk
+ path: build/app/outputs/flutter-apk/MergeData.apk
+
+ - name: Bump version and push tag
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ id: create_tag
+ uses: mathieudutour/github-tag-action@v6.2
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ default_bump: patch
+
+ - name: Create Release
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ steps.create_tag.outputs.new_tag }}
+ release_name: Release ${{ steps.create_tag.outputs.new_tag }}
+ draft: false
+ prerelease: false
+
+ - name: Upload Release Asset
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./build/app/outputs/flutter-apk/MergeData.apk
+ asset_name: MergeData.apk
+ asset_content_type: application/vnd.android.package-archive
diff --git a/.gitignore b/.gitignore
index 1402e01..8d12875 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,9 +7,11 @@
*.swp
.DS_Store
.atom/
+.build/
.buildlog/
.history
.svn/
+.swiftpm/
migrate_working_dir/
# IntelliJ related
diff --git a/README.md b/README.md
index 4820fe9..bb81419 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,57 @@
# MergeData
-Robot scouting app developed by FRC Team 2706 Merge Robotics.
-
Now featuring... a working Google Sheets integration!!!
+#### A scouting app for the FIRST Robotics Competition developed by Team 2706 Merge Robotics.
-## Documentation
+View App · Quick Start Guide · Frequently Asked Questions
+
+
+ Table of Contents
+
+ - Features
+ - View App
+ - Description
+ - Quick Start Guide
+ - Frequently Asked Questions
+ - License
+ - Support
+
+
+
+
+
+## Features:
+### **Modular**
+* Every season, a new JSON file is created, which controls all the questions in the app. You can easily tweak it anytime to reflect changes to your scouting procedure. No coding skills needed!
+### **Universal**
+* We use Flutter, a framework compatible with most platforms, including iOS, Android, and in a web browser.
+### **Google Sheets Integration**
+* Scouts can save and send data to a Google Sheets spreadsheet once scouting is done.
+
+
+
+## View App
+Our app is hosted on GitHub Pages at https://mergedata.ca. It is also available on the Apple App Store and as an APK for Android devices.
+
+
+
+## Description
+MergeData is a modular FRC scouting app that is designed to be run on any device, including devices running iOS, Android, Windows, GNU/Linux, and macOS. Every season, a configuration file (JSON) gets created which allows the scouting questions to be easily changed to collect any data that is important for your team's scouting strategy. When done scouting, the data can be saved locally, scanned by other devices via a QR code, or uploaded to a Google Sheets spreadsheet.
+
+
+
+## Quick Start Guide
+Installation instructions coming soon TM
+
+
+
+## Frequently Asked Questions
Coming soon TM
+
+
## License
This project is under the Apache 2.0 license, please read the `LICENSE` file for more information.
+
+
## Support
For support, bug reports, or feature requests, please create an issue [here](https://github.com/FRC2706/MergeData/issues).
diff --git a/android/build.gradle b/android/build.gradle
index e83fb5d..041e887 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,5 +1,5 @@
buildscript {
- ext.kotlin_version = '1.7.10'
+ ext.kotlin_version = '1.9.25'
repositories {
google()
mavenCentral()
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 3c472b9..cb086a5 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
index 7cd7128..7ef64d7 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -23,7 +23,7 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version "7.3.0" apply false
+ id "com.android.application" version "8.1.0" apply false
}
include ":app"
diff --git a/assets/games/2025.json b/assets/games/2025.json
new file mode 100644
index 0000000..a9d8b75
--- /dev/null
+++ b/assets/games/2025.json
@@ -0,0 +1,178 @@
+{
+ "Pre-Match": [
+ {
+ "name": "Scouter Name",
+ "required": true,
+ "type": "text"
+ },
+ {
+ "name": "Event",
+ "choices": ["Niagara", "North Bay", "DCMP"],
+ "required": true,
+ "type": "radio"
+ },
+ {
+ "name": "Alliance Station",
+ "choices": ["Red 1", "Red 2", "Red 3", "Blue 1", "Blue 2", "Blue 3"],
+ "required": false,
+ "type": "radio"
+ },
+ {
+ "name": "Match #",
+ "required": true,
+ "type": "number"
+ },
+ {
+ "name": "Team #",
+ "required": true,
+ "type": "number"
+ },
+ {
+ "name": "Starting Postition",
+ "choices": ["Left", "Middle", "Right"],
+ "required": true,
+ "type": "radio"
+ }
+ ],
+
+ "Autonomous": [
+ {
+ "name": "Crossed Starting Line",
+ "type": "bool"
+ },
+ {
+ "name": "Auto Coral scored on L1 (bottom)",
+ "type": "counter"
+ },
+ {
+ "name": "Auto Coral scored on L2 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "Auto Coral scored on L3 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "Auto Coral scored on L4 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "Auto # of Coral Dropped",
+ "type": "counter"
+ },
+ {
+ "name": "Auto Coral Pickup Location",
+ "type": "radio",
+ "required": true,
+ "choices": ["Floor", "Human Player Sation", "Both"]
+ },
+ {
+ "name": "Auto # of Algae Removed from Reef",
+ "type": "counter"
+ },
+ {
+ "name": "Auto # of Algae scored in Processor",
+ "type": "counter"
+ },
+ {
+ "name": "Auto # of Algae scored in Net",
+ "type": "counter"
+ },
+ {
+ "name": "Auto # of Algae Dropped",
+ "type": "counter"
+ },
+ {
+ "name": "Comments on Auto",
+ "type": "text"
+ }
+ ],
+
+ "TeleOp": [
+ {
+ "name": "TeleOp Coral scored on L1 (bottom)",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Coral scored on L2 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Coral scored on L3 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Coral scored on L4 (branch)",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Coral Dropped",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Coral Pickup Location",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Algae Harvested from Reef",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Algae scored in Processor",
+ "type": "counter"
+ },
+ {
+ "name": "TeleOp Algae Scored in Net by Robot",
+ "type": "counter"
+ },
+ {
+ "name": "Teleop Algae Dropped",
+ "type": "counter"
+ }
+ ],
+
+
+
+ "EndGame": [
+ {
+ "name": "Attempted Climb?",
+ "type": "bool"
+ },
+ {
+ "name": "Ending Position",
+ "type": "radio",
+ "required": false,
+ "choices": ["None", "Parked", "High Climb", "Low Climb"]
+ }
+ ],
+
+
+ "PostMatch": [
+ {
+ "name": "Defence Rating",
+ "type": "radio",
+ "required": true,
+ "choices": ["1", "2", "3", "4", "5", "N/A"]
+ },
+ {
+ "name": "Ability to withstand defence",
+ "type": "radio",
+ "required": true,
+ "choices": ["1", "2", "3", "4", "5", "N/A"]
+ },
+ {
+ "name": "Did they die during the match?",
+ "type": "bool"
+ },
+ {
+ "name": "Main Cycle",
+ "type": "text",
+ "required": false
+ },
+ {
+ "name": "Comments",
+ "type": "text",
+ "required": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/assets/pit/2025.json b/assets/pit/2025.json
new file mode 100644
index 0000000..a8ce5e1
--- /dev/null
+++ b/assets/pit/2025.json
@@ -0,0 +1,55 @@
+{
+ "Pit": [
+ {
+ "name": "Scout name",
+ "required": true,
+ "type": "text"
+ },
+ {
+ "name": "Team number",
+ "required": false,
+ "type": "number"
+ },
+ {
+ "name": "Weight (lbs)",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Drivetrain type",
+ "choices": ["Swerve", "Tank", "Butterfly/Grasshopper", "Mecanum", "Other"],
+ "required": false,
+ "type": "radio"
+ },
+ {
+ "name": "Other drivetrain",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Where can you pick up from?",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Autos",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Where can they score?",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Endgame: Can they climb?",
+ "required": false,
+ "type": "text"
+ },
+ {
+ "name": "Other comments",
+ "required": false,
+ "type": "text"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 9625e10..7c56964 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 11.0
+ 12.0
diff --git a/ios/Podfile b/ios/Podfile
index fdcc671..d97f17e 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-# platform :ios, '11.0'
+# platform :ios, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 77b15ed..7154b01 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -31,12 +31,12 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios"
SPEC CHECKSUMS:
- Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
- shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
- url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
-PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
+PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
-COCOAPODS: 1.12.1
+COCOAPODS: 1.16.2
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index b60ff0f..7189c12 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -215,7 +215,7 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
- LastUpgradeCheck = 1430;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
@@ -452,7 +452,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -475,7 +475,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = "com.mergerobotics.merge-data";
+ PRODUCT_BUNDLE_IDENTIFIER = com.team2706.mergedata;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -580,7 +580,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -629,7 +629,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -654,7 +654,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = "com.mergerobotics.merge-data";
+ PRODUCT_BUNDLE_IDENTIFIER = com.team2706.mergedata;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -677,7 +677,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = "com.mergerobotics.merge-data";
+ PRODUCT_BUNDLE_IDENTIFIER = com.team2706.mergedata;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 87131a0..8e3ca5d 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
=3.3.0 <4.0.0"
- flutter: ">=3.19.0"
+ dart: ">=3.6.0 <4.0.0"
+ flutter: ">=3.27.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index d41512b..9ead1a4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
-version: 1.0.0+1
+version: 1.1.0+1
environment:
sdk: ">=3.2.3 <4.0.0"
@@ -31,16 +31,17 @@ dependencies:
flutter:
sdk: flutter
- url_launcher: 6.2.6
+ url_launcher: ^6.3.1
+ url_launcher_ios: ^6.3.2
flutter_svg:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
qr_flutter: ^4.1.0
- qr_code_scanner: ^1.0.1
+ qr_code_scanner_plus: ^2.0.7
gsheets: ^0.5.0
- shared_preferences: ^2.2.3
+ shared_preferences: ^2.5.2
dev_dependencies:
flutter_test:
@@ -51,7 +52,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
- flutter_lints: ^3.0.2
+ flutter_lints: ^5.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
@@ -69,12 +70,12 @@ flutter:
# - images/a_dot_ham.jpeg
assets:
- assets/games/2024.json
- #- assets/games/2025.json
+ - assets/games/2025.json
#- assets/games/2026.json
#- assets/games/2027.json
#- assets/games/2028.json
- assets/pit/2024.json
- #- assets/pit/2025.json
+ - assets/pit/2025.json
#- assets/pit/2026.json
#- assets/pit/2027.json
#- assets/pit/2028.json