Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
6125eca
Recreating image capture impl from flutter/plugins
camsim99 Feb 23, 2023
5be1371
Merge remote-tracking branch 'upstream/main' into camx_imgcap
camsim99 Feb 23, 2023
b2fce3d
Fix integration tesT
camsim99 Feb 23, 2023
ed62a9a
Merge branch 'main' into camx_imgcap
camsim99 Feb 23, 2023
2e3027b
Analyzer pt 2
camsim99 Feb 23, 2023
fbd3fe5
Merge branch 'camx_imgcap' of github.com:camsim99/packages into camx_…
camsim99 Feb 23, 2023
dfa477e
Personal cleanup
camsim99 Feb 23, 2023
a651b92
Add initialization of controller
camsim99 Feb 24, 2023
884fd6c
Merge remote-tracking branch 'upstream/main' into camx_imgcap
camsim99 Feb 24, 2023
d5f8b91
Modify some docs
camsim99 Feb 24, 2023
060b7e5
Address review
camsim99 Mar 2, 2023
ff50c70
Merge remote-tracking branch 'upstream/main' into camx_imgcap
camsim99 Mar 2, 2023
fe6f1fc
Fix analyze
camsim99 Mar 2, 2023
e2643ae
Update packages/camera/camera_android_camerax/android/src/main/java/i…
camsim99 Mar 3, 2023
b7194f7
Update packages/camera/camera_android_camerax/lib/src/image_capture.dart
camsim99 Mar 3, 2023
dadc230
Start addressing review
camsim99 Mar 6, 2023
d15e1d4
Finish addressing review
camsim99 Mar 7, 2023
6dc2b77
Fix analyze
camsim99 Mar 7, 2023
f826b62
Generate mocks on stable
camsim99 Mar 7, 2023
0f7f29a
Fix/add tests
camsim99 Mar 7, 2023
1e9739b
Add isBound dart test
camsim99 Mar 7, 2023
9ba20d0
Merge remote-tracking branch 'upstream/main' into camx_imgcap
camsim99 Mar 13, 2023
5bf6b17
Start dev
camsim99 Mar 8, 2023
5e58b2c
Add cameraClosing impl
camsim99 Mar 8, 2023
4c8c94d
Add tests
camsim99 Mar 13, 2023
6a0de08
Implement occ with camera state
camsim99 Mar 14, 2023
d3ed3e7
Reimplement with live camera state
camsim99 Mar 15, 2023
d1c684f
Start adding tests
camsim99 Mar 22, 2023
c04d8c1
Add java tests
camsim99 Mar 22, 2023
b2322d2
Formatting
camsim99 Mar 22, 2023
3545aec
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Mar 22, 2023
e1f5bdb
Fix flutter analyze
camsim99 Mar 22, 2023
2d3409b
Fix analyze
camsim99 Mar 22, 2023
1f40f47
Review
camsim99 Mar 22, 2023
6c9b04e
Fix tests, review 2
camsim99 Mar 23, 2023
6c6cbb4
review 3
camsim99 Mar 23, 2023
a0ea3c5
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Mar 23, 2023
06c1545
fix analyze
camsim99 Mar 23, 2023
681a117
Fix cast
camsim99 Mar 23, 2023
1143a03
generate mocks on stable
camsim99 Mar 23, 2023
d431511
Formatting
camsim99 Mar 24, 2023
ab3c085
Add missing tests
camsim99 Mar 24, 2023
631f972
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Mar 24, 2023
70c817a
Fix analyze
camsim99 Mar 24, 2023
426b438
Bump camerax version
camsim99 Mar 27, 2023
2bc4877
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Mar 28, 2023
0fcf7c6
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Mar 29, 2023
6c49bd9
Formatting
camsim99 Mar 29, 2023
b9daeb1
pair programming w/maurice
camsim99 Apr 11, 2023
3345878
Fixing plugin
camsim99 Apr 12, 2023
9f6646f
Current status
camsim99 Apr 13, 2023
265eb1e
Remove print statements
camsim99 Apr 14, 2023
bfc4b5e
Add print
camsim99 Apr 14, 2023
4f3c342
remove comments
camsim99 Apr 14, 2023
e3c7a5b
Review 2
camsim99 Apr 17, 2023
f341f7f
Fixing tests
camsim99 Apr 18, 2023
0d4b021
Fix tests, format
camsim99 Apr 18, 2023
ca3bd9e
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 Apr 18, 2023
540ee98
Fix test
camsim99 Apr 18, 2023
debcd3a
Fix camera test
camsim99 Apr 18, 2023
a79ee62
Start addressing review
camsim99 Apr 25, 2023
438f592
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 May 1, 2023
c44fc06
Address review, remove cast
camsim99 May 1, 2023
83aea10
Fix java tests
camsim99 May 1, 2023
5f435e8
Fix dart tests
camsim99 May 1, 2023
581af94
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 May 1, 2023
dec3d69
Merge remote-tracking branch 'upstream/main' into camx_occ
camsim99 May 1, 2023
02c039f
Merge branch 'camx_occ' into camx_occ_3
camsim99 May 1, 2023
ce463ba
Undo changes to other packages
camsim99 May 1, 2023
c525162
Undo non-camera changes
camsim99 May 1, 2023
86304c3
Add getValue
camsim99 May 2, 2023
b826c18
Fix tests
camsim99 May 2, 2023
2cebb18
Add log and formatting
camsim99 May 2, 2023
04976ec
Add period
camsim99 May 2, 2023
bca72ee
Fix android test errors
camsim99 May 2, 2023
2da0b8f
Merge remote-tracking branch 'upstream/main' into camx_occ_3
camsim99 May 2, 2023
ea78ab0
fix tests
camsim99 May 3, 2023
d0b160f
Formatting
camsim99 May 3, 2023
bc7ebee
Fix tests
camsim99 May 3, 2023
9014d3b
Add mock files
camsim99 May 3, 2023
f3d6a06
Addres test comments
camsim99 May 3, 2023
34cab98
Address rest of review
camsim99 May 3, 2023
6f701a5
Address maurice review
camsim99 May 3, 2023
a636525
Address reviews
camsim99 May 4, 2023
d5a21cb
Improve comments
camsim99 May 5, 2023
bc4ebc1
Update packages/camera/camera_android_camerax/lib/src/android_camera_…
camsim99 May 8, 2023
491ab2c
Apply patch + fix dispose
camsim99 May 8, 2023
bff96a9
Merge branch 'camx_occ_3' of github.com:camsim99/packages into camx_o…
camsim99 May 8, 2023
ad40999
Merge remote-tracking branch 'upstream/main' into camx_occ_3
camsim99 May 8, 2023
a3667dd
Merge remote-tracking branch 'upstream/main' into camx_occ_3
camsim99 May 9, 2023
c3732fe
Merge remote-tracking branch 'upstream/main' into camx_occ_3
camsim99 May 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fixing plugin
  • Loading branch information
camsim99 committed Apr 12, 2023
commit 33458787870f08d70523443c11d8421bc9f3238e
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

package io.flutter.plugins.camerax;

import javax.annotation.processing.Generated;

import android.app.Activity;
import android.content.Context;
import androidx.annotation.NonNull;
Expand All @@ -19,8 +21,10 @@ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, Activity
private InstanceManager instanceManager;
private FlutterPluginBinding pluginBinding;
private LiveCameraStateHostApiImpl liveCameraStateHostApiImpl;
private ProcessCameraProviderHostApiImpl processCameraProviderHostApi;
private ImageCaptureHostApiImpl imageCaptureHostApi;
private ProcessCameraProviderHostApiImpl processCameraProviderHostApiImpl;
private ImageCaptureHostApiImpl imageCaptureHostApiImpl;
private LiveDataHostApiImpl liveDataHostApiImpl;

public SystemServicesHostApiImpl systemServicesHostApi;

/**
Expand Down Expand Up @@ -48,21 +52,22 @@ void setUp(BinaryMessenger binaryMessenger, Context context, TextureRegistry tex
binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager));
GeneratedCameraXLibrary.JavaObjectHostApi.setup(
binaryMessenger, new JavaObjectHostApiImpl(instanceManager));
processCameraProviderHostApi =
processCameraProviderHostApiImpl =
new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context);
GeneratedCameraXLibrary.ProcessCameraProviderHostApi.setup(
binaryMessenger, processCameraProviderHostApi);
binaryMessenger, processCameraProviderHostApiImpl);
systemServicesHostApi = new SystemServicesHostApiImpl(binaryMessenger, instanceManager);
GeneratedCameraXLibrary.SystemServicesHostApi.setup(binaryMessenger, systemServicesHostApi);
GeneratedCameraXLibrary.PreviewHostApi.setup(
binaryMessenger, new PreviewHostApiImpl(binaryMessenger, instanceManager, textureRegistry));
imageCaptureHostApi = new ImageCaptureHostApiImpl(binaryMessenger, instanceManager, context);
GeneratedCameraXLibrary.ImageCaptureHostApi.setup(binaryMessenger, imageCaptureHostApi);
imageCaptureHostApiImpl = new ImageCaptureHostApiImpl(binaryMessenger, instanceManager, context);
GeneratedCameraXLibrary.ImageCaptureHostApi.setup(binaryMessenger, imageCaptureHostApiImpl);
GeneratedCameraXLibrary.CameraHostApi.setup(
binaryMessenger, new CameraHostApiImpl(binaryMessenger, instanceManager));
liveCameraStateHostApiImpl = new LiveCameraStateHostApiImpl(binaryMessenger, instanceManager);
GeneratedCameraXLibrary.LiveCameraStateHostApi.setup(
binaryMessenger, liveCameraStateHostApiImpl);
liveDataHostApiImpl = new LiveDataHostApiImpl(binaryMessenger, instanceManager);
GeneratedCameraXLibrary.LiveDataHostApi.setup(binaryMessenger, liveDataHostApiImpl);
GeneratedCameraXLibrary.ObserverHostApi.setup(
binaryMessenger, new ObserverHostApiImpl(binaryMessenger, instanceManager));
}

@Override
Expand All @@ -88,8 +93,8 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBi
updateContext(pluginBinding.getApplicationContext());

Activity activity = activityPluginBinding.getActivity();
processCameraProviderHostApi.setLifecycleOwner((LifecycleOwner) activity);
liveCameraStateHostApiImpl.setLifecycleOwner((LifecycleOwner) activity);
processCameraProviderHostApiImpl.setLifecycleOwner((LifecycleOwner) activity);
liveDataHostApiImpl.setLifecycleOwner((LifecycleOwner) activity);
systemServicesHostApi.setActivity(activity);
systemServicesHostApi.setPermissionsRegistry(
activityPluginBinding::addRequestPermissionsResultListener);
Expand All @@ -116,11 +121,11 @@ public void onDetachedFromActivity() {
* ProcessCameraProvider}.
*/
public void updateContext(Context context) {
if (processCameraProviderHostApi != null) {
processCameraProviderHostApi.setContext(context);
if (processCameraProviderHostApiImpl != null) {
processCameraProviderHostApiImpl.setContext(context);
}
if (imageCaptureHostApi != null) {
processCameraProviderHostApi.setContext(context);
if (imageCaptureHostApiImpl != null) {
processCameraProviderHostApiImpl.setContext(context);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,27 @@ public void create(
@Nullable CameraState.StateError error,
@NonNull CameraStateFlutterApi.Reply<Void> callback) {

// TODO(camsim99): actually fix this
CameraStateType cameraStateType;
switch (type) {
default:
cameraStateType = CameraStateType.CLOSED;
case CameraState.Type.CLOSED:
cameraStateType = CameraState.Type.CLOSED;
break;
case CameraState.Type.CLOSING:
cameraStateType = CameraState.Type.CLOSING;
break;
case CameraState.Type.OPEN:
cameraStateType = CameraState.Type.CLOSED;
break;
case CameraState.Type.OPENING:
cameraStateType = CameraState.Type.CLOSED;
break;
case CameraState.Type.PENDING_OPEN:
cameraStateType = CameraState.Type.CLOSED;
break;
}

if (error != null) {
new CameraStateErrorFlutterApiWrapper(binaryMessenger, instanceManager).create(error, Long.valueOf(error.getCode()), "TODO(camsim99)", reply -> {});
new CameraStateErrorFlutterApiWrapper(binaryMessenger, instanceManager).create(error, Long.valueOf(error.getCode()), getCameraStateErrorDescription(error), reply -> {});
}

if (!instanceManager.containsInstance(instance)) {
Expand All @@ -77,6 +89,41 @@ public void create(
}
}

/**
* Returns an error message corresponding to the specified {@link CameraState.StateError}.
*
* <p>See https://developer.android.com/reference/androidx/camera/core/CameraState#constants_1 for
* more information on the different {@link CameraState.StateError} types.
*/
private String getCameraStateErrorDescription(@NonNull CameraState.StateError cameraStateError) {
final int cameraStateErrorCode = cameraStateError.getCode();
final String cameraStateErrorDescription = cameraStateErrorCode + ": ";
switch (cameraStateErrorCode) {
case CameraState.ERROR_CAMERA_IN_USE:
return cameraStateErrorDescription
+ "The camera was already in use, possibly by a higher-priority camera client.";
case CameraState.ERROR_MAX_CAMERAS_IN_USE:
return cameraStateErrorDescription
+ "The limit number of open cameras has been reached, and more cameras cannot be opened until other instances are closed.";
case CameraState.ERROR_OTHER_RECOVERABLE_ERROR:
return cameraStateErrorDescription
+ "The camera device has encountered a recoverable error. CameraX will attempt to recover from the error.";
case CameraState.ERROR_STREAM_CONFIG:
return cameraStateErrorDescription + "Configuring the camera has failed.";
case CameraState.ERROR_CAMERA_DISABLED:
return cameraStateErrorDescription
+ "The camera device could not be opened due to a device policy. Thia may be caused by a client from a background process attempting to open the camera.";
case CameraState.ERROR_CAMERA_FATAL_ERROR:
return cameraStateErrorDescription
+ "The camera was closed due to a fatal error. This may require the Android device be shut down and restarted to restore camera function or may indicate a persistent camera hardware problem.";
case CameraState.ERROR_DO_NOT_DISTURB_MODE_ENABLED:
return cameraStateErrorDescription
+ "The camera could not be opened because 'Do Not Disturb' mode is enabled. Please disable this mode, and try opening the camera again.";
default:
return "There was an undefined issue with the camera state.";
}
}

/**
* Sets the Flutter API used to send messages to Dart.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ public class LiveDataHostApiImpl implements LiveDataHostApi {
// To ease adding additional methods, this value is added prematurely.
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final BinaryMessenger binaryMessenger;

private final InstanceManager instanceManager;

public LifecycleOwner fakeLifecycleOwner;
private LifecycleOwner lifecycleOwner;

/**
* Constructs a {@link LiveDataHostApiImpl}.
Expand All @@ -44,20 +42,21 @@ public LiveDataHostApiImpl(
this.instanceManager = instanceManager;
}

/** Sets {@link LifecycleOwner} used to observe the camera state if so requested. */
public void setLifecycleOwner(LifecycleOwner lifecycleOwner) {
this.lifecycleOwner = lifecycleOwner;
}

@Override
@SuppressWarnings("unchecked")
public void observe(@NonNull Long identifier, @NonNull Long observerIdentifier) {

// tODO(camsim99): get lifecycleowner
getLiveDataInstance(identifier)
.observe(fakeLifecycleOwner, Objects.requireNonNull(instanceManager.getInstance(observerIdentifier)));
.observe(lifecycleOwner, Objects.requireNonNull(instanceManager.getInstance(observerIdentifier)));
}

@Override
public void removeObservers(@NonNull Long identifier) {

// tODO(camsim99): get lifecycleowner
getLiveDataInstance(identifier).removeObservers(fakeLifecycleOwner);
getLiveDataInstance(identifier).removeObservers(lifecycleOwner);
}

private LiveData<?> getLiveDataInstance(@NonNull Long identifier) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ public void onChanged(
CameraState state = (CameraState) value;
new CameraStateFlutterApiWrapper(binaryMessenger, instanceManager).create(state, state.getType(), state.getError(), reply -> {});
} else {
// TODO(camsim99): make this more specific
throw new UnsupportedOperationException();
throw new UnsupportedOperationException("The type of value in observance is not wrapped by this plugin.");
}

api.onChanged(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public void observe() {
new LiveDataHostApiImpl(mockBinaryMessenger, instanceManager);

LifecycleOwner fakeLifecycleOwner = mock(LifecycleOwner.class);
hostApi.fakeLifecycleOwner = fakeLifecycleOwner;
hostApi.setLifecycleOwner(fakeLifecycleOwner);

hostApi.observe(instanceIdentifier, observerIdentifier);

Expand All @@ -82,7 +82,7 @@ public void removeObservers() {
new LiveDataHostApiImpl(mockBinaryMessenger, instanceManager);

LifecycleOwner fakeLifecycleOwner = mock(LifecycleOwner.class);
hostApi.fakeLifecycleOwner = fakeLifecycleOwner;
hostApi.setLifecycleOwner(fakeLifecycleOwner);

hostApi.removeObservers(instanceIdentifier);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@

import 'dart:async';

import 'package:async/async.dart';
import 'package:camera_platform_interface/camera_platform_interface.dart';
import 'package:flutter/widgets.dart';
import 'package:stream_transform/stream_transform.dart';

import 'camera.dart';
import 'camera_info.dart';
import 'camera_selector.dart';
import 'camera_state.dart';
import 'camera_state_error.dart';
import 'camerax_library.g.dart';
import 'image_capture.dart';
import 'live_camera_state.dart';
import 'live_data.dart';
import 'observer.dart';
import 'preview.dart';
import 'process_camera_provider.dart';
import 'surface.dart';
Expand All @@ -37,7 +41,7 @@ class AndroidCameraCameraX extends CameraPlatform {
Camera? camera;

/// The [LiveCameraState] that represents the state of the [camera] instance.
LiveCameraState? liveCameraState;
LiveData<CameraState>? liveCameraState;

/// The [Preview] instance that can be configured to present a live camera preview.
@visibleForTesting
Expand Down Expand Up @@ -167,7 +171,7 @@ class AndroidCameraCameraX extends CameraPlatform {
// instance as bound but not paused.
camera = await processCameraProvider!
.bindToLifecycle(cameraSelector!, <UseCase>[preview!, imageCapture!]);
_updateLiveCameraState();
_updateLiveCameraState(flutterSurfaceTextureId);
_previewIsPaused = false;

return flutterSurfaceTextureId;
Expand Down Expand Up @@ -228,6 +232,7 @@ class AndroidCameraCameraX extends CameraPlatform {
@override
Future<void> dispose(int cameraId) async {
preview?.releaseFlutterSurfaceTexture();
liveCameraState?.removeObservers();
processCameraProvider?.unbindAll();
}

Expand All @@ -240,20 +245,20 @@ class AndroidCameraCameraX extends CameraPlatform {
/// The camera started to close.
@override
Stream<CameraClosingEvent> onCameraClosing(int cameraId) {
return LiveCameraState.cameraClosingStreamController.stream
.map<CameraClosingEvent>((bool isCameraClosing) {
assert(isCameraClosing);
return CameraClosingEvent(cameraId);
});
return _cameraEvents(cameraId).whereType<CameraClosingEvent>();
}

/// The camera experienced an error.
@override
Stream<CameraErrorEvent> onCameraError(int cameraId) {
return SystemServices.cameraErrorStreamController.stream
.map<CameraErrorEvent>((String errorDescription) {
return CameraErrorEvent(cameraId, errorDescription);
});
return StreamGroup.mergeBroadcast<
CameraErrorEvent>(<Stream<CameraErrorEvent>>[
SystemServices.cameraErrorStreamController.stream
.map<CameraErrorEvent>((String errorDescription) {
return CameraErrorEvent(cameraId, errorDescription);
}),
_cameraEvents(cameraId).whereType<CameraErrorEvent>()
]);
}

/// The ui orientation changed.
Expand All @@ -276,15 +281,15 @@ class AndroidCameraCameraX extends CameraPlatform {
/// [cameraId] not used.
@override
Future<void> resumePreview(int cameraId) async {
await _bindPreviewToLifecycle();
await _bindPreviewToLifecycle(cameraId);
_previewIsPaused = false;
}

/// Returns a widget showing a live camera preview.
@override
Widget buildPreview(int cameraId) {
return FutureBuilder<void>(
future: _bindPreviewToLifecycle(),
future: _bindPreviewToLifecycle(cameraId),
builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
Expand Down Expand Up @@ -319,7 +324,7 @@ class AndroidCameraCameraX extends CameraPlatform {

/// Binds [preview] instance to the camera lifecycle controlled by the
/// [processCameraProvider].
Future<void> _bindPreviewToLifecycle() async {
Future<void> _bindPreviewToLifecycle(int cameraId) async {
assert(processCameraProvider != null);
assert(cameraSelector != null);
assert(preview != null);
Expand All @@ -332,7 +337,7 @@ class AndroidCameraCameraX extends CameraPlatform {

camera = await processCameraProvider!
.bindToLifecycle(cameraSelector!, <UseCase>[preview!]);
_updateLiveCameraState();
_updateLiveCameraState(cameraId);
}

/// Unbinds [preview] instance to camera lifecycle controlled by the
Expand All @@ -350,12 +355,26 @@ class AndroidCameraCameraX extends CameraPlatform {

// Methods concerning camera information:

/// Adds fresh observers to the [LiveCameraState] of the current [camera].
Future<void> _updateLiveCameraState() async {
/// Adds fresh observers to the [LiveData] of the [CameraState] of the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also removes the existing observers. I think that is something callers would want to know.

/// current [camera].
Future<void> _updateLiveCameraState(int cameraId) async {
final CameraInfo cameraInfo = await camera!.getCameraInfo();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non blocking. I still find this weird that we need to pass a cameraId (and use that name) when we have a reference to a camera object already and we dont use one to validate against the other. Is there an oppetunity to use more descriptive variable names here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this gets at the bigger question as to why cameraId is used throughout the Flutter camera API to begin with. Really, cameraId is the ID of the Flutter surface texture used to render a preview to, and thus, is almost totally unrelated to the actual camera instance we use to do any camera functionality. The Flutter surface texture ID is returned by calls to createCamera(...), so I assume it is just an ID that folks using the plugin can mostly use to filter through CameraEvents added to the various camera event streams (because they are constructed with an ID) because otherwise, at least in the Android camera implementations, it goes mostly unused.

I'm on the fence about renaming cameraId, because while it would be more useful to name it something more like flutterSurfaceTextureId, it's not named that in the actual camera platform interface, so it could cause more confusion for folks trying to contribute to the plugin.

However, I am on board for bettering documentation in the implementation around what it is (always referring to the Flutter surface texture ID/createCamera), when it is actually being used in a method, and if it is being used, exactly how. I'll file an issue before landing this for that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flutter/flutter#126270 filed for improving documentation

liveCameraState?.removeObservers();
liveCameraState = await cameraInfo.getLiveCameraState();
liveCameraState!.addObserver();
liveCameraState!.observe(_createCameraClosingObserver(cameraId));
}

Observer<CameraState> _createCameraClosingObserver(int cameraId) {
return Observer<CameraState>(onChanged: (CameraState state) {
if (state.type == CameraStateType.closing) {
cameraEventStreamController.add(CameraClosingEvent(cameraId));
}

if (state.error != null) {
cameraEventStreamController
.add(CameraErrorEvent(cameraId, state.error!.description));
}
});
}

// Methods for mapping Flutter camera constants to CameraX constants:
Expand Down
Loading