Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Utilize core-based synchronisation #258

Merged
merged 11 commits into from
Nov 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 16 additions & 152 deletions MapboxVision.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

26 changes: 26 additions & 0 deletions MapboxVision/Core/FileSystem.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Foundation

final class FileSystem: NSObject {
private let archiver: Archiver

init(archiver: Archiver) {
self.archiver = archiver
}
}

extension FileSystem: FileSystemInterface {
func archiveFiles(filePaths: [String], archivePath: String, callback: @escaping SuccessCallback) {
DispatchQueue.global(qos: .utility).async {
do {
try self.archiver.archive(filePaths.map(URL.init(fileURLWithPath:)),
destination: URL(fileURLWithPath: archivePath))
} catch {
assertionFailure("ERROR: archiving failed with error: \(error.localizedDescription)")
callback(false)
return
}

callback(true)
}
}
}
40 changes: 40 additions & 0 deletions MapboxVision/Core/Media.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import Foundation

final class Media: NSObject {
private let recorder: FrameRecorder
private let videoTrimmer: VideoTrimmer

init(recorder: FrameRecorder, videoTrimmer: VideoTrimmer) {
self.recorder = recorder
self.videoTrimmer = videoTrimmer
}
}

extension Media: MediaInterface {
func startVideoRecording(filePath: String) {
recorder.startRecording(to: filePath, settings: .lowQuality)
}

func stopVideoRecording() {
recorder.stopRecording()
}

func makeVideoClips(inputFilePath: String, clips: [VideoClip], callback: @escaping SuccessCallback) {
var success = true
let group = DispatchGroup()

for clip in clips {
group.enter()
videoTrimmer.trimVideo(source: inputFilePath, clip: clip) { error in
if error != nil {
success = false
}
group.leave()
}
}

group.notify(queue: DispatchQueue.global(qos: .utility)) {
callback(success)
}
}
}
32 changes: 0 additions & 32 deletions MapboxVision/Core/Platform.swift

This file was deleted.

30 changes: 30 additions & 0 deletions MapboxVision/Core/Telemetry.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Foundation

typealias TelemetryFileMetadata = [String: String]

final class Telemetry: NSObject {
private let networkClient: NetworkClient

init(networkClient: NetworkClient) {
self.networkClient = networkClient
}
}

extension Telemetry: TelemetryInterface {
func setSyncUrl(_ url: String) {
networkClient.set(baseURL: URL(string: url))
}

func sendTelemetry(name: String, entries: [TelemetryEntry]) {
let entries = Dictionary(entries.map { ($0.key, $0.value) }) { first, _ in
assertionFailure("Duplicated key in telemetry entries.")
return first
}

networkClient.sendEvent(name: name, entries: entries)
}

func sendTelemetryFile(path: String, metadata: TelemetryFileMetadata, callback: @escaping SuccessCallback) {
networkClient.upload(file: path, metadata: metadata) { error in callback(error == nil) }
}
}
14 changes: 0 additions & 14 deletions MapboxVision/Helpers/Country+SyncRegion.swift

This file was deleted.

9 changes: 0 additions & 9 deletions MapboxVision/Helpers/MemoryByte.swift

This file was deleted.

7 changes: 0 additions & 7 deletions MapboxVision/Helpers/TimeInterval.swift

This file was deleted.

28 changes: 0 additions & 28 deletions MapboxVision/Helpers/URL.swift

This file was deleted.

9 changes: 0 additions & 9 deletions MapboxVision/Helpers/UserDefaults+DefaultValue.swift

This file was deleted.

47 changes: 0 additions & 47 deletions MapboxVision/Services/DataProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,39 +7,6 @@ protocol DataProvider: AnyObject {
func stop()
}

final class RecordedDataProvider: DataProvider {
struct Dependencies {
let recordingPath: RecordingPath
let startTime: UInt
}

let dependencies: Dependencies
let telemetryPlayer: TelemetryPlayer

init(dependencies: Dependencies) {
self.dependencies = dependencies
self.telemetryPlayer = TelemetryPlayer()
telemetryPlayer.read(fromFolder: dependencies.recordingPath.recordingPath)
}

private var startTime = DispatchTime.now().uptimeMilliseconds

func start() {
startTime = DispatchTime.now().uptimeMilliseconds
telemetryPlayer.scrollData(dependencies.startTime)
}

func update() {
let settings = dependencies.recordingPath.settings
let frameSize = CGSize(width: settings.width, height: settings.height)
let currentTimeMS = DispatchTime.now().uptimeMilliseconds - startTime + dependencies.startTime
telemetryPlayer.setCurrentTime(currentTimeMS)
telemetryPlayer.updateData(withFrameSize: frameSize, srcSize: frameSize)
}

func stop() {}
}

final class RealtimeDataProvider: DataProvider {
struct Dependencies {
let native: VisionManagerNative
Expand Down Expand Up @@ -68,17 +35,3 @@ final class RealtimeDataProvider: DataProvider {
dependencies.motionManager.stop()
}
}

final class EmptyDataProvider: DataProvider {
func start() {}

func update() {}

func stop() {}
}

private extension DispatchTime {
var uptimeMilliseconds: UInt {
return UInt(DispatchTime.now().uptimeNanoseconds / 1_000_000)
}
}
24 changes: 0 additions & 24 deletions MapboxVision/Services/DeviceInfoProvider.swift

This file was deleted.

65 changes: 5 additions & 60 deletions MapboxVision/Services/EventsManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,6 @@ final class EventsManager {
return token
}()

private let formatter: DateFormatter = {
let dateFormatter = DateFormatter()
let enUSPosixLocale = Locale(identifier: "en_US_POSIX")
dateFormatter.locale = enUSPosixLocale
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
return dateFormatter
}()

private lazy var recordingFormatter = DateFormatter.createRecordingFormatter()

init() {
let bundle = Bundle(for: type(of: self))
let name = bundle.infoDictionary!["CFBundleName"] as! String
Expand All @@ -38,11 +28,6 @@ final class EventsManager {
)
manager.sendTurnstileEvent()
manager.isMetricsEnabled = true
manager.isDebugLoggingEnabled = true
}

func sendEvent(name: String, entries: [String: Any]) {
manager.enqueueEvent(withName: name, attributes: entries)
}
}

Expand All @@ -51,52 +36,12 @@ extension EventsManager: NetworkClient {
manager.baseURL = baseURL
}

func upload(file: URL, toFolder folderName: String, completion: @escaping (Error?) -> Void) {
let contentType: String
switch file.pathExtension {
case "zip": contentType = "zip"
case "mp4": contentType = "video"
case "jpg": contentType = "image"
default:
assertionFailure("EventsManager: post unsupported content type")
contentType = ""
}

let name = file.lastPathComponent
let folder = file.deletingLastPathComponent().lastPathComponent

let created = file.creationDate.map(formatter.string) ?? ""

var metadata = [
"name": name,
"fileId": folder + "/" + name,
"sessionId": folderName,
"format": file.pathExtension,
"created": created,
"type": contentType,
]

if contentType == "video" {
var startTime = created
var endTime = created

let components = name.deletingPathExtension.split(separator: "-")
if
let date = recordingFormatter.date(from: folder),
let start = components[safe: 0],
let startInterval = TimeInterval(start),
let end = components[safe: 1],
let endInterval = TimeInterval(end)
{
startTime = formatter.string(from: date.addingTimeInterval(startInterval))
endTime = formatter.string(from: date.addingTimeInterval(endInterval))
}

metadata["startTime"] = startTime
metadata["endTime"] = endTime
}
func sendEvent(name: String, entries: [String: Any]) {
manager.enqueueEvent(withName: name, attributes: entries)
}

manager.postMetadata([metadata], filePaths: [file.path], completionHandler: completion)
func upload(file: String, metadata: TelemetryFileMetadata, completion: @escaping (Error?) -> Void) {
manager.postMetadata([metadata], filePaths: [file], completionHandler: completion)
}

func cancel() {}
Expand Down
4 changes: 3 additions & 1 deletion MapboxVision/Services/Network/NetworkClient.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import Foundation
import MapboxVisionNative

protocol NetworkClient {
func set(baseURL: URL?)
func upload(file: URL, toFolder folderName: String, completion: @escaping (Error?) -> Void)
func sendEvent(name: String, entries: [String: Any])
func upload(file: String, metadata: TelemetryFileMetadata, completion: @escaping (Error?) -> Void)
func cancel()
}
Loading