From f4e91e6f55430bb02852d73bc2eb1583dec4abf5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 7 Oct 2024 13:24:03 +0100 Subject: [PATCH 1/5] [ECO-5020] fix: update AGP plugin - updated AGP plugin to 7.4 - added build config feature - added support for older AGP versions --- android/build.gradle | 12 +++- android/gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 61608 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- android/gradlew | 18 +++-- android/gradlew.bat | 15 +++-- example/android/app/build.gradle | 61 ++++++----------- example/android/build.gradle | 21 +----- .../gradle/wrapper/gradle-wrapper.properties | 3 +- example/android/settings.gradle | 30 ++++++--- test_integration/android/app/build.gradle | 63 ++++++------------ test_integration/android/build.gradle | 20 +----- .../gradle/wrapper/gradle-wrapper.properties | 3 +- test_integration/android/settings.gradle | 30 ++++++--- test_integration/android/settings_aar.gradle | 1 - 14 files changed, 131 insertions(+), 149 deletions(-) delete mode 100644 test_integration/android/settings_aar.gradle diff --git a/android/build.gradle b/android/build.gradle index c8c855f72..eae63b9af 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.4.0' } } @@ -33,7 +33,12 @@ dependencies { } android { - compileSdkVersion 32 + compileSdkVersion 34 + + // Conditional for compatibility with AGP <4.2. + if (project.android.hasProperty("namespace")) { + namespace 'io.ably.flutter.plugin' + } // Require Java language level 8 so we can use Method References (used with Lambdas) compileOptions { @@ -56,6 +61,9 @@ android { lintOptions { disable 'InvalidPackage' } + buildFeatures { + buildConfig true + } } apply from: file("./ably-agent.gradle") diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4fb3f96a785543079b8df6723c946b..ccebba7710deaf9f98673a68957ea02138b60d0a 100755 GIT binary patch delta 39692 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 GdG|kGW5mAz delta 37934 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 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index aa991fcea..91dc34173 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew index 1b6c78733..79a61d421 100755 --- a/android/gradlew +++ b/android/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/android/gradlew.bat b/android/gradlew.bat index ac1b06f93..6689b85be 100755 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index b48dd6372..014f15ae7 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -1,63 +1,46 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new 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' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" } -apply plugin: 'com.android.application' -apply plugin: 'com.google.gms.google-services' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 32 + namespace = "io.ably.flutter.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion - // Require Java language level 8 so we can use Method References (used with Lambdas) compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } - lintOptions { - disable 'InvalidPackage' + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 } defaultConfig { - applicationId "io.ably.flutter.example" - minSdkVersion 19 - targetSdkVersion 32 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "io.ably.flutter.example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + signingConfig = signingConfigs.debug } } } flutter { - source '../..' + source = "../.." } dependencies { diff --git a/example/android/build.gradle b/example/android/build.gradle index 15b2ce63d..d2ffbffa4 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,18 +1,3 @@ -buildscript { - ext.kotlin_version = '1.5.31' - - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' - classpath 'com.google.gms:google-services:4.3.10' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -20,14 +5,14 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index aa991fcea..91dc34173 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 5a2f14fb1..cef42b686 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -1,15 +1,25 @@ -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 flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.4.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false } + +include ":app" \ No newline at end of file diff --git a/test_integration/android/app/build.gradle b/test_integration/android/app/build.gradle index d7e9ac9a6..3d19bae21 100644 --- a/test_integration/android/app/build.gradle +++ b/test_integration/android/app/build.gradle @@ -1,63 +1,44 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new 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' +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 32 + namespace = "com.example.ably_flutter_integration_test" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } - lintOptions { - disable 'InvalidPackage' + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.ably_flutter_integration_test" - minSdkVersion 19 - targetSdkVersion 32 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + applicationId = "com.example.ably_flutter_integration_test" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + signingConfig = signingConfigs.debug } } } flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + source = "../.." } diff --git a/test_integration/android/build.gradle b/test_integration/android/build.gradle index ef43bc97d..d2ffbffa4 100644 --- a/test_integration/android/build.gradle +++ b/test_integration/android/build.gradle @@ -1,17 +1,3 @@ -buildscript { - ext.kotlin_version = '1.5.31' - - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -19,14 +5,14 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/test_integration/android/gradle/wrapper/gradle-wrapper.properties b/test_integration/android/gradle/wrapper/gradle-wrapper.properties index aa991fcea..91dc34173 100644 --- a/test_integration/android/gradle/wrapper/gradle-wrapper.properties +++ b/test_integration/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/test_integration/android/settings.gradle b/test_integration/android/settings.gradle index 44e62bcf0..cef42b686 100644 --- a/test_integration/android/settings.gradle +++ b/test_integration/android/settings.gradle @@ -1,11 +1,25 @@ -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 "7.4.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" \ No newline at end of file diff --git a/test_integration/android/settings_aar.gradle b/test_integration/android/settings_aar.gradle deleted file mode 100644 index e7b4def49..000000000 --- a/test_integration/android/settings_aar.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' From 0c7be08a42a6320b0a92569401ee750f3af530ea Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 7 Oct 2024 17:15:54 +0100 Subject: [PATCH 2/5] chore: update github actions --- .github/workflows/check.yaml | 6 ++--- .github/workflows/docs.yml | 4 +-- .github/workflows/flutter_example_app.yaml | 12 ++++----- .github/workflows/flutter_integration.yaml | 31 +++++++++++++--------- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index b4afb6f81..1cba1e673 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -10,11 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 with: - flutter-version: '3.0.x' + flutter-version: '3.24' cache: true # This step requires fetch of test_integration packages because flutter format and @@ -25,7 +25,7 @@ jobs: cd test_integration && flutter pub get - name: 'Check formatting issues in the code' - run: flutter format --set-exit-if-changed . + run: dart format --set-exit-if-changed . - name: 'Statically analyze the Dart code for any errors' run: 'flutter analyze --no-pub .' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fb76c20b6..fbca36013 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,11 +10,11 @@ jobs: deployments: write id-token: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 with: - flutter-version: '3.0.x' + flutter-version: '3.24' cache: true - name: Use Intro Blurb As Homepage diff --git a/.github/workflows/flutter_example_app.yaml b/.github/workflows/flutter_example_app.yaml index 28d6dc298..93ce299c9 100644 --- a/.github/workflows/flutter_example_app.yaml +++ b/.github/workflows/flutter_example_app.yaml @@ -8,11 +8,11 @@ jobs: ios: runs-on: "macos-latest" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 with: - flutter-version: "3.0.x" + flutter-version: "3.24" cache: true - name: "Build example app for iOS" @@ -23,16 +23,16 @@ jobs: android: runs-on: "ubuntu-latest" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: "11" + java-version: "17" - uses: subosito/flutter-action@v2 with: - flutter-version: "3.0.x" + flutter-version: "3.24" cache: true - name: "Build example app for Android" diff --git a/.github/workflows/flutter_integration.yaml b/.github/workflows/flutter_integration.yaml index 078db40e5..559ad0975 100644 --- a/.github/workflows/flutter_integration.yaml +++ b/.github/workflows/flutter_integration.yaml @@ -10,9 +10,9 @@ jobs: strategy: matrix: device: # Device names must be shown in `xcrun simctl list devices` - - 'iPhone 12' # we are not specifying the iOS version as it tends to change + - 'iPhone 15' # we are not specifying the iOS version as it tends to change fail-fast: false - runs-on: 'macos-11' + runs-on: macos-latest steps: - name: 'List Simulators' run: 'xcrun simctl list devices' @@ -20,11 +20,11 @@ jobs: - name: 'Start Simulator' run: xcrun simctl boot "${{ matrix.device }}" - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 with: - flutter-version: '3.0.x' + flutter-version: '3.24' cache: true # test_integration package depends on ably_flutter, so before we run integration @@ -38,31 +38,36 @@ jobs: cd test_integration && ./run_integration_tests.sh android: + runs-on: ubuntu-latest strategy: matrix: api-level: [24, 29] fail-fast: false - - runs-on: 'macos-11' - steps: - - uses: actions/checkout@v3 + - name: checkout + uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: - distribution: 'corretto' - java-version: '11' + distribution: "temurin" + java-version: "17" + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - uses: subosito/flutter-action@v2 with: - flutter-version: '3.0.x' + flutter-version: '3.24' cache: true - name: 'Run Flutter Driver tests' - timeout-minutes: 30 uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} + timeout-minutes: 30 emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: | From d41e3f601634b9364f97b5bad6f842880c024a6a Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 8 Oct 2024 13:16:12 +0100 Subject: [PATCH 3/5] chore: update dependencies --- example/ios/Podfile.lock | 8 +- example/pubspec.lock | 204 ++++++++++++------------------ example/pubspec.yaml | 10 +- pubspec.lock | 80 ++++++++---- pubspec.yaml | 2 +- test_integration/ios/Podfile.lock | 2 +- test_integration/pubspec.lock | 44 +++---- test_integration/pubspec.yaml | 2 +- 8 files changed, 168 insertions(+), 184 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ef9d4a74e..567efd85e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -47,10 +47,10 @@ SPEC CHECKSUMS: Ably: 1d78e5dec56db6d2cf91b10d14fea796ce591bae ably_flutter: e4b2f440e48855dbbd94856f27fa73dc53f17e23 AblyDeltaCodec: add5d06a756b3581b12aab5b5500a320b8c55bea - device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 - fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58 + device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 + fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c msgpack: c85f6251873059738472ae136951cec5f30f3251 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 diff --git a/example/pubspec.lock b/example/pubspec.lock index fc44e4e11..5727c98fc 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -12,18 +12,18 @@ packages: dependency: transitive description: name: args - sha256: "0bd9a99b6eb96f07af141f0eb53eace8983e8e5aa5de59777aca31684680ef22" + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.5.0" async: dependency: "direct main" description: name: async - sha256: db4766341bd8ecb66556f31ab891a5d596ef829221993531bd64a8e6342f0cda + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.11.0" characters: dependency: transitive description: @@ -32,22 +32,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - charcode: - dependency: transitive - description: - name: charcode - sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 - url: "https://pub.dev" - source: hosted - version: "1.3.1" clock: dependency: transitive description: name: clock - sha256: "6021e0172ab6e6eaa1d391afed0a99353921f00c54385c574dc53e55d67c092c" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -60,66 +52,34 @@ packages: dependency: "direct main" description: name: crypto - sha256: cf75650c66c0316274e21d7c43d3dea246273af5955bd94e8184837cd577575c + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.5" dbus: dependency: transitive description: name: dbus - sha256: "83fb17f96be368b3b991b56929c817876cea4a689ba235ef2c359970ed7de049" + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.7.10" device_info_plus: dependency: "direct main" description: name: device_info_plus - sha256: cebe8e3c85a0049120909a9ce5993361a389f998e06bac4d65305e27388106fe - url: "https://pub.dev" - source: hosted - version: "3.2.1" - device_info_plus_linux: - dependency: transitive - description: - name: device_info_plus_linux - sha256: e4eb5db4704f5534e872148a21cfcd39581022b63df556da6720d88f7c9f91a9 - url: "https://pub.dev" - source: hosted - version: "2.1.1" - device_info_plus_macos: - dependency: transitive - description: - name: device_info_plus_macos - sha256: "6b7bf87119739f6a08b74129f9d9d4232e1cd293c431b0ebd14a220c62a0ae14" + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "10.1.2" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "7b2519986b1d805c0d123fcfb42a1be73f9ec2f04f45b15e693b2cb355305b86" - url: "https://pub.dev" - source: hosted - version: "2.3.0+1" - device_info_plus_web: - dependency: transitive - description: - name: device_info_plus_web - sha256: "38715ad1ef3bee8915dd7bee08a9ac9ab54472a8df425c887062a3046209f663" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - device_info_plus_windows: - dependency: transitive - description: - name: device_info_plus_windows - sha256: "8fb1403fc94636d6ab48aeebb5f9379f2ca51cde3b337167ec6f39db09234492" + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "7.0.1" enum_to_string: dependency: "direct main" description: @@ -132,18 +92,18 @@ packages: dependency: transitive description: name: ffi - sha256: "35d0f481d939de0d640b3db9a7aa36a52cd22054a798a73b4f50bdad5ce12678" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.1.3" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" flutter: dependency: "direct main" description: flutter @@ -153,10 +113,10 @@ packages: dependency: "direct main" description: name: flutter_hooks - sha256: c32436445d490ed6c6c94099dd835ecdb8e6fed32d6dc0bc1c3c646b54257e25 + sha256: "6a126f703b89499818d73305e4ce1e3de33b4ae1c5512e3b8eab4b986f46774c" url: "https://pub.dev" source: hosted - version: "0.18.2" + version: "0.18.6" flutter_lints: dependency: "direct dev" description: @@ -169,26 +129,26 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "13e68f60b920d9b7699d9f305ccafa92b23659bb8b9594f097a60704281166b0" + sha256: "49eeef364fddb71515bc78d5a8c51435a68bccd6e4d68e25a942c5e47761ae71" url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "17.2.3" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "64a5f687a87c2a3b87df81484cd9d797082a2cc1144a74345fc5f2c8223fc4e6" + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af url: "https://pub.dev" source: hosted - version: "0.4.1+1" + version: "4.0.1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "21bceee103a66a53b30ea9daf677f990e5b9e89b62f222e60dd241cd08d63d3a" + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "7.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -198,26 +158,26 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "963249d47b24190b03a073d784c4d4a07030d290fbace972f44a7a05fd120027" + sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc" url: "https://pub.dev" source: hosted - version: "8.0.2" + version: "8.2.8" http: dependency: "direct main" description: name: http - sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "0.13.6" http_parser: dependency: transitive description: name: http_parser - sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" lints: dependency: transitive description: @@ -230,74 +190,58 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.15.0" path: dependency: transitive description: name: path - sha256: "2ad4cddff7f5cc0e2d13069f2a3f7a73ca18f66abd6f5ecf215219cdb3638edb" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.0" petitparser: dependency: transitive description: name: petitparser - sha256: "1a914995d4ef10c94ff183528c120d35ed43b5eaa8713fc6766a9be4570782e2" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" - source: hosted - version: "3.1.0" + version: "6.0.2" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.2" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" + version: "2.1.8" retry: dependency: "direct main" description: name: retry - sha256: "45dfeebaf095b606fdb9dbfb4c114cc204449bc274783b452658365e03afdbab" + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" rxdart: dependency: "direct main" description: name: rxdart - sha256: bc2d2b17b87fab32e2dca53ca3066d3147de6f96c74d76cfe1a379a24239c46d + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" url: "https://pub.dev" source: hosted - version: "0.27.3" + version: "0.27.7" sky_engine: dependency: transitive description: flutter @@ -307,50 +251,50 @@ packages: dependency: transitive description: name: source_span - sha256: d5f89a9e52b36240a80282b3dc0667dd36e53459717bb17b8fb102d30496606a + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.10.0" stream_transform: dependency: "direct main" description: name: stream_transform - sha256: ed464977cb26a1f41537e177e190c67223dbd9f4f683489b6ab2e5d211ec564e + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: dd11571b8a03f7cadcf91ec26a77e02bfbd6bbba2a512924d3116646b4198fc4 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.3.0" term_glyph: dependency: transitive description: name: term_glyph - sha256: a88162591b02c1f3a3db3af8ce1ea2b374bd75a7bb8d5e353bcfbdc79d719830 + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" timezone: dependency: transitive description: name: timezone - sha256: "57b35f6e8ef731f18529695bffc62f92c6189fac2e52c12d478dec1931afb66e" + sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.9.4" typed_data: dependency: transitive description: name: typed_data - sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" vector_math: dependency: transitive description: @@ -359,30 +303,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" win32: dependency: transitive description: name: win32 - sha256: "9273b3769064f82a3b330d95123d7d6cabc5ecbc59497abc7191e0a43920225b" + sha256: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec" url: "https://pub.dev" source: hosted - version: "2.3.10" + version: "5.5.5" + 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: "060b6e1c891d956f72b5ac9463466c37cce3fa962a921532fc001e86fe93438e" + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "1.1.0" xml: dependency: transitive description: name: xml - sha256: baa23bcba1ba4ce4b22c0c7a1d9c861e7015cb5169512676da0b85138e72840c + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "6.5.0" sdks: - dart: ">=3.2.0-0 <4.0.0" - flutter: ">=2.8.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index b0e7cca9e..27fdb9e3f 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -3,8 +3,8 @@ description: Demonstrates how to use the Ably Flutter plugin. publish_to: "none" environment: - sdk: ">=2.12.0 <3.0.0" - flutter: "2.8.0" + sdk: ">=3.3.0 <4.0.0" + flutter: "3.24.0" dependencies: flutter: @@ -16,9 +16,9 @@ dependencies: async: ^2.6.1 stream_transform: ^2.0.0 enum_to_string: ^2.0.1 - flutter_local_notifications: ^9.2.0 - fluttertoast: 8.0.2 - device_info_plus: ^3.2.1 + flutter_local_notifications: ^17.2.3 + fluttertoast: ^8.2.8 + device_info_plus: ^10.1.2 crypto: ^3.0.1 flutter_hooks: ^0.18.2 diff --git a/pubspec.lock b/pubspec.lock index 304d95a52..0b5c2cdb2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" boolean_selector: dependency: transitive description: @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" clock: dependency: transitive description: @@ -37,10 +37,10 @@ packages: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.18.0" fake_async: dependency: "direct dev" description: @@ -67,14 +67,30 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: dependency: transitive description: - name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "3.0.1" lints: dependency: transitive description: @@ -87,34 +103,34 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.11.1" meta: dependency: "direct main" description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.15.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.0" sky_engine: dependency: transitive description: flutter @@ -124,26 +140,26 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -164,10 +180,10 @@ packages: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.7.2" vector_math: dependency: transitive description: @@ -176,6 +192,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + url: "https://pub.dev" + source: hosted + version: "14.2.4" sdks: - dart: ">=2.18.0 <3.0.0" - flutter: ">=2.5.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 89ccd6f17..4e0de5a3a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.2.34 repository: https://github.com/ably/ably-flutter environment: - sdk: ">=2.14.0 <3.0.0" + sdk: ">=2.14.0 <4.0.0" flutter: ">=2.5.0" dependencies: diff --git a/test_integration/ios/Podfile.lock b/test_integration/ios/Podfile.lock index 3e6102572..190c1deab 100644 --- a/test_integration/ios/Podfile.lock +++ b/test_integration/ios/Podfile.lock @@ -29,7 +29,7 @@ SPEC CHECKSUMS: Ably: 1d78e5dec56db6d2cf91b10d14fea796ce591bae ably_flutter: e4b2f440e48855dbbd94856f27fa73dc53f17e23 AblyDeltaCodec: add5d06a756b3581b12aab5b5500a320b8c55bea - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 msgpack: c85f6251873059738472ae136951cec5f30f3251 PODFILE CHECKSUM: f2c6cc511583caab2c65ac3f5766428391d93d34 diff --git a/test_integration/pubspec.lock b/test_integration/pubspec.lock index 6889d5a9a..bbaaed5a7 100644 --- a/test_integration/pubspec.lock +++ b/test_integration/pubspec.lock @@ -216,26 +216,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -264,18 +264,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.15.0" mime: dependency: transitive description: @@ -312,10 +312,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" pool: dependency: transitive description: @@ -445,26 +445,26 @@ packages: dependency: "direct dev" description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.4" typed_data: dependency: transitive description: @@ -485,10 +485,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.4" watcher: dependency: transitive description: @@ -530,5 +530,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=3.2.0-0 <4.0.0" - flutter: ">=2.5.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/test_integration/pubspec.yaml b/test_integration/pubspec.yaml index 48b30019f..5d487661e 100644 --- a/test_integration/pubspec.yaml +++ b/test_integration/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.14.0 <3.0.0" + sdk: ">=2.14.0 <4.0.0" dependencies: flutter: From b267b4e03ebc3f29cbdbb8038e885b8de045de0b Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 8 Oct 2024 15:03:40 +0100 Subject: [PATCH 4/5] fix: analyze --- analysis_options.yaml | 4 ---- .../push_notifications_received_sliver.dart | 4 ++-- .../ui/push_notifications/push_notifications_sliver.dart | 4 ++-- example/lib/ui/realtime_sliver.dart | 4 ++-- lib/src/platform/src/codec.dart | 2 -- test/ably_flutter_plugin_test.dart | 6 ++++-- test/mock_method_call_manager.dart | 4 ++-- 7 files changed, 12 insertions(+), 16 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 8b475187e..f815b7078 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -24,7 +24,6 @@ linter: rules: - always_declare_return_types - always_put_required_named_parameters_first - - always_require_non_null_named_parameters - always_use_package_imports - avoid_bool_literals_in_conditional_expressions - avoid_catches_without_on_clauses @@ -44,8 +43,6 @@ linter: - avoid_relative_lib_imports - avoid_renaming_method_parameters - avoid_return_types_on_setters - - avoid_returning_null - - avoid_returning_null_for_future - avoid_returning_null_for_void - avoid_returning_this - avoid_setters_without_getters @@ -66,7 +63,6 @@ linter: - do_not_use_environment - empty_constructor_bodies - hash_and_equals - - invariant_booleans - join_return_with_assignment - leading_newlines_in_multiline_strings - lines_longer_than_80_chars diff --git a/example/lib/ui/push_notifications/push_notifications_received_sliver.dart b/example/lib/ui/push_notifications/push_notifications_received_sliver.dart index 15060211e..1b5b9a663 100644 --- a/example/lib/ui/push_notifications/push_notifications_received_sliver.dart +++ b/example/lib/ui/push_notifications/push_notifications_received_sliver.dart @@ -14,9 +14,9 @@ class PushNotificationsReceivedSliver extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( + const Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: const [ + children: [ Text( 'Received messages', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), diff --git a/example/lib/ui/push_notifications/push_notifications_sliver.dart b/example/lib/ui/push_notifications/push_notifications_sliver.dart index 06a702a91..0653c4d62 100644 --- a/example/lib/ui/push_notifications/push_notifications_sliver.dart +++ b/example/lib/ui/push_notifications/push_notifications_sliver.dart @@ -47,8 +47,8 @@ class PushNotificationsSliver extends StatelessWidget { ], ); - Widget buildSummaryText() => Column( - children: const [ + Widget buildSummaryText() => const Column( + children: [ Text( 'Activate your device, view your local device information, ' 'subscribe to a push channel with either your device or ' diff --git a/example/lib/ui/realtime_sliver.dart b/example/lib/ui/realtime_sliver.dart index 15e143e5c..1f02e0849 100644 --- a/example/lib/ui/realtime_sliver.dart +++ b/example/lib/ui/realtime_sliver.dart @@ -262,8 +262,8 @@ class RealtimeSliver extends HookWidget { ), PaginatedResultViewer( title: 'History', - subtitle: Column( - children: const [ + subtitle: const Column( + children: [ TextRow( 'Hint', 'Use realtime history as a way to get messages that were' diff --git a/lib/src/platform/src/codec.dart b/lib/src/platform/src/codec.dart index dcd4e41fe..953d7d5b7 100644 --- a/lib/src/platform/src/codec.dart +++ b/lib/src/platform/src/codec.dart @@ -1,8 +1,6 @@ import 'dart:io' as io show Platform; -import 'dart:typed_data'; import 'package:ably_flutter/ably_flutter.dart'; import 'package:ably_flutter/src/platform/platform_internal.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; /// @nodoc diff --git a/test/ably_flutter_plugin_test.dart b/test/ably_flutter_plugin_test.dart index a5d8004ce..9fd9cc46d 100644 --- a/test/ably_flutter_plugin_test.dart +++ b/test/ably_flutter_plugin_test.dart @@ -15,7 +15,8 @@ void main() { const _nativeLibraryVersion = '1.1.0'; setUp(() { - channel.setMockMethodCallHandler((methodCall) async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (methodCall) async { switch (methodCall.method) { case PlatformMethod.resetAblyClients: return true; @@ -39,7 +40,8 @@ void main() { }); tearDown(() { - channel.setMockMethodCallHandler(null); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, null); }); test(PlatformMethod.getPlatformVersion, () async { diff --git a/test/mock_method_call_manager.dart b/test/mock_method_call_manager.dart index 03992d42c..57860137b 100644 --- a/test/mock_method_call_manager.dart +++ b/test/mock_method_call_manager.dart @@ -14,7 +14,7 @@ class MockMethodCallManager { MockMethodCallManager() { final channel = MethodChannel('io.ably.flutter.plugin', StandardMethodCodec(Codec())); - TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, handler); Platform(methodChannel: channel); } @@ -25,7 +25,7 @@ class MockMethodCallManager { handleCounter = 0; final channel = MethodChannel('io.ably.flutter.plugin', StandardMethodCodec(Codec())); - TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, handler); Platform(methodChannel: channel); } From cc8995843ea68479c5841f86ae16633d4813b7a8 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 8 Oct 2024 17:28:08 +0100 Subject: [PATCH 5/5] fixup! chore: update github actions --- .github/workflows/flutter_integration.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flutter_integration.yaml b/.github/workflows/flutter_integration.yaml index 559ad0975..94ae3840a 100644 --- a/.github/workflows/flutter_integration.yaml +++ b/.github/workflows/flutter_integration.yaml @@ -64,10 +64,10 @@ jobs: cache: true - name: 'Run Flutter Driver tests' + timeout-minutes: 30 uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} - timeout-minutes: 30 emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: |