Skip to content

Commit 050f8a9

Browse files
committed
Revert "[camera] Remove deprecated Optional type (flutter#6870)"
Removing Optional from CameraValue.copyWith caused a regression handling device orientation changes while the preview was paused. This reverts commit 3d8b73b.
1 parent 2c94000 commit 050f8a9

File tree

11 files changed

+102
-66
lines changed

11 files changed

+102
-66
lines changed

packages/camera/camera/CHANGELOG.md

-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
## 0.10.1
2-
3-
* Remove usage of deprecated quiver Optional type.
4-
51
## 0.10.0+5
62

73
* Updates code for stricter lint checks.

packages/camera/camera/lib/src/camera_controller.dart

+28-16
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:camera_platform_interface/camera_platform_interface.dart';
99
import 'package:flutter/foundation.dart';
1010
import 'package:flutter/material.dart';
1111
import 'package:flutter/services.dart';
12+
import 'package:quiver/core.dart';
1213

1314
import '../camera.dart';
1415

@@ -160,10 +161,10 @@ class CameraValue {
160161
bool? exposurePointSupported,
161162
bool? focusPointSupported,
162163
DeviceOrientation? deviceOrientation,
163-
DeviceOrientation? lockedCaptureOrientation,
164-
DeviceOrientation? recordingOrientation,
164+
Optional<DeviceOrientation>? lockedCaptureOrientation,
165+
Optional<DeviceOrientation>? recordingOrientation,
165166
bool? isPreviewPaused,
166-
DeviceOrientation? previewPauseOrientation,
167+
Optional<DeviceOrientation>? previewPauseOrientation,
167168
}) {
168169
return CameraValue(
169170
isInitialized: isInitialized ?? this.isInitialized,
@@ -180,12 +181,16 @@ class CameraValue {
180181
exposurePointSupported ?? this.exposurePointSupported,
181182
focusPointSupported: focusPointSupported ?? this.focusPointSupported,
182183
deviceOrientation: deviceOrientation ?? this.deviceOrientation,
183-
lockedCaptureOrientation:
184-
lockedCaptureOrientation ?? this.lockedCaptureOrientation,
185-
recordingOrientation: recordingOrientation ?? this.recordingOrientation,
184+
lockedCaptureOrientation: lockedCaptureOrientation == null
185+
? this.lockedCaptureOrientation
186+
: lockedCaptureOrientation.orNull,
187+
recordingOrientation: recordingOrientation == null
188+
? this.recordingOrientation
189+
: recordingOrientation.orNull,
186190
isPreviewPaused: isPreviewPaused ?? this.isPreviewPaused,
187-
previewPauseOrientation:
188-
previewPauseOrientation ?? this.previewPauseOrientation,
191+
previewPauseOrientation: previewPauseOrientation == null
192+
? this.previewPauseOrientation
193+
: previewPauseOrientation.orNull,
189194
);
190195
}
191196

@@ -353,8 +358,8 @@ class CameraController extends ValueNotifier<CameraValue> {
353358
await CameraPlatform.instance.pausePreview(_cameraId);
354359
value = value.copyWith(
355360
isPreviewPaused: true,
356-
previewPauseOrientation:
357-
value.lockedCaptureOrientation ?? value.deviceOrientation);
361+
previewPauseOrientation: Optional<DeviceOrientation>.of(
362+
value.lockedCaptureOrientation ?? value.deviceOrientation));
358363
} on PlatformException catch (e) {
359364
throw CameraException(e.code, e.message);
360365
}
@@ -367,7 +372,9 @@ class CameraController extends ValueNotifier<CameraValue> {
367372
}
368373
try {
369374
await CameraPlatform.instance.resumePreview(_cameraId);
370-
value = value.copyWith(isPreviewPaused: false);
375+
value = value.copyWith(
376+
isPreviewPaused: false,
377+
previewPauseOrientation: const Optional<DeviceOrientation>.absent());
371378
} on PlatformException catch (e) {
372379
throw CameraException(e.code, e.message);
373380
}
@@ -498,8 +505,8 @@ class CameraController extends ValueNotifier<CameraValue> {
498505
value = value.copyWith(
499506
isRecordingVideo: true,
500507
isRecordingPaused: false,
501-
recordingOrientation:
502-
value.lockedCaptureOrientation ?? value.deviceOrientation);
508+
recordingOrientation: Optional<DeviceOrientation>.of(
509+
value.lockedCaptureOrientation ?? value.deviceOrientation));
503510
} on PlatformException catch (e) {
504511
throw CameraException(e.code, e.message);
505512
}
@@ -519,7 +526,10 @@ class CameraController extends ValueNotifier<CameraValue> {
519526
try {
520527
final XFile file =
521528
await CameraPlatform.instance.stopVideoRecording(_cameraId);
522-
value = value.copyWith(isRecordingVideo: false);
529+
value = value.copyWith(
530+
isRecordingVideo: false,
531+
recordingOrientation: const Optional<DeviceOrientation>.absent(),
532+
);
523533
return file;
524534
} on PlatformException catch (e) {
525535
throw CameraException(e.code, e.message);
@@ -737,7 +747,8 @@ class CameraController extends ValueNotifier<CameraValue> {
737747
await CameraPlatform.instance.lockCaptureOrientation(
738748
_cameraId, orientation ?? value.deviceOrientation);
739749
value = value.copyWith(
740-
lockedCaptureOrientation: orientation ?? value.deviceOrientation);
750+
lockedCaptureOrientation: Optional<DeviceOrientation>.of(
751+
orientation ?? value.deviceOrientation));
741752
} on PlatformException catch (e) {
742753
throw CameraException(e.code, e.message);
743754
}
@@ -757,7 +768,8 @@ class CameraController extends ValueNotifier<CameraValue> {
757768
Future<void> unlockCaptureOrientation() async {
758769
try {
759770
await CameraPlatform.instance.unlockCaptureOrientation(_cameraId);
760-
value = value.copyWith();
771+
value = value.copyWith(
772+
lockedCaptureOrientation: const Optional<DeviceOrientation>.absent());
761773
} on PlatformException catch (e) {
762774
throw CameraException(e.code, e.message);
763775
}

packages/camera/camera/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing
44
Dart.
55
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera
66
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
7-
version: 0.10.1
7+
version: 0.10.0+5
88

99
environment:
1010
sdk: ">=2.14.0 <3.0.0"

packages/camera/camera/test/camera_preview_test.dart

+13-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
88
import 'package:flutter/services.dart';
99
import 'package:flutter/widgets.dart';
1010
import 'package:flutter_test/flutter_test.dart';
11+
import 'package:quiver/core.dart';
1112

1213
class FakeController extends ValueNotifier<CameraValue>
1314
implements CameraController {
@@ -132,8 +133,11 @@ void main() {
132133
isInitialized: true,
133134
isRecordingVideo: true,
134135
deviceOrientation: DeviceOrientation.portraitUp,
135-
lockedCaptureOrientation: DeviceOrientation.landscapeRight,
136-
recordingOrientation: DeviceOrientation.landscapeLeft,
136+
lockedCaptureOrientation:
137+
const Optional<DeviceOrientation>.fromNullable(
138+
DeviceOrientation.landscapeRight),
139+
recordingOrientation: const Optional<DeviceOrientation>.fromNullable(
140+
DeviceOrientation.landscapeLeft),
137141
previewSize: const Size(480, 640),
138142
);
139143

@@ -163,8 +167,11 @@ void main() {
163167
controller.value = controller.value.copyWith(
164168
isInitialized: true,
165169
deviceOrientation: DeviceOrientation.portraitUp,
166-
lockedCaptureOrientation: DeviceOrientation.landscapeRight,
167-
recordingOrientation: DeviceOrientation.landscapeLeft,
170+
lockedCaptureOrientation:
171+
const Optional<DeviceOrientation>.fromNullable(
172+
DeviceOrientation.landscapeRight),
173+
recordingOrientation: const Optional<DeviceOrientation>.fromNullable(
174+
DeviceOrientation.landscapeLeft),
168175
previewSize: const Size(480, 640),
169176
);
170177

@@ -194,7 +201,8 @@ void main() {
194201
controller.value = controller.value.copyWith(
195202
isInitialized: true,
196203
deviceOrientation: DeviceOrientation.portraitUp,
197-
recordingOrientation: DeviceOrientation.landscapeLeft,
204+
recordingOrientation: const Optional<DeviceOrientation>.fromNullable(
205+
DeviceOrientation.landscapeLeft),
198206
previewSize: const Size(480, 640),
199207
);
200208

packages/camera/camera/test/camera_test.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:flutter/widgets.dart';
1313
import 'package:flutter_test/flutter_test.dart';
1414
import 'package:mockito/mockito.dart';
1515
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
16+
import 'package:quiver/core.dart';
1617

1718
List<CameraDescription> get mockAvailableCameras => <CameraDescription>[
1819
const CameraDescription(
@@ -1190,7 +1191,8 @@ void main() {
11901191
cameraController.value = cameraController.value.copyWith(
11911192
isPreviewPaused: false,
11921193
deviceOrientation: DeviceOrientation.portraitUp,
1193-
lockedCaptureOrientation: DeviceOrientation.landscapeRight);
1194+
lockedCaptureOrientation:
1195+
Optional<DeviceOrientation>.of(DeviceOrientation.landscapeRight));
11941196

11951197
await cameraController.pausePreview();
11961198

packages/camera/camera_android/CHANGELOG.md

-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
## 0.10.2
2-
3-
* Remove usage of deprecated quiver Optional type.
4-
51
## 0.10.1
62

73
* Implements an option to also stream when recording a video.

packages/camera/camera_android/example/lib/camera_controller.dart

+26-14
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:camera_platform_interface/camera_platform_interface.dart';
88
import 'package:flutter/foundation.dart';
99
import 'package:flutter/material.dart';
1010
import 'package:flutter/services.dart';
11+
import 'package:quiver/core.dart';
1112

1213
/// The state of a [CameraController].
1314
class CameraValue {
@@ -108,10 +109,10 @@ class CameraValue {
108109
bool? exposurePointSupported,
109110
bool? focusPointSupported,
110111
DeviceOrientation? deviceOrientation,
111-
DeviceOrientation? lockedCaptureOrientation,
112-
DeviceOrientation? recordingOrientation,
112+
Optional<DeviceOrientation>? lockedCaptureOrientation,
113+
Optional<DeviceOrientation>? recordingOrientation,
113114
bool? isPreviewPaused,
114-
DeviceOrientation? previewPauseOrientation,
115+
Optional<DeviceOrientation>? previewPauseOrientation,
115116
}) {
116117
return CameraValue(
117118
isInitialized: isInitialized ?? this.isInitialized,
@@ -124,12 +125,16 @@ class CameraValue {
124125
exposureMode: exposureMode ?? this.exposureMode,
125126
focusMode: focusMode ?? this.focusMode,
126127
deviceOrientation: deviceOrientation ?? this.deviceOrientation,
127-
lockedCaptureOrientation:
128-
lockedCaptureOrientation ?? this.lockedCaptureOrientation,
129-
recordingOrientation: recordingOrientation ?? this.recordingOrientation,
128+
lockedCaptureOrientation: lockedCaptureOrientation == null
129+
? this.lockedCaptureOrientation
130+
: lockedCaptureOrientation.orNull,
131+
recordingOrientation: recordingOrientation == null
132+
? this.recordingOrientation
133+
: recordingOrientation.orNull,
130134
isPreviewPaused: isPreviewPaused ?? this.isPreviewPaused,
131-
previewPauseOrientation:
132-
previewPauseOrientation ?? this.previewPauseOrientation,
135+
previewPauseOrientation: previewPauseOrientation == null
136+
? this.previewPauseOrientation
137+
: previewPauseOrientation.orNull,
133138
);
134139
}
135140

@@ -257,14 +262,16 @@ class CameraController extends ValueNotifier<CameraValue> {
257262
await CameraPlatform.instance.pausePreview(_cameraId);
258263
value = value.copyWith(
259264
isPreviewPaused: true,
260-
previewPauseOrientation:
261-
value.lockedCaptureOrientation ?? value.deviceOrientation);
265+
previewPauseOrientation: Optional<DeviceOrientation>.of(
266+
value.lockedCaptureOrientation ?? value.deviceOrientation));
262267
}
263268

264269
/// Resumes the current camera preview
265270
Future<void> resumePreview() async {
266271
await CameraPlatform.instance.resumePreview(_cameraId);
267-
value = value.copyWith(isPreviewPaused: false);
272+
value = value.copyWith(
273+
isPreviewPaused: false,
274+
previewPauseOrientation: const Optional<DeviceOrientation>.absent());
268275
}
269276

270277
/// Captures an image and returns the file where it was saved.
@@ -307,8 +314,8 @@ class CameraController extends ValueNotifier<CameraValue> {
307314
isRecordingVideo: true,
308315
isRecordingPaused: false,
309316
isStreamingImages: streamCallback != null,
310-
recordingOrientation:
311-
value.lockedCaptureOrientation ?? value.deviceOrientation);
317+
recordingOrientation: Optional<DeviceOrientation>.of(
318+
value.lockedCaptureOrientation ?? value.deviceOrientation));
312319
}
313320

314321
/// Stops the video recording and returns the file where it was saved.
@@ -324,6 +331,7 @@ class CameraController extends ValueNotifier<CameraValue> {
324331
value = value.copyWith(
325332
isRecordingVideo: false,
326333
isRecordingPaused: false,
334+
recordingOrientation: const Optional<DeviceOrientation>.absent(),
327335
);
328336
return file;
329337
}
@@ -392,12 +400,16 @@ class CameraController extends ValueNotifier<CameraValue> {
392400
Future<void> lockCaptureOrientation() async {
393401
await CameraPlatform.instance
394402
.lockCaptureOrientation(_cameraId, value.deviceOrientation);
395-
value = value.copyWith(lockedCaptureOrientation: value.deviceOrientation);
403+
value = value.copyWith(
404+
lockedCaptureOrientation:
405+
Optional<DeviceOrientation>.of(value.deviceOrientation));
396406
}
397407

398408
/// Unlocks the capture orientation.
399409
Future<void> unlockCaptureOrientation() async {
400410
await CameraPlatform.instance.unlockCaptureOrientation(_cameraId);
411+
value = value.copyWith(
412+
lockedCaptureOrientation: const Optional<DeviceOrientation>.absent());
401413
}
402414

403415
/// Sets the focus mode for taking pictures.

packages/camera/camera_android/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: camera_android
22
description: Android implementation of the camera plugin.
33
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
5-
version: 0.10.2
5+
version: 0.10.1
66

77
environment:
88
sdk: ">=2.14.0 <3.0.0"

packages/camera/camera_avfoundation/CHANGELOG.md

-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
## 0.9.10
2-
3-
* Remove usage of deprecated quiver Optional type.
4-
51
## 0.9.9
62

73
* Implements option to also stream when recording a video.

0 commit comments

Comments
 (0)