From 9239c77106e74d5d6f547ff37a56a538911dbffc Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 17 Sep 2026 08:26:27 +0700 Subject: [PATCH] ci: add keystore/key.properties to repo, fix NDK version, remove duplicate build.gradle --- .gitea/workflows/release.yml | 19 +- .gitignore | 5 - .metadata | 90 +- ANDROID_SETUP.md | 186 +-- QUICKSTART.md | 156 +- analysis_options.yaml | 65 +- android/.gitignore | 28 +- android/app/build.gradle | 80 - android/app/build.gradle.kts | 2 +- android/app/proguard-rules.pro | 7 + android/app/src/debug/AndroidManifest.xml | 14 +- android/app/src/main/AndroidManifest.xml | 74 +- .../res/drawable-v21/launch_background.xml | 24 +- .../main/res/drawable/launch_background.xml | 24 +- .../app/src/main/res/values-night/styles.xml | 36 +- android/app/src/main/res/values/styles.xml | 36 +- android/app/src/profile/AndroidManifest.xml | 14 +- android/build.gradle | 31 - android/build.gradle.kts | 48 +- .../gradle/wrapper/gradle-wrapper.properties | 10 +- android/settings.gradle.kts | 52 +- .../1024 x 500 - feature screen.png | Bin 0 -> 177689 bytes .../432px - blue box - green background.png | Bin 0 -> 10413 bytes .../432px - blue box - white background.png | Bin 0 -> 12005 bytes .../432px - green box - white background.png | Bin 0 -> 12034 bytes .../432px - white box - blue background.png | Bin 0 -> 11437 bytes .../PNG/432px - white box - transparent.png | Bin 0 -> 10777 bytes .../432px - white box - white background.png | Bin 0 -> 8208 bytes .../432px - blue box - green background.svg | 16 + .../432px - blue box - white background.svg | 16 + .../432px - green box - white background.svg | 25 + .../432px - white box - blue background.svg | 31 + .../SVG/432px - white box - transparent.svg | 31 + .../432px - white box - white background.svg | 31 + .../512px - blue box - green background.png | Bin 0 -> 12395 bytes .../PNG/512px - blue box - transparent.png | Bin 0 -> 11741 bytes .../512px - blue box - white background.png | Bin 0 -> 14450 bytes .../512px - green box - blue background.png | Bin 0 -> 12502 bytes .../PNG/512px - green box - transparent.png | Bin 0 -> 11252 bytes .../512px - green box - white background.png | Bin 0 -> 13766 bytes ...icon only - no safe area - transparent.png | Bin 0 -> 16830 bytes .../PNG/512px - icon only - transparent.png | Bin 0 -> 8828 bytes .../512px - white box - blue background.png | Bin 0 -> 13671 bytes .../PNG/512px - white box - transparent.png | Bin 0 -> 12812 bytes .../512px - white box - white background.png | Bin 0 -> 9929 bytes .../512px - White box - blue background.svg | 29 + .../SVG/512px - White box - transparent.svg | 29 + .../512px - White box - white background.svg | 29 + .../512px - blue box - green background.svg | 14 + .../SVG/512px - blue box - transparent.svg | 14 + .../512px - blue box - white background.svg | 14 + .../512px - green box - blue background.svg | 14 + .../SVG/512px - green box - transparent.svg | 14 + .../512px - green box - white background.svg | 14 + ...icon only - no safe area - transparent.svg | 24 + .../SVG/512px - icon only - transparent.svg | 24 + ios/.gitignore | 68 +- ios/Flutter/AppFrameworkInfo.plist | 52 +- ios/Flutter/Debug.xcconfig | 2 +- ios/Flutter/Release.xcconfig | 2 +- .../contents.xcworkspacedata | 14 +- .../xcshareddata/IDEWorkspaceChecks.plist | 16 +- .../xcshareddata/WorkspaceSettings.xcsettings | 16 +- .../xcshareddata/xcschemes/Runner.xcscheme | 202 +-- .../contents.xcworkspacedata | 14 +- .../xcshareddata/IDEWorkspaceChecks.plist | 16 +- .../xcshareddata/WorkspaceSettings.xcsettings | 16 +- ios/Runner/AppDelegate.swift | 26 +- .../AppIcon.appiconset/Contents.json | 244 +-- .../LaunchImage.imageset/Contents.json | 46 +- .../LaunchImage.imageset/README.md | 8 +- ios/Runner/Base.lproj/LaunchScreen.storyboard | 74 +- ios/Runner/Base.lproj/Main.storyboard | 52 +- ios/Runner/Runner-Bridging-Header.h | 2 +- ios/RunnerTests/RunnerTests.swift | 24 +- lib/database/siab_database.dart | 186 +-- lib/main.dart | 194 +-- lib/models/registered_device.dart | 82 +- lib/screens/devices_screen.dart | 636 ++++---- lib/screens/home_screen.dart | 287 ++-- lib/screens/main_shell.dart | 412 ++--- lib/screens/timbang_screen.dart | 1396 ++++++++--------- lib/siab_config.dart | 28 +- lib/widgets/connection_card.dart | 158 +- lib/widgets/data_packet_card.dart | 252 +-- lib/widgets/statistics_card.dart | 152 +- linux/.gitignore | 2 +- linux/flutter/CMakeLists.txt | 176 +-- linux/runner/CMakeLists.txt | 52 +- linux/runner/main.cc | 12 +- linux/runner/my_application.h | 36 +- macos/.gitignore | 14 +- macos/Flutter/Flutter-Debug.xcconfig | 2 +- macos/Flutter/Flutter-Release.xcconfig | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 16 +- .../xcshareddata/xcschemes/Runner.xcscheme | 198 +-- .../contents.xcworkspacedata | 14 +- .../xcshareddata/IDEWorkspaceChecks.plist | 16 +- macos/Runner/AppDelegate.swift | 26 +- .../AppIcon.appiconset/Contents.json | 136 +- macos/Runner/Base.lproj/MainMenu.xib | 686 ++++---- macos/Runner/Configs/Debug.xcconfig | 4 +- macos/Runner/Configs/Release.xcconfig | 4 +- macos/Runner/Configs/Warnings.xcconfig | 26 +- macos/Runner/DebugProfile.entitlements | 24 +- macos/Runner/Info.plist | 64 +- macos/Runner/MainFlutterWindow.swift | 30 +- macos/Runner/Release.entitlements | 16 +- macos/RunnerTests/RunnerTests.swift | 24 +- pubspec.lock | 1380 ++++++++-------- pubspec.yaml | 68 +- siab-release.keystore | Bin 0 -> 2788 bytes test/widget_test.dart | 116 +- windows/.gitignore | 34 +- windows/flutter/CMakeLists.txt | 218 +-- windows/runner/CMakeLists.txt | 80 +- windows/runner/flutter_window.cpp | 142 +- windows/runner/flutter_window.h | 66 +- windows/runner/main.cpp | 86 +- windows/runner/resource.h | 32 +- windows/runner/runner.exe.manifest | 28 +- windows/runner/utils.cpp | 130 +- windows/runner/utils.h | 38 +- windows/runner/win32_window.cpp | 576 +++---- windows/runner/win32_window.h | 204 +-- 125 files changed, 5540 insertions(+), 5285 deletions(-) delete mode 100644 android/app/build.gradle delete mode 100644 android/build.gradle create mode 100644 app-store-assets/feature-graphic/1024 x 500 - feature screen.png create mode 100644 app-store-assets/icons/432px/PNG/432px - blue box - green background.png create mode 100644 app-store-assets/icons/432px/PNG/432px - blue box - white background.png create mode 100644 app-store-assets/icons/432px/PNG/432px - green box - white background.png create mode 100644 app-store-assets/icons/432px/PNG/432px - white box - blue background.png create mode 100644 app-store-assets/icons/432px/PNG/432px - white box - transparent.png create mode 100644 app-store-assets/icons/432px/PNG/432px - white box - white background.png create mode 100644 app-store-assets/icons/432px/SVG/432px - blue box - green background.svg create mode 100644 app-store-assets/icons/432px/SVG/432px - blue box - white background.svg create mode 100644 app-store-assets/icons/432px/SVG/432px - green box - white background.svg create mode 100644 app-store-assets/icons/432px/SVG/432px - white box - blue background.svg create mode 100644 app-store-assets/icons/432px/SVG/432px - white box - transparent.svg create mode 100644 app-store-assets/icons/432px/SVG/432px - white box - white background.svg create mode 100644 app-store-assets/icons/512px/PNG/512px - blue box - green background.png create mode 100644 app-store-assets/icons/512px/PNG/512px - blue box - transparent.png create mode 100644 app-store-assets/icons/512px/PNG/512px - blue box - white background.png create mode 100644 app-store-assets/icons/512px/PNG/512px - green box - blue background.png create mode 100644 app-store-assets/icons/512px/PNG/512px - green box - transparent.png create mode 100644 app-store-assets/icons/512px/PNG/512px - green box - white background.png create mode 100644 app-store-assets/icons/512px/PNG/512px - icon only - no safe area - transparent.png create mode 100644 app-store-assets/icons/512px/PNG/512px - icon only - transparent.png create mode 100644 app-store-assets/icons/512px/PNG/512px - white box - blue background.png create mode 100644 app-store-assets/icons/512px/PNG/512px - white box - transparent.png create mode 100644 app-store-assets/icons/512px/PNG/512px - white box - white background.png create mode 100644 app-store-assets/icons/512px/SVG/512px - White box - blue background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - White box - transparent.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - White box - white background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - blue box - green background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - blue box - transparent.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - blue box - white background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - green box - blue background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - green box - transparent.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - green box - white background.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - icon only - no safe area - transparent.svg create mode 100644 app-store-assets/icons/512px/SVG/512px - icon only - transparent.svg create mode 100644 siab-release.keystore diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7602d4f..4ecade8 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -35,21 +35,6 @@ jobs: - name: Run tests run: flutter test - - name: Decode keystore - if: env.KEYSTORE_BASE64 != '' - run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > siab-release.keystore - env: - KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} - - - name: Create key.properties - run: | - cat > android/key.properties < About Phone - - Tap "Build Number" 7 times - - Go back to Settings > Developer Options - - Enable "USB Debugging" - -2. **Connect device via USB:** - ```bash - # Check if device is detected - adb devices - ``` - -3. **Run the app:** - ```bash - cd flutter_siab_app - flutter run - ``` - -## Option 2: Use Android Emulator - -### Install Android Studio: - -1. Download Android Studio: https://developer.android.com/studio - -2. Install Android SDK and create an emulator: - - Open Android Studio - - Tools > Device Manager - - Create Virtual Device - - Choose a device (e.g., Pixel 5) - - Download a system image (API 30+ recommended) - - Finish setup - -3. **Start the emulator:** - ```bash - # List available emulators - flutter emulators - - # Launch emulator (replace with your emulator name) - flutter emulators --launch - ``` - -4. **Run the app:** - ```bash - cd flutter_siab_app - flutter run - ``` - -## Option 3: Build APK and Install Manually - -If you can't use USB debugging, build an APK: - -```bash -cd flutter_siab_app -flutter build apk --release -``` - -The APK will be at: `build/app/outputs/flutter-apk/app-release.apk` - -Transfer to your Android device and install it. - -## Troubleshooting - -### "No devices found" -- Ensure USB debugging is enabled -- Try different USB cable/port -- Run `adb devices` to verify connection -- On Linux, you may need to add udev rules - -### "Permission denied" -- Check USB debugging authorization on device -- Try `adb kill-server && adb start-server` - -### Bluetooth not working on emulator -- Physical devices are recommended for Bluetooth testing -- Some emulators don't support Bluetooth BLE -- Use a real Android device for best results - -## Required Permissions - -The app needs these permissions (already configured): -- Bluetooth -- Bluetooth Admin -- Bluetooth Scan -- Bluetooth Connect -- Location (required for BLE scanning on Android 12+) - -Make sure to grant all permissions when the app requests them. +# Android Setup Guide + +## Option 1: Use Physical Android Device (Recommended) + +### Steps: + +1. **Enable Developer Options on your Android device:** + - Go to Settings > About Phone + - Tap "Build Number" 7 times + - Go back to Settings > Developer Options + - Enable "USB Debugging" + +2. **Connect device via USB:** + ```bash + # Check if device is detected + adb devices + ``` + +3. **Run the app:** + ```bash + cd flutter_siab_app + flutter run + ``` + +## Option 2: Use Android Emulator + +### Install Android Studio: + +1. Download Android Studio: https://developer.android.com/studio + +2. Install Android SDK and create an emulator: + - Open Android Studio + - Tools > Device Manager + - Create Virtual Device + - Choose a device (e.g., Pixel 5) + - Download a system image (API 30+ recommended) + - Finish setup + +3. **Start the emulator:** + ```bash + # List available emulators + flutter emulators + + # Launch emulator (replace with your emulator name) + flutter emulators --launch + ``` + +4. **Run the app:** + ```bash + cd flutter_siab_app + flutter run + ``` + +## Option 3: Build APK and Install Manually + +If you can't use USB debugging, build an APK: + +```bash +cd flutter_siab_app +flutter build apk --release +``` + +The APK will be at: `build/app/outputs/flutter-apk/app-release.apk` + +Transfer to your Android device and install it. + +## Troubleshooting + +### "No devices found" +- Ensure USB debugging is enabled +- Try different USB cable/port +- Run `adb devices` to verify connection +- On Linux, you may need to add udev rules + +### "Permission denied" +- Check USB debugging authorization on device +- Try `adb kill-server && adb start-server` + +### Bluetooth not working on emulator +- Physical devices are recommended for Bluetooth testing +- Some emulators don't support Bluetooth BLE +- Use a real Android device for best results + +## Required Permissions + +The app needs these permissions (already configured): +- Bluetooth +- Bluetooth Admin +- Bluetooth Scan +- Bluetooth Connect +- Location (required for BLE scanning on Android 12+) + +Make sure to grant all permissions when the app requests them. diff --git a/QUICKSTART.md b/QUICKSTART.md index bd44258..cb038ed 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -1,78 +1,78 @@ -# Quick Start Guide - -## Prerequisites - -1. Install Flutter: https://flutter.dev/docs/get-started/install -2. Install Android Studio or VS Code with Flutter extensions -3. Enable developer options on your Android device - -## Setup Steps - -1. **Navigate to the app directory:** - ```bash - cd flutter_siab_app - ``` - -2. **Get Flutter dependencies:** - ```bash - flutter pub get - ``` - -3. **Connect your Android device** (USB debugging enabled) or start an emulator - -4. **Run the app:** - ```bash - flutter run - ``` - -## First Run - -1. **Grant Permissions:** - - The app will request Bluetooth and Location permissions - - Grant all permissions (Location is required for BLE scanning on Android) - -2. **Connect to SIAB Device:** - - Tap the blue floating action button (FAB) at bottom right - - App will scan for devices named "SIAB" - - Once found, it will connect automatically - - If no data arrives, it will try common start commands - -3. **View Data:** - - Streamed data packets appear in real-time - - Tap any packet to see detailed information - - View statistics at the top - -## Features - -- ✅ One-tap connect/disconnect -- ✅ Real-time data streaming -- ✅ Detailed packet information -- ✅ Statistics (count, rate, duration) -- ✅ Automatic start command detection -- ✅ Clean, Material Design UI - -## Troubleshooting - -### "No devices found" -- Ensure SIAB device is powered on -- Check device name matches "SIAB" (case-insensitive) -- Verify Bluetooth is enabled on both devices - -### "Permission denied" -- Go to Android Settings > Apps > SIAB Bluetooth > Permissions -- Enable Location permission (required for BLE) - -### "No data received" -- App automatically tries start commands -- Check device documentation for correct command -- Device may need specific initialization sequence - -## Building APK - -To build a release APK: - -```bash -flutter build apk --release -``` - -APK location: `build/app/outputs/flutter-apk/app-release.apk` +# Quick Start Guide + +## Prerequisites + +1. Install Flutter: https://flutter.dev/docs/get-started/install +2. Install Android Studio or VS Code with Flutter extensions +3. Enable developer options on your Android device + +## Setup Steps + +1. **Navigate to the app directory:** + ```bash + cd flutter_siab_app + ``` + +2. **Get Flutter dependencies:** + ```bash + flutter pub get + ``` + +3. **Connect your Android device** (USB debugging enabled) or start an emulator + +4. **Run the app:** + ```bash + flutter run + ``` + +## First Run + +1. **Grant Permissions:** + - The app will request Bluetooth and Location permissions + - Grant all permissions (Location is required for BLE scanning on Android) + +2. **Connect to SIAB Device:** + - Tap the blue floating action button (FAB) at bottom right + - App will scan for devices named "SIAB" + - Once found, it will connect automatically + - If no data arrives, it will try common start commands + +3. **View Data:** + - Streamed data packets appear in real-time + - Tap any packet to see detailed information + - View statistics at the top + +## Features + +- ✅ One-tap connect/disconnect +- ✅ Real-time data streaming +- ✅ Detailed packet information +- ✅ Statistics (count, rate, duration) +- ✅ Automatic start command detection +- ✅ Clean, Material Design UI + +## Troubleshooting + +### "No devices found" +- Ensure SIAB device is powered on +- Check device name matches "SIAB" (case-insensitive) +- Verify Bluetooth is enabled on both devices + +### "Permission denied" +- Go to Android Settings > Apps > SIAB Bluetooth > Permissions +- Enable Location permission (required for BLE) + +### "No data received" +- App automatically tries start commands +- Check device documentation for correct command +- Device may need specific initialization sequence + +## Building APK + +To build a release APK: + +```bash +flutter build apk --release +``` + +APK location: `build/app/outputs/flutter-apk/app-release.apk` diff --git a/analysis_options.yaml b/analysis_options.yaml index 0d29021..85f6774 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,28 +1,37 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore index be3943c..c908258 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -1,14 +1,14 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java -.cxx/ - -# Remember to never publicly share your keystore. -# See https://flutter.dev/to/reference-keystore -key.properties -**/*.keystore -**/*.jks +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index 1896a70..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,80 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -android { - namespace "id.ptsemangat.siab_scale" - compileSdk 36 - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - applicationId "id.ptsemangat.siab_scale" - minSdkVersion flutter.minSdkVersion - targetSdk 34 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - signingConfigs { - release { - storeFile file(keystoreProperties['storeFile']) - storePassword keystoreProperties['storePassword'] - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -flutter { - source '../..' -} - -dependencies {} diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d897521..5d46f34 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -14,7 +14,7 @@ if (keystorePropertiesFile.exists()) { android { namespace = "id.ptsemangat.siab_scale" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + ndkVersion = "27.0.12077973" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 968ebe9..2b6cef6 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -6,6 +6,12 @@ -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } +# Play Core deferred components +-dontwarn com.google.android.play.core.** +-dontwarn com.google.android.play.core.splitcompat.** +-dontwarn com.google.android.play.core.splitinstall.** +-dontwarn com.google.android.play.core.tasks.** + # SIAB Scale app -keep class id.ptsemangat.siab_scale.** { *; } @@ -14,3 +20,4 @@ # sqflite -keep class com.tekartik.sqflite.** { *; } + diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 399f698..8ffe024 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index eb0025b..68f7a35 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml index f74085f..1cb7aa2 100644 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 304732f..8403758 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml index 06952be..360a160 100644 --- a/android/app/src/main/res/values-night/styles.xml +++ b/android/app/src/main/res/values-night/styles.xml @@ -1,18 +1,18 @@ - - - - - - - + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index cb1ef88..5fac679 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,18 +1,18 @@ - - - - - - - + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 399f698..8ffe024 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index cbb6a64..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '2.0.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/build.gradle.kts b/android/build.gradle.kts index dbee657..1f88145 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,24 +1,24 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -val newBuildDir: Directory = - rootProject.layout.buildDirectory - .dir("../../build") - .get() -rootProject.layout.buildDirectory.value(newBuildDir) - -subprojects { - val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) - project.layout.buildDirectory.value(newSubprojectBuildDir) -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean") { - delete(rootProject.layout.buildDirectory) -} +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index efdcc4a..913c864 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index fb605bc..4e35a44 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -1,26 +1,26 @@ -pluginManagement { - val flutterSdkPath = - run { - val properties = java.util.Properties() - file("local.properties").inputStream().use { properties.load(it) } - val flutterSdkPath = properties.getProperty("flutter.sdk") - require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } - flutterSdkPath - } - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.9.1" apply false - id("org.jetbrains.kotlin.android") version "2.1.0" apply false -} - -include(":app") +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "9.0.0" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false +} + +include(":app") diff --git a/app-store-assets/feature-graphic/1024 x 500 - feature screen.png b/app-store-assets/feature-graphic/1024 x 500 - feature screen.png new file mode 100644 index 0000000000000000000000000000000000000000..14c857a7dff93af54ec815ca2eac74c702c6056c GIT binary patch literal 177689 zcmYIv1z1$u_x8|84vhjbAl=fPLr4oqhje#IcS%WyG>k|~4blkG-5r8}ba#End%yqv zJ@YWkoH=L5+H0?P*Sn)sm1VIpUSNPgAnZ4CP&E(;8Tg2Bj*bZYV}bVh0$+lxrKD6{ z)np|hZ=|JoUkmW^vU0M$27wq7+!I!rL*A11iiL0Wrc*aMRsXCUQ;Z@rS16l|V@YFoxS@9I5rCa~(7Q|y|91Xq=R zL&oz`&a%dvW6gCqf<*t4WY@Y!S?Dm*#LAS5OI@QbUZ}ME!=&YOsqdkYZA>>dO6hK> zERoVEh6=h$g#}M^L)c=n84aB;(^A>O`bW)>9~SGY_IN_P z#)qu^R(ZX_;F6Z z(MH|`I<-(CD{{<{a_AfzwwnIGw<@ahXG;Zc$%dVawlCQ+ z;*jxz;-q7CN9P;F`~(B!`kh>5Y2>hz|FZ}&Q_DKWLrtC7F_Z#Ea@b(7D{q@4}z&g6%Qe;u!lru=P!G`vI> zl+*K8{LJ)+G(z?N$zup{8(}mFrGW@U2KxW=XF1jcote3se*xtEzh-MY^bm%UVqyL7 zB@V)WqJsVrJ{A`yIU=_ThORx+_Gi{^{cmu!p9oxF*$!|* z%#b?;0$_L??~wxk9bN`S93XZw1$9gY>_F_mLM+y-(VTyN+FJX&K%9jkLLW^5>9&1C za7vc=X%YSJlDfLBNs6Cs4{qFLvUd6!|F1b5giNuk6gpygRtPWXU!kSX3uI#=P~c#i z;{{@a{t+#yg-7b*PSz)&;UC9c_hbJ5EG_nb(%6T{0uNyPiQe$ZWbMxXU;6}X$Zp#A zy}yId;%=0F{I@P!p+E=3$j664Mx%f7=7Y(x{_9-e7dWrWyz1z&{}>J^I>-N>F%zi* zk&CWo?LJ8x*UhU9J^QcwtgM^?XR5qcYpo&e^P4Ha5cdDm<)J8KVZP-BVCTJj736vG zNPl(fP>Yg*^0z|)IE0$o22S`_ZBsBO4u*-1C2CgLjp~p3k$P7~Kz~=n73)W-7_dEG z_o3{-Euz1v&hIsA9R$>fedX5s^y2U6wzR2c9`ULh6aT9J8@4_`^1t^_<+YA{Ozx_a zasOHFUJTN4I|)F(=`WPsYbrW{PBGID40l>Y;(dKepGbAKEdFmz1V|B&g-4M5{R!*6 zSJxa@7M{+FPCv6^{x{qFHQ}|wPNkb)u9w0t0oDbLCjU*AJoroidyQdyJFRNr>bEV9 zop)chO)6F&58wY^+K}2V=4`mFDPVn8zH=_#Xho|u(KY-*8Syv$uYcqhUu_rtCIzkF zkX|Yh^Mxu$BM*Cr@qXpYu#AMi3X$#|85xcD8n6>5J#EDf+0X6aguPt!Li4t+(Urrj zZA`N_daTX=slTh$qig9AE?TZFoRA(F|J$OAH*0aP{DoX`uZwrN#*28}L$?1-?m0Ts zpr`Pd9b0AZAV^hM|Ton2BP#mNpy8|a=aiA82mPJ%xpr}6j~nqna!CUN`naH z&{C}Z0Hz8}p5W%9*qGQjf%G$f{ZEw zGOL@lF#>Ijkn{xMfDQ2^Gid>rF3yMo0wE&4us1}1Cf;M%VU^KgwV2=$15wQbt3g1B za*POJU@M(eyq|DZP|W7Hq1_<#S=>O?$ZM?eIedl~>p;XXa8Z4XB@|g)=>-D9C-GMp z5OJCc9t>Bk%pt_c*YCLzcEqhK@Ki%kL5$G4&&YTP)IFCW=6b2gsrJQcC5nPc^2K(8 z#FBGy+5JV$%|0`g2F-T!HI8cgPjc_jB_|IB;nR|3K5uKp}Lrs*(osDMjc08(J& z$L{r!Y#~0!mHWO|@ecDf-K>p)swE%VjGmK{_Nk~a!X|c-4~kqe>df_&nSd_qSb}6S zWW<9&3}AF1xI|ZU!xjI%Oh18cjHaY(TTx$)855-lhRcE=XGWwEQeTWohoth}?1@K6 z{j3(Wpg>?~ON{(QPi;y;DijLh$O#@w20?Yvg90Pv#0j6NQZ^!k-U{PWqbJkd_X~Rz z(4rIOrw~>W$}yrKT0yX6F>>Fa8@JqByhgx#D;LxWuegN6S5{VdZ2wN#qI)2vwY615 zL}bV9HtgEvpKaxOtv|akjM@>r#lQM2J(AaM?zoWh!D_qG;8j-_(I{W(`P`g#iAHJi zpxVI5NSqySaq>jbyS!k?aY)CN9|3A8Vm%$kw5KFt4~6pdbf6P8C~|o(Usj(?i4X4( z5j_EsyyloK?{eIuu)^@Oa4)RD>3K%Hd;%Cb zI#gU~L7Pl6{l^)pjwLiU>jDVDi@BSc#I)n@(pYkwerZGu2g-`@NAIJA$tJbK_QbO8r!5NzttpFdY^ zSFN8N+q%z~!X)$c+4NEmyjJ>-!4M28mw83DSv41hNP&Gsu&Uf2g-;=5ZIG9jawI0 z0e+5-j!fM|y?-s|7U?=*ckf0^+AI`)kW=**Bd9VE`d`-OE_?5ddhE~rYH}#i*3hN; zcz<4}=fTQo-C9UvOVN?Q6*Fhk9}ou}tj{j8zSFtefa z)-4ysqCkPb^MB+!AgnWD^nH8$-?8N*IIVRAjrwlYj*8yJ>@|f+{%|)KtWk~p5rhE! z#(oQ1%)vxcIAm7#1mYba_-_5~hj{_E><&qu7(KGViaou>Vcyy{F zS_E<1ir_#K`i5tHZy4IquEr=iJL#j6JK^?0lGYW$;$h=1Jd+fO-bf$>s-gAn(ELQg z@=67hubC=KMG!5iOUpgZX1Q@O*@r!XZR*e01<4zAo^_U-&wD-CT8=y8ea{QGvs`gx zkpY*>p*VT7@H+?>$KD!FIF#UYPYOzr-|XdkxL#bn8JU_g%h%2#&pj3%t*Ovp;t}L5 zh*HddQ&F$R#MI>)iXe6teToJhPaMoo&Z}n(Q1@8=sP!x<5?26oh%LYWmIozxojKwO zJUtG%{7KpBC>6_ddY_8PGU!5HTv*r&gTZPG&mN8fo|-G$MH|ol4R6_nvoKnm1eCD? zA?OZGJ6{4GW&I>f#E<0n?bwta*JAwe zq`}Q4d1=P%ks_1=+U}{}8hJQ(vM7buSt-m~nWZ-p;B+s=i~wp$s?wBbLaK0{=w!_= zF?iOjFb)~%yt@9GdX_{!jp`d3T=~I&gL3W!T&%}%PZYz*DN8dpsPF32c)b7lbd~?~)xD&#g^f$iev_{4 zAe^3#E*SDj?TZ@Y1mQITNL7+KyXu9vnKvCG9wWGI!j?UtesUoyvN3fj0ZaNl6A7z9 z(^M#jjv8VR9p`7?o3?oIe1cqYc`DWPY{bw{skA5s_8!~#6L5;f8oR}676pv?g$0j^ zH?{;^6g*ojg~>xa$}2V>Mt|YhLW9(j)F(rbLgY()4%_ayav#sv*49pp+x|%w5jSy# zG`aPVx8$^s0WWL6^!-F=^(OAfC(Ojy#bv_XfI3kP|80o|zGTs)^&(tk6se%=-R3sN z7nPMTZxP;>FFe*2DowkB-_)An2XdY)a2D%DkNWO?3MJa%%t?MfZASA&IJFW~4FiIY z7*v=1HA*fCaJBf6+zAKTk{DE~dEe~ybSDzk(Cdm6VdOy&WQ?er9cwBY8cpfMpE{k+ z^G{xFoj2TFKchu{*MRUgEiJ+$!WFvLdm?xrA6B2174tiI|Ir`rXiUxncI5_MJ&dhy z2?1B00kd|`b4a?nx{U5SNn~YZfroxinN@2~=)TIc*YO7wQ(r_*s1hD;0bDFW$mFh|4>L>vU_ zg4~CFOEO*uRb3*CFq7)98X#mf`9*m01k_BYrXB{<_aGzC!}Vlb>r-V)C(UIbK9w)4 z*^7&d6`?$!RE!bZ(TS{7yWsGu-NLs_eL--R4#s0Qdd z9zy~(OH~@$*Q}IHo9Iv-5i{)(Cd{B`p21uZ5J9aw{uo|W|1He<6usMAO*2x zyqA=Ju7sL-Ky*A!Vxem?4sf-Hl6;T(1*7q+%INe7qF_2Q%wnd! zr2c?riY-!?4lWZS);dW2P$`ol;y|!ydSXjLstNwM691Bd%=TzszrkTy>*--t>>*>+ z&CTr__CKHjJ4Z$5?e7AffY&vJfVP~O=fC*tYh?MBi=y;rSySZOwviId2lXpqt*x(e zM==@6d;7OIL!?4?v z3Mow*8gbtJQO%{p^4U?nkO5635LZS8ihpMCMXvbq^CTTE_;Gw38Cq08r5HtpUBm-U zP?InDmNucAgp;fpG^1O>As(ribeyOrzXwt6$r{)F9E+H&N#~6*RHut3Z(R{dEkS5a zlpan8M-Ln#l>mbosj-peQJ6SF7>O8QNSqexd3Bm?M>4rdg zalD#5eTw&$&&pj|zzvCrNNau9taMgysTegxx_7!WE1_0M5E?o4;DoFg6Nn!9#k;*j zE}j;Y6pP130YP|cB^(%MF>dA%L>A_z<_@d(__UxdThPJU{Ocl z%jns_rVALk=vkOtF_%3BMTv$kN)RFS=YEX=q9o9JLdT$dL5Iall>qNOY`&$j$w~FH zHoBB|1p+ENkk&jKY?@}8V9POvqiUT*edS0Q^fV&$!cQ+_WFk$R(Fx9|!97I08<`JQ zEGafs-=*u@=x5yCV39`PysHwIs=XPTgNd?3{FU7GzmL3vUpKRG0nrxL+5OG?-hr3V(Wk6f#6<|- z%m-7)$KOu;zB2@0%iBWhScI}i0LQWbuc(Jp(5JX0tLZX>Ac%N3k6IPF_0AhoT5bF0 zk+FiTGo|})4jR79FZJ^H=t)r5w0|k}C#OPAaF^t1P~`vg>_LU${N%Mv0D8yoTh$N-&c&PPOQ_Rh$3RHP^FLtZ%HoY{CLe;@rmk<3ZxEnoU4@6g?6pwO`MSF2(L z{Qp^y~-Y2PC&5^V0LuX3)FC86q9SMTo9AG4XwJJ=R4oj>$Rp{6Luj_ zXyj5#$hJLk;8ES|YZq?PpCP=+&qp(40L^F9t?9Z@xw1lPY?KSqc*4qP^+yZ2o}zh_`cO&&!; z9D1@Up{fpMQHX z6M66+}mbaZ`UGFRrhsXlS?^;u_U&_E2(ktTNZhs_F!46*8#ZPX;ZQ zg;IKdp&oQ#XK?UynAwaVONi?teIiUXf79z>*Xu#P_!UP@S4~$EozP0&W&sYQ24}Nx zVe&CZija?bZwSvygu+7Q^`?IjSpRT;C9YAEvu+9^7>qBlcn(q1DTu-!P>uB<&me?= zlxo<+FA)$md008|xbn?a55lNh!p3hU&FG;s(vph~b?@?inOx6Ma}}RBEIXfK&wM(+ znGGYQn6hlT?N0N%6%u>c^K2ct@xXaocr_YhTyMt!!FrH(6Kv18xSt9uA~%%yTs7ly{xwqzcMm=P3IR2RqeHfSOU zl;8PBR4EhCqr51Myx@*mK^AEu+>3p5q<;d6D@@*+U7wgU@9U8=!kx?w6`(!qBq0ur}=v*=>i3unoY zFIIZywO9=^m&V(t3H=TB5J91IvCK1BQkW%8{1&lHF-4Ae4t)u+DV-O1_>Iw>vZ1@Ui%5m9PE0_lT;3Ib{Hd z>-F^Z>>HLZ<2+klCH0dxJ&n`t)QKWc6(l4ipi%ld4W_aJDbU^J0T~5ZnZ`idk%ZMA zH3%I_hzO#lrHmyJvmx-89@--P_2s!ZGK6C(v+KU19<`hoM2#$gjyU}CMYVIOlr7)= z4y1x7RK``iXmMY9fTT5+#4AB2{EiBH(Ccl|E<8k!q{{7|vQJTKX-;8Sn@CVs_tCT?X33r0w5oWpk z`IeUtfQ#Ob?MIZ-`%LW{x%uyPUJoS9OvZ)ZeJc%C_ zw6H@8wd@xH)uMczwSqgp_vJDB^1>ZDp1lj91Lc-J6eJ`$3swh+;ta}irugIc$hh-B z497SsWj_`~gFs-Epg4*$!oykHoacoj#tW~dc`*@5E9g&tI$Nn;Cu_SueQsxLO852T zDUK?Su|a=#A7^RcEWp6-zbs^QGZ)_MaL;SS!z0iLfSVP14fYFlJ2iuBKEK>c2-JOE zQO~*`wQR&KI=1^ws(}$1N97GTlK&5r!?AdkeKZH3*rq{eWwcs~6Bv*@Kyk++5IVdC~BnU&!7KT{CZ7msvh=LJ>E*S}j zU%D|>)Fq~xFYFUl^b*7xf+oLXUnU7v+5Up7mLsHqN)J?KOOe!d-iRcU`zuxX3C{eo*Hb}{h<8&cM zjVF#86fV)f%H8Fnv7w8?O8p(^et=I9Ml9Dt`02x`*C|@=?UJ9^VjA+ z|JiUumgkC>k`6NeI0GSu*xmeS+sQ>0E;jaU5JoUWOys~TXWkYERFIn(dZ=$OUdq{Q zPr)8P+-(fL6^Wh>=uD6LKm(OuDqmob$@*@p@hCU3PsTVsqu5y;qZf|kP`NvjQb93ngb@2a>3y|SFXg+$TQ72MAA1FAoq;$Kx zAr{`lPA0u_2X*Y^CnG5(u_c?XtMWgxv7LJ9`-6^muP|7b0rvHgV`RQ!YouJID48im zK8YX+3JJ~1=*Nx6dewP+JoeanCkm{T?`cvlIVGi7y3=1#@-iQsTc&1B0JSUuoe!uT zfBrCltS7**5o#*1wY~hKI)HBQrcLVJcKNBUNbE*azJZdCv^p>fa?#|Zy`XdL(PF8EoB=*;$TNH^yc@pbRd6$JDX#&Cf) zt9^u+ndf8ZFK_P{6CuewyriW8vW`L}tMoA`HVps!xqo-w3#k1t_s0Io`-@ay{xWsKovu)?SAvB^{Cb7YCnfG_s?Ytc@Lt9&0wlprSZG3#&Zb!RR zZpkGz#$!Lov0uRZ_Z{$qlauQ4gz>wh_NUvu)mGQ-k&tKrJ#l3@OBi{#{RIdwP`HFJ z*^&Fsgh3p;<&hdTF!wyf4J$i)>z$pQmt@a96dafiv{R8m&~YFzCo|ykadB|Ns@}?W zQlsxA;5f~YTEZyB-soHFYl1+^zclxB-;zy*?AGfL#`MgPF1&h+>dZs^Jc?oFi0Z9K zUC+9NWGS6E{VQL|XtOv^4K6+MGxdv|h#*Z6k5Jk0?KgM%Ct>%?Cd0Yv{UwE}4{IZf zzN2K6lzKI0{pu?A{@nn`ZGyV_1b6_T752ijJP{?8cXLeG+Uz5HZDv8bUSX zVg6D*Ld-+0T(?mY-Fm_c1_g~}#w@UhamzG-0k)Am#q=ctwY84!Ubc`Y@4)-7%`(sm zR@PKgX7Hv-32hotC+!4BFUj2}Q_TuI5HfnQJgn%G#~PZcsp-6;hl`DxwKVdP*Qih1 zWqnnJQM><3_P@n|^e)N!o{0;RBQHft2P^ioMay3mpmaMiWWq@233L4}J(QqNr&H=G zle#KOD)senfjCn_zz-W2{B}Gj8hE>Xkz>wh6xr!#qpOJ~_w&b3_nWeYQq!IT{6~NJ zFPLDp=~YUL`)~zRIl_YrOuADBmxl-k^&p-G4)S;q0v-woKLbpMoG2d2fRZjo9L(B* zw}vkFOirOs4tUA;EsU8+l%Z7c*3FMONJSt~@VW_pV?c?X{5BV)Og5qEjt$!iqf^=S zy&soEOWXsu>F^G(mn@?AW7ScyAWl$Dh! z{!;9ouAw(cr|cdz{OeZo(Y;I&J9nqtL+^Yud}Ks;ZRH9ryk+Zuz8gU%9t?GU=FH zpSEvGG~{(B&RP_CrHamO?&toCF{X{`2F%1iUPY*@t5Z-=Fw)Z^+bC_AZiv57mC+TZ`*`tl z9Pt-x4D%_(L_bEjhQGAGE%IH1<+>*IJwzDR=gq-~lJ~Xp* zD{Gjz8*@`Mk2hC$u(4WfNqqCy<&y@(voD#^TiOK4M1+W>&QwSAOc5h+9M$5pFrB%2 zN8{AFsPGUPTO+q>0R}CmO1+i#r;eElJ)lUlKfk~!8@bmsYjCw?Vr;QJl1)3yLsDjR zkY1D|RHw2hHhR4%aYFLGvianSLpPp@5Q9F~w}x@~4SL>iJOQ;Nd5D=#>I@AB)+Cn@ z76Xx4Eo)(6;jj2JJ40VZDE9MTtb=Oio{LgfeRg_1r^RR7xXW!+)sJ~f(cLCMP3h;) zpJQY16)L;0LhgrR?18u-;Exn#(@77Rml0;TF)>4~fy+SrSr?K73;-o~ScH)vDK4On zWRe(p&q9Ezw$*S)PiJr*&(c+<%9IY??)5D7k zl8w2H+qF$A=E~o%r~mNge+&gd@Sw@D3jI2JMe;-0G0!>vgfmx%Yb?5_9ww(ZoyaeL zw$2h{G+q{RLv|AY)HsB8&M3x%@oT-o`t#TMa~X@SVP->^$OG^SZJ*O1k!HkIcCCRp z`&I9~3Of+Fblpt*(_Om}3$e%HlFmuX?_T=OP7Nw|qkO6GE1FlsiSn+)k_ehw157EW z1S-M_MbMQ-1Do3`TKzIf#Z#8Ecd9}Ho@9zg~p zvephdYHS0A&3!Ii7UH6B%7Qm$);egnmkkXKpH1?@I)~QQ#O;0MhhI-KHN4#yox1Jq z+FgAcuew+DJP1S}sG>$s0#c)qsWP8ot}O#=ua=)!C?St5d3J4>1s|1j%`7X4dREY6 zzSkjEwnYo#fvYWJbnK(f*+u0?kRfS(&`g` zj$}p}Zq4cFaL`y;-we<<{%Y3y?vF$##QD_vNaANc3s(;=jR0;2_&)aLeHW^qmD$aL zLW1PIRMe2BtChPKl2265HkeshJF)0 zPcnb4DC=O+^Ki92Anr|iS70O@;2s!n^Z-t_zrTOiQ?v#<4&zK~fMDTfpCaC_PQdcb z{n`C0jWlh{29Jys7&+)jC{CTNxq{Wc!oEUMu3=wUMddE%3BV--a-a4A1yMpkXsdU7 zu=&ilEfB8#fl6EG z+w*DFbMvB>$HD%(!C*l@IfAIiGh#J9WIpZ1Qu-_EhpGnMc}Dgw}80UwZTa zsiDnz?Q*D<+j?TWfiyqgY|=f@+U)Ue;Be^NP4GbYZojrT*I#fJ(L2YgLhK|;EN5i< z?hZG7*4}O1VsM(2 zw5cDoN?K})bpMDCvY|G|_nD=u`?G+)_5Ha??1Zq8+b5qqw-2h9{qS!Zbkt6E4DY^{ zy-Q~1en(SL(yV?NU$Pm!X(q8f!Osa>bTK(n{r24;mC5@}1ahD~8Y1jhi@Lo6B53~) z<|TGn%CgJ5hWlv`F{6UoSzRK^ocV()BU>e+KfldSABPRcVSFt#t)6oB3x}*mEL9&8 z&axMma9c#9K@Fn%E6xz@an@DucXa*~2tP83(=)%eZCuY#r6I0+v;SgNf`>0$ky5-8 zf1|f;B@x8y8<;*t(Trnd8+(w(?1E4%KOh3Q|Dk*fL&IK_TRsyvzv(@}V1B z6~TF{n))Wk?3~4~_z@KwTPE-_o>$y;VE5SF>Al~ol2dV$`<^MdRY9+OW8@0K2`|Xc|?KM1u97Bkk1&ViK9=VTE zzbXI<4}!K6Du~*GGb2^swpt^Y0RtT`;gehhm3Wv*iH2kc(V$jLe5{I+QhnWTyWSJu zDt$IwY}_jC>dqKqM@&$E%uG>8`(>T3Dc7kyeO6w-A&|Ix7)I1iqx_6l+^KpjKeufE zJox2A%-^udEc-0uh@|c01YWhQd3#OfntQF=)-2U>b9ydayvW7ocP@5H>0^4iGQ3iC zg-Yq~cezq5qU6*gzk_nTo@5XEH6uHSxb}_&ma{^X)uPC5LvSU$nIbX(bM}>STsUmo z*xW(OJz*2*@;ZL*Xx^Y-4P`T;L0{`78(spKQ)9xozMg5)oQhxXhosw%;gKYnvgh-Ei>o zUN(+CAc2N|pFxkq*dI4!#U6WyiFf&b8O*kCmlX5*?d?4o6Ke>M?(P3^%F^g}Ct){C z9IXF+=2hVi+Xu?H#e8B1O%A-D?cq~^VUq3ZZPFA`&HV0VQ3SYrOb)aT=d4O;193|`Ois%UqRN9~8a$Spgnx1GV zv+s=m6~8m~3zJ{C>se)NFMoE`Z6D9x1qUl2{-~~YR5W<{ID|BMi)j2_5=J5Xq|w}< z0G3cdHFB4*8GKwjv2P=sOC=~~NrH!}r|OYZ)#lD^sSuyL1t}Yui!?5`pDW%);3iZ0 zkN8{*93`92{Khiy__E>cww<(6IC{gy#%e>LJ87yXtgiI+6+N(mkJ)Ko5Z2~Jete{L zasDhf?=;<5LJz<7d&Oi_gxkjGIa<|X>2WKPy`Ew4*gsfdB&ylyl-*j$j!sy}wokHY0oM`iYvMIjM&^lC7LGk6XFR9#`_q~TtokdB75och!xgg68MF$QWq6)E_UlA-nD2!VAo zOvl1iY9-%kXRkt1m^GER&mtMZ6pPj5ir%bx^->U)#2E*wl;^2cY_!uUvVIg((Jy>4 z>vsAf^_myaisdC63ZT{z#mRf)AG=*-1DrPJFHQAYi#^dqC{A0{_p4i8jwV&1gA6_5 z&gN#;Qnrh6VoD!h*Vid16Ujl&-3EFaZft!vH6%P6qD4ZO(mFHn4Sf9NZTZa`&xy|6 zo*`>5(B>=?ldlQf-i@IH3osIU)#xdr)3&XZGHaOFjT!7_C9 z-|hH%NTz-lF|A`;LE&d}V656`ZB+kLSKjWdG!i5VikGsR&ej}fD(0b>H$AP=(bOz9a~brZYqjg5QgvS ztnSk~NxK!i1=u#D(Kyx*M;}Q9z8{~DZp4ILArz^VY!0Rsii_735l*lmf~c+~@={KP zt2CI1F~aKUvo%hH8-B|xe3`HYOENzEPKr;8GdUQBe|J7t=A7pnd7$N(kE8oFM|d2= zHy?Y7xJx}r&`|2tlg#p9EhvYOmSr5U^JSvAUF(mH#A4@&=E=aBdReo%EY7Idbem=E z)zy>woVPfFxJtzLQ}V@BrvaDw9D-$v^%MKYJBPm2Qzsn=ivvOK2iMD02UY=IL0&e8 z-k6Z8CJuAGvFY$6uhvr8w%hfoh?P%7k&dmLXML_K0}k_vc%W|%F!vE%+xPnI*JgLv zX`JD@dKpB=<2Y{GxaMIF2EaOsXFX#^8B`I>{G|frHB{atRpHnQVf_ zatP#;Xx~B@iL-BQKY=ZjTy=V$Q&Q>0(t|`p}mFeDV zmsYK$moH3RUM!u(O3fCFLJbn}p8V}@X})wdy|vkvH;j{dvJ7A=e;_arx-y@Yr$R2! zW3z<;^bC0JtK#^`A3uKh95q@V<+SE(V-A*1K1TJq4{o}kfPBT!gFzsGTPsWnN>)os zQYT1K-;{U1yOQrFBm2x@kURlg0Qh7*u!`i&^z^Ar5F|JEtvo{DjQ3N}qlnKXz+S4- z5X`x9)2p?pKoy7fR*Q@Z-TYSPPMCO6c)-EUSfK$%HeB}u*k>%N;I+>Rv$?xY??S#* zL$Ct@svaC(_o7u_?)f3A%-4Dx#MCF1&_WPTdp?J#cFa} zIO?zNt?50dQN$#m;?W3JQ#F05alk5{WfGg9O8>c0MVkk8{jxt}<1mA^jF@#-5?~|h zH$aOhy{~_T$PEu+;E6n(PXfe>LQ_-Z0!{1d~7mG3bI^K z;Nnq>JAQEfQ|G?7w($b=@W=%z0a;^egVhP8l|h`Gg-wt-IIza`n8V z{r>Li@fZE$s;A@q4f~;DWt#`PjwH0i&D+~Wm(l%l-qMyRT`4-DvtD*%1MrPrxB%DO zb;^ol=Adlks5%Q!=HMDY`XeJF081MboUDfalOZJ(J-DMvqs66BSe;>r@S|n6mnQG$ z?980Q-Q58TE&!)}JTDfjps1n~T#iACt>50hgsTrPmtrVQGrxI9?B~bP?(d!vWHSUR zx1EG&6n6QunNyJYydCcTHf$F%n?Zchi;nmM@BOQN_D*fuC6j!IY^t3pSq!m2Gm{R9 znAFDe$Mj%g_SV}MgmStnii&VgH@l_p3DaL*tz9lUk{}w)5=9zaPl(Yu0t)BZJ0e1o z6L6@Qzm_`S_kaW-oOIr}YcV z98nGqw_bxQZ0y*!`%-2c@;|F^Kg)jBr+avFgshA@<90tiA6W&{kgz=qyac8icOCn6}r&F1ORFX$-O zWtTBXO=9gX$Z>{PsRD^`eN7=4aG98qN&7?WS~;ss#M*CeH$qUXL2`_vUgH8#8fYC+ zy0|zEHB4je4oD8wDnI1NiUV0lwcXC0zk)&;IQTDBJ}*kqhnnDofI>=}GP#pUf)wRW zT~aoVz<2mrchDmt@m*9ybwO#Rg0mqA{Hf~AUOybZC3dF~gt+##Q9wbtoz^xUVC(|0h20q?&^d-w1gF2K+_)gjy z`YH9hhd}=9QEE?3-^^`%RyJ(bL`MJ_7#MUFnlfv$_#D^*nNh$hQJPU*UBh-#z~wJj zBi~DP6_Hw(ZcfI{sj2g-fLd6wWfZvc>Yukrn?BA(|4}N};>4RIhcR+5tpsNe;*+q;{KFT2#B;&uef<>_cN0{PX zjVLv&w5)gYIyzqm*Q!=jDzLYn>#g4Mf}p&CPz{*~4S6phQ(*LI;}Z~Y2l7)KEF3Ic zTu%?Txl{l_J9>9{wAf&Au;9c}>fN5C7eX6ZHz{?$h3!cg7mHLoD4r#&x?C|Z$Arwp zVy%*{9fnSTS^7g(Td5!BG-%>lUU-3#KQ(WIMFPk^9b zrI-sY3B?J1_9pX(FFeoZ<$1ng_K{!bMG`J)Yq`zZyX!VaUA}acOmDl4jF8Q}5o>E} zAk94w$>ZQM6&hLV5C;I#d^8j49KTB)Sn$1~A-eOAFp~ELW@LB<9y?(TkN0s^_h+;0 zZO1JclKF*&5BU+fK((>iGcA?vKwymT+fIpP?YzFISnUUA5)cDy<#L8^*>yEU$m6i_ zxP`>s-Gfc1Mw_t$k>{P;QNUV$G<)0o4`zg*$&#sw6$dCw8Z)kgZ(T!!&-}znrF8bN z4}olu{i0_*9Bx+o9O~RJy`5WqSVyZs-0SH#y4dQI1}9;*h>!>NT=vou)}U6U|M*lQ0Q+gZe^=FXPvGv)@X;iS za3hl_M4N;T!a3gtEsEkc7SH2G$wb7K52>PpU~u2OK*E-AV;&>5I_9~_^u>rr3KlP< zG^+Bx8h+iA8Rv(~%_Js2$}A+H@uIg@KC%&d zOuB0Rk7q`5D-+<1)M#=l_!&aa^oooLtn;kd} zF(oe$S6kP>mm=SOKEP~w$^{(TI1_=@ff+)-6>;Om=#PFhPTz=csJ~blbM*#}9ad|9 z0-zPaI9GsfhLmt~z@Q3szm>41NM8nhM45FLS`cDkgnfc0_nQR<);<1;6^nE`{nn|% zxzr}1UM^ThrqO3s9e?qp0~i9aHudn=B4;&5`<1@ zIUG*K=UmB}z~~+dLS$6?!I(c5K|;0S#aA*gt4t`OzaD1n{!}%_A&2o?Po|!|@WoRI z51mBpM=?D+Rf7RH=^|xAPgJmVLE;_;RgU*ABQIzR7frBp0>X^ z&i-iGXYCQ~?waLvye}4%xAVk*ovv6i3@A;kLY)+AEw7|~+-isM~%0ku$ zOrXBeq5E}s^HJM&kh-#=&(`x|5`{z7hR4%{-kg2I8aer!%hl$?cU3Lk(*x!}@s*N{ z>}iwYYQ^WNN5to9aU?z5)1smu4~GXbK+&Zf{j{;3NfQnch!V~0E=TPaXW~1* zo3{Mw1weV~#S2tZb{R4K0SqUe>pWT{=A{YZA5Pv?wO#b`Wt0MNgxA?tG1981wpS+Q z!^49g8V*)G^*y59|8W7Z(4Yzn3twl{$L6O`cC`#dxYT_gY^&ZeeP5?dLzejVwQSNk zOFFuVt!b^r1=ixSd0JUHlER$!8P;fPpvRYnP*yX=uHag)1{W&zW)2U%R`ejvZ^>#Z&%W!5^EL~Zk zINRIB)>cXKj6L86lW=Z)yxMj4(4=}U(N^GFK!9lOm9UC+EO3;_kIR`q$k*CvONpQldPC>LAB9`A=_V@mI{N zmRm4F$hmEZt!I&uLkTy>G^ZVkbTt&Sh^eOE)kTJ?(QxDk#3OgcYJ>5UH_4@a)kZfnYs5IuLJ2{}I={$tnUo8?82KX2W4}@^H#Uq1IcYu{{pQsN?>IAvKk+4DL}T3< zXzcfDbOS%?f)7r`dvR%Ld1(m)A|&*-lRZeQ$_xj>ynh&${@SqhoL)#NAx@>jpw{G~ z3_q$qbVpNBn5uAQa(n3+! zqmWm~drmEeobIbBCH&EagqB~w=9dKi5McEcmsM@2J9&^VRB`(E5i>RvXZm^?TLeQn zc3lLLkp1Ngt2P_9t!W(pg8Ae1ZE*Urf4sAUuD0Enxs1}PpZ_YSA{)cDy8ocC2Wu-LYOU!sU zk(qHy_z9wYtQisY&-uqDBNxFUQLJvWDUpybFPS)Z@hBM!-`WjawE&;O@N9BvNazcX zjkx65S^2`qP>QE+3SNK}efcplA)agWEN;YXNkG8B>1Go!(0JjSPTDuErLM0E@x)6g zfBqdz`4@*U>=+s4J{3;bCO9`^D;DiXPzL883K;6c!%W8ywm(UUaN;xogFS%2GCGVm zTPZSh_VC5KHNS->VT3xI63SyYFDi$1#{Bty=K7Lv81`q~jL54zQ-xY;o*9j(Cxc#x zHZ)E77ZWCRC*J^HbV}Geq{!i@jpkP*{j|c8XVh@96I<&8c@xhRe))ZXgTOz7h>BB6 zb}DIOZFi63QlejY;mJbOgA8DSFwJ+YpTp)pbGwOWVnE_@aTkbVxvKWK9&PPFn2>$;pl*#6+&SOFrQ`%d(3qT?&{Zh?*iMNrKKfHdM$I9C^%a~7+kcA zz3HMQESQ>?Q#m0~JcvDwKJLZ= zd+-Ms0S+yNa+@8tMj5aCr@U!&cuHk;3WZVp3S8Q~-%8wG?aXLOwb+;%`M$W^fqAaT zl#)t1z*)ieJL`kDt%(EZOwER`1Uc)JJA_tOTV4B{+g4PZ^f^EJt+scOzF2NBC4_%Q ziAY94>UWZb0zZaOup3r-?6>WQdLu|p)%m#W^>miqdTXEEw)WMq+4$*5NL|q{5Md=1 zk-Nta(w>SEhCE>^c_ERoC3!A0%;SD2GiiiO3F+idF*N6RZWS?WpTFEiI z9-h~I0;Q6813`jVPs-aEmj1_d zadHNww4R$o-E)pbEiFULwbP7>*s4E`y@0$s`b~P6_cktMv1Bw(GYxm+M}IL=^QDsJu57A8xiqo`U?Idi{Lc*i<9c5Bpx+%<#5euC6|{hynlJudKUHcc=NiA>+Xg9%|&wM(~zI==}rQa{&j=%{$)oi+3E_3?*nB2t7&X|WL4Eao%6HV6kv)P@At@?kx-M2pg&phrYG_ z%RVvxb}Ny?8dW6fQX>6-9rj|Kb~++F5(= zE~cZO>yLo*W*J7MOv@T1j3~Tndm=B+sIoZDdhji*^0}+{bl-8@`V_Nr(cjzms`pjs zhr8rM;QoIc!17gjd|J3W;$teSe%j9X((qt+jHKn3(kgq5%7{(s<}*`5-+P}YeO6@h z?yvOvT`PNXH?Gff8Ui&gM#i`jE+n&_!W5+Bs_)F^#&;j5wlh{KRF8hul{3jYwq>si zTxD=_ZfCvub(eU2CMcMlbwt5d;xrUIB8&Cf2wR+wm-XtNm@pZuq)G{iQU<)wSRsP zq@YT4_g*<&r^802`#P~gu;g|$FZRr}Nl&!=*yR-nqeG>rI@r zscb3Yh5t#|veWYk75aPa7Z4$#WF7@&1oAcE`wRQrUEd3%`m>wxYg9s!A&I!^QTcKWT=g!V(*&;^@m-WmTz~@wnnC+?s>$UScaAYeDd|kNw^(#ZOPdVACU9F*h}Y0 zmM`56Bc@EJ7GEFbAV7W?l241S#lzdsbKXP`Hbz!E7joGtVP;C4#2~ds(MWc6L7cUp zNA~ZHB3^MR_vi`VtKn)J+7#WwFVg25IKFz^$`!FLsYWI7&lJh=C;R}x1-ulQBvXhTajkpPE5s$A=|YkAyKXSAGF+o%g6o#{4_ z@`m`A{Hk0f7mIA7G`N~Hr_Sk3UVK!M|06|blVEi&QFUa(kI?%rbHIrif-5D5cVpU@ zwz%Y#5aAjW9UU#oHomeFjm>y$`2Kq!HlMb_{>L95Z~ksVeqVTIvJ_K7lkk()lw^N< zsK+tnLZFjxST!550^>i7^T zs40*&5`1a!=Tb;A*TxQV;2V~4SH^oQAHHm-$wu_|?g70wF;>XS?QQ%A{SlK{y59R< z*OwOPRaS8QsmAkprm1^%IV(hip3Ery=O*)9*g1*DC-%M%M+Uoj+2P!1D9mG6VA>P zPEPj;j*|EYHk@d8>N7-aB+2s=10gv&DH0@9my0q56in{b)ApFzic*h*g}E2EU6l_D z{MqFTo;@=?nRyy5Zd0>|P3GDjPYHW(S+jRt8iaPW)wk7!F4`17E;<_Re5djkO`5UH z^5L({agbG?@v?7QTEWS3zB(W@bYDnFZZOsTC>>l`VDG1`G1lfF@9S$oi|6r_eZ1uN*bE{mTw9)wAknt78d_(8uw_U$4NE` z0V=nrbQCl&JgE+%RfqMcVlSy}4k%SRPlYAXD;k<=->1h`pF1}f@W&0-g(Ia*j}(b* zL6mHcBaRfbEvr!TZ>6>D5LcXTf7^R=dE2EMT{5|AFx22*tqTY7$DxsibT%qQvr7{p zP)6|Qm8Q`S#M9G<>#1qc{>|&#+~OPEbVAJ&g_f4ySoe?TLK;U_YJRFFoFD|_*+Xj+ zaZSG5GUQIBCwTf&g6G@w#tsK zs*{>74a-d`l)0L_6XW|?`PjS9+O{iFF>lahxrUNGnjzph9on(PYbWe^@_R?Qi&5U0 zLnswqiTBfLOFgSW^SzS9gSzI(@Yt#PImO|Xz^u3ORHgk|O+?X#nMW}CHzF>x-zRZh z(oy86$5Pp5=3bR8r-M=ZyukK(mdX5uZS1oNjBKg<(>_$T>h zPfiO!h)!|ziFZCOe#x~=#qT>$>1Xsrhd?;o(8)N;TYV`Y(14s0YXt=isv6#84hH(d zzG!ZwK(Q#5>^>pKKR5q9AQH?2Ld1^sQwQdK2ZyQRu}H~lBR2YzfU;63oCQ(v%sy!z zyJ_FKC&UwMh2DMa9ht4AwtxJ{7V6^dMV4*&_Z{7sAkf^&$;n?C8OgIeH01QXL{#t) zQSPYz@Vv5c%FsBdp_oIMN%EWL(E+k zIIWL)iuzNBb`9)V|2={X-;E#9=04I-jpoM*A2Eu(UR&~x z+JTTNzUciqpptvb)Mdn^hslLOuOzRgo+KHzO%o?uP*6h8+m=(Ek3eWtJQc)NRCYU~ z$qoAeT~8fs{n5w6Dcnu6b|6;nDC0Qo$HrPR)CKK>w){B5p$rfGqB$Mw5k+DYYMwgq zTqZ#KIH!iMt>7mFGWwOIAflJKEAj=mTAQ7L0j7UkbbtH=J5v47u2X|cV>FAYGrEMo ziu|D(>DkMke(WAcwa|LyLT0Rx$7quzhM^lVtKk>Q*7Q=nhIp?(p`UtcMk+!~RbO`A zZkyPpJrES>LLk9W=>hB->grQmQgJWkR(?9Jo2Td_x5&14UJ(S-G}DJe*zA7&G{~D~ z=n3B(VhcErdQ454IR7)=}tps8AfQ zQ3lh)Xwf2cSK)A3BI9BWkF4+Fc$LBw2H8c0bcPxewU`l5rO}7Q$-=gSpkpy){ETGJ z5d4QWO|%Ih(d2JtXDt-bp40rKb5j2BE}r6zX=ZO|i}Le2A6$8!zTVK>WazsKPXht; z;=rVb;D9U@9O4SNhg52bcf}gl0p_7HP;8|FtlXVgV)?fWN(IGJxxHMr&9tE^LOk%w z@Qr#VEb~P0;S4j*J|u|DIU0`?w!s>dXAsqgm$j?|*Eafykfm@`nXhQ+EbvW9tCzm{ zpC-6*VE%8%m>3w4A>tqC@tm5L0q?gPh43DcY6HZ6U|)w)521JIvD+m3B&w9rhv(5> zzRv_d#?8b74d;;N;OYCC;TGTWNVI zb7PV`n;m%P9n-|<(&&Yu0WW{)!Zjr4RAL#Q;lb$P%QV^Q-Y(U-JWj`sj!><)3nHZ} zCh_wNTPceB7)m^cIK!uYLR<=)(1E*M`f<6kXg`I4qe_nMPj{V1oMIFSM@fWUc=M3X zYlj{rUi`OIPKadP zoz{ESoJSu|`z#>G%L-8}mR3$(T^Y}{ILa3SiF0s2D^l=G(gO)3k|N_^pT!doEh`Jp z1CapbhV@72b8w4Gi)qn3{A8FRT?1(MKTp>KbB*YUph4o{c}nuGmaqC8p*i3GH)Tk% z;<9z`>T2>llK8Fc8uV+2RcFD&*pH@)W2V;B@Q|q5gQv)LZC&%MKt@ef_gOP-*u&uM z#@0q%O-&>T|K#B%VgME5$wD|j;k%~s#Gykyf~Gg^W>q=#+uipR+>Fn z0c42O$O@6OqIE4w(@+CX3J*z2Ihx#F*l9x+XaomGp5EvE_%V^4tkKr?0xpt-TY%-C zG>6s6*~#tjm$reykNmpX{j*?+H3Zfc0x%Pc*d#UM@qWPx3{+mxKIfU;r-He_d zLD##vvGH^Hs4E0Z9h2zir!l+YE`F!;or8k|g>)WAvii2x)`kX;?*6za6f9(f&yV={ zGBGcxNaPe1k9Q7oV3;I=C0k!B8JU=>ot@r~X}BSf@|Ner+y!6AcdR*Nh-}^i0W)#{ zoY-$}1*9Az)97_J3y9I5?y&7h6w%~O8kuM=9-g|oItxq7?d@$sJUlZCi>zNwO7cJz zhDjmpeSKmqq*h)~K+DN_ma))lkRbrxT3W&aZ|#gz!Ib3wdueEB9CtZeP-9f1y_FVR zar>RS|HFBvEBr0}Jbu|1^X)YM;B(y!Ki zB<*6ei%B~6EE_~THKl{p~gwt#gUY9)HmWj zM?egvMs*W`jhBq7hWkeWoQ6?Uoj}V)cBvYwSj-?EPgXW21V8Clf6i&?S zr%+nFpk+h!5)}>euz3gPA1`S>(0jyt4j2BtR7CRAz_fx17h6+hPwU}q?BTq?*mXpX znW(yk+w7@npSn7*`T_^TGVmehhy{AKjUQ@VuXssL(aIsiUMXhT`Yj@SZjX})VQoCg zQ)ki~tok)RjtzCeB;)%qo1|Hx+h%tgxoh8iDsA)Dh7ucsYHn_h8Iqq@v=D?2G=u!_kA=X2<-y}Z)r)-jL+^C-#e zgYnQDuLe1>6HaGV-hQY1$~; zKuw*ePI%mSWOO-_@Sed+Djwmn|K52+y7w=fnEPa?^XN;e**jfBx+SlxHM!;(DuSA3r zdoW}ArivA_zgD(-j%M&DB_%C4Z{r2KRwHmJte%CM+CLCwZNT^;17byiZ6Y$ z$5OJhvr|$um6X^lhKaszY|ixnm~C-lBF^Q*Mt@xWvYYM|>&5Rttih^g&x^e%QeK@* zV4@!w^Lsqoohtt1V@Hp73$o?1=M9yW9gkbC7QO21S04wNDrrYEgnc}(x?1-3_O?dS zuPXf>zW(^Ze!Aw^v27u3cbDblcE8eorJ4W76Jgu6l(Moi@7#$#1U@xgpJyh4ySUUX1&@Duh~LIxmI(rh z1;0;H5+I5K+J_NgvB*$}i-tdKSRUoyX6$DnA?PGk`E?-mWoG+~oro#C&i>dy3|o&y zlWV)kihy_ON;h69@^tl)<4lPviQ1 zgJ`KXOIsMKofHMPEUPIG*IOn^@a%{p(%0P(o%X&AB?4vxJybpTy7dW zbefr)qYwe;h}-D2)fBaNL1Ez++{NkX#FP}>CZDFh?M<4vh+@U3E*dOOqI#DaFToXA zKC)*aQp&%oKPg&RBvTKefZ1rF+Oj(oCo%TVpFextHqkHm%d8fOkJhwX_M9V?Jf)?* zyksmqrFC_^_{frJmDSZB7A%P(iII&DuI|8b;nz5~Bmu-BLRY_>0Rs2N``UqU>hfUW z3^-hcE~Zu0)zv}iWh>H?^ops^Xd3!l6s8!Im6q)UCx`v2=Tb?O#_bp zZY$khI2XIldZw)Hev{QP^RsCCUNbNo4h;@Awk>{I_2E4VpzuEV{ICg@s7w=lPMP%| zc$b1b6iEG&kn`5?*NVoyUQ+vW&o*Q^PhgdNx-fi7vgV?r+b&AC`@>g}uIY8uuuPeK@)zzMcDrP#Lz^NjI2vx}C;ZllAQQta$E_{yF;(le@Dsqkz}hHhW@f_B);%7EJg05CS0b}+qK6n~`^ck6NbPG5=;Q*npc(QP9YcVz@tA3b zb15X4OX0bHjtPy|S}aa9CkJ~Rgu|$L`$e|CXcI8UM+lTx>XF*&v9uun^$h?ON8P^t| z-~0W&Eal5UL@Y6Uu3^vPWhhlg`e0-(r*i(Qv>V*eo5x{zj7Hx=6O9hCo=~D=c*y=9 z?1!r39of3d_m-a2d+{Gze&o0&D3~v9XBKPmMB~jBRQInARn==X;l6*aJ2?&qmpT0J zj)2;FG<300A z`OduVATTt<1Q8{?{aO~xOD-f}F{~BR^_jgBeF+TY+1Y+WuU9`cEC&Szp^%cYiwpEU zbfU5TA^X)Pe2-0~$L;M7Dt+wOnJngL9dc;k9eSuQzq} zW5a`H{G+=L8kj_E4!?8CGcwZcT7kAf0eqW)!qWU}`tWAgA&X%1si~=bw;A=3R2<9@ zFzUCT!9GBsrY-P9fjEo|Ec|cv)zf+HTW|Nil9G}(`3-_%vK&rj2Q!MMfyc`?Z<^i| zlf7{}0OeRky4w_}{uLY&wR?y4t63s`kG!;$Euh-l?v{@m!I$?ps~c|1FiL0y!E2qG z4-+&%;r=gdFr2AkXDbZUr6*xNFtTNXP^t2HbT}bVRn@6~{|4+ZZtTT(*3vN(i;JE^ zuj_Y?5|8p5|Ghjr0+8%mZ!F#`dIY!K&Qw-_pR^*o#oicYl${U9m#hAdfZt{3%1^ zVJC@`ioy@>zq+3pEjGoyG}wnLQO@%LXbR0?bY{Zy!Yzr!yg=qAK914@3zPS%e`|XX zi4b3;zv;~DBR%b?3x(HTlu1+(k25wb7A<{WQH*!)Y2GW&&|{%(LQ}IKfSkFIUyM@) zveJsg#iHJcsbO(LS|W*+z6brH7M)n%c?*ksp=aAHskKU$CtHQRV0<3n0reGjjlJU+X7_hfV8;M_!ug5o*5Rbfz}_8tgr z1lIK*Rq^;~gb*NVc?xM<4Gj(4M9|Q9S+2Z0cH-cf=cFkYtZzv1{gKcJ?mG!c8Ar6$Dx=4|`vvcBzb z%Tf&_i-R8M#p+iSJ}?o0Q_ikoGx=ZS@R61*s<^C5LN)o>_Sn-FxXlH`t8;?ia9gPb z+ma*0p>`D;AUACw6$z7EV7huLg+*V$^Lz)0tn3fwe+col)Ye{nYP-wKBuNZaZ9&*( zl>T|o{qRa~VdX^jZHuI02KUjM2c3kM6cJt81B zE9>aY6X|n``pc2y;}7<9uyU=|gR7YPj%Fh64Nd(^ZX_i$hn0MoUxJC<_9kgw8UCVt zDUN}S>4lQSs5)LOZCR-(R4E{mGm0xM`9n0i)vsZRf}uL7vP3E}MDhZTCZL_KsLqr# z2@Cmqo8&FJzQA11*)_8u&p0el%UU&Zh-S?%YzmJ4VzS0X3ZuU6#h)s*p%;o5`rKD) zbXYym^V5pt3O_F#(ajU~M*k8kNo?3`^6bOi)m5*n_Vq~@7QQwP(r2-q$sv}gC4!dD zEMKy#^u%*IRH}lrm<25~jbCO>J`pMcW;^2@62T5+Dd!TPQ6Cr{u941sUtH04tfb|)Wjb9H?T=B@|8=L{yQx5>;6l*yN~J_jJz z?QpR+;gy2G>Gbo3IYn{;X06!d)EpP5OxE!$jMes`4o4VTbW-OE*7H}9#F@~=o+Zxdc2Bm;oRSvm1G#>Hc?cLfe2 z55+)o%tviBJ<_T(Mc7{Y!%H_;Zfnj z(Menxxv>0#d1bu~W=0nR0zOn!GNhZ)dqEk43L3hlxP-(0(LYrj4a4XxoPk5KmQz#n zE+Xk$rVk)j#@y${?7oE{OYfmc#{1sQc1%oXW()0Mw$KhJ4J@h=E_S{|+gWt(orz48 z>M*7k2enPiAATVsW4aWLRNc{2VTJBQlS~vuJgRmm8_`QlHh5bmB%>rWQKR#|UjfpV zdlFf{s2{4OMWw_jC3Sz8^vHSKkHUROyPUIp^4#dhQK0c3pGGV4y|WR8I+ATW@Ttfl zpm({jTX!6~Wv{KZLB4xl$iq6alck>x42|Hp3*%u*Q{!kSKbyc7Co&H1Xmm85EReHI zNdtZA-H_qq-*iLE)m9(S4Jww!lPf4F{M!b26CYhe^W2v{*1Ni0>dCtw*3LC@MycE$ zp7_Q8vG==M0%fsuk#WSVn7j#kysH9cE07g$-}c~EHlbSFTVGQ%oF#NeD*q&4rrr8* zxdi0KUJfi&8=(2x&-*S{34emY-oK{5Y=6Lc6DasI^%B#`e&Y~XJUcKK><|qp+lR0$S`35Y(l{z3)Q*I&$y>w=*8p6Cw}<&?9uhh z6xT`M#UO2~OcTQl*Ysj1KVJnUMe)s#sn1%GM7H5S*r~are5`)rsBn|UKUt)Oda{>% zqub@$cd}sryzzY4%8}Z)xjVb;xv8eK4n^_Sgd{p1f>8_PivfGPMjS*J6aCFus5BiB zMqewU5)SX-A7XGBLllfA)%daHdNoegz7br{AQ!Krlin2v1&73fm_%^)5q{>nmhJ;m zFP{i&{f+zERbTU52YNDe)PS7Qw9}Y>WG%L+oq=79TyHT_qhO+ZO()T++tNoc>#cx5 z5mFM8e=8gq!HXiWw?Wt!NdKb$k&W%No%yME)*-T^{WHS9egY(}9fCzZmL&uhy~q7& z-{BXxKjZWB?%?sbUi3D0i#*+o9mQsXkX&aFDF0&hB~Jak!`TS0Vx~at{`~mUP4<)A zu)Qf2ZWy!P&+l)pgu<+c|4pGrY^g5&d3afRO7j1jX8;csrYR{apMrS-#Cp5@OMkdJ z0)N>B^Mks9L6-F+7`A<{yC^Qpe{TGnANIah7Lf>b34O6dA`-RnxHvTS5{FO}7~A)-Xp%tJ=O@ZZWy_?Gt{Jg>p_n#$!!1wkj} zvF(fgcNG6SaD%ZZR_g6nt)_~EPTCPXEwa=Io1Y%m#c45oy)fom2Yv+bG zflux5_s3Pjm%{6orDZ-5fA99*&F(!L(QtpiL&Gmmq9bdeFiG^UG9oqZPwaJm3FjtX zsy{}$s!q>kKJ%3Q#;zFuz39)m%Ne}fmkajgi7WR`eObZRyFtTON!?4>$12~;Xo?FE zUS^7##;jM^wx7pHK2dHAz8jkA42>^Iw67|Dr|VlTZ$tyH%|&I~Ewdvu4NZX%@tKs* zt&2etW0mMPE^g{h)g0@zjYVCikK$U~{+RsmQx zAUd{QF2qv^LPwadXZ7|r(qO`JSnJa*pw)>#J4*su{ro)g*DpPqKw5DqO|L_~seG6L z5>Mw@0DXTrhuiQ^QOe&=O+qiQ0*NCh`Y4`s=@N-LnX0NiRRUh|%Tu}SuVSQy^S@Ut zOz1zL>Y$wA;`|g_Dxl@Wnd;#cU%R7Ku9UTh=Gxg?Mlb zGBLsdU6ZI~PEL-I*WqPCCzbHm+_Jr)vn_IdPZ%~nwx0W%RG2d&aR59%J}QKW6hq3D zmFba&5!D7ytp!Kv89gE%JO^Bue*uXCS9%V7rKGN8a45R*vrb%?iLR0e_6Wh8JvT_= zN0fr zX)bpJMibib!^6Wo+R`$4D3U08AaQU96d^}0VYG;(9SG+Y&4;}Azt#UeJ8R;*`WI&a zFspb>AFvTzrT~znR3)PIq!TTHPVvYyF2%spiV?>FAV6abFd%vYsFRw9q5 zF$o5T1?lY|hWRIm5-O1Rchyr6p~3vcE}@~fW7#5F)2HM2n|A_Kpl;e0&Z)%Rm!_sB`B6|H3Nn~T2ymh6xAXqCG+Y89I$d?9`8i4YB(ETeN{n*-`%&u5 z^h!DLh-I(rv?vVDsb)eK$hlwkF3mjGA^UJIVCv;c-Zv?79a`h7e{iGr!{_Z@cwDo2 zgqmvp^vvfXsnr@`eY~X1CdyON43Z!p90KAaOyjKgWw zbCR2>CKg+?Qgb49BnF%4!zIUKlVU;eh-3JWa`L2$^|{Eg^Ae@qR}P)PDbI=xrL|r8 zga$&VQAkKYBgcRgZO(+;P1t}QM#(t6EiO#>mp^~xSkgCTVsbe7D7p^4#X~6=#XRlx zP+(QF^iW+bnPJW5-bjqo13hc*=3+YQqLWIEEydtpDf=`l-N@Q$uCHH?W&PR=2>%Mi z&3$gh+;F6fL1-ZF-xOsT{qX+lk5Eq1URgCO*@CKgv#zgmcvb>Ju_97tuysO^TZ#4S{28cz3i(Dd$tV#)rXeL@$9;j=D+NVoZ6D}$E zooKCKy#YvQxcSQLy_}Y#%{zIt(x1Vg_V2V>_0ALkh)q&ry36Ft-)h;%;D0~CVduBC{2y|*(=VxIkqPn zi84gaUV@(3ySR(^fRC?oli>{Oduh776`{R+y*5Uu*D8n6<4wnZ%9*YDqJN7#is8Rp z$)|+=tH<_&4~TuMMZ6_afNlMd>{FD4-j(-3cn!37gX!7RB4xKllq!xH9H2LbcmZT5$vAf zccP%p1Y+d&J<1s9ezRRAxbNzkv}8)W;La6!sH`%514(MrddcjqxuDI|e42LMarbVu z)oDa$H^FZzharGQ0!6luk!Su153cs*6Z=om`CndU9N+VPv{|643P~~Y=plls2+j6B&{_HQR{@UWDH*Hn5TY8}L z1|c3`nF0GJO&uo+R6~MPh*ae%>=VSy=H?Hoaq6R@p?O4>W%c7Di8)}@v2^Ajg3|$b z=a3U4^#~Y$_w792@1$}<{~^LqXbF%JVq#)YfA2gaUW9PbemlR9FubQ`C%N8mGU8HrTbK_nKC4fM z>qGAv1~;JXj)UajZ&o^!RBxP|oN&X`xw*M3oBzt|S+XMSBnC+Bgb=^H8!WzOujGgk znsV;TM9p}E3PP?yU2Aej!GB0g&dfxB^y#KW$cKkVM0Cc5(hgNop9xZ|(MV2(hlejN zE=^8NHXBfgrz$nt4ov>EncS$1WjGC_THQDQ_CZZ9$4DBN6!n=Bq&-wcJi$lor*zbx z!NG#V+ALz=h>vyPyZjWXqVRmqSB_hu{6^m9bQ0h1N7Fv9BVh1eUI}u z!&6+iICC>KBDW=;=b_)7%=@11>#OYTPii%T#xy{FW4??)wwFe^K|T);Y(y&%i@zM-n5-Z!4BhMQ^Hi#n7{ zUt8P1ncS*_MieNI-Nn(Yah` zRB>ga4P8R^nA!I4KPIl9GFcX6gcvdD;KM(gm_B!vXk}SJm`o7*f*-0->7N@+JWct4 z$NB7Qt`sFbGeu(3mmv06Ws9@3MWu`2y0^yuPPfrO6`hu%#pAQEJVfZS@7r(#H~PCV@SN^_h`LZ54v-t%iP$0YzHOh)Fak`qi41!AuN zv32;~wx-AmOXyt5#LtAwp%Ue{u0IMVmPHD;h8|nnhj}7R+{_!Y-iCaD>;R4|l%5jy zizS9W9KEZotkFmJH6$-FJg=mzj8;x?4CPIrlvEH42!n#vaES!s6uR70754W={E)iR zv4dk;dKGRuK$=j>aI;@?`+->ZOeY}qgUrnCdBy2EpaP&wnvJjCcN-`&ucFY8P04n1 zTSVU7pUniKxLO(5e4L0TH~ss!;9|d~D?~qm?(C~Zu*iMvz!>4zwnQG=lczp~{zEs# ztWLZQgx>jm^U0~t*xy>n?;iBD{Q#B8$tkN#s#JEc5T$2VQ63o%KLbt3%s*IJCu5Ii z+GqW^B8db?h{x!4Rf2M9>PNzB2DP#`mA~VYjv|;V-;$0tyGyeA_Ij_iC2?EXvvGDY zK=4IbKP{1(+jM+1<{+DG52UcwV4*IljFE+2jg+KdbI5;v7=!my*V@SkTu_WgnIkcI zdX(u5gvOE>HWgGys=7j4x;>oL4V-_S&RmQG!t-Pq7A93^w;JHo)mJ^XGmDB|J!og$ zw4@q#guWA^8*K(xKqFf3ZJ3hN@uX%Jib6BULfJV%udVI*`1W7b1wLO}nv9rDQqWqmzkh8N1PIHXI|YX$dI&^GL!)R8 z(urM_-oq<;!RGSv3W9busMDH3!L!v$L~h7DX>FT~BG`AtyW~{bd#@Wf!p* z@s`VCcv73by5qKgB=N|_co^Hd#KJt>xT2F)AZ6CHoe4%tTD9^k)hM!&sQy!v4(~D7 zJPJ=^XNe)=Kj9EI8kgT0WP#`rk1>O~8mzgt3|LomhXj;D%%IZr#K=nKo9Fk>hjWU0 z_0cDSKlS{HJys1E2lmz^?*DFDzm0Ip5&I}mR9gcXYAn*H|ER@Up^HUC6WwLyYuAr` z(T`J95?aDY*`1h(%A~|uVT`mEFQx&$9f z0uF*0#`7sYnhnRC#sC>YFRGOT_qZYXGK-myXxt>KdEa`LgUH;{99|qS&>vraTXWD- z-WWBa9Lc_%Z1#XsDbSE@QpJ1XL8+jrK1Trc@@>q$7!N=JLy|CwGEMRf~1ZQ&o{P&m)lv z=m&v>Gx;a3!qidIv2c^|A*jo-jF1rHRDfTwIqv+s+fRt(=N!VxYXrD=4#jQSdNW#% z9mmdtXJf7gQvTN1AuthHqG z&NW#vF`Q7t_fVl<{zNS0 zOS$8zmL~3{Aj3BF-;e{@dCu?qn-!Z%*C6IQ+<@Xsfirb+f<`j&XGfspdrSyr@s!ua3@x6ClT${% z%yTg#4o>~&ul$Q}q{Ns*^eWC9+K|N|rVf1Gt8Ms>%n1qWC1vo*NRY9aIsY>15Co!L zp?&$XvQTsKuCjC0)be*mT8nLD#*xm>t`yMJWH9iOg-lJsLEex-{PkF5$Fu2?xI2f+ zpOcclh-%DfL}|Z?e7eP^u=AVYbXX=?%CJ}1tz4+#T%DE!hf09EXb-X3Q zgaVZr`LHrXE%Y>GOiV3;Fb-G#NIHop&A}i29a(=B^(NZ!@6f6)hpa=owAEB5>%P_b zX+K?#MjNr^^oJK&n?DR)&dixcY9%YH5ArRrFq&n4mMw&snVV;JHx=N1_f%qeJ;SgZ zx8}m|1e849AoJnyVPs_FA6;|*cjz!POy%$J7tUq7D+YP7S&;WKmHk))cKqEBdGjsa zH-8JdQ$a=E&7Qi>>3;$^v3xup?{T(8O2;ZM{Io_1h7XnW2c(K;THC(w8-l0*cUw~rtwI6-)!Se6ZZGjM3 z>Ae5f0+86ioH@1o`3oVCb}*mUfP6AG4@&f2>Iop?Ts@AEq>iTz3+VqR(*lBATyg9` zIMJAzDXx#pjg``oBwwa)De|!>zgq(xej;JP(AR0|YMD({3D_o|g7SAtlN8R&K?qS3 zYZfL{{A~NKqV4k_?(R-|-Rk=~!?sAT&qMEq$y~)yu&;I({Cr{2}!sr3}l;{{Bcg0(Y+>ib|`o{fTP&?jl91c8`B?=l( zA}as0UIlRZHg?npSj-7}SGhs$-UbQ77Jbips*c@BB*T+br zhR0ruF}TL_np&k2jgyEr2-#zN9|FnA|Clxw#Tc=0`zlFAEip=0K+cV1#aDFXB)7DS z`~mI#M@M)0r~^5Tv7<))&!UtfBCESD$Xy-3nw#@wqG1wLV!z3mm)gqxBqR`|LpS-f zlVu`_vdZ?xzl5owin?76ls6~Hx8F8$d>|}#nF>XN0P+7ofB#OT!Z4fPqxXN}9TO*_ zW!Do7AqXk2oi|YC9PnD(+Ll*V0*Ycxb>_^3=vCZs0@wZAnuFe_W!KrE^Yil|*0y_~ zmy1aUhd&s3e4ZYz{Jtga+utwRRFVS#+GKAy8$d;xdX7OaI_?jZ{989eWTv>}8TuTt zMD9;A_?`bqgX;#b{tmJJyF0+&0Cjvf7-8+Wn9x_G#UY=_o6g}yi)Q^kW)A|9~qu$IJU9&o&$Cy!w_yT7147Tv$dS@E*XVGGl;Tt4v>m~225cB;azw!~Aw^;`Y@=d*SVMdg@y5FyQF!2Mk6U4`I)h4WG zN=|%mBT-TNKD1d3#S>Lwu$3d7Xgk0#_PuzU)m|0Mg936V^QezF8>-`3T^PR78jJ zcd9G?Et{%5DGK)=-#>{(Z}j{g706IUg@~7wmosy6KF3zU3o<5-WbbnXlhSLZeJlt( zt85iBY5=WVnRKu^23m-CB5ul5sUK1~kNkTbZF6+u>3H>T^16-8)*8zk|3}kTKt;KI zZx0;;4h_;JDUA%>E!|2=i3pN{bT=X)-5p9wOUnR)Ln+H5M{=Wa*wOn_x6y-hd zIcM)@KfxklmXDHZDAhTPi*re#8EqArDCw`E{IyGI9W@fFuNyKt+WfhPQ0`dgSz0H5 zMZjJP8K3Rf`cdP_Z7f;2o5oj#297sgbcrRA!}yCr4XkVFQ@1N0#jaw0dzkW(evVVc zgq)z}=+&9kYLP+uP>r3Z)|xG(pmGf}b>$VDUylCG!sEIX0DX6Fb2A5wUQeRQ%0fMU zAww8L&VJk6IJo+L$5fQ@Hct{A1~wMeHs2oZ@mj~7&UWnMcZ-iC{fm9 zSai01oeS=T%I@Bs6h)Old{}B^8y*nYySI*dTY! zSK44i1vcb!^H<%nQ8O_az*QZ+12ct6uTl`IS#aCa)59#PFSv}{0Y(oip^Qp3%xtP@ zccu+Aegh*4fY7e~qPEs?Nm>d@z&vv)AexI2MLz%4*>+2*mb>K zw(KAI_XP^h17RY!%;I}E@Q3RX((44+=7qsp$~>>R!R>(+B5hI`y8@Gf@&moDE)kkI z0l9#)4mVjM?bBJT*bSGj#v zi43yF4swY~!Norl?Ff5Ls5{w?DVXhd-pU)XE*2;wDY2!^a1t-P|M)om+ni3o>-1b1 zd|Fg~T>h9cwm2&$N<0B~*D8}Q<}oqP)#@WTG;S-mTyk@4Uh-OSK&ADz)yJ0A?Rz~X zUbHW>W$plJBTIN$5x|}+!$f?aTl6BRs4LY8-gkRS9CRCk< zDAycC;uh@V8ghPwXL5(L|AKFvZoqY%*FpwEHiYE$or9F8=zI(?qR4QFh{;%06Je+|MP%s z+sBU~K)$j40A^<#&bkb_efV(Z2|*a(I9=Vb7kk^?M|k~*@Hu}Kq4M)N-m>j&D*6ve zA(Ld03LjZ<;(?Q`fGJz$1iNw`;6mhu=XE^tZg2BpDGWd$1_wEk2MWi|1>aAjHVaT1 z+DiWR&XPCgGQKDXwdnwUhlQw6Bv~vC881msV(zz=#B!1W1UdfUT&g6*&!7-#oa%ZN zbT#)@q^n56RWI%ZrGM6#tHA`wviaaYhBRgVFD2NT#Cd(PNfC_rN_lyTvT>Nm_^4gS z!5g-W()9QQcnOXv!O|~T3ebXHa+jbXGeU=vkp!R`!YIx*8rwLLnNoCQ1juya&`+pc zOJzJMe-fPcSh4f*n_lp6aM-`UJGg&}_y{KU>FMe1RA`H?Vxq#-J|`nTW1o`YJa9i+ zu{%;@mBThVcWc~k;TY&9-+v6HfHTI%v-b94*Ksa`s(e@c#PTWSKv`K4GoT&(G@JFP zqGK0nDJ+!Jv((j<(_H;1rTeF*rUo8_Q6Bo(-D|c4MN?Uy!&LY<{-DSBxw2&SYb~S~ zcJ*7>IV1QYote{*!UEzL!ja#ok;ci+PQ#mx`VROiNW~=1D&3f)tkkvd|B4Y{kyekE zk8GNbA=LIVB?rGy*eK|Rl1uQhtBRj*6WU~ zsz`TDNiq)U$7q&sC;Dpk6%yF###GFF*pkkQ{4B5J2Ddx>=kESRMvjl`N!v1ZwHP7h zTHFU}yh(J8Z`X4YE6NQgrl;jutqjiYZ#NarG*K6wa?UVMVZ*HS$UY*5$)akjPFd*P zI9x~&=PBQ|37=CYh^o5EqcE9V$CMQ#s>~SCp@H~KXW>k|Fb6#|Lp{wz00(5b&EM-_ zcWnPHk1#>KwWR&xU-$Men6JtE>lXDo3|c-um;KqM^98^5-W4TbIv()qsjB`4x!#{Av)Ldk|C`G1`qI@m z3f_S<;6s4yMzR~xVs<^SH{ORK>lhnT;f1xBD$o;Q0~WjAw^u(q+faZOF;?R40t~Fk z1vh{n+5j+@oczsnx(pD{)TmZNQm=Do16&3w4wUMc5rES^7N)H(z08T}& zp-Lu`b|z*#Yg#x2NSo!rnZ>O_DMDAupCwPPos)2fou^0x5?nG?iXZkgg2ge>3D(g` z9~>~9vYXTq`&nnt15gK zff+9k8`RZfV z{c;o+Am)zz-r+EA<}do3A8~Wz&3@@KQDxZ(D3HgXya4N075fk`4BjV`8cU^FLy~(8 zwNPXzDeJy-(=WiGSJlzcaXreEXH_L`Zvi|E zU1soVNW;)DHKk6;bjT*#C&^%1h**`todOK&N#f4zu_74@g?asXO;#EOfEMe0H`6UG!t%DQn(yfCHwl=b-xh~*w`vaos z*TF$a8-J}XvwX(HB3sH{Au2VwBx1QGG&&+|44K@!+W{)IjU}0|TVILZ>aw!^it+@x z{w3!viN~7%9{V$S?|Aw%*~{17rayOx9IA_UcSg4T(X?7R$B=`bRxxf>e`+Ezx{ zH1EWOra6xcCY#)d(8+=l2Lv+ zJ1GQHKhk&&i+lI0_?9f1)_Fxn2CH{OjYtA1FWY;&R?W4vfNzBtp7k1vU8BrItb<$Q zbL4Jvz4j!!x_1Su?z@ri6!8PY4ewE44x6&PH9Qv{L|q96{<=#B73sX2m>AEWFULTv`Dr59}h!%M>&czBdm-viI|%UN$U5FM+PE|0Nv+mWg-}+JLi5 znbPxLKeG++j?WAW(<eit}vSe#>tySFjVN}DfQHQ(?n|XB+_65*Y;9S zvh6P+?OX7I4M?|kO$^+$-4D&DhfQc2*{*EpxSbol*9MHLQ6dO3yPaO0Hk5Rh3#*DMdep=OBY=g@K8Q zuh~5k5cg}!N=k>@ze*gHq%GM=%iT#UVj{rO)r`b`1m?AP)WZDs(>mEh#br-6yn#rP z)Wp^4iD3^~k&AsJ!wcc&0QO5ybU&LhT3bW+n3IYZ%9t>}jSRlP4&&s&#DAaDMi@3c ziWh$kY!y&d_KP_Qa>F3;mQ?bQ<|RAKcir;DZ4*EOL~{}v(W?0{HP zw2TC6wAVHA76smAGwaz7TyGn_$XF<@5j$^xO&&V zkp0=p`c<{T;Ks2)rF})VcN@r=$*44Lc}|97kQ5PYGz}`+X&lo2!X- z-@{IfFoYeP?0Vn5J)I|O5U^g;?|cCVIg_0D!9pLr!|9;zrkVWn7^sf$u zgu62Ae*-K?045cOjYY`Pn{cQ+c3+t59b4aBrkKi<*o_b&; ziUn@JSp-x0*YaqKK!*wPTJ9VH%Q@3An3!D;2YxS9m)zS45GODOXgm3dXBch1if^7J z;hxp5ZtyI#maNv&dSFnE`;~Q)ml?CiKOO7(OxvA*f4I?!A(})$El8nPS#LkHag2gY z7wn>jd37UhtdHA0tfTuE*cf2jN=f8BB%V(lGbkUA1_2b?86Tm-@dHleHoKF6-M6pPzSk zy(ygIUbyqRvxLXSCv?LFc%v`JcwGwXniv}E-POeu2~M>$KNs6R$`W1?*MZO~?SD=% zLW&UNZD#NN^Q_R86~Xc;SE6YszD;1U84m?{V<~S`14bF!E3^?2tfe&w3fKp!XxGOe za1frI$y0`G0l-+q;Zj*A@KW;Np@Xh>6TA zcw3f`go+g*YXJsFcaYF7bAjB%FG-)?oz3!vQaCiyK{0V~*li8R!3lGU5IMk+s=a%N ztT*8Qp8~cRgs1`b;U1~cLgxgC?F26bVC}es%T<`PUIk!K_e}zo%Y*QWu0mCz8DCIP z@Ep`(Tg6FVjhc9G6QQH(lA=*t3OL;ta|gbHH5L!$ba$dZ-+bc=ZUzq{0&^KaMde?= zz5`1)=?Y%37is*gK2g@RfO!pw?Wy+-U(3p#h`VsD5ME69-A;hF#L~OE7Dlruqa|G! zKccEJg<pH=)ax+|{S&+5ZWG#4R>R}e4R@==Lwq@pN;f$2nSUMU65gDto zgzp{RofwGC5^5vSlF#>+cjzQE@IW$zsOEmYa=`q(>HtxPH@L(0`vM#f$nZZypcB|? z@o4eAvsmn?eQ^+iPy`d=4Wl9Ek|GR>7mQ@C2%|-@M3fR1W5!cb6!*ua2p!40$V)%>s-ao92V`@MqQp4N0M~SlH%?4PcV3P zxkY}Ha6^MytT1Xmr71pKdoQw0;Zf1kpCT2FnQZi->A1(XSzgZE-sM>G^^rkOmY5eF zwJ1m|l7RxoNpEbW=nVUnZ1+ef7BUkp6v`4##E2aa5l6bAN0r44XTb{cd|qj95|l_n zN?iB-J2xDnnPjCp_F{}N90HAy<>=<<8?uQu_1bgWU?F}+iC640J5~);(LlNkvRH85 zy^g-!wUO`wM+Tn>%yzT@R8X*1d1x@W7bPq<0JVro<-dhzXwP=J1GIC_SM?lEVyu7M z00;Z=!)$K}hJ7=^{iWueik%H+9};&6sJGiQq}PLUj~d!IQ3pkLuxj7&NTmzy}fl0vWOn-0U_E$G(t?pu7uwBSo{XAM70PXick<$;7w&>{nrI>Qpvk4tl0PX3f9xY9LcK%VKkVcanGpJJLM@v&*#&`d18K6S zF2)eOi&l}?_KM!}rXAwyT)8i}5S)*PjM*O|95?5lG*Ui!&(p69RXnzVC<-=uisK-D zP}@k@8&^n)$2ccilfx|=bs_tVS7-VdU6;aW$-+VtNNHRXW$=q%HaqUY`Y7!OB zA1ERZnVal>V=0WL;@dZ|r8U$0s|gG}Ubye|%mRqdkzxMfT}5&JBY-b*ks$%?=t<7b^)Ul)_B*1PjL|RH)kiIppzJB~sS=kS$=wj%xyR_23wm_K5{XwLRa7@^F zTuOo~?TZA{1mr3OBW6}siT+nknSrfktFoJHH1kA0mW?s6q;G@cM|fl+`E$qU-sO*%mj|u)^Mi(bLz*i)hn+$T-)#w*WG8U(8sBY= z(n&kNmS|R6aJMQkwe`)z+aLt$79unrG91PDgS7G_xTVmOm^aP)m#chm$Y%m%2;tKg zFn80gjEsy2eM%E(SNMK8mX$sD83bKw;Qa)zOD0cMEG;Hi+r=`t7%UAD9_GNgALwci zlZ~~s{-rP6tQSyUOG+TxuUp!$M`C>wt6hA3?<6;ZYvqu(_x5~NVg%90fv9G)x|f;) zff<=+S)lnKj(;qEv4};p0u^j~Gm=;7ds_amc#cUY(1-TE_$AZ?gL z8m&?rO7zPj31U7*ekz0BBukrY6B|rtK5M?q*e`*wttp`L`jg}vQcRkh&<#!HYkZaJ zs-}34x*8sBvCS`(JhRHmH^Dd=7Q6+0rr~kf82)`AF z?ILiNsK$@ zgV71c(!3Y@vweKsB_xz&s~1gE%t(O6WS;ia0tX7kVv>cT+8Bc8YxCANKM)-8qF{Di zEb;K~z=-;b0s*2%PtZlH`;kC$67RsN%nFK+(sJ}CPVFa!T)5+x$6&nJ5uRaVhp`BD zBoB^-+3lf^0Z^-*MgQ9eZ#S!;OjKse_hWtGgZ9~J$LB65r@U)n4u;eeS*7~bi z!aR^47Cd?>Nsfdes=5?}0BrnDKWOq3ZhFq7^lNCyCW8m7?qAr05 zI7k5l@f0oWXuq40FeN8gKerP3q>v-LiJh>84G9Bc*6-c1Xx;QL13iF&dvS2BT%`9C z$9@@<(?VRe$ej}X$I$mT47X7eF@?lxpPPDwKFmG#XK)Pc520)B?aR2b#5n9b=Ukx{ z$}1LPEI#CiZj6iibm&rC+0uU2I}qZA#ILSpy+vK@J6BR45T9jec=nCcSaoF!TT@F) zr3^z&k`9$$h@)lw<%Xc-m;hp`Qzk6qCewlfz#02MFR-_VgcukYC@*_^xFw?L&GU3RZZV(S?=e=5ZSNaGKsL!u=2{vmNcqL zN=krs+!_Z0+lZbDtzeG`jt3 z8fqP)PQbIjnj;(_81OhD42V*YFg=Q8F!&uwycIGMTN0{2F)Al9aYjCf)cW?ks;W)s z7?X9}e{w)Ym(CnZ?v8t30Ue^mSSWbx^vkL#b~gK@Yp(@u34!J#$TC___1Q^%2noGZ z45{}lyG>3KGyeOt1pWr(eO`mc9rOUDUvbw0AD1N<>!KKwck-C@BjSGw@u}7pw_rfS zwtjw4TLHuR29B{QXnA>MgF*H^Dl~rdFg!scw5B)PQYrOPK}LwKTTAU~lbK$T9w&+S zqrD3uJ;^HRzWtP7ZV{aOM3z3+F3t8yv{1!CIDcxLBTSP+;!^VGgKqR;)0OU7&jMdz zpiH9tM1BFJAPZII-Lp+D>gFVn#*%yd-Jn6|~Ka z!|vbsliG3RvhjraMgDC8#h-+bs#Rul$*bp0%XI@ATYQ*B@+v;BmD$Z$YkizC7z}4| zaXWOF3f%m^2Nk4beLrXkF-toM4W>oPfe?W>K`kOyWg;I`WFi!zAY^nj94#EI6b3Vc zpGNq{vV&i^O}o6Yju|nr6vyJBl25K@|EkXZe7%4E6RFIun23Y~InOpNZa!Q+{_J2u zqU_GbhAQLO{q7&>qS+=o-D)J0%9Ya9r*QAKr4wR;0DoD&9f+!(UQ`|#UWlu4%iUP^ zC)xawH(-`#Eg}-Ah()Ie#iHLLJzCFz3rrZ*0ww~mXJKY$wn<3_oc43@=J)}&d?+T_ z^kY!X0nfPyyBJ`*64qW12+CrYs|kRvWYXRz+N~f@zF$A%K%sbgIhx#-7-#RSN8}&P zO0;NsA%O>wE9>kb!K$|W{Cv}!u>jaojJ9&N=XNRIA{KC{IRyoqIPi1@Wm{SG$wdeiLa`dmt}Zi zttwgyu|%j@6jk}e9-8kd)eZD-UbrN~Uu3%0}T# z6TALB3?n#9?)9`$edBNKg*ZM&;qvqE1m`3&mp!CFnOB{!KyHy%!Grj)Ps#rTv}j-? z$uST;6-Ybp)JwIc8tm_Jr*zMNCM_vzW-UyC`(n(fy?`60*M4~-fruI>r(K=rSnLh z9J#SHUpzn9g%6<{-(EEo>Cc1Gm|UUl?rP`3d8Mk2#w}7S%?SzoO+l5O8c=E8PiGGc zTmbJM7`X0y?E5gR4^Z8@j6DFYT)-WA_s4!xPNNIJk~;~LxH0#f{0#tZZy<9A1g5Qt zk6po7}^Vsy&+{IEoQEUnv>H}fl{4z@r%^w_S0kcN9ACEZt5{22Yebuy;m_IH!Bi;=QQ`1 zUV|#fEAT@nS>=g}p#)L420Eo=_4o-ou@Hypc_|vW=M#M&J1I#k zJvL5e4z|tyylQY>?!I0{o`SiPFxIf>@PMyrGGXavam@|Ha#5~4!(pK;0yI5t$|7KSo_(QNP_PaN9$;lkf|jlIe?6cfPsGY*%&`A zpbBW~{%xLaHg0iO@bp6Iq^0MDkMr|4rhXhrIL+L=5M^o?8THc=R|Ay`G;klgo zV$=YwUu5aRZqsB*cSsO?73GIds70C>Rj_m}5CP!u6Whe~VBzDSGplELYem;^)WAr2 zlKkF1Rm)((4zx`R-z4)D`xwIGV3=f;mR7XYTtsoz80qAjeGeMk%gf6=U>I8OJ2!n2 zp1tp&#P(L)z4U%|XGI>FI1U5tM3a#fp&U8B{A*q57qkF(^UrYs>%xwIR#n#cm*RfY zAF+LzLmqj{!3;Ee@^r&!?7JE5#r*XFC?>YSMTnMh3??TsWBfDq_)be*Xj{>2 zVFUY}{J(+5|Lp8cPhUUz%a@|q{2fm(FE0m&tco4+Z2n1K{*Bpsduc@pWfY6S8V;rS z(580-H6w28bipv3R&x`t(4}3yLWM(zmt!p0ubq_o_cL2Kn@)IDCy1DG+1|cqTz-t2 zaZVLrW)da}IV0c!7Zgzd7>6o|e^;vy4l(V3JrB=%MV`yu0>Fe+SD)L8ylIKrf z^d-|eIH!xGKie#^`Dvj`7yJ*~?(N&N{i$xUWMFVqaPl6gkxQ`c-l zOhV!YwF5!KD(NcoYA{O#Q%?^FO~S>s3(Ph1F}9bI3Shxb#10<@?w)gVd_Gs-m->$C z?GI*~YF~SYsK9&Vy>iYfJe~>!B|OC9BmG9xvfjt(fdgm`6tT$$Wr0yDGbuH zs~lT7OGhQ~L*2;EV>a)7Z#Q&qE!?!mPzmtP%0XqT3jR$j(N z7$K`N&<3>ix?^M(+0FY;q@ZX4deQ6$+uOn(ho2obAAS4nvB1i;_5^%JncJK*^OO7%?iF2I?xNcs7@y zpu6Qn!o%(XTZsG!Yfgy3W_AF zwO|*P!i<%)zvW1xQW8D3N=;{Z8<+!3$Y=!Es2x_?pOOBd(b!9QL$~g~`ah;mi=B79 zU1a#o9;nF8QFLZ5>TX|5+hHSd{!uCibC&X6&Q=zHn+KKa4K(h24QqBaZ71weCAS$FJl8$io?Ms_>_R|5)%~|&@If( zjm^y&>+8>qj37Y*X%iC@fe$GNFLgwyfEbUcD8cvhWpob#+lTS;*9s?U~dC&|Tc#tZOBYFfmM%D>3?VnQ&Ny$}8j)74(U=!aLA!}^x zBT741X30sL38xtznF`u>fIza%X zI)<4jxg;x75gi7lzM)vfYf;E_5_qh};tsRp_A?0O@cj`u=pFxz&Df_s-2nf9yc7K= z)e=lGTEceYgIKz{V8N1&eM>o*39zgX8HQ@?8^hDndfH+ED3qceCFSKUC8iMq zPEI5FBZ?=(xq8e(oDdy-eWmzBMSyyxYB>L>wF6x&fQ9Yent)AP$jD5I7#f;s@VgJj z(*4-<@h{=icT+zK_YRjFVT|E_%yB^#L>_9(_o1Zj841`oKa~W!SXM92kQ^ z4_HtAw!EU^(?Crg6VBM;V8z$3kv(}??gS7HBbc@EQ0;$9aZzB-q3sWK0>aP$GmQy1 zSy^e8Tt&svWH4|@1t6LEo3badJvKvWxBns+_z)-o;7m#@qnd4(Acx1i27Ix1cz- z7xNglexb&QjC2nMN9VPO{i&A3Hx!VNCOw3?^Fsr0@umB@d2nI6Kz#)b-M zJPHMD94~^may^Zak(TI%Q?=H}9ZbnatHwM0fB(EFDNThy+}!F+#(d820KE7qX$^)A z+=z&Q*`uzG)!mPeH5?d0Qoyp@IQzLh8*qdMj2qxuDl8&mKT}p&K2v9xY-L#IR#*Mz zh3;Pi4ig@Sj3H)l3jQ5e+unq6Y5*2SL;kG?BS9vg*EoRA$Sl0hzrVFH^%88=?I|p>?!E{s@nJ-?*DtdrpqkfeECq|97U4g_@@woTz?_%&8bt zTG8|Ah=&mgs^_V$zIF5;YP>M2XL)UHco1dfNM`j4l>^5;0Tm>(u3$E>M({Nhg~r_) z706Nfr1FH_5V(HLl3eQB3ej_xX%*^Z6GbCGQFlYpVRzJ(}R5(ECbwcICJ0u zjq%U@c{Y$HZ1ooO#RCJ6Lb}u@JK>?R#tRFHlLwiwkIpDWBdU4=Wb(#W_p7P*3Ka8u zcpKC~$QrWk{{5&9oaB8%hTdCi;@OY!pABs9ZK<*-zj`%8HW2q zC0wm;IVk?NhRqdTj{{sd2mY}R+8KU;GxrOrS8}nkwgEL4LNe>AY(e5D?5Uzkj6*o? z4p}YOJHL0qd`nh3;zS;tk7cEWR)u9{!g^TQLpD#62z@+OlN0~{g_g>FM(lspEUX-1 zamLP0L%Ov$SM9U$Aeb58Y}FwOK~x}Q>Ek{Vrse%|e!Y|z($U1x+bv`s7C1Y3h!0`R z3?1tso4C|xloj1kk9!P*NpO49sWC1V)8ZGT49=ksj-i=p-JUqYUO<^n>`d)j+I#nwx)pSE*D@67HJN$F zHzh(xsvQPNr?rM|A!Yt@*|V=#GK zTVGR-wTOsxxVT)@hvjD!_XUs^{#%>hn@31gT*-c%QWMq0|eF0+s_ftQZ zp2U0_tr-#}h>$fmmtrJ9Lfi&)B$keiy}A~HIO6FNmMzy%#tuZ0K4atL+}_=;c~;)m zCjKObTG;i?O#L1>;xmQaevRb!p6%P?qvjSjG_OG7lma7S>??ds{!8F^#8w$^ZlzUA)tyQ zA|-V}Ai)YzGyTFx-dIYX$|9O7?9wXABg@{FS-k|sGG%9dDnp&4f8FnxEtDc12wpfX z?j`2Om-l=aSx1LBOM@kpDQ7}Pj!-O(KmsRiq@45-+{L0-4$P=R1T!^mstGIA!1N)8 zT+kml#5%35Mdm@4{|(Lh%Lqfbt-;RH(bfAzq3>Wg4w!ocm>02i4ZSPQv}CaPDZ`g~ zA67Txy1Kfyx3OBzcjsDd-gA)5{IF7y>w$IigPm?-YDyXd_iS!)Gd|ebXJu!P=vj6a zo&P)Kb8)z&!2*09%1Q&w%+B}405a=Vj}HTB6#LCr%`Wk{L!D|~hGz$MTig4H{@-=> zdKwR0yOhr>k@4ZOdA{xUAag2FOSwd{v}^}01PxeIhYLw!EQC?Jdk(G(-(y|I?TVoEb-~OynsJU`H_%n@WoubNU z12w>VOF*@}vhs15Oj(gL-e5flCy>XCTLFnCgim$$?5Fg3d^1=gkqeJJM2BKpy()4{ zv8x1P%8>x~Bpao&q-1k{KLY+bGVe{Ao?w$W-9RvuO+)El&vG>&{f~qz|KDvAWWLJ| z35VHVoe*Gi;zk zl||-Mz^3AaB0C}?h%&@2Ki-L8a*+{*oPjooJ*U48U*M z0{;D^PXZ64sH|*M2o&e1>tdwt5Q7Cl=e_BtQqW(@%8zNpgx%+78##JkR|n@ox^@j~ z#cv#m>4@;jZGwj*2$`*^Ac$9v2!^;mU_vS)EDS0^ncRmo5g@CUlk4ed|M@>)plebe zO#A?xL4XRvi4a1xbm74Szc#Ba6xhqzyck;5s3D*tmn#L8US9-gw%dnDanJ=+?L=Hl zTFT3FO8N*zo4W6oI*>5&etnmCb%Jjrh0`&n+elGc@*bB)BY|K93n^mRaW_7Lha?8s zLef?_X;&~KtSu0)!QR1;C6Wv?XF=kHDfZCLl4Sq{87asK5tqL*y2OF?3{NHbnVkcW zSa)*^g`J%Nv}F%8YRqIOgt34f<;dc_x@nH^pe0Jt;A3t5vQl~-8Qh(F!f49;v*YAd z*4hkKv)lgb927}f=x1*&b@lT~roaOMkL|%I-NaNwLjxq+ynN{i)(Z@Z++hck z50M>!fyvUkZX{T(wZF^$=zZr1b%LliQ2v= zn{l9Nc)!qQti;k>QJ$7p@>cgRS|H=gBsnx5N<2CG){O4ZI#qqsb6XqOem{Z|+WA^C zA|HyA;;G{X!F!G|wj6z$OLLNNIu_yuQLJrmp37;+TcqU1!}^WDji04e?pj1wMi??8 z*W(8IhnFtKcN4C~L7{SH(WPwL!ud!pD-y8BMT?Q&)(l# z1DI^4wN-4%5pj2W-RqAG#-gD$|7wzao+05WXP!?50LaH2n-MY4B9MkjvimS0*ajRr-6vzcZToA zcMYpOGBmamyn{6sy;ZvvAP$@A5CtP=0>3mIUgehJcZJk=;HH6zOggyrrhIjh+enM! zXzq7Qpm-|C;qY>{rqRkJ-6`EEEVsKg7#;H`D=G_;vSdy_J@z7DE_WEMbnIZu3P-IV z$A+G}AS7oftY5LT7*$#W>hD4lV?D`F20Aa)6D-7YJa?AEPq7zhgik+#oEd`EXgPXK zO(=k3yeoQ(H!|8!*VAh_T&%T~frlN*{P{P_o3Hk|G2}4p+Aue}beN5AyF{D@8+$oU zclbaJm=u+*udaeYh?^+;&7FUd9aAAwR&Ng(9B}U?WOp9&W9H}QHH{?!>;t~!2dsKc zfvyag#ga{R0*BZK=`$jgZv)VAV`S-NPAsFvE*67;KQQ&nD|H3_C$|XqHf=zTT^>My zYZPIVK?;1{IZS@^^`ptN%7O5DNZ#*va++O2<}>vm?uJEKIthdE;mhgS2&w)CPe@`dxi^73*lI!Z}Rf+TzU zxtcZpqAOY2I7R-i4lv+RvH|gbM8df{5#Um_JEGSDhkb4HqXc7V2H=xiVLu~4_!RUT zvh=NGMaUb#Z_RA*!}C9wQUf*RWly6&V)%per2?Q{;dspzkNq$f`Ky5u7I4VFI}DSc zJc<+AP?xwp0i*(eiK6cu1D6ajFiI|ln(P8+K*030lJL}e=r(&;SG+YLz)Y1rJdjpn z#(I-C4vP*PsAy;*(R{tQl1YR|9`COH*g}T?{!PfvJ~&pw^xj!lO|nIXy_BS}?XS7U zfE;l@;U(UH>XNO9ZuYJ|4`vpPPQziwqJ?fopG_d`8sIQt&4xrnPy<{L0`{`#1DJqo z!8*sCitpbdl@ZQuvHk)swDDr1PL|#Yq+S_MD7@#ffdDMEP&T}0h0P19D~eyfVNw-=NYl$X~wH$Nqb>V55`t0}9QB4CHN5$&ReHR2Ye z#cQ>lSo{5uFANw9F9rLA&eM|_a>Ls|l*QeK-`&O=9AM<=1W1lRiGuSE%-)MbX<0L& z)dsu3w_(nC{}s~%Osh0$e3F@`YS4S)tl~sM1sWQE)$@|!ngTF5gDgN=(ghU+$ zCyA3|{1kWS%9z>PyDiN9uIFF~fh6_h;kUG;m;dT8QDjY6qvIGYJ}_Jo70q5;g}8_( z_)_U}wvfa@a?DfG%H;C^EIsZbOd$#AX@GBARz|6mHTn~t4KrTu7u@f-?YW;d zO!mM27!r_K%3XYT7h=Oum+uK)vip9Su zGLEua8QuY@gUBRP@MpkY0;bJG#KgEfHDzTB7jQwu)_vT6j};T%MpzXjNvi?S&x=F+ zf%;qVeq7Xk0abQRR(#Y>ZXDwYUERMrbq#`A`uY>YhdhOhP)z!q-xt#YF}3TQ{%y$I z5CfbS6pYh?jlWCg6s1?^Ls!-^%=1Qu6FtRdEcK;zHiT=i)S=2I zeg6Ac95{CoUfr4*{wjNnoNN^73wFN+Jn7kTff7sPRkIrhN%0E1x64L=J+nwbKslTB zKM#>FH>N0yRk=4ru2I^G!kjL6;oeufm%&hYihXTxJXE&Y>2&*KlV*c5ZTzcweF#Lc zZ_eHCBew)Dq7xnBb?8mPT%uUs`(o}&3lTbHZ?;pF6d?1>5w#PRqDOOX3Yl!O@S=|c z{l)h7J|_zYHhNIpyoq5Fu@GoFfoc{XE0+jg$baDgBz7S-D^K3N2By{^roMaY5)9^j z54;vcGMm~CL%2M8ldM4W>Hbu0F?dBSY~Yh1@BQ{61q{XjhJA(SFTe=pzfaH}6vPLL z0=WQymSXjf0jt6K#DzBaW}y9M0MJ|xBJRLh@W5^XOiwE^c*h;ch50`@39il5e@%4I z(vL}i=PAWMRZR;H52jtA#HV7&Feh8mFd#x5<9Acl2PvWga+=IKx)FJQ=EgFU(^XiO zAQWj65J@%{4#uH(cu#j~QMk+E{KzOeE~Ow~SD@^j9kJ}#_)XxswZ@*Q40 z{xF$-_R5xzu~ph0edj!l=Do@-GF_k|Pg&!6FBx>%F;Dcf0jdvp;QnSaXS(_(Ze1!KaNdqciQ&luqV)4A z@~R)B?##Ih;z3Kqk6a%`x5=GHVuhxb3AT!Vcw5^=KJ~=%ntlZjZZ<<2v~T8UM)`um zwN~Pq29lQc1fPeQ87CZ6+xs!H%hiqX8bore9Bg1i(Fa3i{b$C@`gFwYq4=Upa zPr4u`r)!Xj7Dp|;2xx~EaEFJ)sPne-R@ZJnz&-%-IuOPX*-3JIu@d{(=J$UKEVBr% z2vjNH-}r@b#5$Vq6Q&{y-5>sE{mhr%;sZ6VG81m9n#6P5V50-vWaFqJuuEE#NNB_E ziFlXz2NhRdByI%mI@tn}QOnI6LmGVk1T5497c(u%o#+~y`Efma0X+xq=evAvd~R~? z8Lbyt=ny0<0hDDneK&_GsJ4gEQihBYwe7SO^;Z3P!_2qLU9*#F`gTD*k*G zTia#293*@V?^mqfjwoVo*v5a{-ba#`ZkJ9*3(g9D1fdl2?>Rc-^6sogY&X+s)Bx?v zc>VZT*75ElxI)3U07WcnoK~7CH&M$X&LV$ZlrJ{iY+8;6Ex+~m$ z6bZbv34X1Bq@*ufY0sM~)RNYM;}u!3#_9oKBlE)IPekg#C13^)T_iio=d%0)TIsNW zQ}S-BeGqSQy8V}-1tNRXMcM|ap)@e8UG!yF@5g{w86iYV;kP^TCk={0V(7C#&;&KT!i@aqs~WNzU`oR25J>I_zfz!v?aNQgdXP`(%%2}=3? z%epI^MV~0ZWuFk!{R6kwW#-YttHmUo0HsIg#j`&_xQ zofN-}VT%6xfhRGrvxEAE>qm7p-Qsx|a_$>`Jrk1(7G?U}&1N-BEYu)~Bo@d}pK!zD z211PLJ;))b6#8raA5CWgRMq-+@eLf{pu{0m5TsK;K#)edK^p0h?k?$&4(SGI1*D}L z=?0}cq(MYL`g^(m`L1^y@5~)Xcf9+FwSH@%JPz>(6sxBDf-+_803&{{6nn{;*}C2l zi1V78PvzV10b<%M4M8#phq&&`b*0PV0jMRJQT52>LB<<1gWY}kVYAe^Y zO;qZ*m5ZE&ND+(_&LRRNh$d{0_wt5;3nq-Pvg)Xka&TCw8vGU`NZU;V@}evrl@v?8 zN!i$dtEqvwlkk-jq%8x&8x_!UW6o%hb^LhnMn^RpYQ*+y_oqUq%i60S*!}az0UWm( z)nGcsZm|Z&&$b$^pz(`Mxft?yx&^O8N^nPNRKV}M+vUJ(x#k?B$6e#Qo}TZ|fc2QQ zb?os$TtLSLdwF@G z$^)a0ERjQu#Y@urujy2^EtWA9nV=dQwroEce>ltVKtogR_T1=ZU^c^no`pPw&tbw{ zOG#?_=oJe+1Ly?*TULOb3<6O5tFkId1rRS`g6=~Mfb<7|B4 zhZH=xa}~TCKUCkck33SVl#55an?K7D4FM1Vc!5uwzET31@&-Cg_M(BFz837K{7*pu zDL!l!7~p)sz~t(cIAtursGm$}+dVt(#!Q;HnyEB0Gq4xS0LDq6$QGy=1vSj02OnB* z4(vj@R(<3{Qwpx`+w{DklR--N?l?y7twvi|fbiPOOBdZbWDX&|4&6rKFR z5Wi4^r#h+k=dxFCoGM9DoJvct;Gu|_| zo7q3eu3xa3#ciX~X=<=6IeaLu3R-9x($^Li^eyo9`Ks|&xLkiDolAOy#FEk6g-Dkl zn7q++{vdex7;KVh5*&NL1p8oT=kO3nl}LV`MxtrqJPZFTk%0+;r8?m* zi=Hvtnnsf=76mmIU9uCW+1Y{y6L4~xq=TEx#*EJ`6}NGY&NQf1W4~%}n`ea51}+^t z?S$*bRk~d(&$?RPcjSS-b|gRPc-qX=j(fO$WlY(g;J*%>-MziLo$T8kpoUM+HHJrL z+@Ef2Yuque5M(gECLTZzUR|4{NW&PZkB9SZ<@xpbO-@3Fkuk7#Gpbl56X*(vE;bl2FjaLl#WfwZq^``ICRgBfyIhh>kNgJ)N!Xd=MNQEJXfk zkCz-E*tO1xFrqws@*GYrrQ@FW#Ms&JsjBEQ_nK%XVTsl;GZJDx51&|^jE|4^Y%al% z9m--y2b0yUDbH74#sr&S&&BI`W_`a!CeAdQDDMK#>f-FIrn2(Ost6*cxzU{~L#L7H za{cT|27#VEkUbGhxB(vR`=}e>?S3vj;q?Squ2O*Xc4i9iUgW@z8F8X6J8wt7HGRhf z2BRQrSPI1V$S_cR@5gAi)0frs;GqzkoK^;9?1YOeP?n_>9Ts@v_9{bGny^3c`r~>C% zHY|{uaHH|H*jd?X0NV(m@`Hr;F5D{yVnPV0UcWuRutVV7w6yfg;OJ;k5Npr+F`>~J zPqKGBILNQaq;lJNM8CJ)4J7kS;Oi%KTeR06d>fWuRSZP{yIqa}_tU87VL^r|Z{F`* zUpF5=TDLK!f+*#(_&rL)Z=nhR?v3<)bx-|v0!+q#0L(x#(@|Bre0O_J)s&Kzl_g2) zL2Wd-vt{^i8929qIyX{2x_EsBXsMlht`5+rjSNiKX+4uq7>0x+;ECR{DB>Y{PI#@~&^03*C9pRYh*5xcZh%D4)DH($%#ScWQ^0~jn1!AW;BuA%y-uQ2sm+azOt zs4yVZ?{#*0VIi6h>FP|^Lzd=`m9GWfPJ=OcYUOBOmEV1z0l=-1*!A}BA3$5z0HFF0 zSdFqOzcn`U0!}9%O;9s16@vUE?k@~r^#F)r4Sa|7AOiIAxR-2Nf?Ze!91{+Q0Vw-i zKbL#we8;}s9p=ry;QOId>856W-o$=h-n#R<5S`EUuDI?XQ_L+QN2BbctB;Z&^r^MA zwbCKV=rL-Db|(+z3{!(-`CeKvHCUlW_52#nI+=D`0=uIQgOAGZv@0xbw1h$!I^$>C z5PpH(9W@=27Y3>7l4!Ocm8AWe5n;3`LQ0?VIzR4!S$HLkg)u+ZO7f743L~V!#J`MP z+}}s%bH3qXSZac?9?e6FmHkfl>^KhA+fj3V6&M0T%k?Gv%(YQBGUO>(ADE)FL}YBv66qF+BJ0*%^?#4G#SI^WbX@%l?W#N_op!uOh26aCXS2 zat@EVfc9^m6F@c2K+orUadelZY^km8=H{m7b8Eo%!)6dOy&Xfc)rUo}M@Tm#H$l(d(_pc8C!n%3p+bIS=qrt`E;O?Jgae?~1(8GF zY#!p`VnB*Am|Y++1q^EnEs6^nfsjT9Y_RA_EUj!xK7am5oo$g~HO)aT$#PVV&w~bW zqXz;I0W%jgigx(mih@j8B=^Bv=R^EhYzDr9vj+~XjBZU;-c>gu)SCd*kZp2X7}zcx4JvtJv5Ou6FX7kbU^ zK;{IZcUfIBQJOD6DY>}lCL2e99YR#SS+Ap|PCMvGPk;wAoS*u71T5Eg%Wkb*JTYRF z_oh^>)qQp#i%8J8nW=Hf9ISB}nFYP=`y6;aL%6?<|gMnUMi~f5%h|u8A z6Y*nUVY-UB`xoOca6g>ya74xQ?|5m36)Z{S?VOUDa&IpIs}=8mR9nA(`2da&nTEcK z%Dr#u{sg|e9=-DdkIX90_9u|23dj`}=H@A2q0p~)FC2(O`a5Hq_tZj>65MmmD9a*Y z0iHGj2m<)gq5l3vli6CLi@RCRqiyc8z2A4OTtVq%NW!wj3q7%iD^;$6W-N1#HX>gw#|ulfX2HF#aX- zN1~zaZEF^nB;L$7Ko*aN-pD)uFkGfDRp?0x73(&pfoXu+nw-`g1)@Wi8q4VA^QUne z=B|)ToY$fHkpXg0bWHp|eDWZTK|Nv$$L(zWH@3V+!$p;6cgCgj@9Hoisku6G zMYZao;ztpo;~E@%jG#sInJkPV!$@YPv|X;$<#HDP2`?b?{9Cz!4FwyL%(UID+~RB{ zCMn6d9nL7Jt1nHx=S5&1E>z}KSD)mBkll7n-YKc7Cd8+2Dad-BoKBw~+AuJ(Yw&TTWdY;vbgHpd>�LSH!3zq)!X9_kJk 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig index 36b0fd9..b398823 100644 --- a/macos/Runner/Configs/Debug.xcconfig +++ b/macos/Runner/Configs/Debug.xcconfig @@ -1,2 +1,2 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig index dff4f49..d93e5dc 100644 --- a/macos/Runner/Configs/Release.xcconfig +++ b/macos/Runner/Configs/Release.xcconfig @@ -1,2 +1,2 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig index 42bcbf4..fb4d7d3 100644 --- a/macos/Runner/Configs/Warnings.xcconfig +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -1,13 +1,13 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index dddb8a3..51d0967 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -1,12 +1,12 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index 4789daa..3733c1a 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -1,32 +1,32 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 3cc05eb..ab30cba 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -1,15 +1,15 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 852fa1a..04336df 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -1,8 +1,8 @@ - - - - - com.apple.security.app-sandbox - - - + + + + + com.apple.security.app-sandbox + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift index 61f3bd1..21fe1ab 100644 --- a/macos/RunnerTests/RunnerTests.swift +++ b/macos/RunnerTests/RunnerTests.swift @@ -1,12 +1,12 @@ -import Cocoa -import FlutterMacOS -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/pubspec.lock b/pubspec.lock index 41077ff..35243bc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,690 +1,690 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" - source: hosted - version: "2.13.0" - bluez: - dependency: transitive - description: - name: bluez - sha256: "61a7204381925896a374301498f2f5399e59827c6498ae1e924aaa598751b545" - url: "https://pub.dev" - source: hosted - version: "0.8.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" - url: "https://pub.dev" - source: hosted - version: "0.3.5+1" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - dbus: - dependency: transitive - description: - name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c - url: "https://pub.dev" - source: hosted - version: "2.1.5" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_blue_plus: - dependency: "direct main" - description: - name: flutter_blue_plus - sha256: "69a8c87c11fc792e8cf0f997d275484fbdb5143ac9f0ac4d424429700cb4e0ed" - url: "https://pub.dev" - source: hosted - version: "1.36.8" - flutter_blue_plus_android: - dependency: transitive - description: - name: flutter_blue_plus_android - sha256: "6f7fe7e69659c30af164a53730707edc16aa4d959e4c208f547b893d940f853d" - url: "https://pub.dev" - source: hosted - version: "7.0.4" - flutter_blue_plus_darwin: - dependency: transitive - description: - name: flutter_blue_plus_darwin - sha256: "682982862c1d964f4d54a3fb5fccc9e59a066422b93b7e22079aeecd9c0d38f8" - url: "https://pub.dev" - source: hosted - version: "7.0.3" - flutter_blue_plus_linux: - dependency: transitive - description: - name: flutter_blue_plus_linux - sha256: "56b0c45edd0a2eec8f85bd97a26ac3cd09447e10d0094fed55587bf0592e3347" - url: "https://pub.dev" - source: hosted - version: "7.0.3" - flutter_blue_plus_platform_interface: - dependency: transitive - description: - name: flutter_blue_plus_platform_interface - sha256: "84fbd180c50a40c92482f273a92069960805ce324e3673ad29c41d2faaa7c5c2" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - flutter_blue_plus_web: - dependency: transitive - description: - name: flutter_blue_plus_web - sha256: a1aceee753d171d24c0e0cdadb37895b5e9124862721f25f60bb758e20b72c99 - url: "https://pub.dev" - source: hosted - version: "7.0.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - glob: - dependency: transitive - description: - name: glob - sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.dev" - source: hosted - version: "2.1.3" - hooks: - dependency: transitive - description: - name: hooks - sha256: "5d309c86e7ce34cd8e37aa71cb30cb652d3829b900ab145e4d9da564b31d59f7" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.dev" - source: hosted - version: "3.0.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" - source: hosted - version: "0.12.19" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" - url: "https://pub.dev" - source: hosted - version: "1.18.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - native_toolchain_c: - dependency: transitive - description: - name: native_toolchain_c - sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" - url: "https://pub.dev" - source: hosted - version: "0.17.4" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "983c7fa1501f6dcc0cb7af4e42072e9993cb28d73604d25ebf4dab08165d997e" - url: "https://pub.dev" - source: hosted - version: "9.2.5" - path: - dependency: "direct main" - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e - url: "https://pub.dev" - source: hosted - version: "2.2.22" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.dev" - source: hosted - version: "11.4.0" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.dev" - source: hosted - version: "12.1.0" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.dev" - source: hosted - version: "9.4.7" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.dev" - source: hosted - version: "7.0.1" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - provider: - dependency: "direct main" - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" - source: hosted - version: "0.28.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.dev" - source: hosted - version: "10.1.4" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.dev" - source: hosted - version: "5.0.2" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - sqflite: - dependency: "direct main" - description: - name: sqflite - sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - sqflite_android: - dependency: transitive - description: - name: sqflite_android - sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 - url: "https://pub.dev" - source: hosted - version: "2.4.2+2" - sqflite_common: - dependency: transitive - description: - name: sqflite_common - sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - sqflite_darwin: - dependency: transitive - description: - name: sqflite_darwin - sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - sqflite_platform_interface: - dependency: transitive - description: - name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - synchronized: - dependency: transitive - description: - name: synchronized - sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.dev" - source: hosted - version: "3.4.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.dev" - source: hosted - version: "3.2.2" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f - url: "https://pub.dev" - source: hosted - version: "2.4.2" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.dev" - source: hosted - version: "3.1.5" - uuid: - dependency: transitive - description: - name: uuid - sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 - url: "https://pub.dev" - source: hosted - version: "4.5.2" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.dev" - source: hosted - version: "15.0.2" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.10.3 <4.0.0" - flutter: ">=3.38.4" +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + bluez: + dependency: transitive + description: + name: bluez + sha256: "61a7204381925896a374301498f2f5399e59827c6498ae1e924aaa598751b545" + url: "https://pub.dev" + source: hosted + version: "0.8.3" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + url: "https://pub.dev" + source: hosted + version: "0.3.5+1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c + url: "https://pub.dev" + source: hosted + version: "2.1.5" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_blue_plus: + dependency: "direct main" + description: + name: flutter_blue_plus + sha256: "69a8c87c11fc792e8cf0f997d275484fbdb5143ac9f0ac4d424429700cb4e0ed" + url: "https://pub.dev" + source: hosted + version: "1.36.8" + flutter_blue_plus_android: + dependency: transitive + description: + name: flutter_blue_plus_android + sha256: "6f7fe7e69659c30af164a53730707edc16aa4d959e4c208f547b893d940f853d" + url: "https://pub.dev" + source: hosted + version: "7.0.4" + flutter_blue_plus_darwin: + dependency: transitive + description: + name: flutter_blue_plus_darwin + sha256: "682982862c1d964f4d54a3fb5fccc9e59a066422b93b7e22079aeecd9c0d38f8" + url: "https://pub.dev" + source: hosted + version: "7.0.3" + flutter_blue_plus_linux: + dependency: transitive + description: + name: flutter_blue_plus_linux + sha256: "56b0c45edd0a2eec8f85bd97a26ac3cd09447e10d0094fed55587bf0592e3347" + url: "https://pub.dev" + source: hosted + version: "7.0.3" + flutter_blue_plus_platform_interface: + dependency: transitive + description: + name: flutter_blue_plus_platform_interface + sha256: "84fbd180c50a40c92482f273a92069960805ce324e3673ad29c41d2faaa7c5c2" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_blue_plus_web: + dependency: transitive + description: + name: flutter_blue_plus_web + sha256: a1aceee753d171d24c0e0cdadb37895b5e9124862721f25f60bb758e20b72c99 + url: "https://pub.dev" + source: hosted + version: "7.0.2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + hooks: + dependency: transitive + description: + name: hooks + sha256: "5d309c86e7ce34cd8e37aa71cb30cb652d3829b900ab145e4d9da564b31d59f7" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd" + url: "https://pub.dev" + source: hosted + version: "0.12.20" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" + url: "https://pub.dev" + source: hosted + version: "1.19.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" + url: "https://pub.dev" + source: hosted + version: "0.17.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "983c7fa1501f6dcc0cb7af4e42072e9993cb28d73604d25ebf4dab08165d997e" + url: "https://pub.dev" + source: hosted + version: "9.2.5" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + url: "https://pub.dev" + source: hosted + version: "2.2.22" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da + url: "https://pub.dev" + source: hosted + version: "10.1.4" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b + url: "https://pub.dev" + source: hosted + version: "5.0.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 + url: "https://pub.dev" + source: hosted + version: "2.4.2+2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11" + url: "https://pub.dev" + source: hosted + version: "0.7.12" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + url: "https://pub.dev" + source: hosted + version: "2.4.2" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + url: "https://pub.dev" + source: hosted + version: "4.5.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.0-0 <4.0.0" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 068dcb6..481e68f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,34 +1,34 @@ -name: siab_bluetooth_app -description: SIAB Bluetooth streaming data app for Android -publish_to: 'none' -version: 1.0.0+1 - -environment: - sdk: '>=3.0.0 <4.0.0' - -dependencies: - flutter: - sdk: flutter - - # Bluetooth Low Energy - flutter_blue_plus: ^1.30.0 - - # State management - provider: ^6.1.1 - - # UI - cupertino_icons: ^1.0.6 - # Local SQLite - sqflite: ^2.3.2 - path: ^1.9.0 - path_provider: ^2.1.2 - permission_handler: ^11.3.0 - share_plus: ^10.0.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^3.0.0 - -flutter: - uses-material-design: true +name: siab_bluetooth_app +description: SIAB Bluetooth streaming data app for Android +publish_to: 'none' +version: 1.0.0+1 + +environment: + sdk: '>=3.0.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + + # Bluetooth Low Energy + flutter_blue_plus: ^1.30.0 + + # State management + provider: ^6.1.1 + + # UI + cupertino_icons: ^1.0.6 + # Local SQLite + sqflite: ^2.3.2 + path: ^1.9.0 + path_provider: ^2.1.2 + permission_handler: ^11.3.0 + share_plus: ^10.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.0 + +flutter: + uses-material-design: true diff --git a/siab-release.keystore b/siab-release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..5271498fd55a8f2e5344e70cca47f316daf02573 GIT binary patch literal 2788 zcma);X*d)N_r}d;8OAb?eP1%j(u}e;wz4EKVuXx57|U29Y78SZc8MN?jGZZ2N0zcL z%?PcQr0iQYq(nT*mbd@)f3KeF{q(*c&ULQyyU%?--q%4=pz}Zg2uXpaaq=8ZI+OGr z2H*meQlMlo1sd@Sha)MF>i>`+1z-x~&M!>;RhgW;|90^~0l-oU#Pk4El5-{GWj}3 zP4lcbE~`_XlMlwZ1c>_dUX{*7KlUiswnq5nZ@z}-%J78fr7(iv2uFFvl@l`^G!Ve# zzG<<{6=h!F$z;-5phm7r%9OY9?cEQ%DHpZ^FvjNl(}CYTgb%taVtxMrCX6d5!=Gk; zW?7j|yl|*BNNQEHE=pLP7=N6DAEs`9k(X}I{KM(g;-`wy?$OZKlil-ytFsh@>g)WeM*e4Ib;*{39rb2MK*duEQFHS zYliG)jUyJf!xw$EIlVP&V@*7PPuyPQHD7nQHo!H+{nYy=dd{{d<+j}vy(&*czOH55 zk-X3{GvRf{bPzlGD6dfD2Q&`w`D#nf?p4oeP-dLr;iGhj#%jTXs^?j<&1pB5C%lGt zwBmx|{fEXfJ1NV<+pn~&)(yfkbOVjs_JgHWW=m5O#sM`szTBL6f94C3DxJQj)}QN( zk&>$T5BZ_nMB&@4Cm3|D!1c1eK)jMiTg_p{Mw3Akv;32EiGTKMky3jsEfqJMJaa6V zu86E}Rn{Su6$M)>aN)rZH!O|&4=l0*^BXJs6BZ;b`^ztdD5wnO5E#Y)A#}T&#v=jv zrMZgBOBz|+a*ZdHJUNG`jM zu~3jPcY&=EKHjg_JXmP-1o~0qJBJf!-c!_y)>Q;LzKH1W)^tc~Y8Fdi zZjkBS_x{l^q9mWDC;W{0u+Ac2I9cJ{UD`aR*G>MznEIg&OY~O_2_ybMX@UNT%g2( z5nqos>CIlt_^$k^pMsSrr1X0!@j3!&Zr062OIj^_mzr()!dV}6Xg?-cf40bV59IpxN;yx*upWVsHGz zbP}PGUQACzkdoO=)`>g9Eo+d0#ufEZJ0r_U$Uvu~{MA(6*A5l}eWX_3t5X|7Hl3gm zqKwf(-i%W44;Z=fdC>7y9NA#lkWw|4+NDQ-C=OmA;}B=xSp7I#ee%hK$`zWa1VXKz zrE?n*n7PpSw*g?lL916IYj7o`&He25{Tl$k_?`->=uGIcIA*7s*X|s=(tHMNb+Ls) zggK4dd7-B}y)Se}h|H;Yx*uy%o0Sd!c!kM0@$_aeP;-*oPH)Oh|y%SIH zVVU-g%7Kgzy+52rxIo>FWJzPbZ##0h2F3tv{<=bPE{XPE%R&Ek6)tgakcfcyL zr`_eg*zqvqc<_FI*#1&E(LOTbLWb!TIB5(bwtw+N?B+Xr0esPb2{0++wc$uACd#E? zWex5^rxgow#4%PNjy|o1MBY0=Bj&{Q-2s1eOC%$btJ|>qM*%f zaf52^E%8OJ3VS;#Q27yRTCmhNuUp7c0yPPGTM{O1iykIV+;bzcWVN7rH@!+v)k`~d z`n7_;y%nQO@4H@sn6)OJe=r88PrPGhlBA5C420*ZjYg&>Q;3IVGvg8U=_LwjyjH6| z>6ffio^5?2r2IH36&~z@6fO+m#2k07pAX_eIy*p|G~F$3nmuvN`KDvIEb|;`i$oz| zzdt`90Kx&5k7EtRLY+|Y3?g;EMWG*44DN9W795$ot4^!hPYT!p3tO}%o4M7ZI^P6i Rx{L2fK1ox$*Z+T!^)E{l_>}+v literal 0 HcmV?d00001 diff --git a/test/widget_test.dart b/test/widget_test.dart index 1cd8cf0..b2a6750 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,58 +1,58 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:siab_bluetooth_app/models/registered_device.dart'; -import 'package:siab_bluetooth_app/services/ble_service.dart'; - -void main() { - group('RegisteredDevice Model Tests', () { - test('toMap and fromMap serialization', () { - final device = RegisteredDevice( - id: 1, - uuid: '00:11:22:33:44:55', - label: 'Scale Alpha', - ); - - final map = device.toMap(); - expect(map['id'], 1); - expect(map['uuid'], '00:11:22:33:44:55'); - expect(map['label'], 'Scale Alpha'); - - final from = RegisteredDevice.fromMap(map); - expect(from.id, 1); - expect(from.uuid, '00:11:22:33:44:55'); - expect(from.label, 'Scale Alpha'); - }); - - test('copyWith works correctly', () { - final device = RegisteredDevice( - id: 1, - uuid: '00:11:22:33:44:55', - label: 'Scale Alpha', - ); - - final updated = device.copyWith(label: 'Scale Beta'); - expect(updated.id, 1); - expect(updated.uuid, '00:11:22:33:44:55'); - expect(updated.label, 'Scale Beta'); - }); - }); - - group('DataPacket Tests', () { - test('parses weight correctly from byte 3 (index 2)', () { - final packet = DataPacket( - data: [0xAA, 0xBB, 125, 0xDD], - timestamp: DateTime.now(), - packetNumber: 1, - ); - - expect(packet.weightKg, 12.5); - expect(packet.hexString, 'aabb7ddd'); - }); - }); -} +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:siab_bluetooth_app/models/registered_device.dart'; +import 'package:siab_bluetooth_app/services/ble_service.dart'; + +void main() { + group('RegisteredDevice Model Tests', () { + test('toMap and fromMap serialization', () { + final device = RegisteredDevice( + id: 1, + uuid: '00:11:22:33:44:55', + label: 'Scale Alpha', + ); + + final map = device.toMap(); + expect(map['id'], 1); + expect(map['uuid'], '00:11:22:33:44:55'); + expect(map['label'], 'Scale Alpha'); + + final from = RegisteredDevice.fromMap(map); + expect(from.id, 1); + expect(from.uuid, '00:11:22:33:44:55'); + expect(from.label, 'Scale Alpha'); + }); + + test('copyWith works correctly', () { + final device = RegisteredDevice( + id: 1, + uuid: '00:11:22:33:44:55', + label: 'Scale Alpha', + ); + + final updated = device.copyWith(label: 'Scale Beta'); + expect(updated.id, 1); + expect(updated.uuid, '00:11:22:33:44:55'); + expect(updated.label, 'Scale Beta'); + }); + }); + + group('DataPacket Tests', () { + test('parses weight correctly from byte 3 (index 2)', () { + final packet = DataPacket( + data: [0xAA, 0xBB, 125, 0xDD], + timestamp: DateTime.now(), + packetNumber: 1, + ); + + expect(packet.weightKg, 12.5); + expect(packet.hexString, 'aabb7ddd'); + }); + }); +} diff --git a/windows/.gitignore b/windows/.gitignore index d492d0d..ec4098a 100644 --- a/windows/.gitignore +++ b/windows/.gitignore @@ -1,17 +1,17 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 903f489..efb62eb 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -1,109 +1,109 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - ${FLUTTER_TARGET_PLATFORM} $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index 394917c..2041a04 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -1,40 +1,40 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index 955ee30..c819cb0 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -1,71 +1,71 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h index 6da0652..28c2383 100644 --- a/windows/runner/flutter_window.h +++ b/windows/runner/flutter_window.h @@ -1,33 +1,33 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index ce99c12..39a4d28 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -1,43 +1,43 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.Create(L"SIAB Scale", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"SIAB Scale", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h index 66a65d1..ddc7f3e 100644 --- a/windows/runner/resource.h +++ b/windows/runner/resource.h @@ -1,16 +1,16 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest index 153653e..4b962bb 100644 --- a/windows/runner/runner.exe.manifest +++ b/windows/runner/runner.exe.manifest @@ -1,14 +1,14 @@ - - - - - PerMonitorV2 - - - - - - - - - + + + + + PerMonitorV2 + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp index 3a0b465..259d85b 100644 --- a/windows/runner/utils.cpp +++ b/windows/runner/utils.cpp @@ -1,65 +1,65 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - unsigned int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length == 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, utf8_string.data(), target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h index 3879d54..3f0e05c 100644 --- a/windows/runner/utils.h +++ b/windows/runner/utils.h @@ -1,19 +1,19 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index 60608d0..b5ba2a0 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -1,288 +1,288 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - } - FreeLibrary(user32_module); -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registrar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::Create(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h index e901dde..49b847f 100644 --- a/windows/runner/win32_window.h +++ b/windows/runner/win32_window.h @@ -1,102 +1,102 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates a win32 window with |title| that is positioned and sized using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_

