diff --git a/.gitignore b/.gitignore index e89cf1187f48..d1b8cc15438a 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ GeneratedPluginRegistrant.java build/ .flutter-plugins +*.class diff --git a/AUTHORS b/AUTHORS index 0bcd6a07881c..4cd7e8204c3a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,8 +23,9 @@ Diego Velásquez Hajime Nakamura Tuyển Vũ Xuân Sarthak Verma +Jason Nicholls Mike Diarmid Invertase Elliot Hesp Katarina Sheremet -Thomas Stockx \ No newline at end of file +Thomas Stockx diff --git a/packages/battery/CHANGELOG.md b/packages/battery/CHANGELOG.md index 64b78f76d6db..d70b0d6071a6 100644 --- a/packages/battery/CHANGELOG.md +++ b/packages/battery/CHANGELOG.md @@ -1,7 +1,3 @@ -## 0.3.0+3 - -* Fix `batteryLevel` usage example in README - ## 0.3.0+2 * Bump the minimum Flutter version to 1.2.0. diff --git a/packages/battery/README.md b/packages/battery/README.md index 93f8330db0db..2ed23eea3259 100644 --- a/packages/battery/README.md +++ b/packages/battery/README.md @@ -17,7 +17,7 @@ import 'package:battery/battery.dart'; var battery = Battery(); // Access current battery level -print(await battery.batteryLevel); +print(battery.batteryLevel); // Be informed when the state (full, charging, discharging) changes _battery.onBatteryStateChanged.listen((BatteryState state) { diff --git a/packages/battery/pubspec.yaml b/packages/battery/pubspec.yaml index b9a9bcbde1b4..6d9af34e8b57 100644 --- a/packages/battery/pubspec.yaml +++ b/packages/battery/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for accessing information about the battery state (full, charging, discharging) on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/battery -version: 0.3.0+3 +version: 0.3.0+2 flutter: plugin: diff --git a/packages/cloud_firestore/CHANGELOG.md b/packages/cloud_firestore/CHANGELOG.md index fb056969a2a1..58e5ff5177d5 100644 --- a/packages/cloud_firestore/CHANGELOG.md +++ b/packages/cloud_firestore/CHANGELOG.md @@ -1,13 +1,3 @@ -## 0.9.11 - -* Bump Android dependencies to latest. - -# 0.9.10 - -* Support for cloud_firestore running in the background on Android. -* Fixed a bug in cleanup for DocumentReference.snapshots(). -* Additional integration testing. - ## 0.9.9 * Remove `invokeMapMethod` calls to prevent crash. diff --git a/packages/cloud_firestore/android/build.gradle b/packages/cloud_firestore/android/build.gradle index c0283007130d..34b58bb46f72 100755 --- a/packages/cloud_firestore/android/build.gradle +++ b/packages/cloud_firestore/android/build.gradle @@ -47,7 +47,7 @@ android { disable 'InvalidPackage' } dependencies { - api 'com.google.firebase:firebase-firestore:18.2.0' + api 'com.google.firebase:firebase-firestore:17.1.1' implementation 'androidx.annotation:annotation:1.0.0' } } diff --git a/packages/cloud_firestore/example/android/app/build.gradle b/packages/cloud_firestore/example/android/app/build.gradle index 335003e1414f..f3327118cfa0 100755 --- a/packages/cloud_firestore/example/android/app/build.gradle +++ b/packages/cloud_firestore/example/android/app/build.gradle @@ -38,7 +38,6 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled true } buildTypes { diff --git a/packages/cloud_firestore/example/test_driver/cloud_firestore.dart b/packages/cloud_firestore/example/test_driver/cloud_firestore.dart index 1a2ddc1fb6ed..c56444543d81 100644 --- a/packages/cloud_firestore/example/test_driver/cloud_firestore.dart +++ b/packages/cloud_firestore/example/test_driver/cloud_firestore.dart @@ -26,18 +26,9 @@ void main() { }); test('getDocuments', () async { - final Query query = firestore - .collection('messages') - .where('message', isEqualTo: 'Hello world!') - .limit(1); - final QuerySnapshot querySnapshot = await query.getDocuments(); - expect(querySnapshot.documents.first['message'], 'Hello world!'); - final DocumentReference firstDoc = - querySnapshot.documents.first.reference; - final DocumentSnapshot documentSnapshot = await firstDoc.get(); - expect(documentSnapshot.data['message'], 'Hello world!'); - final DocumentSnapshot snapshot = await firstDoc.snapshots().first; - expect(snapshot.data['message'], 'Hello world!'); + final CollectionReference reference = firestore.collection('messages'); + final QuerySnapshot snapshot = await reference.getDocuments(); + expect(snapshot.documents.length, isNonZero); }); }); } diff --git a/packages/cloud_firestore/lib/src/document_reference.dart b/packages/cloud_firestore/lib/src/document_reference.dart index d9f753215765..a1ad31ac5823 100644 --- a/packages/cloud_firestore/lib/src/document_reference.dart +++ b/packages/cloud_firestore/lib/src/document_reference.dart @@ -128,7 +128,7 @@ class DocumentReference { 'Query#removeListener', {'handle': handle}, ); - Firestore._documentObservers.remove(handle); + Firestore._queryObservers.remove(handle); }); }, ); diff --git a/packages/cloud_firestore/pubspec.yaml b/packages/cloud_firestore/pubspec.yaml index f77def0aa209..454151fea517 100755 --- a/packages/cloud_firestore/pubspec.yaml +++ b/packages/cloud_firestore/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Cloud Firestore, a cloud-hosted, noSQL database live synchronization and offline support on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/cloud_firestore -version: 0.9.11 +version: 0.9.9 flutter: plugin: diff --git a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java index 3d60df1bfeb3..7d1c8f754240 100644 --- a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java +++ b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java @@ -25,7 +25,7 @@ public class FirebaseCorePlugin implements MethodCallHandler { public static void registerWith(PluginRegistry.Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_core"); - channel.setMethodCallHandler(new FirebaseCorePlugin(registrar.context())); + channel.setMethodCallHandler(new FirebaseCorePlugin(registrar.activity())); } private FirebaseCorePlugin(Context context) { diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md index c66c92b57a54..11cecdc6e57a 100644 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ b/packages/firebase_crashlytics/CHANGELOG.md @@ -1,7 +1,3 @@ -## 0.0.3 - -* Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves - ## 0.0.2+1 * Update variable name `enableInDevMode` in README. diff --git a/packages/firebase_crashlytics/android/build.gradle b/packages/firebase_crashlytics/android/build.gradle index 822e5e334d42..fd3f9d8ee6d8 100644 --- a/packages/firebase_crashlytics/android/build.gradle +++ b/packages/firebase_crashlytics/android/build.gradle @@ -37,5 +37,6 @@ android { } dependencies { + implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9' } diff --git a/packages/firebase_crashlytics/pubspec.yaml b/packages/firebase_crashlytics/pubspec.yaml index bd7da5e6e05d..6ad71000ac94 100644 --- a/packages/firebase_crashlytics/pubspec.yaml +++ b/packages/firebase_crashlytics/pubspec.yaml @@ -1,7 +1,7 @@ name: firebase_crashlytics description: Flutter plugin for Firebase Crashlytics. It reports uncaught errors to the Firebase console. -version: 0.0.3 +version: 0.0.2+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics diff --git a/packages/firebase_ml_vision/CHANGELOG.md b/packages/firebase_ml_vision/CHANGELOG.md index 66bd7d3525dd..5fd15a48e2bb 100644 --- a/packages/firebase_ml_vision/CHANGELOG.md +++ b/packages/firebase_ml_vision/CHANGELOG.md @@ -1,12 +1,3 @@ -## 0.7.0 - -* **Breaking Change** Unified and enhanced on-device and cloud image-labeling API. - `iOS` now requires minimum deployment target of 9.0. Add `platform :ios, '9.0'` in your `Podfile`. - Updated to latest version of `Firebase/MLVision` on `iOS`. Please run `pod update` in directory containing your `iOS` project `Podfile`. - `Label` renamed to `ImageLabel`. - `LabelDetector` renamed to `ImageLabeler`. - Removed `CloudLabelDetector` and replaced it with a cloud `ImageLabeler`. - ## 0.6.0+2 * Update README.md diff --git a/packages/firebase_ml_vision/README.md b/packages/firebase_ml_vision/README.md index 56c55f21a587..4dcd1c491f29 100644 --- a/packages/firebase_ml_vision/README.md +++ b/packages/firebase_ml_vision/README.md @@ -20,7 +20,7 @@ android { dependencies { // ... - api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2' + api 'com.google.firebase:firebase-ml-vision-image-label-model:16.2.0' } } ``` diff --git a/packages/firebase_ml_vision/android/build.gradle b/packages/firebase_ml_vision/android/build.gradle index 8fcc744893c9..a9d99ee46d9b 100644 --- a/packages/firebase_ml_vision/android/build.gradle +++ b/packages/firebase_ml_vision/android/build.gradle @@ -45,7 +45,7 @@ android { disable 'InvalidPackage' } dependencies { - api 'com.google.firebase:firebase-ml-vision:19.0.2' + api 'com.google.firebase:firebase-ml-vision:17.0.1' implementation 'androidx.annotation:annotation:1.0.0' implementation 'androidx.exifinterface:exifinterface:1.0.0' } diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/CloudLabelDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/CloudLabelDetector.java new file mode 100644 index 000000000000..e24f6209cd40 --- /dev/null +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/CloudLabelDetector.java @@ -0,0 +1,100 @@ +package io.flutter.plugins.firebasemlvision; + +import androidx.annotation.NonNull; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.ml.vision.FirebaseVision; +import com.google.firebase.ml.vision.cloud.FirebaseVisionCloudDetectorOptions; +import com.google.firebase.ml.vision.cloud.label.FirebaseVisionCloudLabel; +import com.google.firebase.ml.vision.cloud.label.FirebaseVisionCloudLabelDetector; +import com.google.firebase.ml.vision.common.FirebaseVisionImage; +import io.flutter.plugin.common.MethodChannel; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class CloudLabelDetector implements Detector { + static final CloudLabelDetector instance = new CloudLabelDetector(); + + private CloudLabelDetector() {} + + private FirebaseVisionCloudLabelDetector detector; + private Map lastOptions; + + @Override + public void handleDetection( + FirebaseVisionImage image, Map options, final MethodChannel.Result result) { + + // Use instantiated detector if the options are the same. Otherwise, close and instantiate new + // options. + + if (detector == null) { + lastOptions = options; + detector = + FirebaseVision.getInstance().getVisionCloudLabelDetector(parseOptions(lastOptions)); + } else if (!options.equals(lastOptions)) { + try { + detector.close(); + } catch (IOException e) { + result.error("cloudLabelDetectorIOError", e.getLocalizedMessage(), null); + return; + } + + lastOptions = options; + detector = + FirebaseVision.getInstance().getVisionCloudLabelDetector(parseOptions(lastOptions)); + } + + detector + .detectInImage(image) + .addOnSuccessListener( + new OnSuccessListener>() { + @Override + public void onSuccess(List firebaseVisionCloudLabels) { + List> labels = + new ArrayList<>(firebaseVisionCloudLabels.size()); + for (FirebaseVisionCloudLabel label : firebaseVisionCloudLabels) { + Map labelData = new HashMap<>(); + labelData.put("confidence", (double) label.getConfidence()); + labelData.put("entityId", label.getEntityId()); + labelData.put("label", label.getLabel()); + + labels.add(labelData); + } + + result.success(labels); + } + }) + .addOnFailureListener( + new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + result.error("labelDetectorError", e.getLocalizedMessage(), null); + } + }); + } + + private FirebaseVisionCloudDetectorOptions parseOptions(Map optionsData) { + final int maxResults = (int) optionsData.get("maxResults"); + final String modelTypeStr = (String) optionsData.get("modelType"); + + final int modelType; + switch (modelTypeStr) { + case "stable": + modelType = FirebaseVisionCloudDetectorOptions.STABLE_MODEL; + break; + case "latest": + modelType = FirebaseVisionCloudDetectorOptions.LATEST_MODEL; + break; + default: + throw new IllegalArgumentException(String.format("No type for model: %s", modelTypeStr)); + } + + return new FirebaseVisionCloudDetectorOptions.Builder() + .setMaxResults(maxResults) + .setModelType(modelType) + .build(); + } +} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java index 6360fb1fe3e0..d81573f59d01 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java @@ -102,16 +102,16 @@ public void onFailure(@NonNull Exception exception) { private Map getLandmarkData(FirebaseVisionFace face) { Map landmarks = new HashMap<>(); - landmarks.put("bottomMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_BOTTOM)); + landmarks.put("bottomMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.BOTTOM_MOUTH)); landmarks.put("leftCheek", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_CHEEK)); landmarks.put("leftEar", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_EAR)); landmarks.put("leftEye", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_EYE)); - landmarks.put("leftMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_LEFT)); + landmarks.put("leftMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_MOUTH)); landmarks.put("noseBase", landmarkPosition(face, FirebaseVisionFaceLandmark.NOSE_BASE)); landmarks.put("rightCheek", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_CHEEK)); landmarks.put("rightEar", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_EAR)); landmarks.put("rightEye", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_EYE)); - landmarks.put("rightMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_RIGHT)); + landmarks.put("rightMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_MOUTH)); return landmarks; } @@ -139,26 +139,21 @@ private FirebaseVisionFaceDetectorOptions parseOptions(Map optio int mode; switch ((String) options.get("mode")) { case "accurate": - mode = FirebaseVisionFaceDetectorOptions.ACCURATE; + mode = FirebaseVisionFaceDetectorOptions.ACCURATE_MODE; break; case "fast": - mode = FirebaseVisionFaceDetectorOptions.FAST; + mode = FirebaseVisionFaceDetectorOptions.FAST_MODE; break; default: throw new IllegalArgumentException("Not a mode:" + options.get("mode")); } - FirebaseVisionFaceDetectorOptions.Builder builder = - new FirebaseVisionFaceDetectorOptions.Builder() - .setClassificationMode(classification) - .setLandmarkMode(landmark) - .setMinFaceSize((float) ((double) options.get("minFaceSize"))) - .setPerformanceMode(mode); - - if ((boolean) options.get("enableTracking")) { - builder.enableTracking(); - } - - return builder.build(); + return new FirebaseVisionFaceDetectorOptions.Builder() + .setClassificationType(classification) + .setLandmarkType(landmark) + .setMinFaceSize((float) ((double) options.get("minFaceSize"))) + .setModeType(mode) + .setTrackingEnabled((boolean) options.get("enableTracking")) + .build(); } } diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java index 566a96fea672..c4b1eaab6ce1 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java @@ -51,8 +51,11 @@ public void onMethodCall(MethodCall call, Result result) { case "FaceDetector#processImage": FaceDetector.instance.handleDetection(image, options, result); break; - case "ImageLabeler#processImage": - ImageLabeler.instance.handleDetection(image, options, result); + case "LabelDetector#detectInImage": + LabelDetector.instance.handleDetection(image, options, result); + break; + case "CloudLabelDetector#detectInImage": + CloudLabelDetector.instance.handleDetection(image, options, result); break; case "TextRecognizer#processImage": TextRecognizer.instance.handleDetection(image, options, result); diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java deleted file mode 100644 index 0a7468950a61..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.flutter.plugins.firebasemlvision; - -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.label.FirebaseVisionCloudImageLabelerOptions; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabel; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabeler; -import com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class ImageLabeler implements Detector { - static final ImageLabeler instance = new ImageLabeler(); - - private ImageLabeler() {} - - private FirebaseVisionImageLabeler labeler; - private Map lastOptions; - - @Override - public void handleDetection( - FirebaseVisionImage image, Map options, final MethodChannel.Result result) { - - // Use instantiated labeler if the options are the same. Otherwise, close and instantiate new - // options. - - if (labeler != null && !options.equals(lastOptions)) { - try { - labeler.close(); - } catch (IOException e) { - result.error("labelDetectorIOError", e.getLocalizedMessage(), null); - return; - } - - labeler = null; - lastOptions = null; - } - - if (labeler == null) { - lastOptions = options; - - final String modelType = (String) options.get("modelType"); - if (modelType.equals("onDevice")) { - labeler = FirebaseVision.getInstance().getOnDeviceImageLabeler(parseOptions(lastOptions)); - } else if (modelType.equals("cloud")) { - labeler = FirebaseVision.getInstance().getCloudImageLabeler(parseCloudOptions(lastOptions)); - } - } - - labeler - .processImage(image) - .addOnSuccessListener( - new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionLabels) { - List> labels = new ArrayList<>(firebaseVisionLabels.size()); - for (FirebaseVisionImageLabel label : firebaseVisionLabels) { - Map labelData = new HashMap<>(); - labelData.put("confidence", (double) label.getConfidence()); - labelData.put("entityId", label.getEntityId()); - labelData.put("text", label.getText()); - - labels.add(labelData); - } - - result.success(labels); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("imageLabelerError", e.getLocalizedMessage(), null); - } - }); - } - - private FirebaseVisionOnDeviceImageLabelerOptions parseOptions(Map optionsData) { - float conf = (float) (double) optionsData.get("confidenceThreshold"); - return new FirebaseVisionOnDeviceImageLabelerOptions.Builder() - .setConfidenceThreshold(conf) - .build(); - } - - private FirebaseVisionCloudImageLabelerOptions parseCloudOptions( - Map optionsData) { - float conf = (float) (double) optionsData.get("confidenceThreshold"); - return new FirebaseVisionCloudImageLabelerOptions.Builder() - .setConfidenceThreshold(conf) - .build(); - } -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/LabelDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/LabelDetector.java new file mode 100644 index 000000000000..c3a317ed0a59 --- /dev/null +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/LabelDetector.java @@ -0,0 +1,80 @@ +package io.flutter.plugins.firebasemlvision; + +import androidx.annotation.NonNull; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.ml.vision.FirebaseVision; +import com.google.firebase.ml.vision.common.FirebaseVisionImage; +import com.google.firebase.ml.vision.label.FirebaseVisionLabel; +import com.google.firebase.ml.vision.label.FirebaseVisionLabelDetector; +import com.google.firebase.ml.vision.label.FirebaseVisionLabelDetectorOptions; +import io.flutter.plugin.common.MethodChannel; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class LabelDetector implements Detector { + static final LabelDetector instance = new LabelDetector(); + + private LabelDetector() {} + + private FirebaseVisionLabelDetector detector; + private Map lastOptions; + + @Override + public void handleDetection( + FirebaseVisionImage image, Map options, final MethodChannel.Result result) { + + // Use instantiated detector if the options are the same. Otherwise, close and instantiate new + // options. + + if (detector == null) { + lastOptions = options; + detector = FirebaseVision.getInstance().getVisionLabelDetector(parseOptions(lastOptions)); + } else if (!options.equals(lastOptions)) { + try { + detector.close(); + } catch (IOException e) { + result.error("labelDetectorIOError", e.getLocalizedMessage(), null); + return; + } + + lastOptions = options; + detector = FirebaseVision.getInstance().getVisionLabelDetector(parseOptions(lastOptions)); + } + + detector + .detectInImage(image) + .addOnSuccessListener( + new OnSuccessListener>() { + @Override + public void onSuccess(List firebaseVisionLabels) { + List> labels = new ArrayList<>(firebaseVisionLabels.size()); + for (FirebaseVisionLabel label : firebaseVisionLabels) { + Map labelData = new HashMap<>(); + labelData.put("confidence", (double) label.getConfidence()); + labelData.put("entityId", label.getEntityId()); + labelData.put("label", label.getLabel()); + + labels.add(labelData); + } + + result.success(labels); + } + }) + .addOnFailureListener( + new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + result.error("labelDetectorError", e.getLocalizedMessage(), null); + } + }); + } + + private FirebaseVisionLabelDetectorOptions parseOptions(Map optionsData) { + float conf = (float) (double) optionsData.get("confidenceThreshold"); + return new FirebaseVisionLabelDetectorOptions.Builder().setConfidenceThreshold(conf).build(); + } +} diff --git a/packages/firebase_ml_vision/example/android/app/build.gradle b/packages/firebase_ml_vision/example/android/app/build.gradle index 41ef760a9932..e6d7ece97e0f 100644 --- a/packages/firebase_ml_vision/example/android/app/build.gradle +++ b/packages/firebase_ml_vision/example/android/app/build.gradle @@ -47,7 +47,7 @@ android { } dependencies { - api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2' + api 'com.google.firebase:firebase-ml-vision-image-label-model:16.2.0' } } diff --git a/packages/firebase_ml_vision/example/ios/Podfile b/packages/firebase_ml_vision/example/ios/Podfile deleted file mode 100644 index c84fa0cb6579..000000000000 --- a/packages/firebase_ml_vision/example/ios/Podfile +++ /dev/null @@ -1,68 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; - end - pods_ary = [] - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary -end - -target 'Runner' do - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) - end - } - - # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end - end -end - -pod 'Firebase/MLVisionBarcodeModel' -pod 'Firebase/MLVisionFaceModel' -pod 'Firebase/MLVisionLabelModel' -pod 'Firebase/MLVisionTextModel' diff --git a/packages/firebase_ml_vision/example/lib/detector_painters.dart b/packages/firebase_ml_vision/example/lib/detector_painters.dart index 684503b1086c..c9248e1bbb64 100644 --- a/packages/firebase_ml_vision/example/lib/detector_painters.dart +++ b/packages/firebase_ml_vision/example/lib/detector_painters.dart @@ -86,7 +86,7 @@ class LabelDetectorPainter extends CustomPainter { LabelDetectorPainter(this.absoluteImageSize, this.labels); final Size absoluteImageSize; - final List labels; + final List