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: diff --git a/google_api_availability_android/CHANGELOG.md b/google_api_availability_android/CHANGELOG.md index 3af33e5..4cdab60 100644 --- a/google_api_availability_android/CHANGELOG.md +++ b/google_api_availability_android/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.1.0 + + * 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_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..29608ad 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/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 0000000..db77bb4 Binary files /dev/null and b/google_api_availability_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ 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 0000000..17987b7 Binary files /dev/null and b/google_api_availability_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/google_api_availability_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/google_api_availability_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/google_api_availability_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ 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 0000000..d5f1c8d Binary files /dev/null and b/google_api_availability_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ 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 0000000..4d6372e Binary files /dev/null and b/google_api_availability_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ 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 7c9056e..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.1 +version: 1.1.0 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); }