From e1b244091b26b287dc1c74cf507811eb8a85e61b Mon Sep 17 00:00:00 2001 From: tim Hoogstrate Date: Tue, 18 Feb 2025 17:26:36 +0100 Subject: [PATCH 1/4] Android version 1.0.2 update --- .../android/build.gradle | 13 +--- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../android/settings.gradle | 25 ++++++- .../GoogleApiAvailabilityPlugin.java | 69 +++++++++---------- google_api_availability_android/pubspec.yaml | 2 +- .../test/method_channel_mock.dart | 2 +- .../CHANGELOG.md | 5 ++ 7 files changed, 64 insertions(+), 54 deletions(-) diff --git a/google_api_availability_android/android/build.gradle b/google_api_availability_android/android/build.gradle index 5b6a3e7..8cb6142 100644 --- a/google_api_availability_android/android/build.gradle +++ b/google_api_availability_android/android/build.gradle @@ -1,17 +1,6 @@ group 'com.baseflow.googleapiavailability' version '1.0-SNAPSHOT' -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' - } -} - rootProject.allprojects { repositories { google() @@ -27,7 +16,7 @@ android { namespace 'com.baseflow.googleapiavailability' } - compileSdkVersion 31 + compileSdkVersion 35 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/google_api_availability_android/android/gradle/wrapper/gradle-wrapper.properties b/google_api_availability_android/android/gradle/wrapper/gradle-wrapper.properties index 69a9715..59bc51a 100644 --- a/google_api_availability_android/android/gradle/wrapper/gradle-wrapper.properties +++ b/google_api_availability_android/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/google_api_availability_android/android/settings.gradle b/google_api_availability_android/android/settings.gradle index f5ff5d0..565409d 100644 --- a/google_api_availability_android/android/settings.gradle +++ b/google_api_availability_android/android/settings.gradle @@ -1 +1,24 @@ -rootProject.name = 'google_api_availability' +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 + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + } + + plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false + } + + include ":app" \ No newline at end of file diff --git a/google_api_availability_android/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java b/google_api_availability_android/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java index aef880b..72bbb43 100644 --- a/google_api_availability_android/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java +++ b/google_api_availability_android/android/src/main/java/com/baseflow/googleapiavailability/GoogleApiAvailabilityPlugin.java @@ -8,9 +8,6 @@ import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import io.flutter.plugin.common.PluginRegistry.ViewDestroyListener; -import io.flutter.view.FlutterNativeView; /** * GoogleApiAvailabilityPlugin @@ -26,49 +23,43 @@ public GoogleApiAvailabilityPlugin() { } @Override - public void onAttachedToActivity(ActivityPluginBinding binding) { - methodCallHandler.setActivity(binding.getActivity()); - } + public void onAttachedToActivity(ActivityPluginBinding binding) { + if (methodCallHandler != null) { + methodCallHandler.setActivity(binding.getActivity()); + } + } - @Override - public void onDetachedFromActivity() { - methodCallHandler.setActivity(null); - } + @Override + public void onDetachedFromActivity() { + if (methodCallHandler != null) { + methodCallHandler.setActivity(null); + } + } - @Override - public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { - methodCallHandler.setActivity(binding.getActivity()); - } + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + if (methodCallHandler != null) { + methodCallHandler.setActivity(binding.getActivity()); + } + } - @Override - public void onDetachedFromActivityForConfigChanges() { - methodCallHandler.setActivity(null); - } + @Override + public void onDetachedFromActivityForConfigChanges() { + if (methodCallHandler != null) { + methodCallHandler.setActivity(null); + } + } - @Override - public void onAttachedToEngine(FlutterPluginBinding binding) { - registerPlugin(binding.getApplicationContext(), binding.getBinaryMessenger()); - } + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + registerPlugin(binding.getApplicationContext(), binding.getBinaryMessenger()); + } @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { unregisterPlugin(); } - public static void registerWith(Registrar registrar) { - final GoogleApiAvailabilityPlugin plugin = new GoogleApiAvailabilityPlugin(); - plugin.registerPlugin(registrar.context(), registrar.messenger()); - plugin.methodCallHandler.setActivity(registrar.activity()); - - registrar.addViewDestroyListener(new ViewDestroyListener() { - @Override - public boolean onViewDestroy(FlutterNativeView view) { - plugin.unregisterPlugin(); - return false; - } - }); - } - private void registerPlugin(Context context, BinaryMessenger messenger) { methodCallHandler = new MethodCallHandlerImpl(context, googleApiAvailabilityManager); channel = new MethodChannel(messenger, "flutter.baseflow.com/google_api_availability_android/methods"); @@ -76,7 +67,9 @@ private void registerPlugin(Context context, BinaryMessenger messenger) { } private void unregisterPlugin() { - channel.setMethodCallHandler(null); - channel = null; + if (channel != null) { + channel.setMethodCallHandler(null); + channel = null; + } } } \ No newline at end of file diff --git a/google_api_availability_android/pubspec.yaml b/google_api_availability_android/pubspec.yaml index 7c9056e..6517ed3 100644 --- a/google_api_availability_android/pubspec.yaml +++ b/google_api_availability_android/pubspec.yaml @@ -3,7 +3,7 @@ description: An Android implementation for the google_api_availability plugin. repository: https://github.com/baseflow/flutter-google-api-availability/tree/main/google_api_availability_android # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.1 +version: 1.0.2 flutter: plugin: diff --git a/google_api_availability_android/test/method_channel_mock.dart b/google_api_availability_android/test/method_channel_mock.dart index ad85720..2b5da96 100644 --- a/google_api_availability_android/test/method_channel_mock.dart +++ b/google_api_availability_android/test/method_channel_mock.dart @@ -13,7 +13,7 @@ class MethodChannelMock { this.result, this.delay = Duration.zero, }) : methodChannel = MethodChannel(channelName) { - TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(methodChannel, _handler); } diff --git a/google_api_availability_platform_interface/CHANGELOG.md b/google_api_availability_platform_interface/CHANGELOG.md index e598763..d7a010b 100644 --- a/google_api_availability_platform_interface/CHANGELOG.md +++ b/google_api_availability_platform_interface/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.0.2 + + * Fixes compile errors for Flutter 3.29.0 (and above) + * Updates compileSDKversion to 35 + ## 1.0.1 * Adds `removeInstance` to `GoogleApiAvailabilityPlatform` for testing purposes. From 4bef0076ffcd9c61cf58527cfe52dcf2757f8fae Mon Sep 17 00:00:00 2001 From: tim Hoogstrate Date: Wed, 19 Feb 2025 09:18:18 +0100 Subject: [PATCH 2/4] updated changelog --- google_api_availability_android/CHANGELOG.md | 5 +++++ google_api_availability_platform_interface/CHANGELOG.md | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/google_api_availability_android/CHANGELOG.md b/google_api_availability_android/CHANGELOG.md index 3af33e5..8b1491b 100644 --- a/google_api_availability_android/CHANGELOG.md +++ b/google_api_availability_android/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.0.2 + + * Fixes compile errors for Flutter 3.29.0 (and above) + * Updates compileSDKversion to 35 + ## 1.0.1 * Adds support for the namespace property to support Android Gradle Plugin (AGP) 8. diff --git a/google_api_availability_platform_interface/CHANGELOG.md b/google_api_availability_platform_interface/CHANGELOG.md index d7a010b..e598763 100644 --- a/google_api_availability_platform_interface/CHANGELOG.md +++ b/google_api_availability_platform_interface/CHANGELOG.md @@ -1,8 +1,3 @@ -## 1.0.2 - - * Fixes compile errors for Flutter 3.29.0 (and above) - * Updates compileSDKversion to 35 - ## 1.0.1 * Adds `removeInstance` to `GoogleApiAvailabilityPlatform` for testing purposes. From 22f87570246d60aaf5f66c709fccae89f36ea201 Mon Sep 17 00:00:00 2001 From: tim Hoogstrate Date: Wed, 19 Feb 2025 11:57:39 +0100 Subject: [PATCH 3/4] Added an example project within the Android package to eliminate the need for an external dependency --- google_api_availability_android/CHANGELOG.md | 2 +- .../android/settings.gradle | 8 +- .../example/.gitignore | 70 +++++++ .../example/.metadata | 10 + .../example/README.md | 16 ++ .../example/android/.gitignore | 10 + .../org.eclipse.buildship.core.prefs | 13 ++ .../example/android/app/.classpath | 6 + .../org.eclipse.buildship.core.prefs | 2 + .../example/android/app/build.gradle | 64 ++++++ .../android/app/src/main/AndroidManifest.xml | 40 ++++ .../main/res/drawable/launch_background.xml | 12 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../example/android/build.gradle | 18 ++ .../example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 24 +++ .../example/lib/main.dart | 194 ++++++++++++++++++ .../example/pubspec.yaml | 20 ++ google_api_availability_android/pubspec.yaml | 2 +- 25 files changed, 523 insertions(+), 6 deletions(-) create mode 100644 google_api_availability_android/example/.gitignore create mode 100644 google_api_availability_android/example/.metadata create mode 100644 google_api_availability_android/example/README.md create mode 100644 google_api_availability_android/example/android/.gitignore create mode 100644 google_api_availability_android/example/android/.settings/org.eclipse.buildship.core.prefs create mode 100644 google_api_availability_android/example/android/app/.classpath create mode 100644 google_api_availability_android/example/android/app/.settings/org.eclipse.buildship.core.prefs create mode 100644 google_api_availability_android/example/android/app/build.gradle create mode 100644 google_api_availability_android/example/android/app/src/main/AndroidManifest.xml create mode 100644 google_api_availability_android/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 google_api_availability_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 google_api_availability_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 google_api_availability_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 google_api_availability_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 google_api_availability_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 google_api_availability_android/example/android/app/src/main/res/values/styles.xml create mode 100644 google_api_availability_android/example/android/build.gradle create mode 100644 google_api_availability_android/example/android/gradle.properties create mode 100644 google_api_availability_android/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 google_api_availability_android/example/android/settings.gradle create mode 100644 google_api_availability_android/example/lib/main.dart create mode 100644 google_api_availability_android/example/pubspec.yaml diff --git a/google_api_availability_android/CHANGELOG.md b/google_api_availability_android/CHANGELOG.md index 8b1491b..4cdab60 100644 --- a/google_api_availability_android/CHANGELOG.md +++ b/google_api_availability_android/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.0.2 +## 1.1.0 * Fixes compile errors for Flutter 3.29.0 (and above) * Updates compileSDKversion to 35 diff --git a/google_api_availability_android/android/settings.gradle b/google_api_availability_android/android/settings.gradle index 565409d..29608ad 100644 --- a/google_api_availability_android/android/settings.gradle +++ b/google_api_availability_android/android/settings.gradle @@ -16,9 +16,9 @@ pluginManagement { } } - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - } +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false +} include ":app" \ No newline at end of file diff --git a/google_api_availability_android/example/.gitignore b/google_api_availability_android/example/.gitignore new file mode 100644 index 0000000..07488ba --- /dev/null +++ b/google_api_availability_android/example/.gitignore @@ -0,0 +1,70 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/google_api_availability_android/example/.metadata b/google_api_availability_android/example/.metadata new file mode 100644 index 0000000..66fe509 --- /dev/null +++ b/google_api_availability_android/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 035e0765cc575c3b455689c2402cce073d564fce + channel: master + +project_type: app diff --git a/google_api_availability_android/example/README.md b/google_api_availability_android/example/README.md new file mode 100644 index 0000000..e767248 --- /dev/null +++ b/google_api_availability_android/example/README.md @@ -0,0 +1,16 @@ +# google_api_availability_example + +Demonstrates how to use the google_api_availability plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.io/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.io/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.io/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/google_api_availability_android/example/android/.gitignore b/google_api_availability_android/example/android/.gitignore new file mode 100644 index 0000000..65b7315 --- /dev/null +++ b/google_api_availability_android/example/android/.gitignore @@ -0,0 +1,10 @@ +*.iml +*.class +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +GeneratedPluginRegistrant.java diff --git a/google_api_availability_android/example/android/.settings/org.eclipse.buildship.core.prefs b/google_api_availability_android/example/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..9851512 --- /dev/null +++ b/google_api_availability_android/example/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/google_api_availability_android/example/android/app/.classpath b/google_api_availability_android/example/android/app/.classpath new file mode 100644 index 0000000..eb19361 --- /dev/null +++ b/google_api_availability_android/example/android/app/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/google_api_availability_android/example/android/app/.settings/org.eclipse.buildship.core.prefs b/google_api_availability_android/example/android/app/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..b1886ad --- /dev/null +++ b/google_api_availability_android/example/android/app/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 diff --git a/google_api_availability_android/example/android/app/build.gradle b/google_api_availability_android/example/android/app/build.gradle new file mode 100644 index 0000000..b466482 --- /dev/null +++ b/google_api_availability_android/example/android/app/build.gradle @@ -0,0 +1,64 @@ +plugins { + id "com.android.application" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace 'com.baseflow.googleapiavailabilityexample' + compileSdkVersion flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.baseflow.googleapiavailabilityexample" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + 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 + } + } +} + +flutter { + source '../..' +} + +dependencies { + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} \ No newline at end of file diff --git a/google_api_availability_android/example/android/app/src/main/AndroidManifest.xml b/google_api_availability_android/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c887de4 --- /dev/null +++ b/google_api_availability_android/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/google_api_availability_android/example/android/app/src/main/res/drawable/launch_background.xml b/google_api_availability_android/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/google_api_availability_android/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/google_api_availability_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/google_api_availability_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/google_api_availability_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/google_api_availability_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/google_api_availability_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/google_api_availability_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/google_api_availability_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/google_api_availability_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/google_api_availability_android/example/android/app/src/main/res/values/styles.xml b/google_api_availability_android/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/google_api_availability_android/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/google_api_availability_android/example/android/build.gradle b/google_api_availability_android/example/android/build.gradle new file mode 100644 index 0000000..bc157bd --- /dev/null +++ b/google_api_availability_android/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/google_api_availability_android/example/android/gradle.properties b/google_api_availability_android/example/android/gradle.properties new file mode 100644 index 0000000..75e8721 --- /dev/null +++ b/google_api_availability_android/example/android/gradle.properties @@ -0,0 +1,4 @@ +android.enableJetifier=true +android.useAndroidX=true +android.enableR8=true +org.gradle.jvmargs=-Xmx1536M \ No newline at end of file diff --git a/google_api_availability_android/example/android/gradle/wrapper/gradle-wrapper.properties b/google_api_availability_android/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f7fafcd --- /dev/null +++ b/google_api_availability_android/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 01 07:57:11 BST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip diff --git a/google_api_availability_android/example/android/settings.gradle b/google_api_availability_android/example/android/settings.gradle new file mode 100644 index 0000000..29a0efb --- /dev/null +++ b/google_api_availability_android/example/android/settings.gradle @@ -0,0 +1,24 @@ +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 + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + } + + plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false + } + + include ":app" \ No newline at end of file diff --git a/google_api_availability_android/example/lib/main.dart b/google_api_availability_android/example/lib/main.dart new file mode 100644 index 0000000..aa4ca7c --- /dev/null +++ b/google_api_availability_android/example/lib/main.dart @@ -0,0 +1,194 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_api_availability_android/google_api_availability_android.dart'; +import 'package:google_api_availability_platform_interface/google_api_availability_platform_interface.dart'; + +void main() => runApp(const MyApp()); + +///Creates the mutable state for this widget. +class MyApp extends StatefulWidget { + /// Named [key] parameter to identify a widget. + const MyApp({Key? key}) : super(key: key); + + @override + // ignore: library_private_types_in_public_api + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + GooglePlayServicesAvailability _playStoreAvailability = + GooglePlayServicesAvailability.unknown; + String _errorString = 'unknown'; + bool _isUserResolvable = false; + bool _errorDialogFragmentShown = false; + + // Platform messages are asynchronous, so we initialize in an async method. + Future checkPlayServices([bool showDialog = false]) async { + GooglePlayServicesAvailability playStoreAvailability; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + playStoreAvailability = await GoogleApiAvailabilityAndroid() + .checkGooglePlayServicesAvailability(showDialog); + } on PlatformException { + playStoreAvailability = GooglePlayServicesAvailability.unknown; + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) { + return; + } + + setState(() { + _playStoreAvailability = playStoreAvailability; + }); + } + + Future makeGooglePlayServicesAvailable() async { + try { + await GoogleApiAvailabilityAndroid().makeGooglePlayServicesAvailable(); + } on PlatformException { + return; + } + + if (!mounted) { + return; + } + } + + Future getErrorString() async { + String errorString; + + try { + errorString = await GoogleApiAvailabilityAndroid().getErrorString(); + } on PlatformException { + errorString = 'Not available on non Android devices'; + } + + if (!mounted) { + return; + } + + setState(() { + _errorString = errorString; + }); + } + + Future isUserResolvable() async { + bool isUserResolvable; + + try { + isUserResolvable = + await GoogleApiAvailabilityAndroid().isUserResolvable(); + } on PlatformException { + isUserResolvable = false; + } + + if (!mounted) { + return; + } + + setState(() { + _isUserResolvable = isUserResolvable; + }); + } + + Future showErrorNotification() async { + try { + await GoogleApiAvailabilityAndroid().showErrorNotification(); + } on PlatformException { + return; + } + + if (!mounted) { + return; + } + } + + Future showErrorDialogFragment() async { + bool errorDialogFragmentShown; + + try { + errorDialogFragmentShown = + await GoogleApiAvailabilityAndroid().showErrorDialogFragment(); + } on PlatformException { + errorDialogFragmentShown = false; + } + + if (!mounted) { + return; + } + + setState(() { + _errorDialogFragmentShown = errorDialogFragmentShown; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: ListView( + children: [ + MaterialButton( + onPressed: () => checkPlayServices(), + color: Colors.red, + child: const Text('Get PlayServices availability'), + ), + Center( + child: Text( + 'Google Play Store status: ${_playStoreAvailability.toString().split('.').last}\n')), + MaterialButton( + onPressed: () => checkPlayServices(true), + color: Colors.redAccent, + child: + const Text('Get PlayServices availability with fix dialog'), + ), + Center( + child: Text( + 'Google Play Store status: ${_playStoreAvailability.toString().split('.').last}\n')), + MaterialButton( + onPressed: () => makeGooglePlayServicesAvailable(), + color: Colors.red, + child: const Text('Make Google Play Service available'), + ), + const SizedBox(height: 30), + MaterialButton( + onPressed: () => getErrorString(), + color: Colors.red, + child: const Text('Get string of the error code'), + ), + Center(child: Text('Error string: $_errorString\n')), + MaterialButton( + onPressed: () => isUserResolvable(), + color: Colors.red, + child: const Text('Error resolvable by user'), + ), + Center( + child: + Text('Error resolvable by user: $_isUserResolvable\n')), + MaterialButton( + onPressed: () => showErrorNotification(), + color: Colors.red, + child: const Text('Show error notification'), + ), + const SizedBox(height: 30), + MaterialButton( + onPressed: () => showErrorDialogFragment(), + color: Colors.red, + child: const Text('Show error dialog fragment'), + ), + Center( + child: + Text('Error dialog shown: $_errorDialogFragmentShown\n')), + ], + )), + ); + } +} diff --git a/google_api_availability_android/example/pubspec.yaml b/google_api_availability_android/example/pubspec.yaml new file mode 100644 index 0000000..54512b5 --- /dev/null +++ b/google_api_availability_android/example/pubspec.yaml @@ -0,0 +1,20 @@ +name: google_api_availability_example +description: Demonstrates how to use the google_api_availability plugin. +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.15.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + google_api_availability_android: + path: ../ + google_api_availability_platform_interface: ^1.0.1 + +dev_dependencies: + flutter_lints: 1.0.4 + +flutter: + uses-material-design: true diff --git a/google_api_availability_android/pubspec.yaml b/google_api_availability_android/pubspec.yaml index 6517ed3..786fed8 100644 --- a/google_api_availability_android/pubspec.yaml +++ b/google_api_availability_android/pubspec.yaml @@ -3,7 +3,7 @@ description: An Android implementation for the google_api_availability plugin. repository: https://github.com/baseflow/flutter-google-api-availability/tree/main/google_api_availability_android # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.2 +version: 1.1.0 flutter: plugin: From 6b25756c2145e9c06e251ad5a3c1d5f8976d0f28 Mon Sep 17 00:00:00 2001 From: tim Hoogstrate Date: Wed, 19 Feb 2025 12:00:46 +0100 Subject: [PATCH 4/4] updated build file --- .github/workflows/google_api_availability_android.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/google_api_availability_android.yaml b/.github/workflows/google_api_availability_android.yaml index 98e5f89..3471c88 100644 --- a/.github/workflows/google_api_availability_android.yaml +++ b/.github/workflows/google_api_availability_android.yaml @@ -23,7 +23,7 @@ jobs: env: source-directory: ./google_api_availability_android - example-directory: ./google_api_availability/example + example-directory: ./google_api_availability_android/example # Steps represent a sequence of tasks that will be executed as part of the job steps: