From 9c4d4ca69a8a160b2ecc471a52f0b5c5732ce8d9 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Mon, 4 Jan 2021 13:02:30 +0100 Subject: [PATCH 01/14] Expand platform interface to support reporting device orientation --- .../lib/camera_platform_interface.dart | 1 + .../lib/src/events/device_event.dart | 45 ++++++++++++++ .../method_channel/method_channel_camera.dart | 58 +++++++++++++++--- .../platform_interface/camera_platform.dart | 7 +++ .../lib/src/types/device_orientation.dart | 50 ++++++++++++++++ .../lib/src/types/types.dart | 1 + .../test/camera_platform_interface_test.dart | 13 ++++ .../test/events/device_event_test.dart | 60 +++++++++++++++++++ .../method_channel_camera_test.dart | 52 ++++++++++++---- .../test/types/device_orientation_test.dart | 44 ++++++++++++++ 10 files changed, 309 insertions(+), 22 deletions(-) create mode 100644 packages/camera/camera_platform_interface/lib/src/events/device_event.dart create mode 100644 packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart create mode 100644 packages/camera/camera_platform_interface/test/events/device_event_test.dart create mode 100644 packages/camera/camera_platform_interface/test/types/device_orientation_test.dart diff --git a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart index eaa14da45a5e..d7e5fcd0834c 100644 --- a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart +++ b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. export 'src/events/camera_event.dart'; +export 'src/events/device_event.dart'; export 'src/platform_interface/camera_platform.dart'; export 'src/types/types.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart new file mode 100644 index 000000000000..bfc9d9c6d518 --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -0,0 +1,45 @@ +import 'package:camera_platform_interface/camera_platform_interface.dart'; + +/// Generic Event coming from the native side of Camera, that are not related to a specific camera module. +/// +/// This class is used as a base class for all the events that might be +/// triggered from a device, but it is never used directly as an event type. +/// +/// Do NOT instantiate new events like `DeviceEvent(cameraId)` directly, +/// use a specific class instead: +/// +/// Do `class NewEvent extend DeviceEvent` when creating your own events. +/// See below for examples: `DeviceOrientationChangedEvent`... +/// These events are more semantic and more pleasant to use than raw generics. +/// They can be (and in fact, are) filtered by the `instanceof`-operator. +abstract class DeviceEvent {} + +/// An event fired whenever. +class DeviceOrientationChangedEvent extends DeviceEvent { + /// The new orientation the device + final DeviceOrientation orientation; + + /// Build a new orientation changed event. + DeviceOrientationChangedEvent(this.orientation); + + /// Converts the supplied [Map] to an instance of the [DeviceOrientationChangedEvent] + /// class. + DeviceOrientationChangedEvent.fromJson(Map json) + : orientation = deserializeDeviceOrientation(json['orientation']); + + /// Converts the [DeviceOrientationChangedEvent] instance into a [Map] instance that + /// can be serialized to JSON. + Map toJson() => { + 'orientation': serializeDeviceOrientation(orientation), + }; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DeviceOrientationChangedEvent && + runtimeType == other.runtimeType && + orientation == other.orientation; + + @override + int get hashCode => orientation.hashCode; +} diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 6a73031111df..fd6a053f558e 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:math'; import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:camera_platform_interface/src/events/device_event.dart'; import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:cross_file/cross_file.dart'; import 'package:flutter/services.dart'; @@ -20,7 +21,7 @@ class MethodChannelCamera extends CameraPlatform { final Map _channels = {}; /// The controller we need to broadcast the different events coming - /// from handleMethodCall. + /// from handleMethodCall. Specific to camera events. /// /// It is a `broadcast` because multiple controllers will connect to /// different stream views of this Controller. @@ -30,10 +31,28 @@ class MethodChannelCamera extends CameraPlatform { final StreamController cameraEventStreamController = StreamController.broadcast(); - Stream _events(int cameraId) => + /// The controller we need to broadcast the different events coming + /// from handleMethodCall. Specific to general device events. + /// + /// It is a `broadcast` because multiple controllers will connect to + /// different stream views of this Controller. + /// This is only exposed for test purposes. It shouldn't be used by clients of + /// the plugin as it may break or change at any time. + @visibleForTesting + final StreamController deviceEventStreamController = + StreamController.broadcast(); + + Stream _cameraEvents(int cameraId) => cameraEventStreamController.stream .where((event) => event.cameraId == cameraId); + /// Construct a new method channel camera instance. + MethodChannelCamera() { + final channel = MethodChannel('flutter.io/cameraPlugin/device'); + channel.setMethodCallHandler( + (MethodCall call) => handleDeviceMethodCall(call)); + } + @override Future> availableCameras() async { try { @@ -80,7 +99,7 @@ class MethodChannelCamera extends CameraPlatform { _channels.putIfAbsent(cameraId, () { final channel = MethodChannel('flutter.io/cameraPlugin/camera$cameraId'); channel.setMethodCallHandler( - (MethodCall call) => handleMethodCall(call, cameraId)); + (MethodCall call) => handleCameraMethodCall(call, cameraId)); return channel; }); @@ -115,22 +134,28 @@ class MethodChannelCamera extends CameraPlatform { @override Stream onCameraInitialized(int cameraId) { - return _events(cameraId).whereType(); + return _cameraEvents(cameraId).whereType(); } @override Stream onCameraResolutionChanged(int cameraId) { - return _events(cameraId).whereType(); + return _cameraEvents(cameraId).whereType(); } @override Stream onCameraClosing(int cameraId) { - return _events(cameraId).whereType(); + return _cameraEvents(cameraId).whereType(); } @override Stream onCameraError(int cameraId) { - return _events(cameraId).whereType(); + return _cameraEvents(cameraId).whereType(); + } + + @override + Stream onDeviceOrientationChanged() { + return deviceEventStreamController.stream + .whereType(); } @override @@ -314,12 +339,27 @@ class MethodChannelCamera extends CameraPlatform { } } - /// Converts messages received from the native platform into events. + /// Converts messages received from the native platform into device events. + /// + /// This is only exposed for test purposes. It shouldn't be used by clients of + /// the plugin as it may break or change at any time. + Future handleDeviceMethodCall(MethodCall call) async { + switch (call.method) { + case 'orientation_changed': + deviceEventStreamController.add(DeviceOrientationChangedEvent( + deserializeDeviceOrientation(call.arguments['orientation']))); + break; + default: + throw MissingPluginException(); + } + } + + /// Converts messages received from the native platform into camera events. /// /// This is only exposed for test purposes. It shouldn't be used by clients of /// the plugin as it may break or change at any time. @visibleForTesting - Future handleMethodCall(MethodCall call, int cameraId) async { + Future handleCameraMethodCall(MethodCall call, int cameraId) async { switch (call.method) { case 'initialized': cameraEventStreamController.add(CameraInitializedEvent( diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index c7a603228ce2..0d3fb55f0ccc 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:math'; import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:camera_platform_interface/src/events/device_event.dart'; import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart'; import 'package:camera_platform_interface/src/types/exposure_mode.dart'; import 'package:cross_file/cross_file.dart'; @@ -78,6 +79,12 @@ abstract class CameraPlatform extends PlatformInterface { throw UnimplementedError('onCameraError() is not implemented.'); } + /// The device orientation changed. + Stream onDeviceOrientationChanged() { + throw UnimplementedError( + 'onDeviceOrientationChanged() is not implemented.'); + } + /// Captures an image and returns the file where it was saved. Future takePicture(int cameraId) { throw UnimplementedError('takePicture() is not implemented.'); diff --git a/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart b/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart new file mode 100644 index 000000000000..78d2bb413e5a --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart @@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The possible orientations for the device. +enum DeviceOrientation { + /// Upright portrait orientation. + portrait, + + /// Upside down portrait orientation. + portraitUpsideDown, + + /// Landscape mode, with the bottom of the phone facing right. + landscapeRight, + + /// Landscape mode, with the bottom of the phone facing left. + landscapeLeft, +} + +/// Returns the device orientation as a String. +String serializeDeviceOrientation(DeviceOrientation orientation) { + switch (orientation) { + case DeviceOrientation.portrait: + return 'portrait'; + case DeviceOrientation.portraitUpsideDown: + return 'portraitUpsideDown'; + case DeviceOrientation.landscapeRight: + return 'landscapeRight'; + case DeviceOrientation.landscapeLeft: + return 'landscapeLeft'; + default: + throw ArgumentError('Unknown DeviceOrientation value'); + } +} + +/// Returns the device orientation for a given String. +DeviceOrientation deserializeDeviceOrientation(String str) { + switch (str) { + case "portrait": + return DeviceOrientation.portrait; + case "portraitUpsideDown": + return DeviceOrientation.portraitUpsideDown; + case "landscapeRight": + return DeviceOrientation.landscapeRight; + case "landscapeLeft": + return DeviceOrientation.landscapeLeft; + default: + throw ArgumentError('"$str" is not a valid DeviceOrientation value'); + } +} diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index bab430eb5a69..93ede7be9d39 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -7,3 +7,4 @@ export 'resolution_preset.dart'; export 'camera_exception.dart'; export 'flash_mode.dart'; export 'exposure_mode.dart'; +export 'device_orientation.dart'; diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index 574fa45e7b81..4695e6cd43c3 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -96,6 +96,19 @@ void main() { ); }); + test( + 'Default implementation of onDeviceOrientationChanged() should throw unimplemented error', + () { + // Arrange + final cameraPlatform = ExtendsCameraPlatform(); + + // Act & Assert + expect( + () => cameraPlatform.onDeviceOrientationChanged(), + throwsUnimplementedError, + ); + }); + test('Default implementation of dispose() should throw unimplemented error', () { // Arrange diff --git a/packages/camera/camera_platform_interface/test/events/device_event_test.dart b/packages/camera/camera_platform_interface/test/events/device_event_test.dart new file mode 100644 index 000000000000..c586b3525f99 --- /dev/null +++ b/packages/camera/camera_platform_interface/test/events/device_event_test.dart @@ -0,0 +1,60 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('DeviceOrientationChangedEvent tests', () { + test('Constructor should initialize all properties', () { + final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + + expect(event.orientation, DeviceOrientation.portrait); + }); + + test('fromJson should initialize all properties', () { + final event = DeviceOrientationChangedEvent.fromJson({ + 'orientation': 'portrait', + }); + + expect(event.orientation, DeviceOrientation.portrait); + }); + + test('toJson should return a map with all fields', () { + final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + + final jsonMap = event.toJson(); + + expect(jsonMap.length, 1); + expect(jsonMap['orientation'], 'portrait'); + }); + + test('equals should return true if objects are the same', () { + final firstEvent = + DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final secondEvent = + DeviceOrientationChangedEvent(DeviceOrientation.portrait); + + expect(firstEvent == secondEvent, true); + }); + + test('equals should return false if orientation is different', () { + final firstEvent = + DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final secondEvent = + DeviceOrientationChangedEvent(DeviceOrientation.landscapeLeft); + + expect(firstEvent == secondEvent, false); + }); + + test('hashCode should match hashCode of all properties', () { + final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final expectedHashCode = event.orientation.hashCode; + + expect(event.hashCode, expectedHashCode); + }); + }); +} diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index b916513ef0de..9784f51b2a23 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -7,9 +7,10 @@ import 'dart:math'; import 'package:async/async.dart'; import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:camera_platform_interface/src/events/device_event.dart'; import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart'; import 'package:camera_platform_interface/src/utils/utils.dart'; -import 'package:flutter/services.dart'; +import 'package:flutter/services.dart' hide DeviceOrientation; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -223,7 +224,7 @@ void main() { ExposureMode.auto, true, ); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('initialized', event.toJson()), cameraId); // Assert @@ -242,13 +243,13 @@ void main() { // Emit test events final fhdEvent = CameraResolutionChangedEvent(cameraId, 1920, 1080); final uhdEvent = CameraResolutionChangedEvent(cameraId, 3840, 2160); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('resolution_changed', fhdEvent.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('resolution_changed', uhdEvent.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('resolution_changed', fhdEvent.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('resolution_changed', uhdEvent.toJson()), cameraId); // Assert @@ -269,11 +270,11 @@ void main() { // Emit test events final event = CameraClosingEvent(cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('camera_closing', event.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('camera_closing', event.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('camera_closing', event.toJson()), cameraId); // Assert @@ -292,11 +293,11 @@ void main() { // Emit test events final event = CameraErrorEvent(cameraId, 'Error Description'); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('error', event.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('error', event.toJson()), cameraId); - await camera.handleMethodCall( + await camera.handleCameraMethodCall( MethodCall('error', event.toJson()), cameraId); // Assert @@ -307,6 +308,29 @@ void main() { // Clean up await streamQueue.cancel(); }); + + test('Should receive device orientation change events', () async { + // Act + final eventStream = camera.onDeviceOrientationChanged(); + final streamQueue = StreamQueue(eventStream); + + // Emit test events + final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); + await camera.handleDeviceMethodCall( + MethodCall('orientation_changed', event.toJson())); + + // Assert + expect(await streamQueue.next, event); + expect(await streamQueue.next, event); + expect(await streamQueue.next, event); + + // Clean up + await streamQueue.cancel(); + }); }); group('Function Tests', () { @@ -685,7 +709,9 @@ void main() { () { final camera = MethodChannelCamera(); - expect(() => camera.handleMethodCall(MethodCall('unknown_method'), 1), + expect( + () => + camera.handleCameraMethodCall(MethodCall('unknown_method'), 1), throwsA(isA())); }); diff --git a/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart b/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart new file mode 100644 index 000000000000..e82a0e98b070 --- /dev/null +++ b/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart @@ -0,0 +1,44 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('DeviceOrientation should contain 4 options', () { + final values = DeviceOrientation.values; + + expect(values.length, 4); + }); + + test("DeviceOrientation enum should have items in correct index", () { + final values = DeviceOrientation.values; + + expect(values[0], DeviceOrientation.portrait); + expect(values[1], DeviceOrientation.portraitUpsideDown); + expect(values[2], DeviceOrientation.landscapeRight); + expect(values[3], DeviceOrientation.landscapeLeft); + }); + + test("serializeDeviceOrientation() should serialize correctly", () { + expect(serializeDeviceOrientation(DeviceOrientation.portrait), "portrait"); + expect(serializeDeviceOrientation(DeviceOrientation.portraitUpsideDown), + "portraitUpsideDown"); + expect(serializeDeviceOrientation(DeviceOrientation.landscapeRight), + "landscapeRight"); + expect(serializeDeviceOrientation(DeviceOrientation.landscapeLeft), + "landscapeLeft"); + }); + + test("deserializeDeviceOrientation() should deserialize correctly", () { + expect( + deserializeDeviceOrientation('portrait'), DeviceOrientation.portrait); + expect(deserializeDeviceOrientation('portraitUpsideDown'), + DeviceOrientation.portraitUpsideDown); + expect(deserializeDeviceOrientation('landscapeRight'), + DeviceOrientation.landscapeRight); + expect(deserializeDeviceOrientation('landscapeLeft'), + DeviceOrientation.landscapeLeft); + }); +} From ed56faca7864a0fbf104d2859a010c8591eed432 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Mon, 4 Jan 2021 13:34:00 +0100 Subject: [PATCH 02/14] Switch to flutter DeviceOrientation enum --- .../lib/src/events/device_event.dart | 3 +- .../lib/src/types/device_orientation.dart | 50 ------------------- .../lib/src/types/types.dart | 1 - .../lib/src/utils/utils.dart | 33 ++++++++++++ .../test/events/device_event_test.dart | 21 ++++---- .../method_channel_camera_test.dart | 4 +- .../test/types/device_orientation_test.dart | 44 ---------------- .../test/utils/utils_test.dart | 23 +++++++++ 8 files changed, 72 insertions(+), 107 deletions(-) delete mode 100644 packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart delete mode 100644 packages/camera/camera_platform_interface/test/types/device_orientation_test.dart diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index bfc9d9c6d518..68728db02af6 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -1,4 +1,5 @@ -import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:camera_platform_interface/src/utils/utils.dart'; +import 'package:flutter/services.dart'; /// Generic Event coming from the native side of Camera, that are not related to a specific camera module. /// diff --git a/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart b/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart deleted file mode 100644 index 78d2bb413e5a..000000000000 --- a/packages/camera/camera_platform_interface/lib/src/types/device_orientation.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// The possible orientations for the device. -enum DeviceOrientation { - /// Upright portrait orientation. - portrait, - - /// Upside down portrait orientation. - portraitUpsideDown, - - /// Landscape mode, with the bottom of the phone facing right. - landscapeRight, - - /// Landscape mode, with the bottom of the phone facing left. - landscapeLeft, -} - -/// Returns the device orientation as a String. -String serializeDeviceOrientation(DeviceOrientation orientation) { - switch (orientation) { - case DeviceOrientation.portrait: - return 'portrait'; - case DeviceOrientation.portraitUpsideDown: - return 'portraitUpsideDown'; - case DeviceOrientation.landscapeRight: - return 'landscapeRight'; - case DeviceOrientation.landscapeLeft: - return 'landscapeLeft'; - default: - throw ArgumentError('Unknown DeviceOrientation value'); - } -} - -/// Returns the device orientation for a given String. -DeviceOrientation deserializeDeviceOrientation(String str) { - switch (str) { - case "portrait": - return DeviceOrientation.portrait; - case "portraitUpsideDown": - return DeviceOrientation.portraitUpsideDown; - case "landscapeRight": - return DeviceOrientation.landscapeRight; - case "landscapeLeft": - return DeviceOrientation.landscapeLeft; - default: - throw ArgumentError('"$str" is not a valid DeviceOrientation value'); - } -} diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index 93ede7be9d39..bab430eb5a69 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -7,4 +7,3 @@ export 'resolution_preset.dart'; export 'camera_exception.dart'; export 'flash_mode.dart'; export 'exposure_mode.dart'; -export 'device_orientation.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart index f94d8e69c07e..5413f25bb8b7 100644 --- a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart +++ b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart @@ -1,4 +1,5 @@ import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:flutter/services.dart'; /// Parses a string into a corresponding CameraLensDirection. CameraLensDirection parseCameraLensDirection(String string) { @@ -12,3 +13,35 @@ CameraLensDirection parseCameraLensDirection(String string) { } throw ArgumentError('Unknown CameraLensDirection value'); } + +/// Returns the device orientation as a String. +String serializeDeviceOrientation(DeviceOrientation orientation) { + switch (orientation) { + case DeviceOrientation.portraitUp: + return 'portraitUp'; + case DeviceOrientation.portraitDown: + return 'portraitDown'; + case DeviceOrientation.landscapeRight: + return 'landscapeRight'; + case DeviceOrientation.landscapeLeft: + return 'landscapeLeft'; + default: + throw ArgumentError('Unknown DeviceOrientation value'); + } +} + +/// Returns the device orientation for a given String. +DeviceOrientation deserializeDeviceOrientation(String str) { + switch (str) { + case "portraitUp": + return DeviceOrientation.portraitUp; + case "portraitDown": + return DeviceOrientation.portraitDown; + case "landscapeRight": + return DeviceOrientation.landscapeRight; + case "landscapeLeft": + return DeviceOrientation.landscapeLeft; + default: + throw ArgumentError('"$str" is not a valid DeviceOrientation value'); + } +} diff --git a/packages/camera/camera_platform_interface/test/events/device_event_test.dart b/packages/camera/camera_platform_interface/test/events/device_event_test.dart index c586b3525f99..c2fef49be04f 100644 --- a/packages/camera/camera_platform_interface/test/events/device_event_test.dart +++ b/packages/camera/camera_platform_interface/test/events/device_event_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:camera_platform_interface/camera_platform_interface.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -10,40 +11,40 @@ void main() { group('DeviceOrientationChangedEvent tests', () { test('Constructor should initialize all properties', () { - final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final event = DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); - expect(event.orientation, DeviceOrientation.portrait); + expect(event.orientation, DeviceOrientation.portraitUp); }); test('fromJson should initialize all properties', () { final event = DeviceOrientationChangedEvent.fromJson({ - 'orientation': 'portrait', + 'orientation': 'portraitUp', }); - expect(event.orientation, DeviceOrientation.portrait); + expect(event.orientation, DeviceOrientation.portraitUp); }); test('toJson should return a map with all fields', () { - final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final event = DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); final jsonMap = event.toJson(); expect(jsonMap.length, 1); - expect(jsonMap['orientation'], 'portrait'); + expect(jsonMap['orientation'], 'portraitUp'); }); test('equals should return true if objects are the same', () { final firstEvent = - DeviceOrientationChangedEvent(DeviceOrientation.portrait); + DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); final secondEvent = - DeviceOrientationChangedEvent(DeviceOrientation.portrait); + DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); expect(firstEvent == secondEvent, true); }); test('equals should return false if orientation is different', () { final firstEvent = - DeviceOrientationChangedEvent(DeviceOrientation.portrait); + DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); final secondEvent = DeviceOrientationChangedEvent(DeviceOrientation.landscapeLeft); @@ -51,7 +52,7 @@ void main() { }); test('hashCode should match hashCode of all properties', () { - final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final event = DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); final expectedHashCode = event.orientation.hashCode; expect(event.hashCode, expectedHashCode); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 9784f51b2a23..8c96d20c929a 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -11,6 +11,7 @@ import 'package:camera_platform_interface/src/events/device_event.dart'; import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart'; import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:flutter/services.dart' hide DeviceOrientation; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -315,7 +316,8 @@ void main() { final streamQueue = StreamQueue(eventStream); // Emit test events - final event = DeviceOrientationChangedEvent(DeviceOrientation.portrait); + final event = + DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); await camera.handleDeviceMethodCall( MethodCall('orientation_changed', event.toJson())); await camera.handleDeviceMethodCall( diff --git a/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart b/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart deleted file mode 100644 index e82a0e98b070..000000000000 --- a/packages/camera/camera_platform_interface/test/types/device_orientation_test.dart +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - test('DeviceOrientation should contain 4 options', () { - final values = DeviceOrientation.values; - - expect(values.length, 4); - }); - - test("DeviceOrientation enum should have items in correct index", () { - final values = DeviceOrientation.values; - - expect(values[0], DeviceOrientation.portrait); - expect(values[1], DeviceOrientation.portraitUpsideDown); - expect(values[2], DeviceOrientation.landscapeRight); - expect(values[3], DeviceOrientation.landscapeLeft); - }); - - test("serializeDeviceOrientation() should serialize correctly", () { - expect(serializeDeviceOrientation(DeviceOrientation.portrait), "portrait"); - expect(serializeDeviceOrientation(DeviceOrientation.portraitUpsideDown), - "portraitUpsideDown"); - expect(serializeDeviceOrientation(DeviceOrientation.landscapeRight), - "landscapeRight"); - expect(serializeDeviceOrientation(DeviceOrientation.landscapeLeft), - "landscapeLeft"); - }); - - test("deserializeDeviceOrientation() should deserialize correctly", () { - expect( - deserializeDeviceOrientation('portrait'), DeviceOrientation.portrait); - expect(deserializeDeviceOrientation('portraitUpsideDown'), - DeviceOrientation.portraitUpsideDown); - expect(deserializeDeviceOrientation('landscapeRight'), - DeviceOrientation.landscapeRight); - expect(deserializeDeviceOrientation('landscapeLeft'), - DeviceOrientation.landscapeLeft); - }); -} diff --git a/packages/camera/camera_platform_interface/test/utils/utils_test.dart b/packages/camera/camera_platform_interface/test/utils/utils_test.dart index dccb30754f14..63e3baff265d 100644 --- a/packages/camera/camera_platform_interface/test/utils/utils_test.dart +++ b/packages/camera/camera_platform_interface/test/utils/utils_test.dart @@ -1,5 +1,6 @@ import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:camera_platform_interface/src/utils/utils.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -29,5 +30,27 @@ void main() { throwsA(isArgumentError), ); }); + + test("serializeDeviceOrientation() should serialize correctly", () { + expect(serializeDeviceOrientation(DeviceOrientation.portraitUp), + "portraitUp"); + expect(serializeDeviceOrientation(DeviceOrientation.portraitDown), + "portraitDown"); + expect(serializeDeviceOrientation(DeviceOrientation.landscapeRight), + "landscapeRight"); + expect(serializeDeviceOrientation(DeviceOrientation.landscapeLeft), + "landscapeLeft"); + }); + + test("deserializeDeviceOrientation() should deserialize correctly", () { + expect(deserializeDeviceOrientation('portraitUp'), + DeviceOrientation.portraitUp); + expect(deserializeDeviceOrientation('portraitDown'), + DeviceOrientation.portraitDown); + expect(deserializeDeviceOrientation('landscapeRight'), + DeviceOrientation.landscapeRight); + expect(deserializeDeviceOrientation('landscapeLeft'), + DeviceOrientation.landscapeLeft); + }); }); } From eab58fe4308b0deb3b199787564b2b7aec13e394 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 10:29:42 +0100 Subject: [PATCH 03/14] Add interface methods for (un)locking the capture orientation. --- .../platform_interface/camera_platform.dart | 13 ++++++++++ .../test/camera_platform_interface_test.dart | 26 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 0d3fb55f0ccc..7d99a7c0145b 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -10,6 +10,7 @@ import 'package:camera_platform_interface/src/events/device_event.dart'; import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart'; import 'package:camera_platform_interface/src/types/exposure_mode.dart'; import 'package:cross_file/cross_file.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; @@ -85,6 +86,18 @@ abstract class CameraPlatform extends PlatformInterface { 'onDeviceOrientationChanged() is not implemented.'); } + /// Locks the capture orientation. + /// + /// If [orientation] is omitted, the current device orientation is used. + Future lockCaptureOrientation([DeviceOrientation orientation]) { + throw UnimplementedError('lockCaptureOrientation() is not implemented.'); + } + + /// Unlocks the capture orientation. + Future unlockCaptureOrientation() { + throw UnimplementedError('unlockCaptureOrientation() is not implemented.'); + } + /// Captures an image and returns the file where it was saved. Future takePicture(int cameraId) { throw UnimplementedError('takePicture() is not implemented.'); diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index 4695e6cd43c3..dafac09222db 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -109,6 +109,32 @@ void main() { ); }); + test( + 'Default implementation of lockCaptureOrientation() should throw unimplemented error', + () { + // Arrange + final cameraPlatform = ExtendsCameraPlatform(); + + // Act & Assert + expect( + () => cameraPlatform.lockCaptureOrientation(), + throwsUnimplementedError, + ); + }); + + test( + 'Default implementation of unlockCaptureOrientation() should throw unimplemented error', + () { + // Arrange + final cameraPlatform = ExtendsCameraPlatform(); + + // Act & Assert + expect( + () => cameraPlatform.unlockCaptureOrientation(), + throwsUnimplementedError, + ); + }); + test('Default implementation of dispose() should throw unimplemented error', () { // Arrange From 27bba292d8495fa8412db41a5f842be71375a46b Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 10:38:46 +0100 Subject: [PATCH 04/14] Update capture orientation interfaces and add unit tests. --- .../method_channel/method_channel_camera.dart | 20 ++++++++++ .../platform_interface/camera_platform.dart | 5 ++- .../lib/src/utils/utils.dart | 2 + .../test/camera_platform_interface_test.dart | 4 +- .../method_channel_camera_test.dart | 38 +++++++++++++++++++ .../test/utils/utils_test.dart | 2 + 6 files changed, 67 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index fd6a053f558e..d1a55bc9eb8a 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -158,6 +158,26 @@ class MethodChannelCamera extends CameraPlatform { .whereType(); } + @override + Future lockCaptureOrientation(int cameraId, + [DeviceOrientation orientation]) async { + await _channel.invokeMethod( + 'lockCaptureOrientation', + { + 'cameraId': cameraId, + 'orientation': serializeDeviceOrientation(orientation) + }, + ); + } + + @override + Future unlockCaptureOrientation(int cameraId) async { + await _channel.invokeMethod( + 'unlockCaptureOrientation', + {'cameraId': cameraId}, + ); + } + @override Future takePicture(int cameraId) async { String path = await _channel.invokeMethod( diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 7d99a7c0145b..6fbf5821ddf3 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -89,12 +89,13 @@ abstract class CameraPlatform extends PlatformInterface { /// Locks the capture orientation. /// /// If [orientation] is omitted, the current device orientation is used. - Future lockCaptureOrientation([DeviceOrientation orientation]) { + Future lockCaptureOrientation(int cameraId, + [DeviceOrientation orientation]) { throw UnimplementedError('lockCaptureOrientation() is not implemented.'); } /// Unlocks the capture orientation. - Future unlockCaptureOrientation() { + Future unlockCaptureOrientation(int cameraId) { throw UnimplementedError('unlockCaptureOrientation() is not implemented.'); } diff --git a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart index 5413f25bb8b7..beaefd6146df 100644 --- a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart +++ b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart @@ -16,6 +16,7 @@ CameraLensDirection parseCameraLensDirection(String string) { /// Returns the device orientation as a String. String serializeDeviceOrientation(DeviceOrientation orientation) { + if (orientation == null) return null; switch (orientation) { case DeviceOrientation.portraitUp: return 'portraitUp'; @@ -32,6 +33,7 @@ String serializeDeviceOrientation(DeviceOrientation orientation) { /// Returns the device orientation for a given String. DeviceOrientation deserializeDeviceOrientation(String str) { + if (str == null) return null; switch (str) { case "portraitUp": return DeviceOrientation.portraitUp; diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index dafac09222db..94cfc190305a 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -117,7 +117,7 @@ void main() { // Act & Assert expect( - () => cameraPlatform.lockCaptureOrientation(), + () => cameraPlatform.lockCaptureOrientation(1), throwsUnimplementedError, ); }); @@ -130,7 +130,7 @@ void main() { // Act & Assert expect( - () => cameraPlatform.unlockCaptureOrientation(), + () => cameraPlatform.unlockCaptureOrientation(1), throwsUnimplementedError, ); }); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 8c96d20c929a..bf9430fd6079 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -794,6 +794,44 @@ void main() { .having((e) => e.description, 'description', 'Illegal zoom error'))); }); + + test('Should lock the capture orientation', () async { + // Arrange + MethodChannelMock channel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: {'lockCaptureOrientation': null}, + ); + + // Act + await camera.lockCaptureOrientation(cameraId); + await camera.lockCaptureOrientation( + cameraId, DeviceOrientation.portraitUp); + + // Assert + expect(channel.log, [ + isMethodCall('lockCaptureOrientation', + arguments: {'cameraId': cameraId, 'orientation': null}), + isMethodCall('lockCaptureOrientation', + arguments: {'cameraId': cameraId, 'orientation': 'portraitUp'}), + ]); + }); + + test('Should unlock the capture orientation', () async { + // Arrange + MethodChannelMock channel = MethodChannelMock( + channelName: 'plugins.flutter.io/camera', + methods: {'unlockCaptureOrientation': null}, + ); + + // Act + await camera.unlockCaptureOrientation(cameraId); + + // Assert + expect(channel.log, [ + isMethodCall('unlockCaptureOrientation', + arguments: {'cameraId': cameraId}), + ]); + }); }); }); } diff --git a/packages/camera/camera_platform_interface/test/utils/utils_test.dart b/packages/camera/camera_platform_interface/test/utils/utils_test.dart index 63e3baff265d..dc9163877d57 100644 --- a/packages/camera/camera_platform_interface/test/utils/utils_test.dart +++ b/packages/camera/camera_platform_interface/test/utils/utils_test.dart @@ -32,6 +32,7 @@ void main() { }); test("serializeDeviceOrientation() should serialize correctly", () { + expect(serializeDeviceOrientation(null), null); expect(serializeDeviceOrientation(DeviceOrientation.portraitUp), "portraitUp"); expect(serializeDeviceOrientation(DeviceOrientation.portraitDown), @@ -43,6 +44,7 @@ void main() { }); test("deserializeDeviceOrientation() should deserialize correctly", () { + expect(deserializeDeviceOrientation(null), null); expect(deserializeDeviceOrientation('portraitUp'), DeviceOrientation.portraitUp); expect(deserializeDeviceOrientation('portraitDown'), From 859076fb76bd1a9820a6be38d1a0671de283ee10 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 11:13:04 +0100 Subject: [PATCH 05/14] Made device orientation mandatory for locking capture orientation in the platform interface. --- .../lib/src/method_channel/method_channel_camera.dart | 4 ++-- .../lib/src/platform_interface/camera_platform.dart | 6 ++---- .../camera_platform_interface/lib/src/utils/utils.dart | 2 -- .../test/camera_platform_interface_test.dart | 2 +- .../test/method_channel/method_channel_camera_test.dart | 3 --- .../camera_platform_interface/test/utils/utils_test.dart | 2 -- 6 files changed, 5 insertions(+), 14 deletions(-) diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index d1a55bc9eb8a..86ea39ec748a 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -159,8 +159,8 @@ class MethodChannelCamera extends CameraPlatform { } @override - Future lockCaptureOrientation(int cameraId, - [DeviceOrientation orientation]) async { + Future lockCaptureOrientation( + int cameraId, DeviceOrientation orientation) async { await _channel.invokeMethod( 'lockCaptureOrientation', { diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 6fbf5821ddf3..a6a93b98e181 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -87,10 +87,8 @@ abstract class CameraPlatform extends PlatformInterface { } /// Locks the capture orientation. - /// - /// If [orientation] is omitted, the current device orientation is used. - Future lockCaptureOrientation(int cameraId, - [DeviceOrientation orientation]) { + Future lockCaptureOrientation( + int cameraId, DeviceOrientation orientation) { throw UnimplementedError('lockCaptureOrientation() is not implemented.'); } diff --git a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart index beaefd6146df..5413f25bb8b7 100644 --- a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart +++ b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart @@ -16,7 +16,6 @@ CameraLensDirection parseCameraLensDirection(String string) { /// Returns the device orientation as a String. String serializeDeviceOrientation(DeviceOrientation orientation) { - if (orientation == null) return null; switch (orientation) { case DeviceOrientation.portraitUp: return 'portraitUp'; @@ -33,7 +32,6 @@ String serializeDeviceOrientation(DeviceOrientation orientation) { /// Returns the device orientation for a given String. DeviceOrientation deserializeDeviceOrientation(String str) { - if (str == null) return null; switch (str) { case "portraitUp": return DeviceOrientation.portraitUp; diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index 94cfc190305a..9781b593f1e8 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -117,7 +117,7 @@ void main() { // Act & Assert expect( - () => cameraPlatform.lockCaptureOrientation(1), + () => cameraPlatform.lockCaptureOrientation(1, null), throwsUnimplementedError, ); }); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index bf9430fd6079..bcd5995a74a0 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -803,14 +803,11 @@ void main() { ); // Act - await camera.lockCaptureOrientation(cameraId); await camera.lockCaptureOrientation( cameraId, DeviceOrientation.portraitUp); // Assert expect(channel.log, [ - isMethodCall('lockCaptureOrientation', - arguments: {'cameraId': cameraId, 'orientation': null}), isMethodCall('lockCaptureOrientation', arguments: {'cameraId': cameraId, 'orientation': 'portraitUp'}), ]); diff --git a/packages/camera/camera_platform_interface/test/utils/utils_test.dart b/packages/camera/camera_platform_interface/test/utils/utils_test.dart index dc9163877d57..63e3baff265d 100644 --- a/packages/camera/camera_platform_interface/test/utils/utils_test.dart +++ b/packages/camera/camera_platform_interface/test/utils/utils_test.dart @@ -32,7 +32,6 @@ void main() { }); test("serializeDeviceOrientation() should serialize correctly", () { - expect(serializeDeviceOrientation(null), null); expect(serializeDeviceOrientation(DeviceOrientation.portraitUp), "portraitUp"); expect(serializeDeviceOrientation(DeviceOrientation.portraitDown), @@ -44,7 +43,6 @@ void main() { }); test("deserializeDeviceOrientation() should deserialize correctly", () { - expect(deserializeDeviceOrientation(null), null); expect(deserializeDeviceOrientation('portraitUp'), DeviceOrientation.portraitUp); expect(deserializeDeviceOrientation('portraitDown'), From 118bd001b6bc8e5856e2f65ff7f026c01b22171b Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 15:47:04 +0100 Subject: [PATCH 06/14] Update comment --- .../lib/src/platform_interface/camera_platform.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index a6a93b98e181..16a4543fc6a5 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -81,6 +81,10 @@ abstract class CameraPlatform extends PlatformInterface { } /// The device orientation changed. + /// + /// Implementations for this: + /// - Should support all 4 orientations. + /// - Should not emit new values when the screen orientation is locked. Stream onDeviceOrientationChanged() { throw UnimplementedError( 'onDeviceOrientationChanged() is not implemented.'); From 0bb07beab4bac45ace7e6a924c0d961f6d159053 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 16:22:38 +0100 Subject: [PATCH 07/14] Update comment. --- .../camera_platform_interface/lib/src/events/camera_event.dart | 3 ++- .../camera_platform_interface/lib/src/events/device_event.dart | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart index 590713d04e8b..338a97f19d0a 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart @@ -4,7 +4,8 @@ import '../../camera_platform_interface.dart'; -/// Generic Event coming from the native side of Camera. +/// Generic Event coming from the native side of Camera, +/// related to a specific camera module. /// /// All [CameraEvent]s contain the `cameraId` that originated the event. This /// should never be `null`. diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index 68728db02af6..96857b163292 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -1,7 +1,8 @@ import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:flutter/services.dart'; -/// Generic Event coming from the native side of Camera, that are not related to a specific camera module. +/// Generic Event coming from the native side of Camera, +/// not related to a specific camera module. /// /// This class is used as a base class for all the events that might be /// triggered from a device, but it is never used directly as an event type. From a2c3fbf3b4ed51f48a485b74132ca403157c8bb5 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Tue, 5 Jan 2021 16:25:13 +0100 Subject: [PATCH 08/14] Update changelog and pubspec version --- packages/camera/camera_platform_interface/CHANGELOG.md | 5 +++++ packages/camera/camera_platform_interface/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index d264d6c6f9ce..b7739e6fc5a8 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.4.0 + +- Introduces interface methods for locking and unlocking the capture orientation. +- Introduces interface method for listening to the device orientation. + ## 1.3.0 - Introduces an option to set the image format when initializing. diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 7a4fa49ce052..a6d0b815e660 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the camera plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/camera/camera_platform_interface # 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.3.0 +version: 1.4.0 dependencies: flutter: From 1d409b992040bac9e5b3d1378e3b421feb8d22ef Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Tue, 5 Jan 2021 23:46:59 +0100 Subject: [PATCH 09/14] Update packages/camera/camera_platform_interface/lib/src/events/device_event.dart Co-authored-by: Maurits van Beusekom --- .../lib/src/events/device_event.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index 96857b163292..81f3287c3706 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:flutter/services.dart'; From 8c1aa01b8d1bef978b81e3db85631120e998d0ab Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 6 Jan 2021 09:47:08 +0100 Subject: [PATCH 10/14] Update packages/camera/camera_platform_interface/lib/src/events/device_event.dart Co-authored-by: Maurits van Beusekom --- .../camera_platform_interface/lib/src/events/device_event.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index 81f3287c3706..6492b4cc1a19 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -20,7 +20,8 @@ import 'package:flutter/services.dart'; /// They can be (and in fact, are) filtered by the `instanceof`-operator. abstract class DeviceEvent {} -/// An event fired whenever. +/// The [DeviceOrientationChangedEvent] is fired every time the user changes the +/// physical orientation of the device. class DeviceOrientationChangedEvent extends DeviceEvent { /// The new orientation the device final DeviceOrientation orientation; From 0c6da4b2bea15e4502490bcbf803fd23350cc60f Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 6 Jan 2021 09:47:24 +0100 Subject: [PATCH 11/14] Update packages/camera/camera_platform_interface/lib/src/events/device_event.dart Co-authored-by: Maurits van Beusekom --- .../camera_platform_interface/lib/src/events/device_event.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index 6492b4cc1a19..9220b60d6477 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -11,7 +11,7 @@ import 'package:flutter/services.dart'; /// This class is used as a base class for all the events that might be /// triggered from a device, but it is never used directly as an event type. /// -/// Do NOT instantiate new events like `DeviceEvent(cameraId)` directly, +/// Do NOT instantiate new events like `DeviceEvent()` directly, /// use a specific class instead: /// /// Do `class NewEvent extend DeviceEvent` when creating your own events. From 16b9b42979ce9f9570d26b5966e0bf45f1e76de1 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 6 Jan 2021 09:47:33 +0100 Subject: [PATCH 12/14] Update packages/camera/camera_platform_interface/lib/src/events/device_event.dart Co-authored-by: Maurits van Beusekom --- .../camera_platform_interface/lib/src/events/device_event.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index 9220b60d6477..82febcab2290 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -23,7 +23,7 @@ abstract class DeviceEvent {} /// The [DeviceOrientationChangedEvent] is fired every time the user changes the /// physical orientation of the device. class DeviceOrientationChangedEvent extends DeviceEvent { - /// The new orientation the device + /// The new orientation of the device final DeviceOrientation orientation; /// Build a new orientation changed event. From 3c79c345853ed5a2d7d91ae5bbbb44004e6c4ce0 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 6 Jan 2021 09:47:46 +0100 Subject: [PATCH 13/14] Update packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart Co-authored-by: Maurits van Beusekom --- .../lib/src/method_channel/method_channel_camera.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 9fb2bd26518a..29048ac158f3 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -22,7 +22,7 @@ class MethodChannelCamera extends CameraPlatform { final Map _channels = {}; /// The controller we need to broadcast the different events coming - /// from handleMethodCall. Specific to camera events. + /// from handleMethodCall, specific to camera events. /// /// It is a `broadcast` because multiple controllers will connect to /// different stream views of this Controller. From d2838f6146717fd9260486cf684f4a89ea626071 Mon Sep 17 00:00:00 2001 From: Bodhi Mulders Date: Wed, 6 Jan 2021 09:47:55 +0100 Subject: [PATCH 14/14] Update packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart Co-authored-by: Maurits van Beusekom --- .../lib/src/method_channel/method_channel_camera.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 29048ac158f3..274f046d28a5 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -33,7 +33,7 @@ class MethodChannelCamera extends CameraPlatform { StreamController.broadcast(); /// The controller we need to broadcast the different events coming - /// from handleMethodCall. Specific to general device events. + /// from handleMethodCall, specific to general device events. /// /// It is a `broadcast` because multiple controllers will connect to /// different stream views of this Controller.