Skip to content

Commit

Permalink
Merge pull request #41 from clutter/camera-coordinator
Browse files Browse the repository at this point in the history
Add Camera Coordinator
  • Loading branch information
jbrophy17 authored Aug 23, 2021
2 parents c26d282 + 0b5b0f5 commit 3577de6
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 92 deletions.
16 changes: 4 additions & 12 deletions Example/PodApp/TiltUp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
2C9FDB0B19D3E8B4F595C30A /* Pods_TiltUp_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1516C7932D51E0EFD75B30 /* Pods_TiltUp_Example.framework */; };
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };
780DE4A324205FCB00AD18DD /* PhotoCaptureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */; };
781B6E9E23B143CD000EA68B /* CameraCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */; };
78B7560226B8C49D006A1791 /* TiltUp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78B7560126B8C49D006A1791 /* TiltUp.framework */; };
78B7560426B8C4B2006A1791 /* TiltUpTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78B7560326B8C4B2006A1791 /* TiltUpTest.framework */; };
9FC1627126CC6D14004B3513 /* CameraCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC1627026CC6D14004B3513 /* CameraCoordinatorTests.swift */; };
BB1598792589677100DE7F2C /* Sequence+sumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1598782589677100DE7F2C /* Sequence+sumTests.swift */; };
BBD511DD2320206D00EB8673 /* UnexpectedNilErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD511DC2320206D00EB8673 /* UnexpectedNilErrorTests.swift */; };
BBD58F3723593DF500FDD6FE /* SingleSelectionViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD58F3623593DF500FDD6FE /* SingleSelectionViewModelTests.swift */; };
Expand Down Expand Up @@ -60,9 +60,9 @@
607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
744F48272933FDC9679684F7 /* Pods-TiltUp_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TiltUp_Tests.debug.xcconfig"; path = "Target Support Files/Pods-TiltUp_Tests/Pods-TiltUp_Tests.debug.xcconfig"; sourceTree = "<group>"; };
780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoCaptureTests.swift; sourceTree = "<group>"; };
781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraCoordinator.swift; sourceTree = "<group>"; };
78B7560126B8C49D006A1791 /* TiltUp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TiltUp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
78B7560326B8C4B2006A1791 /* TiltUpTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TiltUpTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9FC1627026CC6D14004B3513 /* CameraCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraCoordinatorTests.swift; sourceTree = "<group>"; };
BB1598782589677100DE7F2C /* Sequence+sumTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sequence+sumTests.swift"; sourceTree = "<group>"; };
BBD511DC2320206D00EB8673 /* UnexpectedNilErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnexpectedNilErrorTests.swift; sourceTree = "<group>"; };
BBD58F3623593DF500FDD6FE /* SingleSelectionViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSelectionViewModelTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -117,7 +117,6 @@
0B25C65A2304730500F88096 /* Screens */ = {
isa = PBXGroup;
children = (
781B6E9C23B14395000EA68B /* Camera */,
0B25C6602304730500F88096 /* Bootstrap */,
0B25C65B2304730500F88096 /* Home */,
);
Expand Down Expand Up @@ -218,6 +217,7 @@
isa = PBXGroup;
children = (
780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */,
9FC1627026CC6D14004B3513 /* CameraCoordinatorTests.swift */,
);
path = Camera;
sourceTree = "<group>";
Expand All @@ -233,14 +233,6 @@
name = Frameworks;
sourceTree = "<group>";
};
781B6E9C23B14395000EA68B /* Camera */ = {
isa = PBXGroup;
children = (
781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */,
);
path = Camera;
sourceTree = "<group>";
};
BB1598772589674A00DE7F2C /* Extensions */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -490,7 +482,6 @@
buildActionMask = 2147483647;
files = (
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,
781B6E9E23B143CD000EA68B /* CameraCoordinator.swift in Sources */,
0B25C66A2304730500F88096 /* HomeCoordinator.swift in Sources */,
0B25C6672304730500F88096 /* HomeController.swift in Sources */,
0B25C6682304730500F88096 /* HomeViewModel.swift in Sources */,
Expand All @@ -503,6 +494,7 @@
buildActionMask = 2147483647;
files = (
0B25C6762304C2B300F88096 /* TestCoordinator.swift in Sources */,
9FC1627126CC6D14004B3513 /* CameraCoordinatorTests.swift in Sources */,
BBD58F3723593DF500FDD6FE /* SingleSelectionViewModelTests.swift in Sources */,
BBD511DD2320206D00EB8673 /* UnexpectedNilErrorTests.swift in Sources */,
780DE4A324205FCB00AD18DD /* PhotoCaptureTests.swift in Sources */,
Expand Down
16 changes: 4 additions & 12 deletions Example/SPMApp/TiltUp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
0B25C6792304C2B300F88096 /* TestAppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B25C6732304C2B200F88096 /* TestAppCoordinator.swift */; };
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };
780DE4A324205FCB00AD18DD /* PhotoCaptureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */; };
781B6E9E23B143CD000EA68B /* CameraCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */; };
78712FA226B8C9AD00F965F7 /* TiltUp in Frameworks */ = {isa = PBXBuildFile; productRef = 78712FA126B8C9AD00F965F7 /* TiltUp */; };
78712FAA26B8C9D600F965F7 /* TiltUpTest in Frameworks */ = {isa = PBXBuildFile; productRef = 78712FA926B8C9D600F965F7 /* TiltUpTest */; };
9FC1627426CC7A1B004B3513 /* CameraCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC1627326CC7A1B004B3513 /* CameraCoordinatorTests.swift */; };
BB1598792589677100DE7F2C /* Sequence+sumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1598782589677100DE7F2C /* Sequence+sumTests.swift */; };
BBD511DD2320206D00EB8673 /* UnexpectedNilErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD511DC2320206D00EB8673 /* UnexpectedNilErrorTests.swift */; };
BBD58F3723593DF500FDD6FE /* SingleSelectionViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD58F3623593DF500FDD6FE /* SingleSelectionViewModelTests.swift */; };
Expand Down Expand Up @@ -55,9 +55,9 @@
607FACE51AFB9204008FA782 /* TiltUp_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TiltUp_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoCaptureTests.swift; sourceTree = "<group>"; };
781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraCoordinator.swift; sourceTree = "<group>"; };
78B7560126B8C49D006A1791 /* TiltUp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TiltUp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
78B7560326B8C4B2006A1791 /* TiltUpTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TiltUpTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9FC1627326CC7A1B004B3513 /* CameraCoordinatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraCoordinatorTests.swift; sourceTree = "<group>"; };
BB1598782589677100DE7F2C /* Sequence+sumTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sequence+sumTests.swift"; sourceTree = "<group>"; };
BBD511DC2320206D00EB8673 /* UnexpectedNilErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnexpectedNilErrorTests.swift; sourceTree = "<group>"; };
BBD58F3623593DF500FDD6FE /* SingleSelectionViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSelectionViewModelTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -96,7 +96,6 @@
0B25C65A2304730500F88096 /* Screens */ = {
isa = PBXGroup;
children = (
781B6E9C23B14395000EA68B /* Camera */,
0B25C6602304730500F88096 /* Bootstrap */,
0B25C65B2304730500F88096 /* Home */,
);
Expand Down Expand Up @@ -195,6 +194,7 @@
780DE4A124205FA400AD18DD /* Camera */ = {
isa = PBXGroup;
children = (
9FC1627326CC7A1B004B3513 /* CameraCoordinatorTests.swift */,
780DE4A224205FCB00AD18DD /* PhotoCaptureTests.swift */,
);
path = Camera;
Expand All @@ -209,14 +209,6 @@
name = Frameworks;
sourceTree = "<group>";
};
781B6E9C23B14395000EA68B /* Camera */ = {
isa = PBXGroup;
children = (
781B6E9D23B143CD000EA68B /* CameraCoordinator.swift */,
);
path = Camera;
sourceTree = "<group>";
};
BB1598772589674A00DE7F2C /* Extensions */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -385,7 +377,6 @@
buildActionMask = 2147483647;
files = (
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,
781B6E9E23B143CD000EA68B /* CameraCoordinator.swift in Sources */,
0B25C66A2304730500F88096 /* HomeCoordinator.swift in Sources */,
0B25C6672304730500F88096 /* HomeController.swift in Sources */,
0B25C6682304730500F88096 /* HomeViewModel.swift in Sources */,
Expand All @@ -398,6 +389,7 @@
buildActionMask = 2147483647;
files = (
0B25C6762304C2B300F88096 /* TestCoordinator.swift in Sources */,
9FC1627426CC7A1B004B3513 /* CameraCoordinatorTests.swift in Sources */,
BBD58F3723593DF500FDD6FE /* SingleSelectionViewModelTests.swift in Sources */,
BBD511DD2320206D00EB8673 /* UnexpectedNilErrorTests.swift in Sources */,
780DE4A324205FCB00AD18DD /* PhotoCaptureTests.swift in Sources */,
Expand Down
51 changes: 0 additions & 51 deletions Example/Sources/Screens/Camera/CameraCoordinator.swift

This file was deleted.

46 changes: 40 additions & 6 deletions Example/Sources/Screens/Home/HomeCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,48 @@ private extension HomeCoordinator {
let viewModel = HomeViewModel()
controller.viewModel = viewModel

viewModel.coordinatorObservers.goToCamera = {
let coordinator = CameraCoordinator(parent: self)
coordinator.start()
viewModel.coordinatorObservers.goToCamera = { [weak self] in
self?.goToCamera()
}

// TODO: Set viewModel.coordinatorObservers

// TODO: Decide whether to replaceRoot / push / present modally
router.replaceRoot(with: controller, retaining: self)
}

func goToCamera() {
let hintProvider: HintProvider = { numberOfPhotos in
return "\(numberOfPhotos) Photos Captured"
}

let numberOfPhotos = 2...10
let logger = Camera.Logger(info: { _ in }, bug: { _ in })
let cameraViewModel = CameraViewModel(settings: .init(numberOfPhotos: numberOfPhotos), logger: logger)

cameraViewModel.coordinatorObservers.tappedCancel = { [weak self] in
guard let self = self else { return }
self.router.dismissModal()
}

cameraViewModel.coordinatorObservers.capturedPhotos = { [weak self] photoCaptures in
print("Captured \(photoCaptures.count) Photos")
for (i, photoCapture) in photoCaptures.enumerated() {
print(
"""
Photo \(i):
Expected Duration: \(photoCapture.expectedCaptureDuration.converted(to: .seconds))
Actual Duration: \(photoCapture.actualCaptureDuration.converted(to: .seconds))
"""
)
}
self?.router.dismissModal()
}

let coordinator = CameraCoordinator(
parent: self,
modal: true,
hintProvider: hintProvider,
viewModel: cameraViewModel
)

coordinator.start()
}
}
61 changes: 61 additions & 0 deletions Example/Tests/Screens/Camera/CameraCoordinatorTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// CameraCoordinatorTests.swift
// TiltUp_Tests
//
// Created by John Brophy on 8/17/21.
// Copyright © 2021 Clutter. All rights reserved.
//

import XCTest

import TiltUpTest

@testable import TiltUp

final class CameraCoordinatorTests: XCTestCase, WaitableCoordinatorTest {
private var parent: TestCoordinator!

override func setUp() {
parent = TestCoordinator()
}

override func tearDown() {
parent = nil
}

func testStartForModal() {
let coordinator = CameraCoordinator(
parent: parent,
modal: true,
hintProvider: { _ in return nil },
viewModel: .init(
settings: .init(numberOfPhotos: 1...1),
logger: .init(info: { _ in }, bug: { _ in })
)
)

waitForPresentedViewControllerChange(in: parent.router) {
coordinator.start()
}

assertRetained(coordinator, withTopViewControllerOfType: CameraController.self)
}

func testStartForNonModal() {
let coordinator = CameraCoordinator(
parent: parent,
modal: false,
hintProvider: { _ in return nil },
viewModel: .init(
settings: .init(numberOfPhotos: 1...1),
logger: .init(info: { _ in }, bug: { _ in })
)
)

waitForTopViewControllerChange(in: coordinator.router) {
coordinator.start()
}

assertRetained(coordinator, withTopViewControllerOfType: CameraController.self)
}
}
6 changes: 3 additions & 3 deletions Sources/TiltUp/Screens/Camera/CameraController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ public final class CameraController: UIViewController {

public init(viewModel: CameraViewModel, hint: String?) {
self.viewModel = viewModel
overlayView = CameraOverlayView(hint: { _ in hint })
overlayView = CameraOverlayView(hintProvider: { _ in hint })

super.init(nibName: nil, bundle: nil)
}

public init(viewModel: CameraViewModel, hint: @escaping (_ numberOfPhotos: Int) -> String?) {
public init(viewModel: CameraViewModel, hint: @escaping HintProvider) {
self.viewModel = viewModel
overlayView = CameraOverlayView(hint: hint)
overlayView = CameraOverlayView(hintProvider: hint)

super.init(nibName: nil, bundle: nil)
}
Expand Down
40 changes: 40 additions & 0 deletions Sources/TiltUp/Screens/Camera/CameraCoordinator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// CameraCoordiantor.swift
// TiltUp
//
// Created by John Brophy on 8/17/21.
// Copyright © 2021 Clutter. All rights reserved.
//

import Foundation

public final class CameraCoordinator: Coordinator {
private let viewModel: CameraViewModel
private let hintProvider: HintProvider

public init(
parent: Coordinating,
modal: Bool,
hintProvider: @escaping HintProvider,
viewModel: CameraViewModel
) {
self.hintProvider = hintProvider
self.viewModel = viewModel
super.init(parent: parent, modal: modal)
}

public override func start() {
goToCamera()
}
}

private extension CameraCoordinator {
func goToCamera() {
let controller = CameraController(viewModel: viewModel, hint: hintProvider)
router.push(controller, retaining: self)

if router != parent?.router {
parent?.router.presentModal(router)
}
}
}
Loading

0 comments on commit 3577de6

Please sign in to comment.