diff --git a/.env.example b/.env.example index d952f659..e6a163f7 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ +# Never put SUPABASE_SERVICE_ROLE_KEY or VEXA_API_KEY here — those are server-only. +# flutter run --dart-define-from-file=dart_defines.json + SUPABASE_URL= SUPABASE_ANON_KEY= -SUPABASE_SERVICE_ROLE_KEY= GEMINI_API_KEY= -VEXA_API_KEY= -OAUTH_REDIRECT_URL = \ No newline at end of file +OAUTH_REDIRECT_URL=io.supabase.ellena://login-callback/ diff --git a/.gitignore b/.gitignore index f40bff2f..b49e11d5 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,11 @@ migrate_working_dir/ # Environment / credentials .env +.env.* +!.env.example +dart_defines.json +key.properties +android/key.properties firebase*.json *.keystore *.jks diff --git a/BACKEND.md b/BACKEND.md index 5d9ac91e..495ff10a 100644 --- a/BACKEND.md +++ b/BACKEND.md @@ -216,7 +216,7 @@ Supabase provides built-in authentication. The project uses email-based authenti 1. Click **Create Credentials** → **OAuth client ID** 2. Application type: **Android** 3. Name: `Ell-ena Android` -4. Package name: `org.aossie.ell_ena` +4. Package name: `org.aossie.ellena` 5. Get SHA-1 certificate fingerprint: ```bash keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android diff --git a/FRONTEND.md b/FRONTEND.md index 7e690aa3..db1f741c 100644 --- a/FRONTEND.md +++ b/FRONTEND.md @@ -206,17 +206,14 @@ You can use either Visual Studio Code (VS Code) or Android Studio for Flutter de ``` 3. **Set Up Environment Variables**: - - Copy the `.env.example` file to create a new `.env` file: + - Client config is compile-time via `--dart-define-from-file` (not a bundled `.env` asset). + - Copy the example file and fill in **client-safe** values only: ``` - cp .env.example .env - ``` - - Update the `.env` file with your Supabase credentials (as described in the BACKEND.md guide): - ``` - SUPABASE_URL= - SUPABASE_ANON_KEY= - GEMINI_API_KEY= - VEXA_API_KEY= + cp dart_defines.example.json dart_defines.json ``` + - Required keys: `SUPABASE_URL`, `SUPABASE_ANON_KEY`, `GEMINI_API_KEY`, `OAUTH_REDIRECT_URL` + - Do **not** put `SUPABASE_SERVICE_ROLE_KEY` in `dart_defines.json` (server-only). + - `dart_defines.json` is gitignored. ## Connecting to the Supabase Backend @@ -227,7 +224,7 @@ The Ell-ena project is already configured to connect to Supabase. The connection - Your Supabase project should be up and running with all the required tables and functions. 2. **Configure Environment Variables**: - - Ensure your `.env` file contains the correct Supabase URL and anon key. + - Ensure `dart_defines.json` contains the correct Supabase URL and anon key. - These values can be found in your Supabase dashboard under Settings > API. 3. **Initialize Supabase**: @@ -245,15 +242,15 @@ The Ell-ena project is already configured to connect to Supabase. The connection 2. **Run the App**: - To run on all connected devices: ``` - flutter run + flutter run --dart-define-from-file=dart_defines.json ``` - To run on a specific device: ``` - flutter run -d + flutter run -d --dart-define-from-file=dart_defines.json ``` - To run in release mode (for better performance): ``` - flutter run --release + flutter run --release --dart-define-from-file=dart_defines.json ``` 3. **Debug Mode Features**: @@ -285,13 +282,13 @@ The Ell-ena project is already configured to connect to Supabase. The connection 3. **Build the APK**: ``` - flutter build apk --release + flutter build apk --release --dart-define-from-file=dart_defines.json ``` - The APK will be available at `build/app/outputs/flutter-apk/app-release.apk`. 4. **Build App Bundle**: ``` - flutter build appbundle --release + flutter build appbundle --release --dart-define-from-file=dart_defines.json ``` - The bundle will be available at `build/app/outputs/bundle/release/app-release.aab`. diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d47ef669..0425be30 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -5,10 +5,19 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +import java.util.Properties +import java.io.FileInputStream + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { - namespace = "org.aossie.ell_ena" + namespace = "org.aossie.ellena" compileSdk = flutter.compileSdkVersion - ndkVersion = "27.0.12077973" + ndkVersion = "28.2.13676358" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 @@ -20,21 +29,32 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "org.aossie.ell_ena" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. + applicationId = "org.aossie.ellena" minSdk = maxOf(21, flutter.minSdkVersion) targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } + signingConfigs { + create("release") { + if (keystorePropertiesFile.exists()) { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String + } + } + } + buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + // Prefer Play upload keystore when android/key.properties exists. + signingConfig = if (keystorePropertiesFile.exists()) { + signingConfigs.getByName("release") + } else { + signingConfigs.getByName("debug") + } } } } diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index f50ed868..05e26444 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="org.aossie.ellena"> diff --git a/android/app/src/main/kotlin/org/aossie/ell_ena/MainActivity.kt b/android/app/src/main/kotlin/org/aossie/ell_ena/MainActivity.kt deleted file mode 100644 index e61508f9..00000000 --- a/android/app/src/main/kotlin/org/aossie/ell_ena/MainActivity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.aossie.ell_ena - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity : FlutterActivity() \ No newline at end of file diff --git a/android/app/src/main/kotlin/org/aossie/ellena/MainActivity.kt b/android/app/src/main/kotlin/org/aossie/ellena/MainActivity.kt new file mode 100644 index 00000000..0aee090b --- /dev/null +++ b/android/app/src/main/kotlin/org/aossie/ellena/MainActivity.kt @@ -0,0 +1,5 @@ +package org.aossie.ellena + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 876afc07..5ef572fa 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="org.aossie.ellena"> diff --git a/android/gradle.properties b/android/gradle.properties index b7cda7b1..475a6280 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ -org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError -android.useAndroidX=true -android.enableJetifier=true +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 7374351e..c0b2b4ab 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -21,8 +21,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.7.0" apply false - id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("com.android.application") version "8.12.0" apply false + id("org.jetbrains.kotlin.android") version "2.0.21" apply false } include(":app") diff --git a/dart_defines.example.json b/dart_defines.example.json new file mode 100644 index 00000000..11753e91 --- /dev/null +++ b/dart_defines.example.json @@ -0,0 +1,6 @@ +{ + "SUPABASE_URL": "https://YOUR_PROJECT.supabase.co", + "SUPABASE_ANON_KEY": "YOUR_SUPABASE_ANON_KEY", + "GEMINI_API_KEY": "YOUR_GEMINI_API_KEY", + "OAUTH_REDIRECT_URL": "io.supabase.ellena://login-callback/" +} diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart new file mode 100644 index 00000000..41181a8a --- /dev/null +++ b/lib/config/app_config.dart @@ -0,0 +1,43 @@ +/// Compile-time app configuration via `--dart-define` / `--dart-define-from-file`. +/// +/// These values are baked in at build time and are **not** loaded from a bundled +/// `.env` asset. Never pass service-role keys or other server-only secrets here. +/// +/// Local / release examples: +/// ```bash +/// flutter run --dart-define-from-file=dart_defines.json +/// flutter build appbundle --release --dart-define-from-file=dart_defines.json +/// ``` +class AppConfig { + AppConfig._(); + + static const String supabaseUrl = String.fromEnvironment('SUPABASE_URL'); + static const String supabaseAnonKey = + String.fromEnvironment('SUPABASE_ANON_KEY'); + static const String geminiApiKey = String.fromEnvironment('GEMINI_API_KEY'); + static const String oauthRedirectUrl = String.fromEnvironment( + 'OAUTH_REDIRECT_URL', + defaultValue: 'io.supabase.ellena://login-callback/', + ); + + static bool get hasSupabaseConfig => + supabaseUrl.isNotEmpty && supabaseAnonKey.isNotEmpty; + + static bool get hasGeminiConfig => geminiApiKey.isNotEmpty; + + /// Throws a clear error if required client defines are missing. + static void ensureClientConfig() { + final missing = []; + if (supabaseUrl.isEmpty) missing.add('SUPABASE_URL'); + if (supabaseAnonKey.isEmpty) missing.add('SUPABASE_ANON_KEY'); + if (geminiApiKey.isEmpty) missing.add('GEMINI_API_KEY'); + if (missing.isEmpty) return; + + throw StateError( + 'Missing compile-time config: ${missing.join(', ')}. ' + 'Pass them with --dart-define=KEY=value or ' + '--dart-define-from-file=dart_defines.json ' + '(see dart_defines.example.json).', + ); + } +} diff --git a/lib/services/ai_service.dart b/lib/services/ai_service.dart index 151cfc33..ebba128f 100644 --- a/lib/services/ai_service.dart +++ b/lib/services/ai_service.dart @@ -1,10 +1,10 @@ -import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:http/http.dart' as http; -import 'package:intl/intl.dart'; +import 'package:ell_ena/config/app_config.dart'; import 'package:ell_ena/services/supabase_service.dart'; import 'package:ell_ena/services/meeting_formatter.dart'; +import 'package:http/http.dart' as http; +import 'package:intl/intl.dart'; +import 'dart:convert'; class AIService { static final AIService _instance = AIService._internal(); @@ -27,16 +27,8 @@ class AIService { if (_isInitialized) return; try { - // Load API key from .env file - await dotenv.load().catchError((e) { - debugPrint('Error loading .env file: $e'); - }); - - _apiKey = dotenv.env['GEMINI_API_KEY']; - - if (_apiKey == null || _apiKey!.isEmpty) { - throw Exception('Missing Gemini API key. Please check your .env file.'); - } + AppConfig.ensureClientConfig(); + _apiKey = AppConfig.geminiApiKey; // Initialize Supabase service if not already initialized if (!_supabaseService.isInitialized) { diff --git a/lib/services/supabase_service.dart b/lib/services/supabase_service.dart index d361b341..ea39960f 100644 --- a/lib/services/supabase_service.dart +++ b/lib/services/supabase_service.dart @@ -1,10 +1,12 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:math'; + +import 'package:ell_ena/config/app_config.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'dart:async'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; class SupabaseService { static final SupabaseService _instance = SupabaseService._internal(); @@ -49,17 +51,10 @@ class SupabaseService { if (_isInitialized) return; try { - await dotenv.load().catchError((e) { - debugPrint('Error loading .env file: $e'); - }); + AppConfig.ensureClientConfig(); - final supabaseUrl = dotenv.env['SUPABASE_URL'] ?? ''; - final supabaseAnonKey = dotenv.env['SUPABASE_ANON_KEY'] ?? ''; - - if (supabaseUrl.isEmpty || supabaseAnonKey.isEmpty) { - throw Exception( - 'Missing required Supabase configuration. Please check your .env file.'); - } + final supabaseUrl = AppConfig.supabaseUrl; + final supabaseAnonKey = AppConfig.supabaseAnonKey; await Supabase.initialize( url: supabaseUrl, @@ -514,8 +509,7 @@ class SupabaseService { }; } - final redirectUrl = dotenv.env['OAUTH_REDIRECT_URL'] ?? - 'io.supabase.ellena://login-callback'; + final redirectUrl = AppConfig.oauthRedirectUrl; // Create a completer to wait for auth state change final completer = Completer>(); diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 3792af4b..1a9d148c 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,12 +7,16 @@ #include "generated_plugin_registrant.h" #include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) gtk_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); gtk_plugin_register_with_registrar(gtk_registrar); + g_autoptr(FlPluginRegistrar) printing_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin"); + printing_plugin_register_with_registrar(printing_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 5d074230..1db2f435 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST gtk + printing url_launcher_linux ) diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index f022c34e..df4c964c 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index f022c34e..e79501e2 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 92b64978..6c34fdaf 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,13 +6,19 @@ import FlutterMacOS import Foundation import app_links +import google_sign_in_ios import path_provider_foundation +import printing import shared_preferences_foundation +import speech_to_text import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SpeechToTextPlugin.register(with: registry.registrar(forPlugin: "SpeechToTextPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 2d3a236b..ff8c044e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _discoveryapis_commons: + dependency: transitive + description: + name: _discoveryapis_commons + sha256: "113c4100b90a5b70a983541782431b82168b3cae166ab130649c36eb3559d498" + url: "https://pub.dev" + source: hosted + version: "1.0.7" adaptive_number: dependency: transitive description: @@ -93,10 +101,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" checked_yaml: dependency: transitive description: @@ -222,14 +230,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_dotenv: - dependency: "direct main" - description: - name: flutter_dotenv - sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b - url: "https://pub.dev" - source: hosted - version: "5.2.1" flutter_launcher_icons: dependency: "direct dev" description: @@ -260,10 +260,10 @@ packages: dependency: "direct main" description: name: font_awesome_flutter - sha256: b738e35f8bb4957896c34957baf922f99c5d415b38ddc8b070d14b7fa95715d4 + sha256: "09dcde8ab90ffae1a7d65ff2ef96fc62a17ad9d0ce7c127b317ded676b0d5935" url: "https://pub.dev" source: hosted - version: "10.9.1" + version: "11.0.0" functions_client: dependency: transitive description: @@ -272,6 +272,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.5.0" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: d0a2c3bcb06e607bb11e4daca48bd4b6120f0bbc4015ccebbe757d24ea60ed2a + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: d5e23c56a4b84b6427552f1cf3f98f716db3b1d1a647f16b96dbb5b93afa2805 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: "102005f498ce18442e7158f6791033bbc15ad2dcc0afa4cf4752e2722a516c96" + url: "https://pub.dev" + source: hosted + version: "5.9.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "5f6f79cf139c197261adb6ac024577518ae48fdff8e53205c5373b5f6430a8aa" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: "460547beb4962b7623ac0fb8122d6b8268c951cf0b646dd150d60498430e4ded" + url: "https://pub.dev" + source: hosted + version: "0.12.4+4" + googleapis: + dependency: "direct main" + description: + name: googleapis + sha256: "864f222aed3f2ff00b816c675edf00a39e2aaf373d728d8abec30b37bee1a81c" + url: "https://pub.dev" + source: hosted + version: "13.2.0" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: befd71383a955535060acde8792e7efc11d2fccd03dd1d3ec434e85b68775938 + url: "https://pub.dev" + source: hosted + version: "1.6.0" gotrue: dependency: transitive description: @@ -340,26 +404,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -388,26 +452,26 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.18.0" mime: dependency: transitive description: @@ -416,6 +480,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" path: dependency: transitive description: @@ -608,6 +680,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.14.2" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" qr: dependency: transitive description: @@ -817,10 +897,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.11" typed_data: dependency: transitive description: @@ -897,10 +977,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -949,6 +1029,14 @@ packages: 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" yet_another_json_isolate: dependency: transitive description: @@ -958,5 +1046,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.8.0 <=3.8.1" + dart: ">=3.10.0-0 <4.0.0" flutter: ">=3.32.0" diff --git a/pubspec.yaml b/pubspec.yaml index b4854649..9632ccc0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +version: 1.0.1+2 environment: sdk: '>=2.17.0 <4.0.0' @@ -38,7 +38,6 @@ dependencies: # Supabase supabase_flutter: ^2.3.4 - flutter_dotenv: ^5.2.1 # State management provider: ^6.1.2 @@ -58,7 +57,7 @@ dependencies: http: ^1.2.1 # Icons - font_awesome_flutter: ^10.8.0 + font_awesome_flutter: ^11.0.0 pdf: ^3.11.3 path_provider: ^2.1.4 @@ -97,7 +96,6 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - - .env - ELL-ena-logo/png/ - ELL-ena-logo/svg/ # assets: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 785a046f..a16341e9 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,11 +7,20 @@ #include "generated_plugin_registrant.h" #include +#include +#include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { AppLinksPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("AppLinksPluginCApi")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + PrintingPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PrintingPlugin")); + SpeechToTextWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SpeechToTextWindows")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 8f8ee4f2..2d82e750 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,9 @@ list(APPEND FLUTTER_PLUGIN_LIST app_links + permission_handler_windows + printing + speech_to_text_windows url_launcher_windows )