diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 722223cf8a1..effa6ef6379 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.18+2 + +* Fixes premature garbage collection of native objects when app is under memory pressure. + ## 0.6.18+1 * Makes Java style improvements. diff --git a/packages/camera/camera_android_camerax/android/lint-baseline.xml b/packages/camera/camera_android_camerax/android/lint-baseline.xml index 7a4999067f3..dcfe3c836cf 100644 --- a/packages/camera/camera_android_camerax/android/lint-baseline.xml +++ b/packages/camera/camera_android_camerax/android/lint-baseline.xml @@ -1,125 +1,125 @@ - + + errorLine1=" } else if (value is androidx.camera.camera2.interop.CaptureRequestOptions) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="937" + column="25"/> + errorLine1=" } else if (value is androidx.camera.camera2.interop.Camera2CameraControl) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="939" + column="25"/> + errorLine1=" } else if (value is androidx.camera.camera2.interop.Camera2CameraInfo) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="947" + column="25"/> + errorLine1=" ): androidx.camera.camera2.interop.CaptureRequestOptions" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6418" + column="6"/> + errorLine1=" pigeon_instance: androidx.camera.camera2.interop.CaptureRequestOptions," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6422" + column="24"/> + errorLine1=" args[0] as androidx.camera.camera2.interop.CaptureRequestOptions" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6468" + column="28"/> + errorLine1=" pigeon_instanceArg: androidx.camera.camera2.interop.CaptureRequestOptions," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6488" + column="27"/> + errorLine1=" ): androidx.camera.camera2.interop.Camera2CameraControl" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6533" + column="6"/> + errorLine1=" pigeon_instance: androidx.camera.camera2.interop.Camera2CameraControl," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6537" + column="24"/> + errorLine1=" bundle: androidx.camera.camera2.interop.CaptureRequestOptions," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6538" + column="15"/> @@ -140,7 +140,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -151,7 +151,7 @@ errorLine2=" ~~~~~~~~~"> @@ -162,52 +162,52 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + errorLine1=" pigeon_instanceArg: androidx.camera.camera2.interop.Camera2CameraControl," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6604" + column="27"/> + errorLine1=" ): androidx.camera.camera2.interop.Camera2CameraInfo" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6899" + column="6"/> + errorLine1=" pigeon_instance: androidx.camera.camera2.interop.Camera2CameraInfo" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6903" + column="24"/> + errorLine1=" pigeon_instance: androidx.camera.camera2.interop.Camera2CameraInfo," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6908" + column="24"/> @@ -228,7 +228,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -239,7 +239,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -250,19 +250,19 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + errorLine1=" pigeon_instanceArg: androidx.camera.camera2.interop.Camera2CameraInfo," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + line="6992" + column="27"/> diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt index 58f599dee23..1eeb0e98de8 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXLibrary.g.kt @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon @file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") @@ -3643,7 +3643,7 @@ abstract class PigeonApiVideoRecordEventListener( abstract class PigeonApiPendingRecording( open val pigeonRegistrar: CameraXLibraryPigeonProxyApiRegistrar ) { - /** Enables audio to be recorded for this recording. */ + /** Enables/disables audio to be recorded for this recording. */ abstract fun withAudioEnabled( pigeon_instance: androidx.camera.video.PendingRecording, initialMuted: Boolean diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProxyApiRegistrar.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProxyApiRegistrar.java index 58c36763df8..436e850f2ac 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProxyApiRegistrar.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProxyApiRegistrar.java @@ -60,7 +60,7 @@ void onFailure(@NonNull String methodName, @NonNull Throwable throwable) { } // PreviewProxyApi maintains a state to track SurfaceProducers provided by the Flutter engine. - @NonNull private final PreviewProxyApi previewProxyApi = new PreviewProxyApi(this); + @Nullable private PreviewProxyApi previewProxyApi; public ProxyApiRegistrar( @NonNull BinaryMessenger binaryMessenger, @@ -221,6 +221,9 @@ public DeviceOrientationManagerProxyApi getPigeonApiDeviceOrientationManager() { @NonNull @Override public PigeonApiPreview getPigeonApiPreview() { + if (previewProxyApi == null) { + previewProxyApi = new PreviewProxyApi(this); + } return previewProxyApi; } diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart index ba337d81f32..5d266c09ce7 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers @@ -307,8 +307,18 @@ class PigeonInstanceManager { /// /// Returns the randomly generated id of the [instance] added. int addDartCreatedInstance(PigeonInternalProxyApiBaseClass instance) { + assert(getIdentifier(instance) == null); + final int identifier = _nextUniqueIdentifier(); - _addInstanceWithIdentifier(instance, identifier); + _identifiers[instance] = identifier; + _weakInstances[identifier] = WeakReference( + instance, + ); + _finalizer.attach(instance, identifier, detach: instance); + + final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); + _identifiers[copy] = identifier; + _strongInstances[identifier] = copy; return identifier; } @@ -340,9 +350,15 @@ class PigeonInstanceManager { /// it was removed. Returns `null` if [identifier] was not associated with /// any strong reference. /// - /// This does not remove the weak referenced instance associated with - /// [identifier]. This can be done with [removeWeakReference]. + /// Throws an `AssertionError` if the weak referenced instance associated with + /// [identifier] is not removed first. This can be done with + /// [removeWeakReference]. T? remove(int identifier) { + final T? instance = _weakInstances[identifier]?.target as T?; + assert( + instance == null, + 'A strong instance with identifier $identifier is being removed despite the weak reference still existing: $instance', + ); return _strongInstances.remove(identifier) as T?; } @@ -394,32 +410,16 @@ class PigeonInstanceManager { /// /// Throws assertion error if the instance or its identifier has already been /// added. - /// - /// Returns unique identifier of the [instance] added. void addHostCreatedInstance( PigeonInternalProxyApiBaseClass instance, int identifier, - ) { - _addInstanceWithIdentifier(instance, identifier); - } - - void _addInstanceWithIdentifier( - PigeonInternalProxyApiBaseClass instance, - int identifier, ) { assert(!containsIdentifier(identifier)); assert(getIdentifier(instance) == null); assert(identifier >= 0); _identifiers[instance] = identifier; - _weakInstances[identifier] = WeakReference( - instance, - ); - _finalizer.attach(instance, identifier, detach: instance); - - final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); - _identifiers[copy] = identifier; - _strongInstances[identifier] = copy; + _strongInstances[identifier] = instance; } /// Whether this manager contains the given [identifier]. @@ -4359,7 +4359,7 @@ class PendingRecording extends PigeonInternalProxyApiBaseClass { } } - /// Enables audio to be recorded for this recording. + /// Enables/disables audio to be recorded for this recording. Future withAudioEnabled(bool initialMuted) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecPendingRecording; diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index f0cd8d8ace2..dc0f0ad90a8 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.6.18+1 +version: 0.6.18+2 environment: sdk: ^3.7.0 @@ -31,7 +31,7 @@ dev_dependencies: sdk: flutter leak_tracker_flutter_testing: any mockito: ^5.4.4 - pigeon: ^25.3.1 + pigeon: ^25.3.2 topics: - camera