diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..0fdcb48 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.27.1" +} \ No newline at end of file diff --git a/.github/workflows/build_apk.yml b/.github/workflows/build_apk.yml index 6caf335..88b6347 100644 --- a/.github/workflows/build_apk.yml +++ b/.github/workflows/build_apk.yml @@ -90,7 +90,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: "zulu" - java-version: "11" + java-version: "17" - name: Restore Android keystore .jsk and .properties files run: | @@ -100,8 +100,10 @@ jobs: - name: Restore google-services.json run: bash .github/scripts/restore_from_base64.sh "${{ secrets.GOOGLE_SERVICES_JSON_ANDROID }}" "android/app/google-services.json" - - name: Restore firebase_options.dart - run: bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart" + - name: Setup Firebase + run: | + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart" + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_JSON }}" "firebase.json" - name: Restore constants.dart env: @@ -112,6 +114,7 @@ jobs: run: bash ./.github/scripts/increment_build_number.sh ${{ github.event.inputs.version }} - name: Download release notes + continue-on-error: true uses: actions/download-artifact@v3 with: name: ${{ env.RELEASE_NOTES_ARTIFACT_NAME }} @@ -121,7 +124,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.13.9" + flutter-version: "3.27.1" - name: Prepare flutter project run: | diff --git a/.github/workflows/build_ipa.yml b/.github/workflows/build_ipa.yml index 88294ba..8a4db0a 100644 --- a/.github/workflows/build_ipa.yml +++ b/.github/workflows/build_ipa.yml @@ -45,7 +45,7 @@ env: jobs: build: name: Build .ipa - runs-on: macos-13 + runs-on: macos-latest timeout-minutes: 60 steps: - uses: actions/checkout@v3 @@ -92,11 +92,11 @@ jobs: - name: Restore ExportOptions.plist run: bash .github/scripts/restore_from_base64.sh "${{ secrets.APP_STORE_EXPORT_OPTIONS }}" "ios/Runner/ExportOptions.plist" - - name: Restore firebase_app_id_file.json - run: bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_APP_ID_FILE }}" "ios/firebase_app_id_file.json" - - - name: Restore firebase_options.dart - run: bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart" + - name: Setup Firebase + run: | + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_APP_ID_FILE }}" "ios/firebase_app_id_file.json" + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart" + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_JSON }}" "firebase.json" - name: Restore constants.dart env: @@ -107,6 +107,7 @@ jobs: run: bash ./.github/scripts/increment_build_number.sh ${{ github.event.inputs.version }} - name: Download release notes + continue-on-error: true uses: actions/download-artifact@v3 with: name: ${{ env.RELEASE_NOTES_ARTIFACT_NAME }} @@ -116,13 +117,14 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.13.9" + flutter-version: "3.27.1" - name: Prepare flutter project run: | flutter --version flutter pub get flutter pub run intl_utils:generate + dart pub global activate flutterfire_cli - name: Build .ipa run: | diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 1aac0a8..2682f66 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -42,7 +42,7 @@ jobs: - uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.13.9" + flutter-version: "3.27.1" - name: Prepare flutter project run: | diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index b49c3f8..adbe5ab 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -27,11 +27,12 @@ jobs: bash .github/scripts/restore_from_base64.sh "${{ secrets.CONSTANTS }}" "lib/constants.dart" bash .github/scripts/restore_from_base64.sh "${{ secrets.GOOGLE_SERVICES_JSON_IOS }}" "ios/Runner/GoogleService-Info.plist" bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_APP_ID_FILE }}" "ios/firebase_app_id_file.json" + bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_JSON }}" "firebase.json" - uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.13.9" + flutter-version: "3.27.1" - name: Prepare app run: | @@ -39,6 +40,7 @@ jobs: flutter pub get flutter pub run intl_utils:generate flutter analyze lib --fatal-infos + dart pub global activate flutterfire_cli - name: Launch iOS simulator uses: futureware-tech/simulator-action@v3 diff --git a/.gitignore b/.gitignore index f8353b3..87d12d9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related @@ -48,7 +50,6 @@ app.*.map.json /ios/build/ /ios/Runner.xcodeproj/project.pbxproj -pubspec.lock /ios/Podfile.lock .fvm/ @@ -63,4 +64,6 @@ ios/Runner/GoogleService-Info.plist coverage/ test/coverage_helper_test.dart **/failures/*.png -screenshots/generated/raw/ \ No newline at end of file +screenshots/generated/raw/ + +firebase.json \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index e929cb4..44c5348 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,25 +1,25 @@ { - "task.slowProviderWarning": true, - "dart.flutterSdkPath": "fvm", - "search.exclude": { - "**/.fvm": true - }, - "files.watcherExclude": { - "**/.fvm": true - }, - "dart.lineLength": 120, - "[dart]": { - "editor.rulers": [ - 120, - ], - "editor.selectionHighlight": true, - "editor.suggest.snippetsPreventQuickSuggestions": false, - "editor.suggestSelection": "first", - "editor.tabCompletion": "onlySnippets", - "editor.wordBasedSuggestions": "off" - }, - "dart.doNotFormat": [ - "**/generated/**", - "lib/data/**" + "task.slowProviderWarning": true, + "dart.flutterSdkPath": ".fvm/flutter_sdk", + "search.exclude": { + "**/.fvm": true + }, + "files.watcherExclude": { + "**/.fvm": true + }, + "dart.lineLength": 120, + "[dart]": { + "editor.rulers": [ + 120 ], + "editor.selectionHighlight": true, + "editor.suggest.snippetsPreventQuickSuggestions": false, + "editor.suggestSelection": "first", + "editor.tabCompletion": "onlySnippets", + "editor.wordBasedSuggestions": "off" + }, + "dart.doNotFormat": [ + "**/generated/**", + "lib/data/**" + ] } \ No newline at end of file diff --git a/README.md b/README.md index 3114a99..c91d08b 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Without further delay behold my new Lightmeter app inspired by Material You (a.k ### 1. Install Flutter -To build this app you need to install Flutter 3.13.9 stable. [How to install](https://docs.flutter.dev/get-started/install). +To build this app you need to install Flutter 3.27.1 stable. [How to install](https://docs.flutter.dev/get-started/install). ### 2. Project setup diff --git a/android/app/build.gradle b/android/app/build.gradle index 2a422e5..bd932a8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,11 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' + id "dev.flutter.flutter-gradle-plugin" + id "com.google.gms.google-services" + id "com.google.firebase.crashlytics" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +14,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -27,15 +30,9 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } -apply plugin: 'com.android.application' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'com.google.firebase.crashlytics' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { compileSdkVersion 34 - ndkVersion flutter.ndkVersion + ndkVersion "27.0.12077973" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -43,7 +40,7 @@ android { } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = JavaVersion.VERSION_1_8 } sourceSets { @@ -51,7 +48,7 @@ android { } defaultConfig { - minSdkVersion 21 + minSdkVersion 23 targetSdkVersion 34 ndk { debugSymbolLevel 'FULL' @@ -101,6 +98,7 @@ android { } } } + namespace 'com.vodemn.lightmeter' } flutter { @@ -108,7 +106,6 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.android.billingclient:billing-ktx:6.0.0" implementation "com.google.firebase:firebase-analytics:17.4.1" } diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index e2f45ff..399f698 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,4 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.vodemn.lightmeter"> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- The INTERNET permission is required for development. Specifically, the Flutter tool needs it to communicate with the running application to allow setting breakpoints, to provide hot reload, etc. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a3dbf1f..9b498cc 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="com.vodemn.lightmeter"> + xmlns:tools="http://schemas.android.com/tools"> <application android:label="@string/app_name" diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index e2f45ff..399f698 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,4 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.vodemn.lightmeter"> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- The INTERNET permission is required for development. Specifically, the Flutter tool needs it to communicate with the running application to allow setting breakpoints, to provide hot reload, etc. diff --git a/android/build.gradle b/android/build.gradle index 951d253..bc157bd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,18 +1,3 @@ -buildscript { - ext.kotlin_version = '1.8.21' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a..b9a9a24 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,6 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c472b9..348c409 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bc..6726085 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,27 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.7.3' apply false + id "org.jetbrains.kotlin.android" version "1.8.21" apply false + id "com.google.gms.google-services" version "4.4.0" apply false + id "com.google.firebase.crashlytics" version "2.9.9" apply false +} + +include ":app" \ No newline at end of file diff --git a/iap/pubspec.yaml b/iap/pubspec.yaml index f6f17ab..540ff00 100644 --- a/iap/pubspec.yaml +++ b/iap/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: git: url: "https://github.com/vodemn/m3_lightmeter_resources" ref: v2.1.0 - shared_preferences: 2.2.0 + shared_preferences: dev_dependencies: flutter_test: diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e10..7c56964 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ <key>CFBundleVersion</key> <string>1.0</string> <key>MinimumOSVersion</key> - <string>11.0</string> + <string>12.0</string> </dict> </plist> diff --git a/ios/Podfile b/ios/Podfile index 5588975..c031aef 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '12.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -36,6 +36,16 @@ end post_install do |installer| installer.pods_project.targets.each do |target| + if target.name == 'BoringSSL-GRPC' + target.source_build_phase.files.each do |file| + if file.settings && file.settings['COMPILER_FLAGS'] + flags = file.settings['COMPILER_FLAGS'].split + flags.reject! { |flag| flag == '-GCC_WARN_INHIBIT_ALL_WARNINGS' } + file.settings['COMPILER_FLAGS'] = flags.join(' ') + end + end + end + flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 7d56341..b1201b5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -155,6 +155,8 @@ 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 45F53C083F2EA48EF231DA16 /* [CP] Embed Pods Frameworks */, FF00F85CE432774850A0EDB7 /* [firebase_crashlytics] Crashlytics Upload Symbols */, + 08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */, + 6F6C086A620B15784F8BE312 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, ); buildRules = ( ); @@ -171,7 +173,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -214,6 +216,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 385E047940E442D45ED68E6E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -269,6 +288,24 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + 6F6C086A620B15784F8BE312 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\""; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\"\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -292,11 +329,11 @@ inputFileListPaths = ( ); inputPaths = ( - "\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}\"", - "\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/\"", - "\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"", - "\"$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)\"", - "\"$(PROJECT_DIR)/firebase_app_id_file.json\"", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", + "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", + "$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)", ); name = "[firebase_crashlytics] Crashlytics Upload Symbols"; outputFileListPaths = ( @@ -305,7 +342,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --flutter-project \"$PROJECT_DIR/firebase_app_id_file.json\" "; + shellScript = "\"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols\" -gsp \"${PROJECT_DIR}/Runner/GoogleService-Info.plist\" -p ios \"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -382,7 +419,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -397,6 +434,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-prod"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -466,7 +504,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -515,7 +553,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -532,6 +570,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-prod"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -561,6 +600,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-prod"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; @@ -633,7 +673,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -647,6 +687,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -711,7 +752,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -728,6 +769,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -791,7 +833,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -806,6 +848,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 5dc5452..b43b14e 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import UIKit import Flutter -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/lib/application.dart b/lib/application.dart index a58de01..e272b92 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -44,7 +44,7 @@ class Application extends StatelessWidget { ], supportedLocales: S.delegate.supportedLocales, builder: (context, child) => MediaQuery( - data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.noScaling), child: child!, ), initialRoute: NavigationRoutes.meteringScreen.name, diff --git a/lib/data/analytics/analytics.dart b/lib/data/analytics/analytics.dart index 45bfd22..75edeca 100644 --- a/lib/data/analytics/analytics.dart +++ b/lib/data/analytics/analytics.dart @@ -22,7 +22,7 @@ class LightmeterAnalytics { Future<void> logEvent( String eventName, { - Map<String, dynamic>? parameters, + Map<String, Object>? parameters, }) async { if (!kReleaseMode) { log('<LightmeterAnalytics> logEvent: $eventName / $parameters'); diff --git a/lib/data/analytics/api/analytics_api_interface.dart b/lib/data/analytics/api/analytics_api_interface.dart index ab75036..f3c8127 100644 --- a/lib/data/analytics/api/analytics_api_interface.dart +++ b/lib/data/analytics/api/analytics_api_interface.dart @@ -1,7 +1,7 @@ abstract class ILightmeterAnalyticsApi { Future<void> logEvent( String eventName, { - Map<String, dynamic>? parameters, + Map<String, Object>? parameters, }); Future<void> logCrash( diff --git a/lib/data/analytics/api/analytics_firebase.dart b/lib/data/analytics/api/analytics_firebase.dart index fe75c6a..8728fa3 100644 --- a/lib/data/analytics/api/analytics_firebase.dart +++ b/lib/data/analytics/api/analytics_firebase.dart @@ -10,7 +10,7 @@ class LightmeterAnalyticsFirebase implements ILightmeterAnalyticsApi { @override Future<void> logEvent( String eventName, { - Map<String, dynamic>? parameters, + Map<String, Object>? parameters, }) async { try { await FirebaseAnalytics.instance.logEvent( diff --git a/lib/data/models/metering_screen_layout_config.dart b/lib/data/models/metering_screen_layout_config.dart index a558202..64bc60c 100644 --- a/lib/data/models/metering_screen_layout_config.dart +++ b/lib/data/models/metering_screen_layout_config.dart @@ -8,7 +8,7 @@ typedef MeteringScreenLayoutConfig = Map<MeteringScreenLayoutFeature, bool>; extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig { static MeteringScreenLayoutConfig fromJson(Map<String, dynamic> data) { - int? migratedIndex(MeteringScreenLayoutFeature feature) { + int migratedIndex(MeteringScreenLayoutFeature feature) { switch (feature) { case MeteringScreenLayoutFeature.extremeExposurePairs: return 0; @@ -16,8 +16,6 @@ extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig { return 1; case MeteringScreenLayoutFeature.equipmentProfiles: return 3; - default: - return null; } } diff --git a/lib/data/shared_prefs_service.dart b/lib/data/shared_prefs_service.dart index 2662d7f..726fd63 100644 --- a/lib/data/shared_prefs_service.dart +++ b/lib/data/shared_prefs_service.dart @@ -7,6 +7,7 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/data/models/volume_action.dart'; +import 'package:lightmeter/utils/color_to_int.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -155,7 +156,7 @@ class UserPreferencesService { set themeType(ThemeType value) => _sharedPreferences.setInt(themeTypeKey, value.index); Color get primaryColor => Color(_sharedPreferences.getInt(primaryColorKey) ?? 0xff2196f3); - set primaryColor(Color value) => _sharedPreferences.setInt(primaryColorKey, value.value); + set primaryColor(Color value) => _sharedPreferences.setInt(primaryColorKey, value.toInt()); bool get dynamicColor => _sharedPreferences.getBool(dynamicColorKey) ?? false; set dynamicColor(bool value) => _sharedPreferences.setBool(dynamicColorKey, value); diff --git a/lib/res/theme.dart b/lib/res/theme.dart index 9f9d392..0362dac 100644 --- a/lib/res/theme.dart +++ b/lib/res/theme.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/res/dimens.dart'; +import 'package:lightmeter/utils/color_to_int.dart'; import 'package:material_color_utilities/material_color_utilities.dart'; const primaryColorsList = [ @@ -32,7 +33,7 @@ ThemeData themeFrom(Color primaryColor, Brightness brightness) { elevation: Dimens.elevationLevel0, scrolledUnderElevation: Dimens.elevationLevel2, color: scheme.surface, - foregroundColor: scheme.onBackground, + foregroundColor: scheme.onSurface, surfaceTintColor: scheme.surfaceTint, ), cardTheme: CardTheme( @@ -75,15 +76,13 @@ ThemeData themeFrom(Color primaryColor, Brightness brightness) { ColorScheme _colorSchemeFromColor(Color primaryColor, Brightness brightness) { final scheme = SchemeTonalSpot( - sourceColorHct: Hct.fromInt(primaryColor.value), + sourceColorHct: Hct.fromInt(primaryColor.toInt()), isDark: brightness == Brightness.dark, contrastLevel: 0.0, ); return ColorScheme( brightness: brightness, - background: Color(scheme.background), - onBackground: Color(scheme.onBackground), error: Color(scheme.error), onError: Color(scheme.onError), errorContainer: Color(scheme.errorContainer), @@ -102,7 +101,7 @@ ColorScheme _colorSchemeFromColor(Color primaryColor, Brightness brightness) { onTertiaryContainer: Color(scheme.onTertiaryContainer), surface: Color(scheme.surface), onSurface: Color(scheme.onSurface), - surfaceVariant: Color(scheme.surfaceVariant), + surfaceContainerHighest: Color(scheme.surfaceContainerHighest), onSurfaceVariant: Color(scheme.onSurfaceVariant), outline: Color(scheme.outline), outlineVariant: Color(scheme.outlineVariant), diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index 08bfee4..fd81b68 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -91,7 +91,6 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC case communication_states.SettingsClosedState(): _settingsOpened = false; add(const InitializeEvent()); - default: } } diff --git a/lib/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart b/lib/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart index 467a0b1..c2a39bf 100644 --- a/lib/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart +++ b/lib/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart @@ -25,7 +25,7 @@ class CameraControlsPlaceholder extends StatelessWidget { const SizedBox(height: Dimens.grid8), Text( error.toStringLocalized(context), - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onBackground), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurface), textAlign: TextAlign.center, ), ], diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart index d4209ba..2451a07 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart @@ -62,14 +62,14 @@ class _Title<T extends PhotographyStopValue> extends StatelessWidget { value.toString(), stepGranularity: 0.5, minFontSize: 10, - style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onBackground), + style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onSurface), softWrap: false, overflow: TextOverflow.fade, maxLines: 1, ) : Text( value.toString(), - style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onBackground), + style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onSurface), softWrap: false, overflow: TextOverflow.fade, maxLines: 1, @@ -97,7 +97,7 @@ class _Tick extends StatelessWidget { @override Widget build(BuildContext context) { return ColoredBox( - color: Theme.of(context).colorScheme.onBackground, + color: Theme.of(context).colorScheme.onSurface, child: SizedBox( height: 1, width: _length, diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart index 415892d..f5ec902 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart @@ -78,7 +78,7 @@ class ExposurePairsList extends StatelessWidget { ? constraints.maxHeight / 2 : constraints.maxHeight, child: ColoredBox( - color: Theme.of(context).colorScheme.onBackground, + color: Theme.of(context).colorScheme.onSurface, child: const SizedBox(width: 1), ), ), diff --git a/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart index 63bd1e6..2a0f50d 100644 --- a/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart +++ b/lib/screens/metering/components/shared/readings_container/components/shared/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart @@ -178,8 +178,8 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide opaque: false, transitionDuration: Duration.zero, reverseTransitionDuration: Duration.zero, - pageBuilder: (_, __, ___) => WillPopScope( - onWillPop: () => _animateReverse().then((value) => true), + pageBuilder: (_, __, ___) => PopScope( + onPopInvokedWithResult: (_, __) => _animateReverse().then((value) => true), child: _AnimatedOverlay( controller: _animationController, barrierColorAnimation: _barrierColorAnimation, @@ -221,7 +221,13 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide }); } - Future<void> close() => _animateReverse().then((_) => Navigator.of(context).pop()); + Future<void> close() { + return _animateReverse().then((_) { + if (mounted) { + Navigator.of(context).pop(); + } + }); + } } class _AnimatedOverlay extends StatelessWidget { diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 7771bf2..417d330 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -69,9 +69,14 @@ class MeteringScreen extends StatelessWidget { } void pushNamed(BuildContext context, String routeName, {Object? arguments}) { - context.read<MeteringBloc>().add(const ScreenOnTopOpenedEvent()); - Navigator.pushNamed(context, routeName, arguments: arguments).then((_) { - context.read<MeteringBloc>().add(const ScreenOnTopClosedEvent()); + final bloc = context.read<MeteringBloc>(); + bloc.add(const ScreenOnTopOpenedEvent()); + Navigator.pushNamed( + context, + routeName, + arguments: arguments, + ).then((_) { + bloc.add(const ScreenOnTopClosedEvent()); }); } } diff --git a/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart b/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart index aab959f..e5271ff 100644 --- a/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart +++ b/lib/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart @@ -4,9 +4,14 @@ import 'package:lightmeter/constants.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:url_launcher/url_launcher.dart'; -class WriteEmailListTile extends StatelessWidget { +class WriteEmailListTile extends StatefulWidget { const WriteEmailListTile({super.key}); + @override + State<WriteEmailListTile> createState() => _WriteEmailListTileState(); +} + +class _WriteEmailListTileState extends State<WriteEmailListTile> { @override Widget build(BuildContext context) { return ListTile( @@ -20,24 +25,30 @@ class WriteEmailListTile extends StatelessWidget { mailToUrl, mode: LaunchMode.externalApplication, ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(S.of(context).youDontHaveMailApp), - behavior: SnackBarBehavior.floating, - action: SnackBarAction( - label: S.of(context).copyEmail, - onPressed: () { - FlutterClipboard.copy(contactEmail).then((_) { - ScaffoldMessenger.of(context).clearSnackBars(); - }); - }, - ), - ), - ); + } else if (mounted) { + _showSnackBar(); } }); }, ); } + + Future<void> _showSnackBar() async { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(S.of(context).youDontHaveMailApp), + behavior: SnackBarBehavior.floating, + action: SnackBarAction( + label: S.of(context).copyEmail, + onPressed: () { + FlutterClipboard.copy(contactEmail).then((_) { + if (mounted) { + ScaffoldMessenger.of(context).clearSnackBars(); + } + }); + }, + ), + ), + ); + } } diff --git a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart index 14d8971..b2410b4 100644 --- a/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart +++ b/lib/screens/settings/components/general/components/language/widget_list_tile_language.dart @@ -14,6 +14,7 @@ class LanguageListTile extends StatelessWidget { title: Text(S.of(context).language), trailing: Text(UserPreferencesProvider.localeOf(context).localizedName), onTap: () { + final prefs = UserPreferencesProvider.of(context); showDialog<SupportedLocale>( context: context, builder: (_) => DialogPicker<SupportedLocale>( @@ -21,11 +22,11 @@ class LanguageListTile extends StatelessWidget { title: S.of(context).chooseLanguage, selectedValue: UserPreferencesProvider.localeOf(context), values: SupportedLocale.values, - titleAdapter: (context, value) => value.localizedName, + titleAdapter: (_, value) => value.localizedName, ), ).then((value) { if (value != null) { - UserPreferencesProvider.of(context).setLocale(value); + prefs.setLocale(value); } }); }, diff --git a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart index 90ab875..e97ef13 100644 --- a/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart +++ b/lib/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart @@ -14,6 +14,7 @@ class StopTypeListTile extends StatelessWidget { title: Text(S.of(context).fractionalStops), trailing: Text(_typeToString(context, UserPreferencesProvider.stopTypeOf(context))), onTap: () { + final prefs = UserPreferencesProvider.of(context); showDialog<StopType>( context: context, builder: (_) => DialogPicker<StopType>( @@ -25,7 +26,7 @@ class StopTypeListTile extends StatelessWidget { ), ).then((value) { if (value != null) { - UserPreferencesProvider.of(context).setStopType(value); + prefs.setStopType(value); } }); }, diff --git a/lib/screens/settings/components/shared/expandable_section_list/components/dialog_section_name/widget_dialog_section_name.dart b/lib/screens/settings/components/shared/expandable_section_list/components/dialog_section_name/widget_dialog_section_name.dart deleted file mode 100644 index 4fa2edc..0000000 --- a/lib/screens/settings/components/shared/expandable_section_list/components/dialog_section_name/widget_dialog_section_name.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/res/dimens.dart'; - -class ExpandableSectionNameDialog extends StatefulWidget { - final String title; - final String hint; - final String initialValue; - - const ExpandableSectionNameDialog({ - this.initialValue = '', - required this.title, - required this.hint, - super.key, - }); - - @override - State<ExpandableSectionNameDialog> createState() => _ExpandableSectionNameDialogState(); -} - -class _ExpandableSectionNameDialogState extends State<ExpandableSectionNameDialog> { - late final _nameController = TextEditingController(text: widget.initialValue); - - @override - void dispose() { - _nameController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AlertDialog( - icon: const Icon(Icons.edit_outlined), - titlePadding: Dimens.dialogIconTitlePadding, - title: Text(widget.title), - content: TextField( - autofocus: true, - controller: _nameController, - decoration: InputDecoration(hintText: widget.hint), - ), - actions: [ - TextButton( - onPressed: Navigator.of(context).pop, - child: Text(S.of(context).cancel), - ), - ValueListenableBuilder( - valueListenable: _nameController, - builder: (_, value, __) => TextButton( - onPressed: value.text.isNotEmpty ? () => Navigator.of(context).pop(value.text) : null, - child: Text(S.of(context).save), - ), - ), - ], - ); - } -} diff --git a/lib/screens/settings/components/shared/expandable_section_list/components/expandable_section_list_item/widget_expandable_section_list_item.dart b/lib/screens/settings/components/shared/expandable_section_list/components/expandable_section_list_item/widget_expandable_section_list_item.dart deleted file mode 100644 index 28e1926..0000000 --- a/lib/screens/settings/components/shared/expandable_section_list/components/expandable_section_list_item/widget_expandable_section_list_item.dart +++ /dev/null @@ -1,184 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/res/dimens.dart'; - -class ExpandableSectionListItem extends StatefulWidget { - final String title; - final VoidCallback onTitleTap; - final VoidCallback onExpand; - final List<IconButton> actions; - final List<Widget> children; - - const ExpandableSectionListItem({ - required this.title, - required this.onTitleTap, - required this.onExpand, - required this.actions, - required this.children, - super.key, - }); - - static ExpandableSectionListItemState of(BuildContext context) { - return context.findAncestorStateOfType<ExpandableSectionListItemState>()!; - } - - @override - State<ExpandableSectionListItem> createState() => ExpandableSectionListItemState(); -} - -class ExpandableSectionListItemState extends State<ExpandableSectionListItem> with TickerProviderStateMixin { - late final AnimationController _controller = AnimationController( - duration: Dimens.durationM, - vsync: this, - ); - bool get _expanded => _controller.isCompleted; - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Card( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), - title: Row( - children: [ - _AnimatedNameLeading(controller: _controller), - const SizedBox(width: Dimens.grid8), - Flexible( - child: Text( - widget.title, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - trailing: _AnimatedArrowButton( - controller: _controller, - onPressed: () => _expanded ? collapse() : expand(), - ), - onTap: () => _expanded ? widget.onTitleTap() : expand(), - ), - _AnimatedContent( - controller: _controller, - actions: widget.actions, - children: widget.children, - ), - ], - ), - ), - ); - } - - void expand() { - widget.onExpand(); - _controller.forward(); - SchedulerBinding.instance.addPostFrameCallback((_) { - Future.delayed(_controller.duration!).then((_) { - Scrollable.ensureVisible( - context, - alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd, - duration: _controller.duration!, - ); - }); - }); - } - - void collapse() { - _controller.reverse(); - } -} - -class _AnimatedNameLeading extends AnimatedWidget { - const _AnimatedNameLeading({required AnimationController controller}) : super(listenable: controller); - - Animation<double> get _progress => listenable as Animation<double>; - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(right: _progress.value * Dimens.grid8), - child: Icon( - Icons.edit_outlined, - size: _progress.value * Dimens.grid24, - ), - ); - } -} - -class _AnimatedArrowButton extends AnimatedWidget { - final VoidCallback onPressed; - - const _AnimatedArrowButton({ - required AnimationController controller, - required this.onPressed, - }) : super(listenable: controller); - - Animation<double> get _progress => listenable as Animation<double>; - - @override - Widget build(BuildContext context) { - return IconButton( - onPressed: onPressed, - icon: Transform.rotate( - angle: _progress.value * pi, - child: const Icon(Icons.keyboard_arrow_down_outlined), - ), - tooltip: _progress.value == 0 ? S.of(context).tooltipExpand : S.of(context).tooltipCollapse, - ); - } -} - -class _AnimatedContent extends AnimatedWidget { - final List<IconButton> actions; - final List<Widget> children; - - const _AnimatedContent({ - required AnimationController controller, - required this.actions, - required this.children, - }) : super(listenable: controller); - - Animation<double> get _progress => listenable as Animation<double>; - - @override - Widget build(BuildContext context) { - return SizedOverflowBox( - alignment: Alignment.topCenter, - size: Size( - double.maxFinite, - _progress.value * Dimens.grid56 * (children.length + 1), - ), - // https://github.com/gskinnerTeam/flutter-folio/pull/62 - child: Opacity( - opacity: _progress.value, - child: Column( - children: [ - ...children, - ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), - trailing: Row( - mainAxisAlignment: MainAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - children: actions, - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/screens/settings/components/shared/expandable_section_list/widget_expandable_section_list.dart b/lib/screens/settings/components/shared/expandable_section_list/widget_expandable_section_list.dart deleted file mode 100644 index 0fc5de2..0000000 --- a/lib/screens/settings/components/shared/expandable_section_list/widget_expandable_section_list.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/res/dimens.dart'; -import 'package:lightmeter/screens/settings/components/shared/expandable_section_list/components/expandable_section_list_item/widget_expandable_section_list_item.dart'; -import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; - -typedef _WidgetBuilder<W, T extends Identifiable> = W Function(BuildContext context, T value); - -class ExpandableSectionList<T extends Identifiable> extends StatefulWidget { - final List<T> values; - final VoidCallback onSectionTitleTap; - final _WidgetBuilder<List<Widget>, T> contentBuilder; - final _WidgetBuilder<List<IconButton>, T> actionsBuilder; - - const ExpandableSectionList({ - required this.values, - required this.onSectionTitleTap, - required this.contentBuilder, - required this.actionsBuilder, - super.key, - }); - - @override - State<ExpandableSectionList> createState() => _ExpandableSectionListState<T>(); -} - -class _ExpandableSectionListState<T extends Identifiable> extends State<ExpandableSectionList<T>> { - final Map<String, GlobalKey<ExpandableSectionListItemState>> keysMap = {}; - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - _updateProfilesKeys(); - } - - @override - Widget build(BuildContext context) { - return SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - final item = widget.values[index]; - return Padding( - padding: EdgeInsets.fromLTRB( - Dimens.paddingM, - index == 0 ? Dimens.paddingM : 0, - Dimens.paddingM, - Dimens.paddingM, - ), - child: ExpandableSectionListItem( - key: keysMap[item.id], - title: item.name, - onTitleTap: widget.onSectionTitleTap, - onExpand: () => _keepExpandedAt(index), - actions: widget.actionsBuilder(context, item), - children: widget.contentBuilder(context, item), - ), - ); - }, - childCount: widget.values.length, - ), - ); - } - - void _keepExpandedAt(int index) { - keysMap.values.toList().getRange(0, index).forEach((element) { - element.currentState?.collapse(); - }); - keysMap.values.toList().getRange(index + 1, keysMap.length).forEach((element) { - element.currentState?.collapse(); - }); - } - - void _updateProfilesKeys() { - if (widget.values.length > keysMap.length) { - // item added - final List<String> idsToAdd = []; - for (final item in widget.values) { - if (!keysMap.keys.contains(item.id)) idsToAdd.add(item.id); - } - for (final id in idsToAdd) { - keysMap[id] = GlobalKey<ExpandableSectionListItemState>(debugLabel: id); - } - idsToAdd.clear(); - } else if (widget.values.length < keysMap.length) { - // item deleted - final List<String> idsToDelete = []; - for (final id in keysMap.keys) { - if (!widget.values.any((p) => p.id == id)) idsToDelete.add(id); - } - idsToDelete.forEach(keysMap.remove); - idsToDelete.clear(); - } else { - // item updated, no need to updated keys - } - } -} diff --git a/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart b/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart index be9e8ad..8330eb6 100644 --- a/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart +++ b/lib/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart @@ -3,6 +3,7 @@ import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/res/theme.dart'; import 'package:lightmeter/screens/shared/filled_circle/widget_circle_filled.dart'; +import 'package:lightmeter/utils/color_to_int.dart'; class PrimaryColorDialogPicker extends StatefulWidget { const PrimaryColorDialogPicker({super.key}); @@ -45,7 +46,7 @@ class _PrimaryColorDialogPickerState extends State<PrimaryColorDialogPicker> { padding: EdgeInsets.only(left: index == 0 ? 0 : Dimens.paddingS), child: _SelectableColorItem( color: color, - selected: color.value == _selected.value, + selected: color.toInt() == _selected.toInt(), onTap: () { setState(() { _selected = color; diff --git a/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart b/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart index 6560d4c..1e66074 100644 --- a/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart +++ b/lib/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart @@ -22,12 +22,13 @@ class PrimaryColorListTile extends StatelessWidget { leading: const Icon(Icons.palette_outlined), title: Text(S.of(context).primaryColor), onTap: () { + final prefs = UserPreferencesProvider.of(context); showDialog<Color>( context: context, builder: (_) => const PrimaryColorDialogPicker(), ).then((value) { if (value != null) { - UserPreferencesProvider.of(context).setPrimaryColor(value); + prefs.setPrimaryColor(value); } }); }, diff --git a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart index a74464c..07326e5 100644 --- a/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart +++ b/lib/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart @@ -14,6 +14,7 @@ class ThemeTypeListTile extends StatelessWidget { title: Text(S.of(context).theme), trailing: Text(_typeToString(context, UserPreferencesProvider.themeTypeOf(context))), onTap: () { + final prefs = UserPreferencesProvider.of(context); showDialog<ThemeType>( context: context, builder: (_) => DialogPicker<ThemeType>( @@ -25,7 +26,7 @@ class ThemeTypeListTile extends StatelessWidget { ), ).then((value) { if (value != null) { - UserPreferencesProvider.of(context).setThemeType(value); + prefs.setThemeType(value); } }); }, diff --git a/lib/screens/shared/centered_slider/widget_slider_centered.dart b/lib/screens/shared/centered_slider/widget_slider_centered.dart index f2cc66d..10039c6 100644 --- a/lib/screens/shared/centered_slider/widget_slider_centered.dart +++ b/lib/screens/shared/centered_slider/widget_slider_centered.dart @@ -120,7 +120,7 @@ class _Slider extends StatelessWidget { width: handleDistance + trackThickness, child: ClipRRect( borderRadius: BorderRadius.circular(trackThickness / 2), - child: ColoredBox(color: Theme.of(context).colorScheme.surfaceVariant), + child: ColoredBox(color: Theme.of(context).colorScheme.surfaceContainerHighest), ), ), AnimatedPositioned.fromRect( diff --git a/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart b/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart index f11128a..1536f0d 100644 --- a/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart +++ b/lib/screens/shared/icon_placeholder/widget_icon_placeholder.dart @@ -20,15 +20,12 @@ class IconPlaceholder extends StatelessWidget { children: [ Icon( icon, - color: Theme.of(context).colorScheme.onBackground, + color: Theme.of(context).colorScheme.onSurface, ), const SizedBox(height: Dimens.grid8), Text( text, - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(color: Theme.of(context).colorScheme.onBackground), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurface), textAlign: TextAlign.center, ), ], diff --git a/lib/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart b/lib/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart index de7af05..fc00ea2 100644 --- a/lib/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart +++ b/lib/screens/shared/release_notes_dialog/flow_dialog_release_notes.dart @@ -21,10 +21,11 @@ class ReleaseNotesFlow extends StatelessWidget { child: BlocListener<ReleaseNotesBloc, ReleaseNotesState>( listener: (context, state) { if (state is ShowReleaseNotesDialogState) { + final bloc = context.read<ReleaseNotesBloc>(); showDialog( context: context, builder: (_) => ReleaseNotesDialog(version: state.version), - ).then((_) => context.read<ReleaseNotesBloc>().setChangelogVersion()); + ).then((_) => bloc.setChangelogVersion()); } }, child: child, diff --git a/lib/screens/shared/ruler_slider/widget_slider_ruler.dart b/lib/screens/shared/ruler_slider/widget_slider_ruler.dart index 9932ef2..5075597 100644 --- a/lib/screens/shared/ruler_slider/widget_slider_ruler.dart +++ b/lib/screens/shared/ruler_slider/widget_slider_ruler.dart @@ -30,7 +30,7 @@ class RulerSlider extends StatelessWidget { children: [ Text( valueAdapter(value), - style: Theme.of(context).textTheme.labelLarge!.copyWith(color: Theme.of(context).colorScheme.onBackground), + style: Theme.of(context).textTheme.labelLarge!.copyWith(color: Theme.of(context).colorScheme.onSurface), ), const SizedBox(height: Dimens.grid4), Expanded( @@ -78,7 +78,7 @@ class _Ruler extends StatelessWidget { @override Widget build(BuildContext context) { final mainTicksFontSize = Theme.of(context).textTheme.bodySmall!.fontSize!; - final itemsColor = Theme.of(context).colorScheme.onBackground; + final itemsColor = Theme.of(context).colorScheme.onSurface; return LayoutBuilder( builder: (context, constraints) { final bool showAllMainTicks = diff --git a/lib/utils/color_to_int.dart b/lib/utils/color_to_int.dart new file mode 100644 index 0000000..21e0589 --- /dev/null +++ b/lib/utils/color_to_int.dart @@ -0,0 +1,12 @@ +import 'dart:ui'; + +extension ColorToInt on Color { + int toInt() { + final a = (this.a * 255).round(); + final r = (this.r * 255).round(); + final g = (this.g * 255).round(); + final b = (this.b * 255).round(); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..65fc5a2 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1565 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + url: "https://pub.dev" + source: hosted + version: "76.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "27899c95f9e7ec06c8310e6e0eac967707714b9f1450c4a58fa00ca011a4a8ae" + url: "https://pub.dev" + source: hosted + version: "1.3.49" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + url: "https://pub.dev" + source: hosted + version: "6.11.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + app_settings: + dependency: "direct main" + description: + name: app_settings + sha256: "09bc7fe0313a507087bec1a3baf555f0576e816a760cbb31813a88890a09d9e5" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: "direct dev" + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + auto_size_text: + dependency: "direct main" + description: + name: auto_size_text + sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + bloc: + dependency: transitive + description: + name: bloc + sha256: "52c10575f4445c61dd9e0cafcc6356fdd827c4c64dd7945ef3c4105f6b6ac189" + url: "https://pub.dev" + source: hosted + version: "9.0.0" + bloc_concurrency: + dependency: "direct main" + description: + name: bloc_concurrency + sha256: "86b7b17a0a78f77fca0d7c030632b59b593b22acea2d96972588f40d4ef53a94" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + bloc_test: + dependency: "direct dev" + description: + name: bloc_test + sha256: "1dd549e58be35148bc22a9135962106aa29334bc1e3f285994946a1057b29d7b" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" + url: "https://pub.dev" + source: hosted + version: "4.0.3" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + url: "https://pub.dev" + source: hosted + version: "2.4.14" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" + url: "https://pub.dev" + source: hosted + version: "8.9.3" + camera: + dependency: "direct main" + description: + name: camera + sha256: "26ff41045772153f222ffffecba711a206f670f5834d40ebf5eed3811692f167" + url: "https://pub.dev" + source: hosted + version: "0.11.0+2" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: "2985b8e5fca62709ebb2150962b1dae0444ba0a112be888ccf21e8371a1406d9" + url: "https://pub.dev" + source: hosted + version: "0.6.10+1" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: c3038e6e72e284b14ad246a419f26908c08f8886d114cb8a2e351988439bfa68 + url: "https://pub.dev" + source: hosted + version: "0.9.17+6" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 + url: "https://pub.dev" + source: hosted + version: "2.8.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" + url: "https://pub.dev" + source: hosted + version: "0.3.5" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clipboard: + dependency: "direct main" + description: + name: clipboard + sha256: "2ec38f0e59878008ceca0ab122e4bfde98847f88ef0f83331362ba4521f565a9" + url: "https://pub.dev" + source: hosted + version: "0.1.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + cloud_firestore: + dependency: transitive + description: + name: cloud_firestore + sha256: a5c28d51ab20ce65db9d9dbeed4a1a825730c2a91a31eb6a6c97dc5d82c6cfd9 + url: "https://pub.dev" + source: hosted + version: "5.6.1" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "6ea302a856373674ce090f97d99a265202a75cb8e3125c6076a782ed586e6f64" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: eae5ffd1a96eab6013d1c3bf33280ca254ddc179b30a12f1dbe9f7a7c6ba7af1 + url: "https://pub.dev" + source: hosted + version: "4.4.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" + collection: + dependency: "direct main" + description: + name: collection + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev" + source: hosted + version: "1.19.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + url: "https://pub.dev" + source: hosted + version: "1.11.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.7" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "4fa68e53e26ab17b70ca39f072c285562cfc1589df5bb1e9295db90f6645f431" + url: "https://pub.dev" + source: hosted + version: "11.2.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d + url: "https://pub.dev" + source: hosted + version: "1.7.0" + exif: + dependency: "direct main" + description: + name: exif + sha256: a7980fdb3b7ffcd0b035e5b8a5e1eef7cadfe90ea6a4e85ebb62f87b96c7a172 + url: "https://pub.dev" + source: hosted + version: "3.3.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + firebase_analytics: + dependency: "direct main" + description: + name: firebase_analytics + sha256: "498c6cb8468e348a556709c745d92a52173ab3a9b906aa0593393f0787f201ea" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + firebase_analytics_platform_interface: + dependency: transitive + description: + name: firebase_analytics_platform_interface + sha256: ccbb350554e98afdb4b59852689292d194d31232a2647b5012a66622b3711df9 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + firebase_analytics_web: + dependency: transitive + description: + name: firebase_analytics_web + sha256: "68e1f18fc16482c211c658e739c25f015b202a260d9ad8249c6d3d7963b8105f" + url: "https://pub.dev" + source: hosted + version: "0.5.10+6" + firebase_auth: + dependency: transitive + description: + name: firebase_auth + sha256: "1c2e81c4d4b56f63cb6cefea0560aa5a504457c7a5a601018e6c6d7c07795640" + url: "https://pub.dev" + source: hosted + version: "5.4.0" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: "973899f5be76d37312a07e366033b7f3f262dc51ec70ceae2a3592993289717a" + url: "https://pub.dev" + source: hosted + version: "7.5.0" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "960f7cc50ecb977a721165166aae90e86302f1370549457f78cbcea5be7f2cb2" + url: "https://pub.dev" + source: hosted + version: "5.13.6" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "0307c1fde82e2b8b97e0be2dab93612aff9a72f31ebe9bfac66ed8b37ef7c568" + url: "https://pub.dev" + source: hosted + version: "3.10.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf + url: "https://pub.dev" + source: hosted + version: "5.4.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: fbc008cf390d909b823763064b63afefe9f02d8afdb13eb3f485b871afee956b + url: "https://pub.dev" + source: hosted + version: "2.19.0" + firebase_crashlytics: + dependency: "direct main" + description: + name: firebase_crashlytics + sha256: f6adb65fa3d6391a79f0e60833bb4cdc468ce0c318831c90057ee11e0909cd29 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + sha256: "6635166c22c6f75f634b8e77b70fcc43b24af4cfee28f975249dbdbd9769a702" + url: "https://pub.dev" + source: hosted + version: "3.8.0" + firebase_remote_config: + dependency: "direct main" + description: + name: firebase_remote_config + sha256: "1ddeee5055a6fd2295429b8cc3019d5f422c60c77fd22156a789aa6446645595" + url: "https://pub.dev" + source: hosted + version: "5.3.0" + firebase_remote_config_platform_interface: + dependency: transitive + description: + name: firebase_remote_config_platform_interface + sha256: a17a43aa27f860a4e13c2cea11f66d71584976c5b9aa59b0e1720b8435d14764 + url: "https://pub.dev" + source: hosted + version: "1.4.48" + firebase_remote_config_web: + dependency: transitive + description: + name: firebase_remote_config_web + sha256: a85a95d6cc0692b82663acf3b0c312f219c55fbdf8ce997922ab862e64945415 + url: "https://pub.dev" + source: hosted + version: "1.7.6" + 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_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: "153856bdaac302bbdc58a1d1403d50c40557254aa05eaeed40515d88a25a526b" + url: "https://pub.dev" + source: hosted + version: "9.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: "7062602e0dbd29141fb8eb19220b5871ca650be5197ab9c1f193a28b17537bc7" + url: "https://pub.dev" + source: hosted + version: "2.4.4" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" + url: "https://pub.dev" + source: hosted + version: "2.0.24" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: bf7404619d7ab5c0a1151d7c4e802edad8f33535abfbeff2f9e1fe1274e2d705 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.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" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + golden_toolkit: + dependency: "direct dev" + description: + name: golden_toolkit + sha256: "8f74adab33154fe7b731395782797021f97d2edc52f7bfb85ff4f1b5c4a215f0" + url: "https://pub.dev" + source: hosted + version: "0.15.0" + google_fonts: + dependency: "direct dev" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + html: + dependency: transitive + description: + name: html + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + url: "https://pub.dev" + source: hosted + version: "0.15.5" + http: + dependency: transitive + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: "direct dev" + description: + name: image + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev" + source: hosted + version: "4.3.0" + in_app_purchase: + dependency: transitive + description: + name: in_app_purchase + sha256: "960f26a08d9351fb8f89f08901f8a829d41b04d45a694b8f776121d9e41dcad6" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + in_app_purchase_android: + dependency: transitive + description: + name: in_app_purchase_android + sha256: b7cc194f183a97d71e6da1edb4a4095466ca0c22533615ecad021bdf95a5ecdc + url: "https://pub.dev" + source: hosted + version: "0.3.6+13" + in_app_purchase_platform_interface: + dependency: transitive + description: + name: in_app_purchase_platform_interface + sha256: "1d353d38251da5b9fea6635c0ebfc6bb17a2d28d0e86ea5e083bf64244f1fb4c" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + in_app_purchase_storekit: + dependency: transitive + description: + name: in_app_purchase_storekit + sha256: "52caf1051fec8018adabd2d1e775a44cb389972ed868a746c4fc28a301734d41" + url: "https://pub.dev" + source: hosted + version: "0.3.20+4" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + intl_utils: + dependency: "direct main" + description: + name: intl_utils + sha256: c2b1f5c72c25512cbeef5ab015c008fc50fe7e04813ba5541c25272300484bf4 + url: "https://pub.dev" + source: hosted + version: "2.8.7" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev" + source: hosted + version: "10.0.7" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev" + source: hosted + version: "3.0.8" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + light_sensor: + dependency: "direct main" + description: + name: light_sensor + sha256: "84cdab036e87f1e7310bc0f1c30bb3ce661b581c8695fb9d5a4af32c8b0c2c2b" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lint: + dependency: "direct dev" + description: + name: lint + sha256: d758a5211fce7fd3f5e316f804daefecdc34c7e53559716125e6da7388ae8565 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + logging: + dependency: "direct dev" + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + m3_lightmeter_iap: + dependency: "direct main" + description: + path: "." + ref: "v2.1.1" + resolved-ref: "28c7d24c6ebe2ec652d4be5568cb405202afbbdf" + url: "https://github.com/vodemn/m3_lightmeter_iap" + source: git + version: "2.1.1+28" + m3_lightmeter_resources: + dependency: "direct main" + description: + path: "." + ref: "v2.1.0" + resolved-ref: "0e6eefe534adce851df639dcd28463a9089e5b92" + url: "https://github.com/vodemn/m3_lightmeter_resources" + source: git + version: "2.1.0+9" + macros: + dependency: transitive + description: + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" + source: hosted + version: "0.1.3-main.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: "direct main" + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: "direct dev" + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mocktail: + dependency: "direct dev" + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + url: "https://pub.dev" + source: hosted + version: "8.1.3" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + url: "https://pub.dev" + source: hosted + version: "3.0.2" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: transitive + 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: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev" + source: hosted + version: "2.2.15" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + 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: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + url: "https://pub.dev" + source: hosted + version: "11.3.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" + url: "https://pub.dev" + source: hosted + version: "12.0.13" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + url: "https://pub.dev" + source: hosted + version: "9.4.5" + 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: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + 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: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: "direct main" + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + process: + dependency: transitive + description: + name: process + sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "81876843eb50dc2e1e5b151792c9a985c5ed2536914115ed04e9c8528f6647b0" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "02a7d8a9ef346c9af715811b01fbd8e27845ad2c41148eefd31321471b41863d" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" + url: "https://pub.dev" + source: hosted + version: "2.5.4+6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" + url: "https://pub.dev" + source: hosted + version: "2.4.1+1" + 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: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + url: "https://pub.dev" + source: hosted + version: "3.3.0+3" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" + url: "https://pub.dev" + source: hosted + version: "1.25.8" + test_api: + dependency: transitive + description: + name: test_api + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev" + source: hosted + version: "0.7.3" + test_core: + dependency: transitive + description: + name: test_core + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" + url: "https://pub.dev" + source: hosted + version: "0.6.5" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + url: "https://pub.dev" + source: hosted + version: "6.3.14" + url_launcher_ios: + dependency: "direct main" + description: + name: url_launcher_ios + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + 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: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vibration: + dependency: "direct main" + description: + name: vibration + sha256: f0af02af2d63132135ae0332a3e54d5de718e214ee94c4f082176ef6ce624a4b + url: "https://pub.dev" + source: hosted + version: "2.0.1" + vibration_platform_interface: + dependency: transitive + description: + name: vibration_platform_interface + sha256: "6ffeee63547562a6fef53c05a41d4fdcae2c0595b83ef59a4813b0612cd2bc36" + url: "https://pub.dev" + source: hosted + version: "0.0.3" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev" + source: hosted + version: "14.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" + url: "https://pub.dev" + source: hosted + version: "3.0.4" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" + url: "https://pub.dev" + source: hosted + version: "5.10.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + 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: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.1" diff --git a/pubspec.yaml b/pubspec.yaml index ddb3f7b..f9c6651 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,61 +7,61 @@ environment: sdk: ">=3.0.0 <4.0.0" dependencies: - app_settings: 4.2.0 + app_settings: 5.1.1 auto_size_text: 3.0.0 - bloc_concurrency: 0.2.2 - camera: 0.10.5+2 - camera_android_camerax: 0.6.1+1 + bloc_concurrency: 0.3.0 + camera: 0.11.0+2 clipboard: 0.1.3 collection: any dynamic_color: 1.7.0 - exif: 3.1.4 - firebase_analytics: 10.6.2 - firebase_core: 2.20.0 - firebase_crashlytics: 3.4.2 - firebase_remote_config: 4.3.2 + exif: 3.3.0 + firebase_analytics: 11.4.0 + firebase_core: 3.10.0 + firebase_crashlytics: 4.3.0 + firebase_remote_config: 5.3.0 flutter: sdk: flutter - flutter_bloc: 8.1.3 + flutter_bloc: 9.0.0 flutter_localizations: sdk: flutter - flutter_native_splash: 2.3.5 - intl: 0.18.1 - intl_utils: 2.8.2 - light_sensor: 3.0.0 + flutter_native_splash: 2.4.4 + intl: 0.19.0 + intl_utils: 2.8.7 + light_sensor: 3.0.1 m3_lightmeter_iap: git: url: "https://github.com/vodemn/m3_lightmeter_iap" - ref: v2.1.0 + ref: v2.1.1 m3_lightmeter_resources: git: url: "https://github.com/vodemn/m3_lightmeter_resources" ref: v2.1.0 - material_color_utilities: 0.5.0 - package_info_plus: 4.2.0 - permission_handler: 10.4.3 - platform: 3.1.0 - shared_preferences: 2.2.0 - url_launcher: 6.1.12 - uuid: 3.0.7 - vibration: 1.8.1 + material_color_utilities: 0.12.0 + package_info_plus: 8.1.3 + permission_handler: 11.3.1 + platform: 3.1.5 + shared_preferences: 2.3.5 + url_launcher: + url_launcher_ios: 6.3.2 + uuid: 4.5.1 + vibration: 2.0.1 dev_dependencies: - args: 2.5.0 - bloc_test: 9.1.3 - build_runner: 2.4.6 + args: 2.6.0 + bloc_test: 10.0.0 + build_runner: 2.4.14 flutter_test: sdk: flutter golden_toolkit: 0.15.0 - google_fonts: 3.0.1 - image: 4.1.7 + google_fonts: 6.2.1 + image: 4.3.0 integration_test: sdk: flutter - lint: 2.1.2 - logging: 1.2.0 - meta: 1.9.1 - mocktail: 0.3.0 - test: 1.24.3 + lint: 2.3.0 + logging: 1.3.0 + meta: 1.15.0 + mocktail: 1.0.4 + test: 1.25.8 dependency_overrides: material_color_utilities: 0.11.1 diff --git a/screenshots/generate_screenshots.dart b/screenshots/generate_screenshots.dart index a47b9e9..d80159c 100644 --- a/screenshots/generate_screenshots.dart +++ b/screenshots/generate_screenshots.dart @@ -22,6 +22,7 @@ import 'package:lightmeter/screens/metering/screen_metering.dart'; import 'package:lightmeter/screens/settings/screen_settings.dart'; import 'package:lightmeter/screens/shared/animated_circular_button/widget_button_circular_animated.dart'; import 'package:lightmeter/screens/timer/screen_timer.dart'; +import 'package:lightmeter/utils/color_to_int.dart'; import 'package:lightmeter/utils/platform_utils.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -77,7 +78,7 @@ void main() { /// Theme settings UserPreferencesService.themeTypeKey: theme.index, - UserPreferencesService.primaryColorKey: color.value, + UserPreferencesService.primaryColorKey: color.toInt(), UserPreferencesService.dynamicColorKey: false, UserPreferencesService.seenChangelogVersionKey: await const PlatformUtils().version, @@ -190,7 +191,7 @@ extension on WidgetTester { name: name, deviceName: const String.fromEnvironment('deviceName'), platformFolder: _platformFolder, - backgroundColor: backgroundColor.value.toRadixString(16), + backgroundColor: backgroundColor.toInt().toRadixString(16), isDark: theme.brightness == Brightness.dark, ).toString(), ); diff --git a/test/application_mock.dart b/test/application_mock.dart index 8475389..7034137 100644 --- a/test/application_mock.dart +++ b/test/application_mock.dart @@ -47,7 +47,7 @@ class WidgetTestApplicationMock extends StatelessWidget { ], supportedLocales: S.delegate.supportedLocales, builder: (context, child) => MediaQuery( - data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.noScaling), child: child!, ), home: Scaffold(body: child), @@ -124,7 +124,7 @@ class _GoldenTestApplicationMockState extends State<GoldenTestApplicationMock> { ], supportedLocales: S.delegate.supportedLocales, builder: (context, child) => MediaQuery( - data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.noScaling), child: child!, ), home: widget.child, diff --git a/test/screens/lightmeter_pro/goldens/lightmeter_pro_screen.png b/test/screens/lightmeter_pro/goldens/lightmeter_pro_screen.png index 5ad139a..ab9d347 100644 Binary files a/test/screens/lightmeter_pro/goldens/lightmeter_pro_screen.png and b/test/screens/lightmeter_pro/goldens/lightmeter_pro_screen.png differ diff --git a/test/screens/metering/goldens/metering_screen.png b/test/screens/metering/goldens/metering_screen.png index 4810bc9..fd0be29 100644 Binary files a/test/screens/metering/goldens/metering_screen.png and b/test/screens/metering/goldens/metering_screen.png differ diff --git a/test/screens/settings/goldens/settings_screen.png b/test/screens/settings/goldens/settings_screen.png index ffe5fe6..c23e484 100644 Binary files a/test/screens/settings/goldens/settings_screen.png and b/test/screens/settings/goldens/settings_screen.png differ diff --git a/test/screens/timer/goldens/timer_screen.png b/test/screens/timer/goldens/timer_screen.png index cb3aa24..96c3632 100644 Binary files a/test/screens/timer/goldens/timer_screen.png and b/test/screens/timer/goldens/timer_screen.png differ