vGcn8jBAs1uH@zz$Pt?lXa~sX4V>h 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 YzrTd1q__~olmGw#07*qoM6N<$f=f{phyVZp literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/432px/PNG/432px - blue box - green background.png b/app-store-assets/icons/432px/PNG/432px - blue box - green background.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae68ea8e1f58e6a8dfcf72d2ae2f592334330e3 GIT binary patch literal 10413 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 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/432px/PNG/432px - blue box - white background.png b/app-store-assets/icons/432px/PNG/432px - blue box - white background.png new file mode 100644 index 0000000000000000000000000000000000000000..39f9263d78ed57b5675c3e1a2729780f6f3f5c2b GIT binary patch literal 12005 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 TlzR=}s8OUo$%~i5zWV+z4PA^4 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/432px/PNG/432px - white box - blue background.png b/app-store-assets/icons/432px/PNG/432px - white box - blue background.png new file mode 100644 index 0000000000000000000000000000000000000000..4b397524ceaf57bc82e4582c799334f2696d251c GIT binary patch literal 11437 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 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/432px/PNG/432px - white box - transparent.png b/app-store-assets/icons/432px/PNG/432px - white box - transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..b808096187b85a6dba61ee6a8576208b672a6acc GIT binary patch literal 10777 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 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/432px/SVG/432px - blue box - green background.svg b/app-store-assets/icons/432px/SVG/432px - blue box - green background.svg new file mode 100644 index 0000000..12256a9 --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - blue box - green background.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/432px/SVG/432px - blue box - white background.svg b/app-store-assets/icons/432px/SVG/432px - blue box - white background.svg new file mode 100644 index 0000000..fffd8ad --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - blue box - white background.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/432px/SVG/432px - green box - white background.svg b/app-store-assets/icons/432px/SVG/432px - green box - white background.svg new file mode 100644 index 0000000..4b75e17 --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - green box - white background.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/432px/SVG/432px - white box - blue background.svg b/app-store-assets/icons/432px/SVG/432px - white box - blue background.svg new file mode 100644 index 0000000..1988ebf --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - white box - blue background.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/432px/SVG/432px - white box - transparent.svg b/app-store-assets/icons/432px/SVG/432px - white box - transparent.svg new file mode 100644 index 0000000..9ad8c4a --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - white box - transparent.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/432px/SVG/432px - white box - white background.svg b/app-store-assets/icons/432px/SVG/432px - white box - white background.svg new file mode 100644 index 0000000..4ec422e --- /dev/null +++ b/app-store-assets/icons/432px/SVG/432px - white box - white background.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/PNG/512px - blue box - green background.png b/app-store-assets/icons/512px/PNG/512px - blue box - green background.png new file mode 100644 index 0000000000000000000000000000000000000000..9d503c0b34c9370b9bdf5af9c0109392cdcafaf3 GIT binary patch literal 12395 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 QP_PcDDrzc}%2@{d7f`6KUjP6A literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - blue box - transparent.png b/app-store-assets/icons/512px/PNG/512px - blue box - transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..c6acc9e081e62ceeef8595a17d166e8f5ba68814 GIT binary patch literal 11741 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 @)l_ppZwO`kog;|+> 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 D1X)fJ literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - green box - blue background.png b/app-store-assets/icons/512px/PNG/512px - green box - blue background.png new file mode 100644 index 0000000000000000000000000000000000000000..517beaea482b94fdab34c6e8aef51e58f0103b88 GIT binary patch literal 12502 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 X&v5$YSF9D79EGsvcBh}7@=g0+&_i){ literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - green box - white background.png b/app-store-assets/icons/512px/PNG/512px - green box - white background.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0ac53a0dc73e919866d11ae22549f552aecd82 GIT binary patch literal 13766 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 L;%Kn}>DvDRDCGf= literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - white box - blue background.png b/app-store-assets/icons/512px/PNG/512px - white box - blue background.png new file mode 100644 index 0000000000000000000000000000000000000000..aa367b2bdbc70f942baacdd49c5d66a314fa6a4d GIT binary patch literal 13671 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 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - white box - transparent.png b/app-store-assets/icons/512px/PNG/512px - white box - transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..3a852210ff2cbd6123b57ee44bd94a3b1c5cdb19 GIT binary patch literal 12812 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 literal 0 HcmV?d00001 diff --git a/app-store-assets/icons/512px/PNG/512px - white box - white background.png b/app-store-assets/icons/512px/PNG/512px - white box - white background.png new file mode 100644 index 0000000000000000000000000000000000000000..b06203433014dcaf0dbeccfeeab4101d6d0e0257 GIT binary patch literal 9929 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - White box - transparent.svg b/app-store-assets/icons/512px/SVG/512px - White box - transparent.svg new file mode 100644 index 0000000..b1f5630 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - White box - transparent.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - White box - white background.svg b/app-store-assets/icons/512px/SVG/512px - White box - white background.svg new file mode 100644 index 0000000..777ed2f --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - White box - white background.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - blue box - green background.svg b/app-store-assets/icons/512px/SVG/512px - blue box - green background.svg new file mode 100644 index 0000000..2f2e6c0 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - blue box - green background.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - blue box - transparent.svg b/app-store-assets/icons/512px/SVG/512px - blue box - transparent.svg new file mode 100644 index 0000000..cec38b1 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - blue box - transparent.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - blue box - white background.svg b/app-store-assets/icons/512px/SVG/512px - blue box - white background.svg new file mode 100644 index 0000000..8d7742a --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - blue box - white background.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - green box - blue background.svg b/app-store-assets/icons/512px/SVG/512px - green box - blue background.svg new file mode 100644 index 0000000..2cd4f0f --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - green box - blue background.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - green box - transparent.svg b/app-store-assets/icons/512px/SVG/512px - green box - transparent.svg new file mode 100644 index 0000000..872cab0 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - green box - transparent.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - green box - white background.svg b/app-store-assets/icons/512px/SVG/512px - green box - white background.svg new file mode 100644 index 0000000..15eabbb --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - green box - white background.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - icon only - no safe area - transparent.svg b/app-store-assets/icons/512px/SVG/512px - icon only - no safe area - transparent.svg new file mode 100644 index 0000000..ab4dfa0 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - icon only - no safe area - transparent.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-store-assets/icons/512px/SVG/512px - icon only - transparent.svg b/app-store-assets/icons/512px/SVG/512px - icon only - transparent.svg new file mode 100644 index 0000000..1afc742 --- /dev/null +++ b/app-store-assets/icons/512px/SVG/512px - icon only - transparent.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/.gitignore b/ios/.gitignore index 7a7f987..ad322bc 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -1,34 +1,34 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 1dc6cf7..b5586f2 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -1,26 +1,26 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 13.0 - - + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 919434a..c4b79bd 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index f9b0d7c..af0309c 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -1,8 +1,8 @@ - - - - - PreviewsEnabled - - - + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d4..bbabc4e 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,101 +1,101 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index f9b0d7c..af0309c 100644 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -1,8 +1,8 @@ - - - - - PreviewsEnabled - - - + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 6266644..8be1cec 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,13 +1,13 @@ -import Flutter -import UIKit - -@main -@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) - } -} +import Flutter +import UIKit + +@main +@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/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..1950fd8 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,122 @@ -{ - "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" : "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" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 0bedcf2..d08a4de 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,23 +1,23 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md index 89c2725..65a94b5 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -1,5 +1,5 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index f2e259c..497371e 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index f3c2851..bbb83ca 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h index 308a2a5..fae207f 100644 --- a/ios/Runner/Runner-Bridging-Header.h +++ b/ios/Runner/Runner-Bridging-Header.h @@ -1 +1 @@ -#import "GeneratedPluginRegistrant.h" +#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift index 86a7c3b..4d206de 100644 --- a/ios/RunnerTests/RunnerTests.swift +++ b/ios/RunnerTests/RunnerTests.swift @@ -1,12 +1,12 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/database/siab_database.dart b/lib/database/siab_database.dart index 8ebb737..1eb287a 100644 --- a/lib/database/siab_database.dart +++ b/lib/database/siab_database.dart @@ -1,93 +1,93 @@ -import 'package:path/path.dart'; -import 'package:sqflite/sqflite.dart'; -import '../models/registered_device.dart'; - -const _tableName = 'siab_devices'; - -class SiabDatabase { - static Database? _db; - - static Future get database async { - if (_db != null) return _db!; - _db = await _init(); - return _db!; - } - - static Future _init() async { - final dbPath = await getDatabasesPath(); - final path = join(dbPath, 'siab_devices.db'); - return openDatabase( - path, - version: 2, - onCreate: (db, version) async { - await db.execute(''' - CREATE TABLE $_tableName ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - uuid TEXT NOT NULL UNIQUE, - label TEXT NOT NULL - ) - '''); - }, - onUpgrade: (db, oldVersion, newVersion) async { - // Simple destructive migration: drop old table and recreate with new schema. - if (oldVersion < 2) { - await db.execute('DROP TABLE IF EXISTS $_tableName'); - await db.execute(''' - CREATE TABLE $_tableName ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - uuid TEXT NOT NULL UNIQUE, - label TEXT NOT NULL - ) - '''); - } - }, - ); - } - - Future insert(RegisteredDevice device) async { - final db = await database; - return db.insert( - _tableName, - device.toMap(), - conflictAlgorithm: ConflictAlgorithm.replace, - ); - } - - Future> getAll() async { - final db = await database; - final maps = await db.query(_tableName, orderBy: 'label ASC'); - return maps.map(RegisteredDevice.fromMap).toList(); - } - - Future getByUuid(String uuid) async { - final db = await database; - final maps = await db.query( - _tableName, - where: 'uuid = ?', - whereArgs: [uuid], - ); - if (maps.isEmpty) return null; - return RegisteredDevice.fromMap(maps.first); - } - - Future update(RegisteredDevice device) async { - if (device.id == null) return 0; - final db = await database; - return db.update( - _tableName, - device.toMap(), - where: 'id = ?', - whereArgs: [device.id], - ); - } - - Future delete(int id) async { - final db = await database; - return db.delete(_tableName, where: 'id = ?', whereArgs: [id]); - } - - Future deleteByUuid(String uuid) async { - final db = await database; - return db.delete(_tableName, where: 'uuid = ?', whereArgs: [uuid]); - } -} +import 'package:path/path.dart'; +import 'package:sqflite/sqflite.dart'; +import '../models/registered_device.dart'; + +const _tableName = 'siab_devices'; + +class SiabDatabase { + static Database? _db; + + static Future get database async { + if (_db != null) return _db!; + _db = await _init(); + return _db!; + } + + static Future _init() async { + final dbPath = await getDatabasesPath(); + final path = join(dbPath, 'siab_devices.db'); + return openDatabase( + path, + version: 2, + onCreate: (db, version) async { + await db.execute(''' + CREATE TABLE $_tableName ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + uuid TEXT NOT NULL UNIQUE, + label TEXT NOT NULL + ) + '''); + }, + onUpgrade: (db, oldVersion, newVersion) async { + // Simple destructive migration: drop old table and recreate with new schema. + if (oldVersion < 2) { + await db.execute('DROP TABLE IF EXISTS $_tableName'); + await db.execute(''' + CREATE TABLE $_tableName ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + uuid TEXT NOT NULL UNIQUE, + label TEXT NOT NULL + ) + '''); + } + }, + ); + } + + Future insert(RegisteredDevice device) async { + final db = await database; + return db.insert( + _tableName, + device.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + Future> getAll() async { + final db = await database; + final maps = await db.query(_tableName, orderBy: 'label ASC'); + return maps.map(RegisteredDevice.fromMap).toList(); + } + + Future getByUuid(String uuid) async { + final db = await database; + final maps = await db.query( + _tableName, + where: 'uuid = ?', + whereArgs: [uuid], + ); + if (maps.isEmpty) return null; + return RegisteredDevice.fromMap(maps.first); + } + + Future update(RegisteredDevice device) async { + if (device.id == null) return 0; + final db = await database; + return db.update( + _tableName, + device.toMap(), + where: 'id = ?', + whereArgs: [device.id], + ); + } + + Future delete(int id) async { + final db = await database; + return db.delete(_tableName, where: 'id = ?', whereArgs: [id]); + } + + Future deleteByUuid(String uuid) async { + final db = await database; + return db.delete(_tableName, where: 'uuid = ?', whereArgs: [uuid]); + } +} diff --git a/lib/main.dart b/lib/main.dart index f6632d2..e217dc3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,97 +1,97 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'services/ble_service.dart'; -import 'screens/main_shell.dart'; - -void main() { - runApp(const SIABApp()); -} - -class SIABApp extends StatelessWidget { - const SIABApp({super.key}); - - @override - Widget build(BuildContext context) { - final colorScheme = ColorScheme.fromSeed( - seedColor: const Color(0xFF2563EB), - brightness: Brightness.light, - ); - - return ChangeNotifierProvider( - create: (_) => BLEService(), - child: MaterialApp( - title: 'SIAB Scale', - theme: ThemeData( - colorScheme: colorScheme, - scaffoldBackgroundColor: const Color(0xFFF4F8FF), - useMaterial3: true, - appBarTheme: const AppBarTheme( - centerTitle: false, - backgroundColor: Color(0xFFF8FBFF), - foregroundColor: Color(0xFF0F172A), - elevation: 0, - surfaceTintColor: Colors.transparent, - ), - cardTheme: CardThemeData( - color: Colors.white, - elevation: 0, - margin: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18), - ), - ), - filledButtonTheme: FilledButtonThemeData( - style: FilledButton.styleFrom( - backgroundColor: const Color(0xFF2563EB), - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - ), - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF2563EB), - foregroundColor: Colors.white, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: OutlinedButton.styleFrom( - foregroundColor: const Color(0xFF2563EB), - side: const BorderSide(color: Color(0x663B82F6)), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - ), - textButtonTheme: TextButtonThemeData( - style: TextButton.styleFrom( - foregroundColor: const Color(0xFF2563EB), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(14), - ), - ), - ), - snackBarTheme: SnackBarThemeData( - behavior: SnackBarBehavior.floating, - backgroundColor: const Color(0xFF0F172A), - contentTextStyle: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.w600, - ), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - ), - themeMode: ThemeMode.light, - home: const MainShell(), - debugShowCheckedModeBanner: false, - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'services/ble_service.dart'; +import 'screens/main_shell.dart'; + +void main() { + runApp(const SIABApp()); +} + +class SIABApp extends StatelessWidget { + const SIABApp({super.key}); + + @override + Widget build(BuildContext context) { + final colorScheme = ColorScheme.fromSeed( + seedColor: const Color(0xFF2563EB), + brightness: Brightness.light, + ); + + return ChangeNotifierProvider( + create: (_) => BLEService(), + child: MaterialApp( + title: 'SIAB Scale', + theme: ThemeData( + colorScheme: colorScheme, + scaffoldBackgroundColor: const Color(0xFFF4F8FF), + useMaterial3: true, + appBarTheme: const AppBarTheme( + centerTitle: false, + backgroundColor: Color(0xFFF8FBFF), + foregroundColor: Color(0xFF0F172A), + elevation: 0, + surfaceTintColor: Colors.transparent, + ), + cardTheme: CardThemeData( + color: Colors.white, + elevation: 0, + margin: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18), + ), + ), + filledButtonTheme: FilledButtonThemeData( + style: FilledButton.styleFrom( + backgroundColor: const Color(0xFF2563EB), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2563EB), + foregroundColor: Colors.white, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: const Color(0xFF2563EB), + side: const BorderSide(color: Color(0x663B82F6)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: const Color(0xFF2563EB), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + ), + ), + ), + snackBarTheme: SnackBarThemeData( + behavior: SnackBarBehavior.floating, + backgroundColor: const Color(0xFF0F172A), + contentTextStyle: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), + ), + themeMode: ThemeMode.light, + home: const MainShell(), + debugShowCheckedModeBanner: false, + ), + ); + } +} diff --git a/lib/models/registered_device.dart b/lib/models/registered_device.dart index 768d0e4..eaca497 100644 --- a/lib/models/registered_device.dart +++ b/lib/models/registered_device.dart @@ -1,41 +1,41 @@ -/// A SIAB device registered in local SQLite with a user-assigned label. -/// Stores only a user label (\"Label ID\") and the device UUID. -class RegisteredDevice { - final int? id; - final String uuid; - final String label; - - RegisteredDevice({ - this.id, - required this.uuid, - required this.label, - }); - - Map toMap() { - return { - if (id != null) 'id': id, - 'uuid': uuid, - 'label': label, - }; - } - - static RegisteredDevice fromMap(Map map) { - return RegisteredDevice( - id: map['id'] as int?, - uuid: map['uuid'] as String, - label: map['label'] as String, - ); - } - - RegisteredDevice copyWith({ - int? id, - String? uuid, - String? label, - }) { - return RegisteredDevice( - id: id ?? this.id, - uuid: uuid ?? this.uuid, - label: label ?? this.label, - ); - } -} +/// A SIAB device registered in local SQLite with a user-assigned label. +/// Stores only a user label (\"Label ID\") and the device UUID. +class RegisteredDevice { + final int? id; + final String uuid; + final String label; + + RegisteredDevice({ + this.id, + required this.uuid, + required this.label, + }); + + Map toMap() { + return { + if (id != null) 'id': id, + 'uuid': uuid, + 'label': label, + }; + } + + static RegisteredDevice fromMap(Map map) { + return RegisteredDevice( + id: map['id'] as int?, + uuid: map['uuid'] as String, + label: map['label'] as String, + ); + } + + RegisteredDevice copyWith({ + int? id, + String? uuid, + String? label, + }) { + return RegisteredDevice( + id: id ?? this.id, + uuid: uuid ?? this.uuid, + label: label ?? this.label, + ); + } +} diff --git a/lib/screens/devices_screen.dart b/lib/screens/devices_screen.dart index 835cfc1..17756e0 100644 --- a/lib/screens/devices_screen.dart +++ b/lib/screens/devices_screen.dart @@ -1,318 +1,318 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../database/siab_database.dart'; -import '../models/registered_device.dart'; -import '../services/ble_service.dart'; -import '../siab_config.dart'; - -class DevicesScreen extends StatefulWidget { - const DevicesScreen({super.key}); - - @override - State createState() => _DevicesScreenState(); -} - -class _DevicesScreenState extends State { - final _db = SiabDatabase(); - List _saved = []; - List _scanResults = []; - bool _loading = false; - - Future _loadSaved() async { - setState(() => _loading = true); - _saved = await _db.getAll(); - setState(() => _loading = false); - } - - Future _scan() async { - final ble = context.read(); - setState(() => _scanResults = []); - final list = await ble.scanForAllSiabDevices(); - setState(() => _scanResults = list); - } - - Future _register( SiabScanResult result, String label) async { - await _db.insert(RegisteredDevice( - uuid: result.address, - label: label.isEmpty ? result.address : label, - )); - await _loadSaved(); - } - - Future _connectToScanResult(SiabScanResult result) async { - final ble = context.read(); - final ok = await ble.connectToDevice(result.device); - if (mounted && !ok) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Connection failed'), backgroundColor: Colors.red), - ); - } else if (mounted && ok) { - await Future.delayed(const Duration(seconds: 2)); - if (mounted && ble.packetCount == 0) ble.tryStartCommands(); - await _loadSaved(); - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Connected'), backgroundColor: Colors.green), - ); - } - } - } - - Future _connectToSaved(RegisteredDevice device) async { - final ble = context.read(); - final ok = await ble.connectToAddress(device.uuid); - if (mounted && !ok) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Device not found or connection failed'), backgroundColor: Colors.red), - ); - } else if (mounted && ok) { - await Future.delayed(const Duration(seconds: 2)); - if (mounted && ble.packetCount == 0) ble.tryStartCommands(); - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Connected'), backgroundColor: Colors.green), - ); - } - } - } - - Future _unregisterDevice(RegisteredDevice device) async { - final confirmed = await showDialog( - context: context, - builder: (ctx) => AlertDialog( - title: const Text('Unregister device'), - content: Text( - 'Remove "${device.label}" (${device.uuid}) from registered devices?', - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(ctx, false), - child: const Text('Cancel'), - ), - FilledButton( - onPressed: () => Navigator.pop(ctx, true), - child: const Text('Unregister'), - ), - ], - ), - ); - - if (confirmed != true) return; - - if (device.id != null) { - await _db.delete(device.id!); - } else { - await _db.deleteByUuid(device.uuid); - } - await _loadSaved(); - } - - @override - void initState() { - super.initState(); - _loadSaved(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('SIAB SCALE'), - actions: [ - IconButton( - onPressed: _loading ? null : _loadSaved, - icon: const Icon(Icons.refresh), - ), - ], - ), - body: Consumer( - builder: (context, ble, _) { - return ListView( - padding: const EdgeInsets.all(16), - children: [ - // Scan section at top - const Text('Daftar Timbangan (scan)', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), - const SizedBox(height: 8), - OutlinedButton.icon( - onPressed: ble.isScanning ? null : () async { await _scan(); }, - icon: ble.isScanning - ? const SizedBox( - width: 18, - height: 18, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : const Icon(Icons.bluetooth_searching, size: 20), - label: Text(ble.isScanning ? 'Scanning...' : 'Scan Timbangan'), - ), - const SizedBox(height: 12), - if (_scanResults.isEmpty && !ble.isScanning) - const Card(child: Padding( - padding: EdgeInsets.all(16), - child: Text('Tap "Scan Timbangan" lihat melihat timbangan di sekitar.'), - )) - else - ..._scanResults.map((r) { - RegisteredDevice? registered; - for (final d in _saved) { - if (d.uuid == r.address) { registered = d; break; } - } - final labelId = registered?.label; - final hasLabel = labelId != null && labelId.isNotEmpty; - return Card( - margin: const EdgeInsets.only(bottom: 8), - child: Padding( - padding: const EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _ListRow(label: 'NAMA', value: labelId ?? '—'), - _ListRow(label: 'ID', value: r.device.remoteId.toString()), - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - if (!hasLabel) - Padding( - padding: const EdgeInsets.only(right: 8), - child: TextButton.icon( - onPressed: () => _showRegisterDialog(r), - icon: const Icon(Icons.app_registration, size: 18), - label: const Text('Register'), - ), - ), - TextButton.icon( - onPressed: ble.isConnecting ? null : () => _connectToScanResult(r), - icon: const Icon(Icons.link, size: 18), - label: const Text('Connect'), - ), - ], - ), - ], - ), - ), - ); - }), - - const SizedBox(height: 24), - - // Registered devices below scan - const Text('Registered devices (saved)', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), - const SizedBox(height: 8), - if (_loading) - const Center(child: CircularProgressIndicator()) - else if (_saved.isEmpty) - const Card(child: Padding( - padding: EdgeInsets.all(16), - child: Text('No registered devices. Scan and register above.'), - )) - else - ..._saved.map((d) => Card( - margin: const EdgeInsets.only(bottom: 8), - child: Padding( - padding: const EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _ListRow(label: 'NAMA', value: d.label), - _ListRow(label: 'ID', value: d.uuid), - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton.icon( - onPressed: () => _unregisterDevice(d), - icon: const Icon(Icons.delete_outline, size: 18), - label: const Text('Unregister'), - ), - const SizedBox(width: 8), - if (ble.isConnected && ble.deviceAddress == d.uuid) - const Icon(Icons.bluetooth_connected, color: Colors.green, size: 28) - else - TextButton.icon( - onPressed: ble.isConnecting ? null : () => _connectToSaved(d), - icon: const Icon(Icons.link, size: 18), - label: const Text('Connect'), - ), - ], - ), - ], - ), - ), - )), - ], - ); - }, - ), - ); - } - - void _showRegisterDialog(SiabScanResult result) { - final controller = TextEditingController( - text: result.name.isNotEmpty ? result.name : SiabConfig.deviceName, - ); - showDialog( - context: context, - builder: (ctx) => AlertDialog( - title: const Text('Register device'), - content: TextField( - controller: controller, - decoration: const InputDecoration( - labelText: 'Nama', - hintText: 'contoh : Scale 1, TIMBANGAN 1', - ), - autofocus: true, - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(ctx), - child: const Text('Cancel'), - ), - FilledButton( - onPressed: () async { - final label = controller.text.trim(); - await _register(result, label.isEmpty ? result.address : label); - if (mounted) Navigator.pop(ctx); - }, - child: const Text('Save'), - ), - ], - ), - ); - } -} - -class _ListRow extends StatelessWidget { - final String label; - final String value; - - const _ListRow({required this.label, required this.value}); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: 110, - child: Text( - '$label:', - style: TextStyle( - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.8), - fontSize: 13, - ), - ), - ), - Expanded( - child: SelectableText( - value, - style: const TextStyle(fontSize: 13), - ), - ), - ], - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../database/siab_database.dart'; +import '../models/registered_device.dart'; +import '../services/ble_service.dart'; +import '../siab_config.dart'; + +class DevicesScreen extends StatefulWidget { + const DevicesScreen({super.key}); + + @override + State createState() => _DevicesScreenState(); +} + +class _DevicesScreenState extends State { + final _db = SiabDatabase(); + List _saved = []; + List _scanResults = []; + bool _loading = false; + + Future _loadSaved() async { + setState(() => _loading = true); + _saved = await _db.getAll(); + setState(() => _loading = false); + } + + Future _scan() async { + final ble = context.read(); + setState(() => _scanResults = []); + final list = await ble.scanForAllSiabDevices(); + setState(() => _scanResults = list); + } + + Future _register( SiabScanResult result, String label) async { + await _db.insert(RegisteredDevice( + uuid: result.address, + label: label.isEmpty ? result.address : label, + )); + await _loadSaved(); + } + + Future _connectToScanResult(SiabScanResult result) async { + final ble = context.read(); + final ok = await ble.connectToDevice(result.device); + if (mounted && !ok) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Connection failed'), backgroundColor: Colors.red), + ); + } else if (mounted && ok) { + await Future.delayed(const Duration(seconds: 2)); + if (mounted && ble.packetCount == 0) ble.tryStartCommands(); + await _loadSaved(); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Connected'), backgroundColor: Colors.green), + ); + } + } + } + + Future _connectToSaved(RegisteredDevice device) async { + final ble = context.read(); + final ok = await ble.connectToAddress(device.uuid); + if (mounted && !ok) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Device not found or connection failed'), backgroundColor: Colors.red), + ); + } else if (mounted && ok) { + await Future.delayed(const Duration(seconds: 2)); + if (mounted && ble.packetCount == 0) ble.tryStartCommands(); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Connected'), backgroundColor: Colors.green), + ); + } + } + } + + Future _unregisterDevice(RegisteredDevice device) async { + final confirmed = await showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('Unregister device'), + content: Text( + 'Remove "${device.label}" (${device.uuid}) from registered devices?', + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx, false), + child: const Text('Cancel'), + ), + FilledButton( + onPressed: () => Navigator.pop(ctx, true), + child: const Text('Unregister'), + ), + ], + ), + ); + + if (confirmed != true) return; + + if (device.id != null) { + await _db.delete(device.id!); + } else { + await _db.deleteByUuid(device.uuid); + } + await _loadSaved(); + } + + @override + void initState() { + super.initState(); + _loadSaved(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('SIAB SCALE'), + actions: [ + IconButton( + onPressed: _loading ? null : _loadSaved, + icon: const Icon(Icons.refresh), + ), + ], + ), + body: Consumer( + builder: (context, ble, _) { + return ListView( + padding: const EdgeInsets.all(16), + children: [ + // Scan section at top + const Text('Daftar Timbangan (scan)', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 8), + OutlinedButton.icon( + onPressed: ble.isScanning ? null : () async { await _scan(); }, + icon: ble.isScanning + ? const SizedBox( + width: 18, + height: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.bluetooth_searching, size: 20), + label: Text(ble.isScanning ? 'Scanning...' : 'Scan Timbangan'), + ), + const SizedBox(height: 12), + if (_scanResults.isEmpty && !ble.isScanning) + const Card(child: Padding( + padding: EdgeInsets.all(16), + child: Text('Tap "Scan Timbangan" lihat melihat timbangan di sekitar.'), + )) + else + ..._scanResults.map((r) { + RegisteredDevice? registered; + for (final d in _saved) { + if (d.uuid == r.address) { registered = d; break; } + } + final labelId = registered?.label; + final hasLabel = labelId != null && labelId.isNotEmpty; + return Card( + margin: const EdgeInsets.only(bottom: 8), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _ListRow(label: 'NAMA', value: labelId ?? '—'), + _ListRow(label: 'ID', value: r.device.remoteId.toString()), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + if (!hasLabel) + Padding( + padding: const EdgeInsets.only(right: 8), + child: TextButton.icon( + onPressed: () => _showRegisterDialog(r), + icon: const Icon(Icons.app_registration, size: 18), + label: const Text('Register'), + ), + ), + TextButton.icon( + onPressed: ble.isConnecting ? null : () => _connectToScanResult(r), + icon: const Icon(Icons.link, size: 18), + label: const Text('Connect'), + ), + ], + ), + ], + ), + ), + ); + }), + + const SizedBox(height: 24), + + // Registered devices below scan + const Text('Registered devices (saved)', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 8), + if (_loading) + const Center(child: CircularProgressIndicator()) + else if (_saved.isEmpty) + const Card(child: Padding( + padding: EdgeInsets.all(16), + child: Text('No registered devices. Scan and register above.'), + )) + else + ..._saved.map((d) => Card( + margin: const EdgeInsets.only(bottom: 8), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _ListRow(label: 'NAMA', value: d.label), + _ListRow(label: 'ID', value: d.uuid), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton.icon( + onPressed: () => _unregisterDevice(d), + icon: const Icon(Icons.delete_outline, size: 18), + label: const Text('Unregister'), + ), + const SizedBox(width: 8), + if (ble.isConnected && ble.deviceAddress == d.uuid) + const Icon(Icons.bluetooth_connected, color: Colors.green, size: 28) + else + TextButton.icon( + onPressed: ble.isConnecting ? null : () => _connectToSaved(d), + icon: const Icon(Icons.link, size: 18), + label: const Text('Connect'), + ), + ], + ), + ], + ), + ), + )), + ], + ); + }, + ), + ); + } + + void _showRegisterDialog(SiabScanResult result) { + final controller = TextEditingController( + text: result.name.isNotEmpty ? result.name : SiabConfig.deviceName, + ); + showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('Register device'), + content: TextField( + controller: controller, + decoration: const InputDecoration( + labelText: 'Nama', + hintText: 'contoh : Scale 1, TIMBANGAN 1', + ), + autofocus: true, + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx), + child: const Text('Cancel'), + ), + FilledButton( + onPressed: () async { + final label = controller.text.trim(); + await _register(result, label.isEmpty ? result.address : label); + if (ctx.mounted) Navigator.pop(ctx); + }, + child: const Text('Save'), + ), + ], + ), + ); + } +} + +class _ListRow extends StatelessWidget { + final String label; + final String value; + + const _ListRow({required this.label, required this.value}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 110, + child: Text( + '$label:', + style: TextStyle( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.8), + fontSize: 13, + ), + ), + ), + Expanded( + child: SelectableText( + value, + style: const TextStyle(fontSize: 13), + ), + ), + ], + ), + ); + } +} diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 7df23a9..6f670f9 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,143 +1,144 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../services/ble_service.dart'; -import '../widgets/data_packet_card.dart'; -import '../widgets/statistics_card.dart'; -import '../widgets/connection_card.dart'; - -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - final ScrollController _scrollController = ScrollController(); - - @override - void dispose() { - _scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('SIAB Scale'), - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - actions: [ - Consumer( - builder: (context, ble, _) { - if (ble.isConnected) { - return IconButton( - icon: const Icon(Icons.delete_outline), - tooltip: 'Clear Data', - onPressed: () { - ble.clearData(); - }, - ); - } - return const SizedBox.shrink(); - }, - ), - ], - ), - body: Consumer( - builder: (context, ble, _) { - return Column( - children: [ - // Connection Card - ConnectionCard(ble: ble), - - // Statistics Card - if (ble.isConnected) StatisticsCard(ble: ble), - - // Data Packets List - Expanded( - child: ble.isConnected && ble.dataPackets.isNotEmpty - ? ListView.builder( - controller: _scrollController, - padding: const EdgeInsets.all(8), - itemCount: ble.dataPackets.length, - reverse: true, // Show newest first - itemBuilder: (context, index) { - final packet = ble.dataPackets[ble.dataPackets.length - 1 - index]; - return DataPacketCard(packet: packet); - }, - ) - : Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - ble.isConnected - ? Icons.bluetooth_connected - : Icons.bluetooth_disabled, - size: 64, - color: Colors.grey, - ), - const SizedBox(height: 16), - Text( - ble.isConnected - ? 'Waiting for data...' - : 'Not connected', - style: Theme.of(context).textTheme.titleLarge?.copyWith( - color: Colors.grey, - ), - ), - if (ble.isConnected) ...[ - const SizedBox(height: 8), - const Text( - 'Data packets will appear here', - style: TextStyle(color: Colors.grey), - ), - ], - ], - ), - ), - ), - ], - ); - }, - ), - floatingActionButton: Consumer( - builder: (context, ble, _) { - if (ble.isConnecting || ble.isScanning) { - return const FloatingActionButton( - onPressed: null, - child: CircularProgressIndicator(color: Colors.white), - ); - } - - if (ble.isConnected) { - return FloatingActionButton( - onPressed: () async { - await ble.disconnect(); - ble.clearData(); - }, - backgroundColor: Colors.red, - child: const Icon(Icons.bluetooth_disabled), - ); - } - - return FloatingActionButton( - onPressed: () async { - final success = await ble.autoConnect(); - if (!success && mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Koneksi ke timbangan gagal'), - backgroundColor: Colors.red, - ), - ); - } - }, - child: const Icon(Icons.bluetooth_searching), - ); - }, - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../services/ble_service.dart'; +import '../widgets/data_packet_card.dart'; +import '../widgets/statistics_card.dart'; +import '../widgets/connection_card.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + final ScrollController _scrollController = ScrollController(); + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('SIAB Scale'), + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + actions: [ + Consumer( + builder: (context, ble, _) { + if (ble.isConnected) { + return IconButton( + icon: const Icon(Icons.delete_outline), + tooltip: 'Clear Data', + onPressed: () { + ble.clearData(); + }, + ); + } + return const SizedBox.shrink(); + }, + ), + ], + ), + body: Consumer( + builder: (context, ble, _) { + return Column( + children: [ + // Connection Card + ConnectionCard(ble: ble), + + // Statistics Card + if (ble.isConnected) StatisticsCard(ble: ble), + + // Data Packets List + Expanded( + child: ble.isConnected && ble.dataPackets.isNotEmpty + ? ListView.builder( + controller: _scrollController, + padding: const EdgeInsets.all(8), + itemCount: ble.dataPackets.length, + reverse: true, // Show newest first + itemBuilder: (context, index) { + final packet = ble.dataPackets[ble.dataPackets.length - 1 - index]; + return DataPacketCard(packet: packet); + }, + ) + : Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + ble.isConnected + ? Icons.bluetooth_connected + : Icons.bluetooth_disabled, + size: 64, + color: Colors.grey, + ), + const SizedBox(height: 16), + Text( + ble.isConnected + ? 'Waiting for data...' + : 'Not connected', + style: Theme.of(context).textTheme.titleLarge?.copyWith( + color: Colors.grey, + ), + ), + if (ble.isConnected) ...[ + const SizedBox(height: 8), + const Text( + 'Data packets will appear here', + style: TextStyle(color: Colors.grey), + ), + ], + ], + ), + ), + ), + ], + ); + }, + ), + floatingActionButton: Consumer( + builder: (_, ble, __) { + if (ble.isConnecting || ble.isScanning) { + return const FloatingActionButton( + onPressed: null, + child: CircularProgressIndicator(color: Colors.white), + ); + } + + if (ble.isConnected) { + return FloatingActionButton( + onPressed: () async { + await ble.disconnect(); + ble.clearData(); + }, + backgroundColor: Colors.red, + child: const Icon(Icons.bluetooth_disabled), + ); + } + + return FloatingActionButton( + onPressed: () async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final success = await ble.autoConnect(); + if (!success && mounted) { + scaffoldMessenger.showSnackBar( + const SnackBar( + content: Text('Koneksi ke timbangan gagal'), + backgroundColor: Colors.red, + ), + ); + } + }, + child: const Icon(Icons.bluetooth_searching), + ); + }, + ), + ); + } +} diff --git a/lib/screens/main_shell.dart b/lib/screens/main_shell.dart index 7bdfc6a..e3ceb98 100644 --- a/lib/screens/main_shell.dart +++ b/lib/screens/main_shell.dart @@ -1,206 +1,206 @@ -import 'dart:ui' show ImageFilter; - -import 'package:flutter/material.dart'; - -import 'devices_screen.dart'; -import 'timbang_screen.dart'; - -/// Root scaffold with bottom nav: Devices and Timbang (scale display). -class MainShell extends StatefulWidget { - const MainShell({super.key}); - - @override - State createState() => _MainShellState(); -} - -class _MainShellState extends State { - int _index = 0; - - static const _tabs = [ - (label: 'Devices', icon: Icons.list_alt), - (label: 'Timbang', icon: Icons.monitor_weight), - ]; - - @override - Widget build(BuildContext context) { - return Scaffold( - extendBody: true, - body: IndexedStack( - index: _index, - children: const [ - DevicesScreen(), - TimbangScreen(), - ], - ), - bottomNavigationBar: _FloatingGlassNavigationBar( - currentIndex: _index, - tabs: _tabs, - onTap: (i) => setState(() => _index = i), - ), - ); - } -} - -class _FloatingGlassNavigationBar extends StatelessWidget { - const _FloatingGlassNavigationBar({ - required this.currentIndex, - required this.tabs, - required this.onTap, - }); - - final int currentIndex; - final List<({String label, IconData icon})> tabs; - final ValueChanged onTap; - - @override - Widget build(BuildContext context) { - return SafeArea( - minimum: const EdgeInsets.fromLTRB(20, 0, 20, 18), - child: ClipRRect( - borderRadius: BorderRadius.circular(32), - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 24, sigmaY: 24), - child: Container( - height: 72, - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Colors.white.withValues(alpha: 0.84), - Colors.white.withValues(alpha: 0.62), - ], - ), - borderRadius: BorderRadius.circular(32), - border: Border.all(color: Colors.white.withValues(alpha: 0.9)), - boxShadow: [ - BoxShadow( - color: const Color(0xFF0F172A).withValues(alpha: 0.13), - blurRadius: 34, - offset: const Offset(0, 18), - ), - BoxShadow( - color: const Color(0xFF38BDF8).withValues(alpha: 0.1), - blurRadius: 24, - offset: const Offset(0, -6), - ), - ], - ), - child: Row( - children: [ - for (var i = 0; i < tabs.length; i++) - Expanded( - child: _GlassNavigationItem( - icon: tabs[i].icon, - label: tabs[i].label, - isSelected: i == currentIndex, - onTap: () => onTap(i), - ), - ), - ], - ), - ), - ), - ), - ); - } -} - -class _GlassNavigationItem extends StatelessWidget { - const _GlassNavigationItem({ - required this.icon, - required this.label, - required this.isSelected, - required this.onTap, - }); - - final IconData icon; - final String label; - final bool isSelected; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - const activeColor = Color(0xFF2563EB); - const inactiveColor = Color(0xFF64748B); - - return Material( - color: Colors.transparent, - child: InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(26), - child: AnimatedContainer( - duration: const Duration(milliseconds: 220), - curve: Curves.easeOutCubic, - alignment: Alignment.center, - margin: const EdgeInsets.symmetric(horizontal: 2), - padding: const EdgeInsets.symmetric(horizontal: 10), - decoration: BoxDecoration( - gradient: isSelected - ? LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Colors.white.withValues(alpha: 0.95), - activeColor.withValues(alpha: 0.12), - ], - ) - : null, - color: isSelected ? null : Colors.transparent, - borderRadius: BorderRadius.circular(26), - border: Border.all( - color: isSelected - ? Colors.white.withValues(alpha: 0.96) - : Colors.transparent, - ), - boxShadow: isSelected - ? [ - BoxShadow( - color: activeColor.withValues(alpha: 0.16), - blurRadius: 18, - offset: const Offset(0, 8), - ), - ] - : null, - ), - child: AnimatedScale( - duration: const Duration(milliseconds: 180), - curve: Curves.easeOutCubic, - scale: isSelected ? 1 : 0.96, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - color: isSelected ? activeColor : inactiveColor, - size: 22, - ), - AnimatedSize( - duration: const Duration(milliseconds: 220), - curve: Curves.easeOutCubic, - child: isSelected - ? Row( - children: [ - const SizedBox(width: 8), - Text( - label, - style: const TextStyle( - color: Color(0xFF2563EB), - fontSize: 13, - fontWeight: FontWeight.w900, - ), - ), - ], - ) - : const SizedBox.shrink(), - ), - ], - ), - ), - ), - ), - ); - } -} +import 'dart:ui' show ImageFilter; + +import 'package:flutter/material.dart'; + +import 'devices_screen.dart'; +import 'timbang_screen.dart'; + +/// Root scaffold with bottom nav: Devices and Timbang (scale display). +class MainShell extends StatefulWidget { + const MainShell({super.key}); + + @override + State createState() => _MainShellState(); +} + +class _MainShellState extends State { + int _index = 0; + + static const _tabs = [ + (label: 'Devices', icon: Icons.list_alt), + (label: 'Timbang', icon: Icons.monitor_weight), + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + extendBody: true, + body: IndexedStack( + index: _index, + children: const [ + DevicesScreen(), + TimbangScreen(), + ], + ), + bottomNavigationBar: _FloatingGlassNavigationBar( + currentIndex: _index, + tabs: _tabs, + onTap: (i) => setState(() => _index = i), + ), + ); + } +} + +class _FloatingGlassNavigationBar extends StatelessWidget { + const _FloatingGlassNavigationBar({ + required this.currentIndex, + required this.tabs, + required this.onTap, + }); + + final int currentIndex; + final List<({String label, IconData icon})> tabs; + final ValueChanged onTap; + + @override + Widget build(BuildContext context) { + return SafeArea( + minimum: const EdgeInsets.fromLTRB(20, 0, 20, 18), + child: ClipRRect( + borderRadius: BorderRadius.circular(32), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 24, sigmaY: 24), + child: Container( + height: 72, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withValues(alpha: 0.84), + Colors.white.withValues(alpha: 0.62), + ], + ), + borderRadius: BorderRadius.circular(32), + border: Border.all(color: Colors.white.withValues(alpha: 0.9)), + boxShadow: [ + BoxShadow( + color: const Color(0xFF0F172A).withValues(alpha: 0.13), + blurRadius: 34, + offset: const Offset(0, 18), + ), + BoxShadow( + color: const Color(0xFF38BDF8).withValues(alpha: 0.1), + blurRadius: 24, + offset: const Offset(0, -6), + ), + ], + ), + child: Row( + children: [ + for (var i = 0; i < tabs.length; i++) + Expanded( + child: _GlassNavigationItem( + icon: tabs[i].icon, + label: tabs[i].label, + isSelected: i == currentIndex, + onTap: () => onTap(i), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class _GlassNavigationItem extends StatelessWidget { + const _GlassNavigationItem({ + required this.icon, + required this.label, + required this.isSelected, + required this.onTap, + }); + + final IconData icon; + final String label; + final bool isSelected; + final VoidCallback onTap; + + @override + Widget build(BuildContext context) { + const activeColor = Color(0xFF2563EB); + const inactiveColor = Color(0xFF64748B); + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(26), + child: AnimatedContainer( + duration: const Duration(milliseconds: 220), + curve: Curves.easeOutCubic, + alignment: Alignment.center, + margin: const EdgeInsets.symmetric(horizontal: 2), + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + gradient: isSelected + ? LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.white.withValues(alpha: 0.95), + activeColor.withValues(alpha: 0.12), + ], + ) + : null, + color: isSelected ? null : Colors.transparent, + borderRadius: BorderRadius.circular(26), + border: Border.all( + color: isSelected + ? Colors.white.withValues(alpha: 0.96) + : Colors.transparent, + ), + boxShadow: isSelected + ? [ + BoxShadow( + color: activeColor.withValues(alpha: 0.16), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ] + : null, + ), + child: AnimatedScale( + duration: const Duration(milliseconds: 180), + curve: Curves.easeOutCubic, + scale: isSelected ? 1 : 0.96, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + color: isSelected ? activeColor : inactiveColor, + size: 22, + ), + AnimatedSize( + duration: const Duration(milliseconds: 220), + curve: Curves.easeOutCubic, + child: isSelected + ? Row( + children: [ + const SizedBox(width: 8), + Text( + label, + style: const TextStyle( + color: Color(0xFF2563EB), + fontSize: 13, + fontWeight: FontWeight.w900, + ), + ), + ], + ) + : const SizedBox.shrink(), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/timbang_screen.dart b/lib/screens/timbang_screen.dart index da00d61..5ba1e67 100644 --- a/lib/screens/timbang_screen.dart +++ b/lib/screens/timbang_screen.dart @@ -1,698 +1,698 @@ -import 'package:flutter/material.dart'; -import 'package:path/path.dart' as p; -import 'package:provider/provider.dart'; -import 'package:share_plus/share_plus.dart'; - -import '../database/siab_database.dart'; -import '../services/ble_service.dart'; - -/// Screen that shows the current timbang (weight) value on a light, -/// futuristic dashboard. -/// When connected, title shows "TIMBANGAN [label] SIAB" from registered device. -class TimbangScreen extends StatelessWidget { - const TimbangScreen({super.key}); - - @override - Widget build(BuildContext context) { - final timbangTheme = Theme.of(context).copyWith( - brightness: Brightness.light, - colorScheme: ColorScheme.fromSeed( - seedColor: const Color(0xFF2563EB), - brightness: Brightness.light, - ), - scaffoldBackgroundColor: const Color(0xFFF4F8FF), - ); - - return Theme( - data: timbangTheme, - child: Scaffold( - backgroundColor: const Color(0xFFF4F8FF), - body: Consumer( - builder: (context, ble, _) { - final weightKg = ble.lastWeightKg; - final displayValue = - weightKg != null ? weightKg.toStringAsFixed(1) : '0.0'; - final isConnected = ble.isConnected; - final address = ble.deviceAddress; - - return _TimbangBackground( - child: SafeArea( - child: SingleChildScrollView( - padding: const EdgeInsets.fromLTRB(20, 24, 20, 136), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: MediaQuery.sizeOf(context).height - - MediaQuery.paddingOf(context).vertical - - 160, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - FutureBuilder( - future: address != null - ? SiabDatabase() - .getByUuid(address) - .then((d) => d?.label ?? '') - : Future.value(''), - builder: (context, snapshot) { - final label = snapshot.data?.trim() ?? ''; - final title = isConnected && label.isNotEmpty - ? 'SIAB SCALE - $label' - : 'SIAB SCALE'; - - return _HeaderSection( - title: title, - isConnected: isConnected, - ); - }, - ), - const SizedBox(height: 24), - _WeightDisplayCard( - displayValue: displayValue, - isConnected: isConnected, - ), - const SizedBox(height: 20), - _ActionPanel( - ble: ble, - isConnected: isConnected, - ), - ], - ), - ), - ), - ), - ); - }, - ), - ), - ); - } -} - -class _TimbangBackground extends StatelessWidget { - const _TimbangBackground({required this.child}); - - final Widget child; - - @override - Widget build(BuildContext context) { - return DecoratedBox( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFFFFFFF), - Color(0xFFEFF8FF), - Color(0xFFF7FBFF), - Color(0xFFEAF1FF), - ], - ), - ), - child: Stack( - children: [ - const Positioned( - top: -90, - right: -80, - child: _GlowOrb( - size: 220, - color: Color(0x663AB7FF), - ), - ), - const Positioned( - bottom: 80, - left: -100, - child: _GlowOrb( - size: 240, - color: Color(0x553D5AFE), - ), - ), - const Positioned( - top: 120, - left: 28, - right: 28, - child: _LightBeam(), - ), - const Positioned( - bottom: 188, - right: 32, - child: _SignalDash(), - ), - Positioned.fill(child: child), - ], - ), - ); - } -} - -class _LightBeam extends StatelessWidget { - const _LightBeam(); - - @override - Widget build(BuildContext context) { - return DecoratedBox( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(999), - gradient: LinearGradient( - colors: [ - Colors.transparent, - const Color(0xFF38BDF8).withValues(alpha: 0.18), - const Color(0xFF6366F1).withValues(alpha: 0.12), - Colors.transparent, - ], - ), - ), - child: const SizedBox(height: 2), - ); - } -} - -class _SignalDash extends StatelessWidget { - const _SignalDash(); - - @override - Widget build(BuildContext context) { - return DecoratedBox( - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.58), - borderRadius: BorderRadius.circular(999), - border: Border.all(color: Colors.white.withValues(alpha: 0.82)), - boxShadow: [ - BoxShadow( - color: const Color(0xFF2563EB).withValues(alpha: 0.12), - blurRadius: 18, - offset: const Offset(0, 8), - ), - ], - ), - child: const SizedBox(width: 72, height: 8), - ); - } -} - -class _GlowOrb extends StatelessWidget { - const _GlowOrb({ - required this.size, - required this.color, - }); - - final double size; - final Color color; - - @override - Widget build(BuildContext context) { - return Container( - width: size, - height: size, - decoration: BoxDecoration( - shape: BoxShape.circle, - boxShadow: [ - BoxShadow( - color: color, - blurRadius: 80, - spreadRadius: 40, - ), - ], - ), - ); - } -} - -class _HeaderSection extends StatelessWidget { - const _HeaderSection({ - required this.title, - required this.isConnected, - }); - - final String title; - final bool isConnected; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.68), - borderRadius: BorderRadius.circular(999), - border: Border.all(color: Colors.white.withValues(alpha: 0.88)), - ), - child: const Text( - 'LIVE WEIGHING CONSOLE', - style: TextStyle( - color: Color(0xFF2563EB), - fontSize: 11, - fontWeight: FontWeight.w800, - letterSpacing: 1.2, - ), - ), - ), - const SizedBox(height: 12), - Text( - title, - textAlign: TextAlign.center, - style: const TextStyle( - color: Color(0xFF1B2B4A), - fontSize: 17, - fontWeight: FontWeight.w800, - letterSpacing: 1.4, - ), - ), - const SizedBox(height: 12), - _StatusBadge(isConnected: isConnected), - ], - ); - } -} - -class _StatusBadge extends StatelessWidget { - const _StatusBadge({required this.isConnected}); - - final bool isConnected; - - @override - Widget build(BuildContext context) { - final color = - isConnected ? const Color(0xFF00A878) : const Color(0xFFE45555); - - return Container( - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.78), - borderRadius: BorderRadius.circular(999), - border: Border.all(color: color.withValues(alpha: 0.28)), - boxShadow: [ - BoxShadow( - color: color.withValues(alpha: 0.12), - blurRadius: 18, - offset: const Offset(0, 8), - ), - ], - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - isConnected ? Icons.bluetooth_connected : Icons.bluetooth_disabled, - color: color, - size: 18, - ), - const SizedBox(width: 8), - Text( - isConnected ? 'Scale connected' : 'Connect scale in Devices tab', - style: TextStyle( - color: color, - fontSize: 12, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ); - } -} - -class _WeightDisplayCard extends StatelessWidget { - const _WeightDisplayCard({ - required this.displayValue, - required this.isConnected, - }); - - final String displayValue; - final bool isConnected; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - gradient: const LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFFFFFFFF), - Color(0xFFE2F4FF), - Color(0xFFF8FBFF), - ], - ), - borderRadius: BorderRadius.circular(34), - boxShadow: [ - BoxShadow( - color: const Color(0xFF2563EB).withValues(alpha: 0.16), - blurRadius: 42, - offset: const Offset(0, 20), - ), - BoxShadow( - color: const Color(0xFF22D3EE).withValues(alpha: 0.12), - blurRadius: 34, - offset: const Offset(0, -8), - ), - ], - ), - child: LayoutBuilder( - builder: (context, constraints) { - final isCompact = constraints.maxWidth < 340; - - return Container( - padding: EdgeInsets.symmetric( - horizontal: isCompact ? 18 : 24, - vertical: isCompact ? 28 : 36, - ), - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.9), - borderRadius: BorderRadius.circular(30), - border: Border.all(color: Colors.white.withValues(alpha: 0.9)), - ), - child: Column( - children: [ - Wrap( - spacing: 8, - runSpacing: 8, - alignment: WrapAlignment.spaceBetween, - children: [ - const _MetricChip( - icon: Icons.speed, - label: 'Live load', - color: Color(0xFF2563EB), - ), - _MetricChip( - icon: isConnected ? Icons.sensors : Icons.sensors_off, - label: isConnected ? 'Streaming' : 'Idle', - color: isConnected - ? const Color(0xFF00A878) - : const Color(0xFFE45555), - ), - ], - ), - SizedBox(height: isCompact ? 22 : 30), - const Text( - 'CURRENT WEIGHT', - style: TextStyle( - color: Color(0xFF64748B), - fontSize: 11, - fontWeight: FontWeight.w900, - letterSpacing: 2.0, - ), - ), - const SizedBox(height: 8), - FittedBox( - fit: BoxFit.scaleDown, - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - displayValue, - style: TextStyle( - color: const Color(0xFF0F1B33), - fontSize: isCompact ? 78 : 94, - height: 0.9, - fontWeight: FontWeight.w900, - letterSpacing: -4, - fontFeatures: const [FontFeature.tabularFigures()], - shadows: const [ - Shadow( - color: Color(0x5522D3EE), - blurRadius: 28, - ), - ], - ), - ), - const SizedBox(width: 10), - Padding( - padding: EdgeInsets.only(bottom: isCompact ? 7 : 10), - child: const Text( - 'kg', - style: TextStyle( - color: Color(0xFF2563EB), - fontSize: 28, - fontWeight: FontWeight.w900, - letterSpacing: -0.5, - ), - ), - ), - ], - ), - ), - SizedBox(height: isCompact ? 22 : 28), - Container( - height: 8, - decoration: BoxDecoration( - color: const Color(0xFFE0F2FE), - borderRadius: BorderRadius.circular(999), - ), - child: FractionallySizedBox( - alignment: Alignment.centerLeft, - widthFactor: isConnected ? 0.78 : 0.34, - child: DecoratedBox( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(999), - gradient: LinearGradient( - colors: [ - const Color(0xFF22D3EE).withValues(alpha: 0.72), - const Color(0xFF2563EB).withValues( - alpha: isConnected ? 0.9 : 0.48, - ), - const Color(0xFF6366F1).withValues( - alpha: isConnected ? 0.78 : 0.36, - ), - ], - ), - boxShadow: [ - BoxShadow( - color: const Color(0xFF22D3EE).withValues( - alpha: isConnected ? 0.28 : 0.12, - ), - blurRadius: 16, - ), - ], - ), - ), - ), - ), - ], - ), - ); - }, - ), - ); - } -} - -class _MetricChip extends StatelessWidget { - const _MetricChip({ - required this.icon, - required this.label, - required this.color, - }); - - final IconData icon; - final String label; - final Color color; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - decoration: BoxDecoration( - color: color.withValues(alpha: 0.08), - borderRadius: BorderRadius.circular(999), - border: Border.all(color: color.withValues(alpha: 0.16)), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, color: color, size: 16), - const SizedBox(width: 6), - Text( - label, - style: TextStyle( - color: color, - fontSize: 11, - fontWeight: FontWeight.w800, - letterSpacing: 0.2, - ), - ), - ], - ), - ); - } -} - -class _ActionPanel extends StatelessWidget { - const _ActionPanel({ - required this.ble, - required this.isConnected, - }); - - final BLEService ble; - final bool isConnected; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.8), - borderRadius: BorderRadius.circular(28), - border: Border.all(color: Colors.white.withValues(alpha: 0.92)), - boxShadow: [ - BoxShadow( - color: const Color(0xFF1D4ED8).withValues(alpha: 0.1), - blurRadius: 30, - offset: const Offset(0, 16), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (isConnected) ...[ - Wrap( - spacing: 12, - runSpacing: 8, - alignment: WrapAlignment.spaceBetween, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text( - 'Ready to capture stable measurements', - style: TextStyle( - color: Color(0xFF334155), - fontSize: 13, - fontWeight: FontWeight.w800, - ), - ), - TextButton.icon( - onPressed: () async { - await ble.disconnect(); - }, - icon: const Icon(Icons.power_settings_new, size: 18), - label: const Text('Disconnect'), - style: TextButton.styleFrom( - foregroundColor: const Color(0xFFE45555), - ), - ), - ], - ), - const SizedBox(height: 14), - ElevatedButton.icon( - onPressed: ble.hasStableWeight - ? () async { - final ok = await ble.saveStableMeasurement(); - if (!context.mounted) return; - - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - ok - ? 'Stable weight saved to file' - : 'No stable value to save yet', - ), - ), - ); - } - : null, - icon: const Icon(Icons.save_rounded), - label: const Text('Save stable value'), - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF2563EB), - foregroundColor: Colors.white, - disabledBackgroundColor: const Color(0xFFE2E8F0), - disabledForegroundColor: const Color(0xFF94A3B8), - elevation: 0, - padding: const EdgeInsets.symmetric(vertical: 16), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18), - ), - ), - ), - const SizedBox(height: 10), - OutlinedButton.icon( - onPressed: () async { - try { - final file = await ble.getTodayMeasurementFile(); - final exists = await file.exists(); - if (!context.mounted) return; - - if (!exists || await file.length() == 0) { - if (!context.mounted) return; - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - 'No measurements file for today yet. Save a value first.', - ), - ), - ); - return; - } - - await Share.shareXFiles( - [ - XFile( - file.path, - mimeType: 'text/csv', - name: p.basename(file.path), - ), - ], - subject: 'SIAB Laporan hasil Timbang ', - text: 'SIAB Laporan hasil Timbang harian.', - ); - } catch (e) { - if (!context.mounted) return; - - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('gagal mengirim file: $e'), - ), - ); - } - }, - icon: const Icon(Icons.ios_share_rounded), - label: const Text('Share today CSV'), - style: OutlinedButton.styleFrom( - foregroundColor: const Color(0xFF2563EB), - side: const BorderSide(color: Color(0x663B82F6)), - padding: const EdgeInsets.symmetric(vertical: 16), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18), - ), - ), - ), - ] else - const _DisconnectedHint(), - ], - ), - ); - } -} - -class _DisconnectedHint extends StatelessWidget { - const _DisconnectedHint(); - - @override - Widget build(BuildContext context) { - return const Row( - children: [ - Icon( - Icons.info_outline_rounded, - color: Color(0xFF64748B), - ), - SizedBox(width: 12), - Expanded( - child: Text( - 'Open the Devices tab, scan nearby scales, then connect to start live weighing.', - style: TextStyle( - color: Color(0xFF475569), - fontSize: 13, - height: 1.35, - fontWeight: FontWeight.w600, - ), - ), - ), - ], - ); - } -} +import 'package:flutter/material.dart'; +import 'package:path/path.dart' as p; +import 'package:provider/provider.dart'; +import 'package:share_plus/share_plus.dart'; + +import '../database/siab_database.dart'; +import '../services/ble_service.dart'; + +/// Screen that shows the current timbang (weight) value on a light, +/// futuristic dashboard. +/// When connected, title shows "TIMBANGAN [label] SIAB" from registered device. +class TimbangScreen extends StatelessWidget { + const TimbangScreen({super.key}); + + @override + Widget build(BuildContext context) { + final timbangTheme = Theme.of(context).copyWith( + brightness: Brightness.light, + colorScheme: ColorScheme.fromSeed( + seedColor: const Color(0xFF2563EB), + brightness: Brightness.light, + ), + scaffoldBackgroundColor: const Color(0xFFF4F8FF), + ); + + return Theme( + data: timbangTheme, + child: Scaffold( + backgroundColor: const Color(0xFFF4F8FF), + body: Consumer( + builder: (context, ble, _) { + final weightKg = ble.lastWeightKg; + final displayValue = + weightKg != null ? weightKg.toStringAsFixed(1) : '0.0'; + final isConnected = ble.isConnected; + final address = ble.deviceAddress; + + return _TimbangBackground( + child: SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.fromLTRB(20, 24, 20, 136), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: MediaQuery.sizeOf(context).height - + MediaQuery.paddingOf(context).vertical - + 160, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + FutureBuilder( + future: address != null + ? SiabDatabase() + .getByUuid(address) + .then((d) => d?.label ?? '') + : Future.value(''), + builder: (context, snapshot) { + final label = snapshot.data?.trim() ?? ''; + final title = isConnected && label.isNotEmpty + ? 'SIAB SCALE - $label' + : 'SIAB SCALE'; + + return _HeaderSection( + title: title, + isConnected: isConnected, + ); + }, + ), + const SizedBox(height: 24), + _WeightDisplayCard( + displayValue: displayValue, + isConnected: isConnected, + ), + const SizedBox(height: 20), + _ActionPanel( + ble: ble, + isConnected: isConnected, + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + ); + } +} + +class _TimbangBackground extends StatelessWidget { + const _TimbangBackground({required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFFFFFFFF), + Color(0xFFEFF8FF), + Color(0xFFF7FBFF), + Color(0xFFEAF1FF), + ], + ), + ), + child: Stack( + children: [ + const Positioned( + top: -90, + right: -80, + child: _GlowOrb( + size: 220, + color: Color(0x663AB7FF), + ), + ), + const Positioned( + bottom: 80, + left: -100, + child: _GlowOrb( + size: 240, + color: Color(0x553D5AFE), + ), + ), + const Positioned( + top: 120, + left: 28, + right: 28, + child: _LightBeam(), + ), + const Positioned( + bottom: 188, + right: 32, + child: _SignalDash(), + ), + Positioned.fill(child: child), + ], + ), + ); + } +} + +class _LightBeam extends StatelessWidget { + const _LightBeam(); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(999), + gradient: LinearGradient( + colors: [ + Colors.transparent, + const Color(0xFF38BDF8).withValues(alpha: 0.18), + const Color(0xFF6366F1).withValues(alpha: 0.12), + Colors.transparent, + ], + ), + ), + child: const SizedBox(height: 2), + ); + } +} + +class _SignalDash extends StatelessWidget { + const _SignalDash(); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.58), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: Colors.white.withValues(alpha: 0.82)), + boxShadow: [ + BoxShadow( + color: const Color(0xFF2563EB).withValues(alpha: 0.12), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], + ), + child: const SizedBox(width: 72, height: 8), + ); + } +} + +class _GlowOrb extends StatelessWidget { + const _GlowOrb({ + required this.size, + required this.color, + }); + + final double size; + final Color color; + + @override + Widget build(BuildContext context) { + return Container( + width: size, + height: size, + decoration: BoxDecoration( + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: color, + blurRadius: 80, + spreadRadius: 40, + ), + ], + ), + ); + } +} + +class _HeaderSection extends StatelessWidget { + const _HeaderSection({ + required this.title, + required this.isConnected, + }); + + final String title; + final bool isConnected; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.68), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: Colors.white.withValues(alpha: 0.88)), + ), + child: const Text( + 'LIVE WEIGHING CONSOLE', + style: TextStyle( + color: Color(0xFF2563EB), + fontSize: 11, + fontWeight: FontWeight.w800, + letterSpacing: 1.2, + ), + ), + ), + const SizedBox(height: 12), + Text( + title, + textAlign: TextAlign.center, + style: const TextStyle( + color: Color(0xFF1B2B4A), + fontSize: 17, + fontWeight: FontWeight.w800, + letterSpacing: 1.4, + ), + ), + const SizedBox(height: 12), + _StatusBadge(isConnected: isConnected), + ], + ); + } +} + +class _StatusBadge extends StatelessWidget { + const _StatusBadge({required this.isConnected}); + + final bool isConnected; + + @override + Widget build(BuildContext context) { + final color = + isConnected ? const Color(0xFF00A878) : const Color(0xFFE45555); + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.78), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: color.withValues(alpha: 0.28)), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.12), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + isConnected ? Icons.bluetooth_connected : Icons.bluetooth_disabled, + color: color, + size: 18, + ), + const SizedBox(width: 8), + Text( + isConnected ? 'Scale connected' : 'Connect scale in Devices tab', + style: TextStyle( + color: color, + fontSize: 12, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ); + } +} + +class _WeightDisplayCard extends StatelessWidget { + const _WeightDisplayCard({ + required this.displayValue, + required this.isConnected, + }); + + final String displayValue; + final bool isConnected; + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFFFFFFFF), + Color(0xFFE2F4FF), + Color(0xFFF8FBFF), + ], + ), + borderRadius: BorderRadius.circular(34), + boxShadow: [ + BoxShadow( + color: const Color(0xFF2563EB).withValues(alpha: 0.16), + blurRadius: 42, + offset: const Offset(0, 20), + ), + BoxShadow( + color: const Color(0xFF22D3EE).withValues(alpha: 0.12), + blurRadius: 34, + offset: const Offset(0, -8), + ), + ], + ), + child: LayoutBuilder( + builder: (context, constraints) { + final isCompact = constraints.maxWidth < 340; + + return Container( + padding: EdgeInsets.symmetric( + horizontal: isCompact ? 18 : 24, + vertical: isCompact ? 28 : 36, + ), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.9), + borderRadius: BorderRadius.circular(30), + border: Border.all(color: Colors.white.withValues(alpha: 0.9)), + ), + child: Column( + children: [ + Wrap( + spacing: 8, + runSpacing: 8, + alignment: WrapAlignment.spaceBetween, + children: [ + const _MetricChip( + icon: Icons.speed, + label: 'Live load', + color: Color(0xFF2563EB), + ), + _MetricChip( + icon: isConnected ? Icons.sensors : Icons.sensors_off, + label: isConnected ? 'Streaming' : 'Idle', + color: isConnected + ? const Color(0xFF00A878) + : const Color(0xFFE45555), + ), + ], + ), + SizedBox(height: isCompact ? 22 : 30), + const Text( + 'CURRENT WEIGHT', + style: TextStyle( + color: Color(0xFF64748B), + fontSize: 11, + fontWeight: FontWeight.w900, + letterSpacing: 2.0, + ), + ), + const SizedBox(height: 8), + FittedBox( + fit: BoxFit.scaleDown, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + displayValue, + style: TextStyle( + color: const Color(0xFF0F1B33), + fontSize: isCompact ? 78 : 94, + height: 0.9, + fontWeight: FontWeight.w900, + letterSpacing: -4, + fontFeatures: const [FontFeature.tabularFigures()], + shadows: const [ + Shadow( + color: Color(0x5522D3EE), + blurRadius: 28, + ), + ], + ), + ), + const SizedBox(width: 10), + Padding( + padding: EdgeInsets.only(bottom: isCompact ? 7 : 10), + child: const Text( + 'kg', + style: TextStyle( + color: Color(0xFF2563EB), + fontSize: 28, + fontWeight: FontWeight.w900, + letterSpacing: -0.5, + ), + ), + ), + ], + ), + ), + SizedBox(height: isCompact ? 22 : 28), + Container( + height: 8, + decoration: BoxDecoration( + color: const Color(0xFFE0F2FE), + borderRadius: BorderRadius.circular(999), + ), + child: FractionallySizedBox( + alignment: Alignment.centerLeft, + widthFactor: isConnected ? 0.78 : 0.34, + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(999), + gradient: LinearGradient( + colors: [ + const Color(0xFF22D3EE).withValues(alpha: 0.72), + const Color(0xFF2563EB).withValues( + alpha: isConnected ? 0.9 : 0.48, + ), + const Color(0xFF6366F1).withValues( + alpha: isConnected ? 0.78 : 0.36, + ), + ], + ), + boxShadow: [ + BoxShadow( + color: const Color(0xFF22D3EE).withValues( + alpha: isConnected ? 0.28 : 0.12, + ), + blurRadius: 16, + ), + ], + ), + ), + ), + ), + ], + ), + ); + }, + ), + ); + } +} + +class _MetricChip extends StatelessWidget { + const _MetricChip({ + required this.icon, + required this.label, + required this.color, + }); + + final IconData icon; + final String label; + final Color color; + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: color.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: color.withValues(alpha: 0.16)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: color, size: 16), + const SizedBox(width: 6), + Text( + label, + style: TextStyle( + color: color, + fontSize: 11, + fontWeight: FontWeight.w800, + letterSpacing: 0.2, + ), + ), + ], + ), + ); + } +} + +class _ActionPanel extends StatelessWidget { + const _ActionPanel({ + required this.ble, + required this.isConnected, + }); + + final BLEService ble; + final bool isConnected; + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.8), + borderRadius: BorderRadius.circular(28), + border: Border.all(color: Colors.white.withValues(alpha: 0.92)), + boxShadow: [ + BoxShadow( + color: const Color(0xFF1D4ED8).withValues(alpha: 0.1), + blurRadius: 30, + offset: const Offset(0, 16), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (isConnected) ...[ + Wrap( + spacing: 12, + runSpacing: 8, + alignment: WrapAlignment.spaceBetween, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text( + 'Ready to capture stable measurements', + style: TextStyle( + color: Color(0xFF334155), + fontSize: 13, + fontWeight: FontWeight.w800, + ), + ), + TextButton.icon( + onPressed: () async { + await ble.disconnect(); + }, + icon: const Icon(Icons.power_settings_new, size: 18), + label: const Text('Disconnect'), + style: TextButton.styleFrom( + foregroundColor: const Color(0xFFE45555), + ), + ), + ], + ), + const SizedBox(height: 14), + ElevatedButton.icon( + onPressed: ble.hasStableWeight + ? () async { + final ok = await ble.saveStableMeasurement(); + if (!context.mounted) return; + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + ok + ? 'Stable weight saved to file' + : 'No stable value to save yet', + ), + ), + ); + } + : null, + icon: const Icon(Icons.save_rounded), + label: const Text('Save stable value'), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2563EB), + foregroundColor: Colors.white, + disabledBackgroundColor: const Color(0xFFE2E8F0), + disabledForegroundColor: const Color(0xFF94A3B8), + elevation: 0, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18), + ), + ), + ), + const SizedBox(height: 10), + OutlinedButton.icon( + onPressed: () async { + try { + final file = await ble.getTodayMeasurementFile(); + final exists = await file.exists(); + if (!context.mounted) return; + + if (!exists || await file.length() == 0) { + if (!context.mounted) return; + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'No measurements file for today yet. Save a value first.', + ), + ), + ); + return; + } + + await Share.shareXFiles( + [ + XFile( + file.path, + mimeType: 'text/csv', + name: p.basename(file.path), + ), + ], + subject: 'SIAB Laporan hasil Timbang ', + text: 'SIAB Laporan hasil Timbang harian.', + ); + } catch (e) { + if (!context.mounted) return; + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('gagal mengirim file: $e'), + ), + ); + } + }, + icon: const Icon(Icons.ios_share_rounded), + label: const Text('Share today CSV'), + style: OutlinedButton.styleFrom( + foregroundColor: const Color(0xFF2563EB), + side: const BorderSide(color: Color(0x663B82F6)), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18), + ), + ), + ), + ] else + const _DisconnectedHint(), + ], + ), + ); + } +} + +class _DisconnectedHint extends StatelessWidget { + const _DisconnectedHint(); + + @override + Widget build(BuildContext context) { + return const Row( + children: [ + Icon( + Icons.info_outline_rounded, + color: Color(0xFF64748B), + ), + SizedBox(width: 12), + Expanded( + child: Text( + 'Open the Devices tab, scan nearby scales, then connect to start live weighing.', + style: TextStyle( + color: Color(0xFF475569), + fontSize: 13, + height: 1.35, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ); + } +} diff --git a/lib/siab_config.dart b/lib/siab_config.dart index 7a84125..478d4c3 100644 --- a/lib/siab_config.dart +++ b/lib/siab_config.dart @@ -1,14 +1,14 @@ -/// Central configuration for SIAB-related constants. -/// -/// The [deviceName] can be overridden at build time using: -/// `--dart-define=SIAB_DEVICE_NAME=YourDeviceName`. -class SiabConfig { - const SiabConfig._(); - - /// Logical Bluetooth name to search for when scanning SIAB devices. - static const String deviceName = String.fromEnvironment( - 'SIAB_DEVICE_NAME', - defaultValue: 'SIAB', - ); -} - +/// Central configuration for SIAB-related constants. +/// +/// The [deviceName] can be overridden at build time using: +/// `--dart-define=SIAB_DEVICE_NAME=YourDeviceName`. +class SiabConfig { + const SiabConfig._(); + + /// Logical Bluetooth name to search for when scanning SIAB devices. + static const String deviceName = String.fromEnvironment( + 'SIAB_DEVICE_NAME', + defaultValue: 'SIAB', + ); +} + diff --git a/lib/widgets/connection_card.dart b/lib/widgets/connection_card.dart index e65927f..56d55cf 100644 --- a/lib/widgets/connection_card.dart +++ b/lib/widgets/connection_card.dart @@ -1,79 +1,79 @@ -import 'package:flutter/material.dart'; -import '../services/ble_service.dart'; -import '../siab_config.dart'; - -class ConnectionCard extends StatelessWidget { - final BLEService ble; - - const ConnectionCard({super.key, required this.ble}); - - @override - Widget build(BuildContext context) { - return Card( - margin: const EdgeInsets.all(8), - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Icon( - ble.isConnected - ? Icons.bluetooth_connected - : Icons.bluetooth_disabled, - color: ble.isConnected ? Colors.green : Colors.grey, - ), - const SizedBox(width: 8), - Text( - ble.isConnected ? 'Connected' : 'Disconnected', - style: Theme.of(context).textTheme.titleLarge, - ), - const Spacer(), - if (ble.isScanning || ble.isConnecting) - const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ), - ], - ), - if (ble.isConnected) ...[ - const SizedBox(height: 8), - if (ble.deviceName != null) - Text('Device: ${ble.deviceName}'), - if (ble.deviceAddress != null) - Text( - 'Address: ${ble.deviceAddress}', - style: Theme.of(context).textTheme.bodySmall, - ), - ], - if (!ble.isConnected && !ble.isScanning && !ble.isConnecting) ...[ - const SizedBox(height: 8), - SizedBox( - width: double.infinity, - child: ElevatedButton.icon( - onPressed: () async { - final success = await ble.autoConnect(); - if (!success && context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - 'Failed to find ${SiabConfig.deviceName} device', - ), - backgroundColor: Colors.orange, - ), - ); - } - }, - icon: const Icon(Icons.search), - label: const Text('Scan & Connect'), - ), - ), - ], - ], - ), - ), - ); - } -} +import 'package:flutter/material.dart'; +import '../services/ble_service.dart'; +import '../siab_config.dart'; + +class ConnectionCard extends StatelessWidget { + final BLEService ble; + + const ConnectionCard({super.key, required this.ble}); + + @override + Widget build(BuildContext context) { + return Card( + margin: const EdgeInsets.all(8), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + ble.isConnected + ? Icons.bluetooth_connected + : Icons.bluetooth_disabled, + color: ble.isConnected ? Colors.green : Colors.grey, + ), + const SizedBox(width: 8), + Text( + ble.isConnected ? 'Connected' : 'Disconnected', + style: Theme.of(context).textTheme.titleLarge, + ), + const Spacer(), + if (ble.isScanning || ble.isConnecting) + const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator(strokeWidth: 2), + ), + ], + ), + if (ble.isConnected) ...[ + const SizedBox(height: 8), + if (ble.deviceName != null) + Text('Device: ${ble.deviceName}'), + if (ble.deviceAddress != null) + Text( + 'Address: ${ble.deviceAddress}', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + if (!ble.isConnected && !ble.isScanning && !ble.isConnecting) ...[ + const SizedBox(height: 8), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: () async { + final success = await ble.autoConnect(); + if (!success && context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Failed to find ${SiabConfig.deviceName} device', + ), + backgroundColor: Colors.orange, + ), + ); + } + }, + icon: const Icon(Icons.search), + label: const Text('Scan & Connect'), + ), + ), + ], + ], + ), + ), + ); + } +} diff --git a/lib/widgets/data_packet_card.dart b/lib/widgets/data_packet_card.dart index 83ea93d..a73f8d1 100644 --- a/lib/widgets/data_packet_card.dart +++ b/lib/widgets/data_packet_card.dart @@ -1,126 +1,126 @@ -import 'package:flutter/material.dart'; -import '../services/ble_service.dart'; - -class DataPacketCard extends StatelessWidget { - final DataPacket packet; - - const DataPacketCard({super.key, required this.packet}); - - @override - Widget build(BuildContext context) { - final timeStr = '${packet.timestamp.hour.toString().padLeft(2, '0')}:' - '${packet.timestamp.minute.toString().padLeft(2, '0')}:' - '${packet.timestamp.second.toString().padLeft(2, '0')}'; - - return Card( - margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: ExpansionTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context).primaryColor, - child: Text( - '#${packet.packetNumber}', - style: const TextStyle(color: Colors.white, fontSize: 12), - ), - ), - title: Text( - packet.hexString, - style: const TextStyle(fontFamily: 'monospace', fontSize: 14), - ), - subtitle: Text('$timeStr • ${packet.data.length} bytes'), - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildSection('Hex', packet.hexString), - const SizedBox(height: 8), - // 'timbang' style: bytes shown in decimal (matching Python output) - _buildSection('timbang', packet.bytesString), - const SizedBox(height: 16), - if (packet.value32BitUnsigned != null) ...[ - _buildValueRow( - '32-bit Unsigned (BE)', - packet.value32BitUnsigned.toString(), - ), - _buildValueRow( - '32-bit Signed (BE)', - packet.value32BitSigned.toString(), - ), - if (packet.value32BitUnsigned! > 0) ...[ - _buildValueRow( - 'As Float (÷100)', - (packet.value32BitUnsigned! / 100.0).toStringAsFixed(2), - ), - _buildValueRow( - 'As Float (÷1000)', - (packet.value32BitUnsigned! / 1000.0).toStringAsFixed(3), - ), - ], - ], - if (packet.value16BitUnsigned != null) ...[ - const SizedBox(height: 8), - _buildValueRow( - '16-bit Unsigned (BE)', - packet.value16BitUnsigned.toString(), - ), - _buildValueRow( - '16-bit Signed (BE)', - packet.value16BitSigned.toString(), - ), - ], - if (packet.asciiString != null) ...[ - const SizedBox(height: 8), - _buildSection('ASCII', packet.asciiString!), - ], - ], - ), - ), - ], - ), - ); - } - - Widget _buildSection(String label, String value) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 12, - color: Colors.grey, - ), - ), - const SizedBox(height: 4), - SelectableText( - value, - style: const TextStyle(fontFamily: 'monospace', fontSize: 14), - ), - ], - ); - } - - Widget _buildValueRow(String label, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - label, - style: const TextStyle(fontSize: 12, color: Colors.grey), - ), - Text( - value, - style: const TextStyle( - fontFamily: 'monospace', - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ); - } -} +import 'package:flutter/material.dart'; +import '../services/ble_service.dart'; + +class DataPacketCard extends StatelessWidget { + final DataPacket packet; + + const DataPacketCard({super.key, required this.packet}); + + @override + Widget build(BuildContext context) { + final timeStr = '${packet.timestamp.hour.toString().padLeft(2, '0')}:' + '${packet.timestamp.minute.toString().padLeft(2, '0')}:' + '${packet.timestamp.second.toString().padLeft(2, '0')}'; + + return Card( + margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: ExpansionTile( + leading: CircleAvatar( + backgroundColor: Theme.of(context).primaryColor, + child: Text( + '#${packet.packetNumber}', + style: const TextStyle(color: Colors.white, fontSize: 12), + ), + ), + title: Text( + packet.hexString, + style: const TextStyle(fontFamily: 'monospace', fontSize: 14), + ), + subtitle: Text('$timeStr • ${packet.data.length} bytes'), + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSection('Hex', packet.hexString), + const SizedBox(height: 8), + // 'timbang' style: bytes shown in decimal (matching Python output) + _buildSection('timbang', packet.bytesString), + const SizedBox(height: 16), + if (packet.value32BitUnsigned != null) ...[ + _buildValueRow( + '32-bit Unsigned (BE)', + packet.value32BitUnsigned.toString(), + ), + _buildValueRow( + '32-bit Signed (BE)', + packet.value32BitSigned.toString(), + ), + if (packet.value32BitUnsigned! > 0) ...[ + _buildValueRow( + 'As Float (÷100)', + (packet.value32BitUnsigned! / 100.0).toStringAsFixed(2), + ), + _buildValueRow( + 'As Float (÷1000)', + (packet.value32BitUnsigned! / 1000.0).toStringAsFixed(3), + ), + ], + ], + if (packet.value16BitUnsigned != null) ...[ + const SizedBox(height: 8), + _buildValueRow( + '16-bit Unsigned (BE)', + packet.value16BitUnsigned.toString(), + ), + _buildValueRow( + '16-bit Signed (BE)', + packet.value16BitSigned.toString(), + ), + ], + if (packet.asciiString != null) ...[ + const SizedBox(height: 8), + _buildSection('ASCII', packet.asciiString!), + ], + ], + ), + ), + ], + ), + ); + } + + Widget _buildSection(String label, String value) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: Colors.grey, + ), + ), + const SizedBox(height: 4), + SelectableText( + value, + style: const TextStyle(fontFamily: 'monospace', fontSize: 14), + ), + ], + ); + } + + Widget _buildValueRow(String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: const TextStyle(fontSize: 12, color: Colors.grey), + ), + Text( + value, + style: const TextStyle( + fontFamily: 'monospace', + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/statistics_card.dart b/lib/widgets/statistics_card.dart index e6ae616..e761d88 100644 --- a/lib/widgets/statistics_card.dart +++ b/lib/widgets/statistics_card.dart @@ -1,76 +1,76 @@ -import 'package:flutter/material.dart'; -import '../services/ble_service.dart'; - -class StatisticsCard extends StatelessWidget { - final BLEService ble; - - const StatisticsCard({super.key, required this.ble}); - - @override - Widget build(BuildContext context) { - final duration = ble.streamingDuration; - final durationStr = duration != null - ? '${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}' - : '0:00'; - - return Card( - margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Padding( - padding: const EdgeInsets.all(16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _StatItem( - icon: Icons.data_usage, - label: 'Packets', - value: '${ble.packetCount}', - ), - _StatItem( - icon: Icons.speed, - label: 'Rate', - value: '${ble.packetsPerSecond.toStringAsFixed(2)}/s', - ), - _StatItem( - icon: Icons.timer, - label: 'Duration', - value: durationStr, - ), - ], - ), - ), - ); - } -} - -class _StatItem extends StatelessWidget { - final IconData icon; - final String label; - final String value; - - const _StatItem({ - required this.icon, - required this.label, - required this.value, - }); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: 24, color: Theme.of(context).primaryColor), - const SizedBox(height: 4), - Text( - value, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, - ), - ), - Text( - label, - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ); - } -} +import 'package:flutter/material.dart'; +import '../services/ble_service.dart'; + +class StatisticsCard extends StatelessWidget { + final BLEService ble; + + const StatisticsCard({super.key, required this.ble}); + + @override + Widget build(BuildContext context) { + final duration = ble.streamingDuration; + final durationStr = duration != null + ? '${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}' + : '0:00'; + + return Card( + margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _StatItem( + icon: Icons.data_usage, + label: 'Packets', + value: '${ble.packetCount}', + ), + _StatItem( + icon: Icons.speed, + label: 'Rate', + value: '${ble.packetsPerSecond.toStringAsFixed(2)}/s', + ), + _StatItem( + icon: Icons.timer, + label: 'Duration', + value: durationStr, + ), + ], + ), + ), + ); + } +} + +class _StatItem extends StatelessWidget { + final IconData icon; + final String label; + final String value; + + const _StatItem({ + required this.icon, + required this.label, + required this.value, + }); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 24, color: Theme.of(context).primaryColor), + const SizedBox(height: 4), + Text( + value, + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + Text( + label, + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ); + } +} diff --git a/linux/.gitignore b/linux/.gitignore index d3896c9..c7ea17f 100644 --- a/linux/.gitignore +++ b/linux/.gitignore @@ -1 +1 @@ -flutter/ephemeral +flutter/ephemeral diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt index d5bd016..27860e8 100644 --- a/linux/flutter/CMakeLists.txt +++ b/linux/flutter/CMakeLists.txt @@ -1,88 +1,88 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/runner/CMakeLists.txt b/linux/runner/CMakeLists.txt index e97dabc..7ed6f3e 100644 --- a/linux/runner/CMakeLists.txt +++ b/linux/runner/CMakeLists.txt @@ -1,26 +1,26 @@ -cmake_minimum_required(VERSION 3.13) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the application ID. -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/linux/runner/main.cc b/linux/runner/main.cc index e7c5c54..4340ffc 100644 --- a/linux/runner/main.cc +++ b/linux/runner/main.cc @@ -1,6 +1,6 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/runner/my_application.h b/linux/runner/my_application.h index 72271d5..8f20fb5 100644 --- a/linux/runner/my_application.h +++ b/linux/runner/my_application.h @@ -1,18 +1,18 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/.gitignore b/macos/.gitignore index 746adbb..d4e0569 100644 --- a/macos/.gitignore +++ b/macos/.gitignore @@ -1,7 +1,7 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..f022c34 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1 @@ -#include "ephemeral/Flutter-Generated.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..f022c34 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1 @@ -#include "ephemeral/Flutter-Generated.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3c5513b..d55ff81 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,99 +1,99 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index b3c1761..c5c474d 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,13 +1,13 @@ -import Cocoa -import FlutterMacOS - -@main -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } - - override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { - return true - } -} +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f..8d4e7cb 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,68 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib index 80e867a..4632c69 100644 --- a/macos/Runner/Base.lproj/MainMenu.xib +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -1,343 +1,343 @@ - - - - - - - - - - - - - - - - - - - - - - -