diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 085f712..8378756 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -707,7 +707,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -729,7 +729,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; diff --git a/AutoCat/AppDelegate.swift b/AutoCat/AppDelegate.swift index b51e890..dd113f2 100644 --- a/AutoCat/AppDelegate.swift +++ b/AutoCat/AppDelegate.swift @@ -23,7 +23,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let config = Realm.Configuration( - schemaVersion: 14, + schemaVersion: 15, migrationBlock: { migration, oldSchemaVersion in if oldSchemaVersion <= 3 { var numbers: [String] = [] @@ -37,6 +37,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } } } + + if oldSchemaVersion <= 14 { + migration.enumerateObjects(ofType: "Vehicle") { old, new in + new!["isRightWheel"] = RealmOptional(old!["isRightWheel"] as? Bool) + } + } }) Realm.Configuration.defaultConfiguration = config diff --git a/AutoCat/Controllers/CheckController.swift b/AutoCat/Controllers/CheckController.swift index d11d574..61747c2 100644 --- a/AutoCat/Controllers/CheckController.swift +++ b/AutoCat/Controllers/CheckController.swift @@ -6,6 +6,12 @@ import SwiftDate import RxRealm import RxDataSources +enum EventAction { + case doNotSend + case receiveAndSend + case sendSpecific(VehicleEvent) +} + class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITableViewDelegate { @IBOutlet weak var number: UITextField! @@ -85,7 +91,11 @@ class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITabl break case .checkNumber(let number, let event): ad.quickAction = .none - self.check(number: number, event: event) + var action: EventAction = .receiveAndSend + if let event = event { + action = .sendSpecific(event) + } + self.check(number: number, action: action) break case .addVoiceRecord: self.tabBarController?.selectedIndex = 1 @@ -101,10 +111,10 @@ class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITabl guard let number = self.number.text else { return } let numberNormalized = number.filter { !$0.isWhitespace }.uppercased() - self.check(number: numberNormalized, event: nil) + self.check(number: numberNormalized, action: .receiveAndSend) } - func check(number: String, event: VehicleEvent?) { + func check(number: String, action: EventAction) { self.number.resignFirstResponder() self.number.text = nil self.check.isEnabled = false @@ -112,16 +122,20 @@ class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITabl Api.checkVehicle(by: number) .observeOn(MainScheduler.instance) .subscribe(onSuccess: { vehicle in - self.onReceivedVehicle(vehicle, event: event) + self.onReceivedVehicle(vehicle, action: action) }, onError: { err in if let realm = try? Realm() { let vehicle = Vehicle(number) try? realm.write { realm.add(vehicle, update: .all) } - let eventSingle = event == nil ? self.getEvent() : Single.just(event!) + + var eventSingle = self.getEvent() + if case .sendSpecific(let event) = action { + eventSingle = Single.just(event) + } eventSingle - .flatMap { event in event.updateAddress().map{ [event] }.catchErrorJustReturn([event]) } + .flatMap { event in event.findAddress().map{ [event] }.catchErrorJustReturn([event]) } .catchErrorJustReturn([]) .subscribe(onSuccess: { events in try? realm.write { @@ -153,15 +167,22 @@ class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITabl } } - func onReceivedVehicle(_ vehicle: Vehicle, event: VehicleEvent? = nil) { + func onReceivedVehicle(_ vehicle: Vehicle, action: EventAction = .receiveAndSend) { self.save(vehicle: vehicle) - let eventSingle = event == nil ? self.getEvent() : Single.just(event!) - eventSingle - .flatMap { event in event.updateAddress().map{ event }.catchErrorJustReturn(event) } - .flatMap { Api.add(event: $0, to: vehicle.number) } - .subscribe(onSuccess: self.save(vehicle:), onError: { print("Error adding event: \($0)") }) - .disposed(by: self.bag) + if case .doNotSend = action { + // Just do nothing + } else { + var eventSingle = self.getEvent() + if case .sendSpecific(let event) = action { + eventSingle = Single.just(event) + } + eventSingle + .flatMap { event in event.findAddress().map{ event }.catchErrorJustReturn(event) } + .flatMap { Api.add(event: $0, to: vehicle.number) } + .subscribe(onSuccess: self.save(vehicle:), onError: { print("Error adding event: \($0)") }) + .disposed(by: self.bag) + } self.updateDetailController(with: vehicle) IHProgressHUD.dismiss() @@ -213,15 +234,15 @@ class CheckController: UIViewController, MaskedTextFieldDelegateListener, UITabl let updateAction = UIContextualAction(style: .normal, title: "Update") { action, view, completion in IHProgressHUD.show() - var event: VehicleEvent? = nil + var eventAction: EventAction = .doNotSend if vehicle.unrecognized, let savedEvent = vehicle.events.first { - event = savedEvent + eventAction = .sendSpecific(savedEvent.freeze()) } Api.checkVehicle(by: vehicle.number, force: true) .observeOn(MainScheduler.instance) .subscribe(onSuccess: { vehicle in - self.onReceivedVehicle(vehicle, event: event) + self.onReceivedVehicle(vehicle, action: eventAction) }, onError: { err in IHProgressHUD.showError(withStatus: err.localizedDescription) print(err.localizedDescription) diff --git a/AutoCat/Controllers/ReportController.swift b/AutoCat/Controllers/ReportController.swift index 1becca9..156bed6 100644 --- a/AutoCat/Controllers/ReportController.swift +++ b/AutoCat/Controllers/ReportController.swift @@ -180,7 +180,11 @@ class ReportController: UIViewController, UICollectionViewDataSource, UICollecti cell?.configure(param: generalSection.description, value: vehicle.category ?? "") break case .wheelPosition: - cell?.configure(param: generalSection.description, value: vehicle.isRightWheel ? "Right" : "Left") + var position = "Unknown" + if let rightWheel = vehicle.isRightWheel.value { + position = rightWheel ? "Right" : "Left" + } + cell?.configure(param: generalSection.description, value: position) break case .japanese: cell?.configure(param: generalSection.description, value: vehicle.isJapanese ? "Yes" : "No") diff --git a/AutoCat/Extensions/VehicleReportImage.swift b/AutoCat/Extensions/VehicleReportImage.swift index db8d334..a1209ca 100644 --- a/AutoCat/Extensions/VehicleReportImage.swift +++ b/AutoCat/Extensions/VehicleReportImage.swift @@ -80,7 +80,11 @@ extension Vehicle { y += cellHeight self.drawCell(y: y, width: w, height: cellHeight, title: "Category", value: self.category ?? "", context: ctx) y += cellHeight - self.drawCell(y: y, width: w, height: cellHeight, title: "Steering wheel position", value: self.isRightWheel ? "Right" : "Left", context: ctx) + var position = "Unknown" + if let rightWheel = self.isRightWheel.value { + position = rightWheel ? "Right" : "Left" + } + self.drawCell(y: y, width: w, height: cellHeight, title: "Steering wheel position", value: position, context: ctx) y += cellHeight self.drawCell(y: y, width: w, height: cellHeight, title: "Japanese", value: self.isJapanese ? "Yes" : "No", lineMargin: 0, context: ctx) y += cellHeight + 32 @@ -182,7 +186,11 @@ extension Vehicle { text += "Year: \(self.year)\n" if let color = self.color { text += "Color: \(color)\n" } if let category = self.category { text += "Category: \(category)\n" } - text += "Steering wheel position: \(self.isRightWheel ? "right" : "left")\n" + var position = "Unknown" + if let rightWheel = self.isRightWheel.value { + position = rightWheel ? "Right" : "Left" + } + text += "Steering wheel position: \(position)\n" text += "Japanese: \(self.isJapanese ? "yes" : "no")\n" text += "Plate number: \(self.number)\n" if let vin = self.vin1 { text += "VIN: \(vin)\n" } diff --git a/AutoCat/Models/Vehicle.swift b/AutoCat/Models/Vehicle.swift index 4a91ae0..3113b9e 100644 --- a/AutoCat/Models/Vehicle.swift +++ b/AutoCat/Models/Vehicle.swift @@ -45,6 +45,20 @@ enum OwnerType: String { case individual } +enum SteeringWheelPosition: CustomStringConvertible { + case left + case right + case unknown + + var description: String { + switch self { + case .left: return "Left" + case .right: return "Right" + case .unknown: return "Unknown" + } + } +} + class VehicleOwnershipPeriod: Object, Decodable { @objc dynamic var lastOperation: String @objc dynamic var ownerType: String @@ -64,7 +78,7 @@ class Vehicle: Object, Decodable, IdentifiableType { @objc dynamic var vin2: String? @objc dynamic var sts: String? @objc dynamic var pts: String? - @objc dynamic var isRightWheel: Bool = false + var isRightWheel = RealmOptional() @objc dynamic var isJapanese: Bool = false @objc dynamic var addedDate: TimeInterval = 0 @objc dynamic var addedBy: String = "" @@ -108,7 +122,7 @@ class Vehicle: Object, Decodable, IdentifiableType { self.vin2 = try container.decodeIfPresent(String.self, forKey: .vin2) self.sts = try container.decodeIfPresent(String.self, forKey: .sts) self.pts = try container.decodeIfPresent(String.self, forKey: .pts) - self.isRightWheel = try container.decode(Bool.self, forKey: .isRightWheel) + self.isRightWheel = try container.decode(RealmOptional.self, forKey: .isRightWheel) self.isJapanese = try container.decode(Bool.self, forKey: .isJapanese) self.addedDate = try container.decode(TimeInterval.self, forKey: .addedDate) self.addedBy = try container.decode(String.self, forKey: .addedBy) diff --git a/AutoCat/Models/VehicleEvent.swift b/AutoCat/Models/VehicleEvent.swift index 473690d..30a4d7a 100644 --- a/AutoCat/Models/VehicleEvent.swift +++ b/AutoCat/Models/VehicleEvent.swift @@ -21,9 +21,13 @@ class VehicleEvent: Object, Codable { super.init() } - func updateAddress() -> Single { - return LocationManager - .getAddressForLocation(latitude: self.latitude, longitude: self.longitude) - .map { self.address = $0 } + func findAddress() -> Single { + if address != nil { + return Single.just(()) + } else { + return LocationManager + .getAddressForLocation(latitude: self.latitude, longitude: self.longitude) + .map { self.address = $0 } + } } } diff --git a/AutoCat/Utils/Constants.swift b/AutoCat/Utils/Constants.swift index 800d54b..ae677b5 100644 --- a/AutoCat/Utils/Constants.swift +++ b/AutoCat/Utils/Constants.swift @@ -3,9 +3,9 @@ import Foundation enum Constants { static var baseUrl: String { #if DEBUG - //return "http://127.0.0.1:3000/" + return "http://127.0.0.1:3000/" //return "http://192.168.1.67:3000/" - return "https://vps.aliencat.pro:8443/" + //return "https://vps.aliencat.pro:8443/" #else return "https://vps.aliencat.pro:8443/" #endif