Moving non-interface related code into framework (for later using it in unit test)
This commit is contained in:
parent
2107848fd6
commit
a42fd3eddb
2
.idea/autocat.iml
Normal file
2
.idea/autocat.iml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module classpath="AppCode" external.linked.project.id="autocat" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="SPM" type="CIDR_MODULE" version="4" />
|
||||
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/autocat.iml" filepath="$PROJECT_DIR$/.idea/autocat.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
@ -1,5 +1,5 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="AutoCat" type="AppleRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="AutoCat" TARGET_NAME="AutoCat" CONFIG_NAME="Debug" SCHEME_NAME="AutoCat" IS_LOCATION_SIMULATION_ALLOWED="true" APPLICATION_LANGUAGE="ru" APPLICATION_REGION="" RUN_TARGET_PROJECT_NAME="AutoCat" RUN_TARGET_NAME="AutoCat" MAKE_ACTIVE="TRUE" SHOULD_DEBUG_EXTENSIONS="false">
|
||||
<configuration default="false" name="AutoCat" type="AppleRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="AutoCat" TARGET_NAME="AutoCat" CONFIG_NAME="Debug" SCHEME_NAME="AutoCat" IS_LOCATION_SIMULATION_ALLOWED="true" LOCATION_SCENARIO_ID="com.apple.dt.IDEFoundation.CurrentLocationScenarioIdentifier" LOCATION_SCENARIO_TYPE="1" APPLICATION_LANGUAGE="ru" APPLICATION_REGION="" RUN_TARGET_PROJECT_NAME="AutoCat" RUN_TARGET_NAME="AutoCat" MAKE_ACTIVE="TRUE" SHOULD_DEBUG_EXTENSIONS="false">
|
||||
<EXTENSION ID="org.jetbrains.appcode.reveal.RevealRunConfigurationExtension">
|
||||
<REVEAL_SETTINGS autoInject="false" autoInstall="true" askToEnableAutoInstall="true" />
|
||||
</EXTENSION>
|
||||
|
||||
@ -7,15 +7,11 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
6841A4F018B0E07966C1CEFC /* PagedResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */; };
|
||||
6841A85D4B60DB71D1E68DA0 /* ImageGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6841AC687EA6293A0757678C /* ImageGrid.swift */; };
|
||||
7A000AA224C2EEDE001F5B00 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A000AA124C2EEDE001F5B00 /* Location.swift */; };
|
||||
7A0420AA25619AEC00034941 /* Osago.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420A925619AEC00034941 /* Osago.swift */; };
|
||||
7A0420AD2561A0B100034941 /* OsagoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420AC2561A0B100034941 /* OsagoController.swift */; };
|
||||
7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B02561A0E100034941 /* OsagoAddController.swift */; };
|
||||
7A0420B62568650C00034941 /* DkbmController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B52568650C00034941 /* DkbmController.swift */; };
|
||||
7A0420BA25693D2C00034941 /* dkbm.js in Resources */ = {isa = PBXBuildFile; fileRef = 7A0420B925693D2C00034941 /* dkbm.js */; };
|
||||
7A05161A2414FF0900FC55AC /* DateSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0516192414FF0900FC55AC /* DateSection.swift */; };
|
||||
7A0B96A0257D6D4B000B39AD /* MultilineLabelRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0B969F257D6D4B000B39AD /* MultilineLabelRow.swift */; };
|
||||
7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090E724A394F100B4F0B2 /* AudioRecordCell.swift */; };
|
||||
7A1090EA24A3A26300B4F0B2 /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090E924A3A26300B4F0B2 /* AudioPlayer.swift */; };
|
||||
@ -28,29 +24,19 @@
|
||||
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471523FDEB2A00B424AF /* MainSplitController.swift */; };
|
||||
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471723FDEBFA00B424AF /* ReportController.swift */; };
|
||||
7A11471A23FE839000B424AF /* AuthController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471923FE839000B424AF /* AuthController.swift */; };
|
||||
7A11474423FF06CA00B424AF /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474323FF06CA00B424AF /* Api.swift */; };
|
||||
7A11474723FF2AA500B424AF /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474623FF2AA500B424AF /* User.swift */; };
|
||||
7A11474923FF2B2D00B424AF /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474823FF2B2D00B424AF /* Response.swift */; };
|
||||
7A11474B23FF368B00B424AF /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474A23FF368B00B424AF /* Settings.swift */; };
|
||||
7A15051224DB3E3000F39631 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A15051124DB3E3000F39631 /* AnyEncodable.swift */; };
|
||||
7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */; };
|
||||
7A21112A24FC3D7E003BBF6F /* AudioEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A21112924FC3D7E003BBF6F /* AudioEngine.swift */; };
|
||||
7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADC6249D43210035F39E /* RegionsController.swift */; };
|
||||
7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF2249F8B650035F39E /* RecordsController.swift */; };
|
||||
7A27ADF5249FD2F90035F39E /* FileManagerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */; };
|
||||
7A27ADF7249FEF690035F39E /* Recorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF6249FEF690035F39E /* Recorder.swift */; };
|
||||
7A27ADF924A09CAD0035F39E /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF824A09CAD0035F39E /* CocoaError.swift */; };
|
||||
7A2DE69825868AC800A113FC /* VehicleAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69725868AC800A113FC /* VehicleAd.swift */; };
|
||||
7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69A25869ABD00A113FC /* AdsController.swift */; };
|
||||
7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69D2589606A00A113FC /* ImageGridRow.swift */; };
|
||||
7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A33381024990DAE00D878F1 /* FiltersController.swift */; };
|
||||
7A333814249A532400D878F1 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A333813249A532400D878F1 /* Filter.swift */; };
|
||||
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AA24360DC800E59687 /* Dated.swift */; };
|
||||
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AC2436350B00E59687 /* SearchController.swift */; };
|
||||
7A43F9F8246C8A6200BA5B49 /* JWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A43F9F7246C8A6200BA5B49 /* JWT.swift */; };
|
||||
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7924001D3300CBFE6E /* CheckController.swift */; };
|
||||
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7D24017FEE00CBFE6E /* VehicleCell.swift */; };
|
||||
7A530B802401803A00CBFE6E /* Vehicle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7F2401803A00CBFE6E /* Vehicle.swift */; };
|
||||
7A61FF8B2575A2CD00D905D5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FF892575A2CD00D905D5 /* Localizable.strings */; };
|
||||
7A61FF912575A5B300D905D5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FF8F2575A5B300D905D5 /* InfoPlist.strings */; };
|
||||
7A61FFA0257D3CFC00D905D5 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FFA2257D3CFC00D905D5 /* Localizable.stringsdict */; };
|
||||
@ -58,15 +44,19 @@
|
||||
7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE702469DFB600ABE48E /* MediaContentView.swift */; };
|
||||
7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE712469DFB600ABE48E /* MediaBrowserViewController.swift */; };
|
||||
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE722469DFB600ABE48E /* ContentTransformers.swift */; };
|
||||
7A659B5924A2B1BA0043A0F2 /* AudioRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */; };
|
||||
7A659B5B24A3768A0043A0F2 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5A24A3768A0043A0F2 /* Substrings.swift */; };
|
||||
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; };
|
||||
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; };
|
||||
7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
|
||||
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; };
|
||||
7A6DD90E24337930009DE740 /* PlateNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90D24337930009DE740 /* PlateNumber.swift */; };
|
||||
7A6E03282485951700DB22ED /* OwnersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6E03272485951700DB22ED /* OwnersController.swift */; };
|
||||
7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */; };
|
||||
7A761C042677F18E0005F28F /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474323FF06CA00B424AF /* Api.swift */; };
|
||||
7A761C052677F1BC0005F28F /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF824A09CAD0035F39E /* CocoaError.swift */; };
|
||||
7A761C07267E8E7F0005F28F /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A15051124DB3E3000F39631 /* AnyEncodable.swift */; };
|
||||
7A761C08267E8EA20005F28F /* JWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A43F9F7246C8A6200BA5B49 /* JWT.swift */; };
|
||||
7A761C09267E8EE40005F28F /* Base64FS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE32246C095700297C33 /* Base64FS.swift */; };
|
||||
7A761C0B267E8FF90005F28F /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A761C0A267E8FF90005F28F /* Error.swift */; };
|
||||
7A813DBE2506A57100CC93B9 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A813DBD2506A57100CC93B9 /* AuthenticationServices.framework */; };
|
||||
7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A813DC22508EE4F00CC93B9 /* EventCell.swift */; };
|
||||
7A813DC5250AAF3C00CC93B9 /* LocationEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A813DC4250AAF3C00CC93B9 /* LocationEditController.swift */; };
|
||||
@ -75,12 +65,9 @@
|
||||
7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A2208248D10EC0073DFD9 /* ResizeImage.swift */; };
|
||||
7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */; };
|
||||
7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76425A0DB8F00ECF2C1 /* BundleVersion.swift */; };
|
||||
7A8AB76825A0DC8200ECF2C1 /* DebugInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76725A0DC8200ECF2C1 /* DebugInfo.swift */; };
|
||||
7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76A25A1D95500ECF2C1 /* SourceStatusRow.swift */; };
|
||||
7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE2C246B2B7400297C33 /* GoogleSignInController.swift */; };
|
||||
7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; };
|
||||
7A96AE31246B2FE400297C33 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE30246B2FE400297C33 /* Constants.swift */; };
|
||||
7A96AE33246C095700297C33 /* Base64FS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE32246C095700297C33 /* Base64FS.swift */; };
|
||||
7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */; };
|
||||
7AA7BC2C25A5DFB80053A5D5 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471C23FEA18700B424AF /* RxSwift */; };
|
||||
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471E23FEA18700B424AF /* RxRelay */; };
|
||||
@ -95,9 +82,9 @@
|
||||
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE1C2532F3EB0041AFC6 /* PKHUD */; };
|
||||
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE22253327F10041AFC6 /* DifferenceKit */; };
|
||||
7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */ = {isa = PBXBuildFile; productRef = 7AEF47A3253DC4D2001D6238 /* Eureka */; };
|
||||
7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */; };
|
||||
7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1F1267E9CC800D7AB32 /* SwiftDate */; };
|
||||
7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */; };
|
||||
7AAE6AD324CDDF950023860B /* VehicleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */; };
|
||||
7AB562BA249C9E9B00473D53 /* VehicleRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */; };
|
||||
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; };
|
||||
7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; };
|
||||
7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C92250B954900F237B2 /* Navigation.swift */; };
|
||||
@ -111,12 +98,68 @@
|
||||
7AE26A3324EEF9EC00625033 /* UIViewControllerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */; };
|
||||
7AE26A3524F31B0700625033 /* EventsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE26A3424F31B0700625033 /* EventsController.swift */; };
|
||||
7AE492A1259232F000322D2E /* MultilineLinkRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE492A0259232F000322D2E /* MultilineLinkRow.swift */; };
|
||||
7AE8424E26109F78002F6B31 /* Exportable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE8424D26109F78002F6B31 /* Exportable.swift */; };
|
||||
7AEFC3BE2529D3CC00BADFB2 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEFC3BD2529D3CC00BADFB2 /* ConfigurableCell.swift */; };
|
||||
7AEFE728240455E200910EB7 /* SettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEFE727240455E200910EB7 /* SettingsController.swift */; };
|
||||
7AF12B1D258C9CFF0090F8B8 /* Cloneable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF12B1C258C9CFF0090F8B8 /* Cloneable.swift */; };
|
||||
7AF6D1E02677A7E00086EA64 /* AutoCatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF6D1DF2677A7E00086EA64 /* AutoCatTests.swift */; };
|
||||
7AF6D1E92677A8410086EA64 /* FakeLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF6D1E82677A8410086EA64 /* FakeLocationManager.swift */; };
|
||||
7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; };
|
||||
7AF6D2052677C03B0086EA64 /* AutoCatCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
7AF6D20F2677C0EA0086EA64 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D20E2677C0EA0086EA64 /* RxCocoa */; };
|
||||
7AF6D2112677C0EA0086EA64 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2102677C0EA0086EA64 /* RxSwift */; };
|
||||
7AF6D2122677C12E0086EA64 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A000AA124C2EEDE001F5B00 /* Location.swift */; };
|
||||
7AF6D2132677C15A0086EA64 /* AudioRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */; };
|
||||
7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */; };
|
||||
7AF6D2152677C1680086EA64 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474A23FF368B00B424AF /* Settings.swift */; };
|
||||
7AF6D2162677C1680086EA64 /* Cloneable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF12B1C258C9CFF0090F8B8 /* Cloneable.swift */; };
|
||||
7AF6D2172677C1680086EA64 /* VehicleRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */; };
|
||||
7AF6D2182677C1680086EA64 /* VehicleAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69725868AC800A113FC /* VehicleAd.swift */; };
|
||||
7AF6D2192677C1680086EA64 /* DateSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0516192414FF0900FC55AC /* DateSection.swift */; };
|
||||
7AF6D21A2677C1680086EA64 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474623FF2AA500B424AF /* User.swift */; };
|
||||
7AF6D21B2677C1680086EA64 /* Vehicle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7F2401803A00CBFE6E /* Vehicle.swift */; };
|
||||
7AF6D21C2677C1680086EA64 /* DebugInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76725A0DC8200ECF2C1 /* DebugInfo.swift */; };
|
||||
7AF6D21D2677C1680086EA64 /* Osago.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420A925619AEC00034941 /* Osago.swift */; };
|
||||
7AF6D21E2677C1680086EA64 /* PlateNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90D24337930009DE740 /* PlateNumber.swift */; };
|
||||
7AF6D21F2677C1680086EA64 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474823FF2B2D00B424AF /* Response.swift */; };
|
||||
7AF6D2202677C1680086EA64 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A333813249A532400D878F1 /* Filter.swift */; };
|
||||
7AF6D2212677C1680086EA64 /* PagedResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */; };
|
||||
7AF6D2232677C2B40086EA64 /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2222677C2B40086EA64 /* Realm */; };
|
||||
7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2242677C2B40086EA64 /* RealmSwift */; };
|
||||
7AF6D2272677C2B40086EA64 /* RxRealm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2262677C2B40086EA64 /* RxRealm */; };
|
||||
7AF6D2282677C2DC0086EA64 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE30246B2FE400297C33 /* Constants.swift */; };
|
||||
7AF6D22A2677C3AD0086EA64 /* Exportable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE8424D26109F78002F6B31 /* Exportable.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
7AF6D1E22677A7E00086EA64 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 7A1146F523FDE7E500B424AF /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 7A1146FC23FDE7E500B424AF;
|
||||
remoteInfo = AutoCat;
|
||||
};
|
||||
7AF6D2022677C03B0086EA64 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 7A1146F523FDE7E500B424AF /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 7AF6D1EE2677C03B0086EA64;
|
||||
remoteInfo = AutoCatCore;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
7AF6D2092677C03B0086EA64 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
7AF6D2052677C03B0086EA64 /* AutoCatCore.framework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PagedResponse.swift; sourceTree = "<group>"; };
|
||||
6841AC687EA6293A0757678C /* ImageGrid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageGrid.swift; sourceTree = "<group>"; };
|
||||
@ -188,6 +231,7 @@
|
||||
7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = "<group>"; };
|
||||
7A6E03272485951700DB22ED /* OwnersController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OwnersController.swift; sourceTree = "<group>"; };
|
||||
7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehiclePhotoCell.swift; sourceTree = "<group>"; };
|
||||
7A761C0A267E8FF90005F28F /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
|
||||
7A813DBD2506A57100CC93B9 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/AuthenticationServices.framework; sourceTree = DEVELOPER_DIR; };
|
||||
7A813DC22508EE4F00CC93B9 /* EventCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventCell.swift; sourceTree = "<group>"; };
|
||||
7A813DC4250AAF3C00CC93B9 /* LocationEditController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationEditController.swift; sourceTree = "<group>"; };
|
||||
@ -224,6 +268,13 @@
|
||||
7AEFC3BD2529D3CC00BADFB2 /* ConfigurableCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurableCell.swift; sourceTree = "<group>"; };
|
||||
7AEFE727240455E200910EB7 /* SettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsController.swift; sourceTree = "<group>"; };
|
||||
7AF12B1C258C9CFF0090F8B8 /* Cloneable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cloneable.swift; sourceTree = "<group>"; };
|
||||
7AF6D1DD2677A7E00086EA64 /* AutoCatTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AutoCatTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7AF6D1DF2677A7E00086EA64 /* AutoCatTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCatTests.swift; sourceTree = "<group>"; };
|
||||
7AF6D1E12677A7E00086EA64 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7AF6D1E82677A8410086EA64 /* FakeLocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FakeLocationManager.swift; sourceTree = "<group>"; };
|
||||
7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AutoCatCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7AF6D1F12677C03B0086EA64 /* AutoCatCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutoCatCore.h; sourceTree = "<group>"; };
|
||||
7AF6D1F22677C03B0086EA64 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -242,6 +293,7 @@
|
||||
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */,
|
||||
7AA7BC2E25A5DFB80053A5D5 /* RxCocoa in Frameworks */,
|
||||
7AA7BC3425A5DFB80053A5D5 /* SwiftDate in Frameworks */,
|
||||
7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */,
|
||||
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */,
|
||||
7AA7BC3225A5DFB80053A5D5 /* RxRealm in Frameworks */,
|
||||
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */,
|
||||
@ -249,6 +301,27 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1DA2677A7E00086EA64 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1EC2677C03B0086EA64 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */,
|
||||
7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */,
|
||||
7AF6D2232677C2B40086EA64 /* Realm in Frameworks */,
|
||||
7AF6D2112677C0EA0086EA64 /* RxSwift in Frameworks */,
|
||||
7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */,
|
||||
7AF6D20F2677C0EA0086EA64 /* RxCocoa in Frameworks */,
|
||||
7AF6D2272677C2B40086EA64 /* RxRealm in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@ -285,6 +358,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A1146FF23FDE7E500B424AF /* AutoCat */,
|
||||
7AF6D1DE2677A7E00086EA64 /* AutoCatTests */,
|
||||
7AF6D1F02677C03B0086EA64 /* AutoCatCore */,
|
||||
7A1146FE23FDE7E500B424AF /* Products */,
|
||||
7A11474C23FFEE8700B424AF /* Frameworks */,
|
||||
);
|
||||
@ -294,6 +369,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A1146FD23FDE7E500B424AF /* AutoCat.app */,
|
||||
7AF6D1DD2677A7E00086EA64 /* AutoCatTests.xctest */,
|
||||
7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@ -306,7 +383,6 @@
|
||||
7A3F07A924360D9100E59687 /* Extensions */,
|
||||
7A6DD90424326788009DE740 /* Fonts */,
|
||||
7A0420B825693CEE00034941 /* JS */,
|
||||
7A11474523FF2A9000B424AF /* Models */,
|
||||
7A11472C23FECA3E00B424AF /* ThirdParty */,
|
||||
7A11474223FF06B600B424AF /* Utils */,
|
||||
7A6DD901242BF48D009DE740 /* Views */,
|
||||
@ -350,8 +426,6 @@
|
||||
children = (
|
||||
7A64AE6E2469DFB600ABE48E /* ATGMediaBrowser */,
|
||||
7A6DD90724329144009DE740 /* CenterTextLayer.swift */,
|
||||
7A96AE32246C095700297C33 /* Base64FS.swift */,
|
||||
7A15051124DB3E3000F39631 /* AnyEncodable.swift */,
|
||||
7ADF6C9C250FA96000F237B2 /* SwiftMaskTextfield.swift */,
|
||||
);
|
||||
path = ThirdParty;
|
||||
@ -360,12 +434,8 @@
|
||||
7A11474223FF06B600B424AF /* Utils */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A96AE30246B2FE400297C33 /* Constants.swift */,
|
||||
7A43F9F7246C8A6200BA5B49 /* JWT.swift */,
|
||||
7A11474323FF06CA00B424AF /* Api.swift */,
|
||||
7A27ADF6249FEF690035F39E /* Recorder.swift */,
|
||||
7A1090E924A3A26300B4F0B2 /* AudioPlayer.swift */,
|
||||
7A000AA124C2EEDE001F5B00 /* Location.swift */,
|
||||
7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */,
|
||||
7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */,
|
||||
);
|
||||
@ -411,9 +481,7 @@
|
||||
7A21112924FC3D7E003BBF6F /* AudioEngine.swift */,
|
||||
7A8AB76425A0DB8F00ECF2C1 /* BundleVersion.swift */,
|
||||
7AE24C5E251F1B4E00758E39 /* Buttons.swift */,
|
||||
7A27ADF824A09CAD0035F39E /* CocoaError.swift */,
|
||||
7A3F07AA24360DC800E59687 /* Dated.swift */,
|
||||
7AE8424D26109F78002F6B31 /* Exportable.swift */,
|
||||
7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */,
|
||||
7ADF6CA02512244400F237B2 /* MapExt.swift */,
|
||||
7ADF6C92250B954900F237B2 /* Navigation.swift */,
|
||||
@ -421,6 +489,7 @@
|
||||
7A659B5A24A3768A0043A0F2 /* Substrings.swift */,
|
||||
7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */,
|
||||
7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */,
|
||||
7A761C0A267E8FF90005F28F /* Error.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
@ -473,6 +542,15 @@
|
||||
path = Fonts;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7A761C06267E8E720005F28F /* ThirdParty */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A96AE32246C095700297C33 /* Base64FS.swift */,
|
||||
7A15051124DB3E3000F39631 /* AnyEncodable.swift */,
|
||||
);
|
||||
path = ThirdParty;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7A813DC7250B5C6E00CC93B9 /* Location */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -486,8 +564,69 @@
|
||||
path = Location;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7AF6D1DE2677A7E00086EA64 /* AutoCatTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7AF6D1E72677A81F0086EA64 /* Mocks */,
|
||||
7AF6D1DF2677A7E00086EA64 /* AutoCatTests.swift */,
|
||||
7AF6D1E12677A7E00086EA64 /* Info.plist */,
|
||||
);
|
||||
path = AutoCatTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7AF6D1E72677A81F0086EA64 /* Mocks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7AF6D1E82677A8410086EA64 /* FakeLocationManager.swift */,
|
||||
);
|
||||
path = Mocks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7AF6D1F02677C03B0086EA64 /* AutoCatCore */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A761C06267E8E720005F28F /* ThirdParty */,
|
||||
7AF6D2292677C3950086EA64 /* Extensions */,
|
||||
7A11474523FF2A9000B424AF /* Models */,
|
||||
7AF6D20D2677C0C30086EA64 /* Utils */,
|
||||
7AF6D1F12677C03B0086EA64 /* AutoCatCore.h */,
|
||||
7AF6D1F22677C03B0086EA64 /* Info.plist */,
|
||||
);
|
||||
path = AutoCatCore;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7AF6D20D2677C0C30086EA64 /* Utils */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A43F9F7246C8A6200BA5B49 /* JWT.swift */,
|
||||
7A11474323FF06CA00B424AF /* Api.swift */,
|
||||
7A96AE30246B2FE400297C33 /* Constants.swift */,
|
||||
7A000AA124C2EEDE001F5B00 /* Location.swift */,
|
||||
);
|
||||
path = Utils;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7AF6D2292677C3950086EA64 /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7A27ADF824A09CAD0035F39E /* CocoaError.swift */,
|
||||
7AE8424D26109F78002F6B31 /* Exportable.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
7AF6D1EA2677C03B0086EA64 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
7A1146FC23FDE7E500B424AF /* AutoCat */ = {
|
||||
isa = PBXNativeTarget;
|
||||
@ -496,10 +635,12 @@
|
||||
7A1146F923FDE7E500B424AF /* Sources */,
|
||||
7A1146FA23FDE7E500B424AF /* Frameworks */,
|
||||
7A1146FB23FDE7E500B424AF /* Resources */,
|
||||
7AF6D2092677C03B0086EA64 /* Embed Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
7AF6D2032677C03B0086EA64 /* PBXTargetDependency */,
|
||||
);
|
||||
name = AutoCat;
|
||||
packageProductDependencies = (
|
||||
@ -521,19 +662,71 @@
|
||||
productReference = 7A1146FD23FDE7E500B424AF /* AutoCat.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
7AF6D1DC2677A7E00086EA64 /* AutoCatTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 7AF6D1E62677A7E00086EA64 /* Build configuration list for PBXNativeTarget "AutoCatTests" */;
|
||||
buildPhases = (
|
||||
7AF6D1D92677A7E00086EA64 /* Sources */,
|
||||
7AF6D1DA2677A7E00086EA64 /* Frameworks */,
|
||||
7AF6D1DB2677A7E00086EA64 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
7AF6D1E32677A7E00086EA64 /* PBXTargetDependency */,
|
||||
);
|
||||
name = AutoCatTests;
|
||||
productName = AutoCatTests;
|
||||
productReference = 7AF6D1DD2677A7E00086EA64 /* AutoCatTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
7AF6D1EE2677C03B0086EA64 /* AutoCatCore */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 7AF6D2062677C03B0086EA64 /* Build configuration list for PBXNativeTarget "AutoCatCore" */;
|
||||
buildPhases = (
|
||||
7AF6D1EA2677C03B0086EA64 /* Headers */,
|
||||
7AF6D1EB2677C03B0086EA64 /* Sources */,
|
||||
7AF6D1EC2677C03B0086EA64 /* Frameworks */,
|
||||
7AF6D1ED2677C03B0086EA64 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = AutoCatCore;
|
||||
packageProductDependencies = (
|
||||
7AF6D20E2677C0EA0086EA64 /* RxCocoa */,
|
||||
7AF6D2102677C0EA0086EA64 /* RxSwift */,
|
||||
7AF6D2222677C2B40086EA64 /* Realm */,
|
||||
7AF6D2242677C2B40086EA64 /* RealmSwift */,
|
||||
7AF6D2262677C2B40086EA64 /* RxRealm */,
|
||||
7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */,
|
||||
7AABB1F1267E9CC800D7AB32 /* SwiftDate */,
|
||||
);
|
||||
productName = AutoCatCore;
|
||||
productReference = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
7A1146F523FDE7E500B424AF /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1130;
|
||||
LastSwiftUpdateCheck = 1250;
|
||||
LastUpgradeCheck = 1130;
|
||||
ORGANIZATIONNAME = "Selim Mustafaev";
|
||||
TargetAttributes = {
|
||||
7A1146FC23FDE7E500B424AF = {
|
||||
CreatedOnToolsVersion = 11.3.1;
|
||||
};
|
||||
7AF6D1DC2677A7E00086EA64 = {
|
||||
CreatedOnToolsVersion = 12.5;
|
||||
TestTargetID = 7A1146FC23FDE7E500B424AF;
|
||||
};
|
||||
7AF6D1EE2677C03B0086EA64 = {
|
||||
CreatedOnToolsVersion = 12.5;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 7A1146F823FDE7E500B424AF /* Build configuration list for PBXProject "AutoCat" */;
|
||||
@ -562,6 +755,8 @@
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
7A1146FC23FDE7E500B424AF /* AutoCat */,
|
||||
7AF6D1EE2677C03B0086EA64 /* AutoCatCore */,
|
||||
7AF6D1DC2677A7E00086EA64 /* AutoCatTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@ -583,6 +778,20 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1DB2677A7E00086EA64 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1ED2677C03B0086EA64 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@ -591,12 +800,8 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7AEFC3BE2529D3CC00BADFB2 /* ConfigurableCell.swift in Sources */,
|
||||
7A96AE33246C095700297C33 /* Base64FS.swift in Sources */,
|
||||
7A530B802401803A00CBFE6E /* Vehicle.swift in Sources */,
|
||||
7A96AE31246B2FE400297C33 /* Constants.swift in Sources */,
|
||||
7A11470123FDE7E500B424AF /* AppDelegate.swift in Sources */,
|
||||
7ADF6C9D250FA96000F237B2 /* SwiftMaskTextfield.swift in Sources */,
|
||||
7A27ADF924A09CAD0035F39E /* CocoaError.swift in Sources */,
|
||||
7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */,
|
||||
7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */,
|
||||
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */,
|
||||
@ -604,10 +809,9 @@
|
||||
7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */,
|
||||
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */,
|
||||
7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */,
|
||||
7AB562BA249C9E9B00473D53 /* VehicleRegion.swift in Sources */,
|
||||
7A0B96A0257D6D4B000B39AD /* MultilineLabelRow.swift in Sources */,
|
||||
7A659B5924A2B1BA0043A0F2 /* AudioRecord.swift in Sources */,
|
||||
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */,
|
||||
7A761C0B267E8FF90005F28F /* Error.swift in Sources */,
|
||||
7AE26A3524F31B0700625033 /* EventsController.swift in Sources */,
|
||||
7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */,
|
||||
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */,
|
||||
@ -617,7 +821,6 @@
|
||||
7AE26A3324EEF9EC00625033 /* UIViewControllerExt.swift in Sources */,
|
||||
7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */,
|
||||
7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */,
|
||||
7A6DD90E24337930009DE740 /* PlateNumber.swift in Sources */,
|
||||
7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */,
|
||||
7A659B5B24A3768A0043A0F2 /* Substrings.swift in Sources */,
|
||||
7AEFE728240455E200910EB7 /* SettingsController.swift in Sources */,
|
||||
@ -625,35 +828,24 @@
|
||||
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */,
|
||||
7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */,
|
||||
7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */,
|
||||
7A11474923FF2B2D00B424AF /* Response.swift in Sources */,
|
||||
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */,
|
||||
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */,
|
||||
7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */,
|
||||
7AF12B1D258C9CFF0090F8B8 /* Cloneable.swift in Sources */,
|
||||
7A11471A23FE839000B424AF /* AuthController.swift in Sources */,
|
||||
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */,
|
||||
7A6E03282485951700DB22ED /* OwnersController.swift in Sources */,
|
||||
7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */,
|
||||
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */,
|
||||
7AE8424E26109F78002F6B31 /* Exportable.swift in Sources */,
|
||||
7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */,
|
||||
7A15051224DB3E3000F39631 /* AnyEncodable.swift in Sources */,
|
||||
7A1090EA24A3A26300B4F0B2 /* AudioPlayer.swift in Sources */,
|
||||
7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */,
|
||||
7A11474723FF2AA500B424AF /* User.swift in Sources */,
|
||||
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */,
|
||||
7A2DE69825868AC800A113FC /* VehicleAd.swift in Sources */,
|
||||
7A813DC5250AAF3C00CC93B9 /* LocationEditController.swift in Sources */,
|
||||
7A43F9F8246C8A6200BA5B49 /* JWT.swift in Sources */,
|
||||
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
|
||||
7A8AB76825A0DC8200ECF2C1 /* DebugInfo.swift in Sources */,
|
||||
7ADF6C9F251201D200F237B2 /* GlobalEventsController.swift in Sources */,
|
||||
7AAE6AD324CDDF950023860B /* VehicleEvent.swift in Sources */,
|
||||
7A11470323FDE7E500B424AF /* SceneDelegate.swift in Sources */,
|
||||
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */,
|
||||
7A813DCB250B5DC900CC93B9 /* LocationPickerController.swift in Sources */,
|
||||
7A0420AA25619AEC00034941 /* Osago.swift in Sources */,
|
||||
7A11474423FF06CA00B424AF /* Api.swift in Sources */,
|
||||
7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */,
|
||||
7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */,
|
||||
7A0420AD2561A0B100034941 /* OsagoController.swift in Sources */,
|
||||
@ -662,23 +854,70 @@
|
||||
7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */,
|
||||
7ADF6C95250D037700F237B2 /* ShowEventController.swift in Sources */,
|
||||
7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */,
|
||||
7A05161A2414FF0900FC55AC /* DateSection.swift in Sources */,
|
||||
7AE492A1259232F000322D2E /* MultilineLinkRow.swift in Sources */,
|
||||
7A333814249A532400D878F1 /* Filter.swift in Sources */,
|
||||
7A11474B23FF368B00B424AF /* Settings.swift in Sources */,
|
||||
7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */,
|
||||
7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */,
|
||||
7A64AE732469DFB600ABE48E /* DismissAnimationController.swift in Sources */,
|
||||
7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */,
|
||||
7A000AA224C2EEDE001F5B00 /* Location.swift in Sources */,
|
||||
7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */,
|
||||
6841A85D4B60DB71D1E68DA0 /* ImageGrid.swift in Sources */,
|
||||
6841A4F018B0E07966C1CEFC /* PagedResponse.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1D92677A7E00086EA64 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7AF6D1E02677A7E00086EA64 /* AutoCatTests.swift in Sources */,
|
||||
7AF6D1E92677A8410086EA64 /* FakeLocationManager.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
7AF6D1EB2677C03B0086EA64 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7AF6D2182677C1680086EA64 /* VehicleAd.swift in Sources */,
|
||||
7A761C08267E8EA20005F28F /* JWT.swift in Sources */,
|
||||
7AF6D2282677C2DC0086EA64 /* Constants.swift in Sources */,
|
||||
7A761C09267E8EE40005F28F /* Base64FS.swift in Sources */,
|
||||
7AF6D2202677C1680086EA64 /* Filter.swift in Sources */,
|
||||
7A761C042677F18E0005F28F /* Api.swift in Sources */,
|
||||
7AF6D21C2677C1680086EA64 /* DebugInfo.swift in Sources */,
|
||||
7AF6D2122677C12E0086EA64 /* Location.swift in Sources */,
|
||||
7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */,
|
||||
7AF6D2172677C1680086EA64 /* VehicleRegion.swift in Sources */,
|
||||
7AF6D21E2677C1680086EA64 /* PlateNumber.swift in Sources */,
|
||||
7AF6D21F2677C1680086EA64 /* Response.swift in Sources */,
|
||||
7A761C07267E8E7F0005F28F /* AnyEncodable.swift in Sources */,
|
||||
7AF6D2162677C1680086EA64 /* Cloneable.swift in Sources */,
|
||||
7AF6D21A2677C1680086EA64 /* User.swift in Sources */,
|
||||
7AF6D21D2677C1680086EA64 /* Osago.swift in Sources */,
|
||||
7AF6D2152677C1680086EA64 /* Settings.swift in Sources */,
|
||||
7A761C052677F1BC0005F28F /* CocoaError.swift in Sources */,
|
||||
7AF6D2132677C15A0086EA64 /* AudioRecord.swift in Sources */,
|
||||
7AF6D21B2677C1680086EA64 /* Vehicle.swift in Sources */,
|
||||
7AF6D22A2677C3AD0086EA64 /* Exportable.swift in Sources */,
|
||||
7AF6D2212677C1680086EA64 /* PagedResponse.swift in Sources */,
|
||||
7AF6D2192677C1680086EA64 /* DateSection.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
7AF6D1E32677A7E00086EA64 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 7A1146FC23FDE7E500B424AF /* AutoCat */;
|
||||
targetProxy = 7AF6D1E22677A7E00086EA64 /* PBXContainerItemProxy */;
|
||||
};
|
||||
7AF6D2032677C03B0086EA64 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 7AF6D1EE2677C03B0086EA64 /* AutoCatCore */;
|
||||
targetProxy = 7AF6D2022677C03B0086EA64 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
7A11470623FDE7E500B424AF /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
@ -848,6 +1087,7 @@
|
||||
7A11471223FDE7E600B424AF /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -872,6 +1112,7 @@
|
||||
7A11471323FDE7E600B424AF /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -893,6 +1134,106 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
7AF6D1E42677A7E00086EA64 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = AutoCatTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.5;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCatTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AutoCat.app/AutoCat";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
7AF6D1E52677A7E00086EA64 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = AutoCatTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.5;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCatTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AutoCat.app/AutoCat";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
7AF6D2072677C03B0086EA64 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 46DTTB8X4S;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AutoCatCore/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCatCore;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
7AF6D2082677C03B0086EA64 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 46DTTB8X4S;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AutoCatCore/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.AutoCatCore;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
@ -914,6 +1255,24 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
7AF6D1E62677A7E00086EA64 /* Build configuration list for PBXNativeTarget "AutoCatTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
7AF6D1E42677A7E00086EA64 /* Debug */,
|
||||
7AF6D1E52677A7E00086EA64 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
7AF6D2062677C03B0086EA64 /* Build configuration list for PBXNativeTarget "AutoCatCore" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
7AF6D2072677C03B0086EA64 /* Debug */,
|
||||
7AF6D2082677C03B0086EA64 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
|
||||
/* Begin XCRemoteSwiftPackageReference section */
|
||||
@ -1037,6 +1396,16 @@
|
||||
package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */;
|
||||
productName = ExceptionCatcher;
|
||||
};
|
||||
7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7AABDE21253327F10041AFC6 /* XCRemoteSwiftPackageReference "DifferenceKit" */;
|
||||
productName = DifferenceKit;
|
||||
};
|
||||
7AABB1F1267E9CC800D7AB32 /* SwiftDate */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A05160F241412CA00FC55AC /* XCRemoteSwiftPackageReference "SwiftDate" */;
|
||||
productName = SwiftDate;
|
||||
};
|
||||
7AABDE1C2532F3EB0041AFC6 /* PKHUD */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7AABDE1B2532F3EB0041AFC6 /* XCRemoteSwiftPackageReference "PKHUD" */;
|
||||
@ -1057,6 +1426,31 @@
|
||||
package = 7AF58D322402A91C00CE01A0 /* XCRemoteSwiftPackageReference "Kingfisher" */;
|
||||
productName = Kingfisher;
|
||||
};
|
||||
7AF6D20E2677C0EA0086EA64 /* RxCocoa */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
|
||||
productName = RxCocoa;
|
||||
};
|
||||
7AF6D2102677C0EA0086EA64 /* RxSwift */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
|
||||
productName = RxSwift;
|
||||
};
|
||||
7AF6D2222677C2B40086EA64 /* Realm */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
|
||||
productName = Realm;
|
||||
};
|
||||
7AF6D2242677C2B40086EA64 /* RealmSwift */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
|
||||
productName = RealmSwift;
|
||||
};
|
||||
7AF6D2262677C2B40086EA64 /* RxRealm */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 7A530B89240181F500CBFE6E /* XCRemoteSwiftPackageReference "RxRealm" */;
|
||||
productName = RxRealm;
|
||||
};
|
||||
/* End XCSwiftPackageProductDependency section */
|
||||
};
|
||||
rootObject = 7A1146F523FDE7E500B424AF /* Project object */;
|
||||
|
||||
@ -33,7 +33,7 @@
|
||||
"repositoryURL": "https://github.com/onevcat/Kingfisher",
|
||||
"state": {
|
||||
"branch": null,
|
||||
"revision": "2a10bf41da75599a9f8e872dbd44fe0155a2e00c",
|
||||
"revision": "1a0c2df04b31ed7aa318354f3583faea24f006fc",
|
||||
"version": "5.15.8"
|
||||
}
|
||||
},
|
||||
|
||||
@ -28,6 +28,26 @@
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7AF6D1DC2677A7E00086EA64"
|
||||
BuildableName = "AutoCatTests.xctest"
|
||||
BlueprintName = "AutoCatTests"
|
||||
ReferencedContainer = "container:AutoCat.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "7AF6D1F62677C03B0086EA64"
|
||||
BuildableName = "AutoCatCoreTests.xctest"
|
||||
BlueprintName = "AutoCatCoreTests"
|
||||
ReferencedContainer = "container:AutoCat.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
|
||||
@ -9,152 +9,157 @@
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>AutoCatCore.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>DifferenceKit (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>5</integer>
|
||||
</dict>
|
||||
<key>DifferenceKit (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
<key>DifferenceKit (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>8</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>9</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>19</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>23</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>7</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 1.xcscheme</key>
|
||||
<key>DifferenceKit (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>14</integer>
|
||||
<integer>8</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>15</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>13</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>16</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>18</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>13</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 1.xcscheme</key>
|
||||
<key>DifferenceKit (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 2.xcscheme</key>
|
||||
<key>Eureka (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>3</integer>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 3.xcscheme</key>
|
||||
<key>Eureka (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>11</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>23</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>25</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>27</integer>
|
||||
</dict>
|
||||
<key>Eureka (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>9</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>16</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 4.xcscheme</key>
|
||||
<key>GettingStarted (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>17</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 5.xcscheme</key>
|
||||
<key>GettingStarted (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>14</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>18</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
<key>GettingStarted (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>15</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>5</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>19</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>20</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>22</integer>
|
||||
</dict>
|
||||
<key>Rx (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
<key>SwiftDate (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
@ -168,35 +173,35 @@
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>10</integer>
|
||||
<integer>13</integer>
|
||||
</dict>
|
||||
<key>SwiftDate (Playground) 3.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>20</integer>
|
||||
<integer>24</integer>
|
||||
</dict>
|
||||
<key>SwiftDate (Playground) 4.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>22</integer>
|
||||
<integer>26</integer>
|
||||
</dict>
|
||||
<key>SwiftDate (Playground) 5.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>24</integer>
|
||||
<integer>28</integer>
|
||||
</dict>
|
||||
<key>SwiftDate (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false />
|
||||
<key>orderHint</key>
|
||||
<integer>11</integer>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
|
||||
@ -4,6 +4,7 @@ import RxSwift
|
||||
import RxCocoa
|
||||
import os.log
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
extension OSLog {
|
||||
static let startup = OSLog(subsystem: "pro.aliencat.autocat.startup", category: "startup")
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import UIKit
|
||||
import RxSwift
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class AudioRecordCell: UITableViewCell, ConfigurableCell {
|
||||
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import UIKit
|
||||
import AutoCatCore
|
||||
|
||||
class EventCell: UITableViewCell {
|
||||
@IBOutlet weak var address: UILabel!
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import UIKit
|
||||
import AutoCatCore
|
||||
|
||||
class VehicleCell: UITableViewCell, ConfigurableCell {
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import Kingfisher
|
||||
import AutoCatCore
|
||||
|
||||
class VehiclePhotoCell: UICollectionViewCell {
|
||||
@IBOutlet weak var photo: UIImageView!
|
||||
|
||||
@ -2,6 +2,7 @@ import UIKit
|
||||
import Eureka
|
||||
import Kingfisher
|
||||
import SafariServices
|
||||
import AutoCatCore
|
||||
|
||||
class AdsController: FormViewController, MediaBrowserViewControllerDataSource {
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@ import RxCocoa
|
||||
import RealmSwift
|
||||
import AuthenticationServices
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class AuthController: UIViewController, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ import SwiftDate
|
||||
import RxRealm
|
||||
import PKHUD
|
||||
import CoreLocation
|
||||
import AutoCatCore
|
||||
|
||||
enum EventAction: Equatable {
|
||||
case doNotSend
|
||||
@ -251,7 +252,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
|
||||
// MARK: - UITextFieldDelegate
|
||||
|
||||
@IBAction func textFieldDidBeginEditing(_ textField: UITextField) {
|
||||
LocationManager.requestCurrentLocation().subscribe().disposed(by: self.bag)
|
||||
RxLocationManager.requestCurrentLocation().subscribe().disposed(by: self.bag)
|
||||
}
|
||||
|
||||
@IBAction func textFieldDidChange(_ textField: UITextField) {
|
||||
@ -362,10 +363,10 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
|
||||
return Single.just(event)
|
||||
}
|
||||
|
||||
if let event = LocationManager.lastEvent, (Date().timeIntervalSince1970 - event.date) < 100 {
|
||||
if let event = RxLocationManager.lastEvent, (Date().timeIntervalSince1970 - event.date) < 100 {
|
||||
return Single<VehicleEvent>.just(event)
|
||||
} else {
|
||||
return LocationManager.requestCurrentLocation()
|
||||
return RxLocationManager.requestCurrentLocation()
|
||||
}
|
||||
}
|
||||
|
||||
@ -410,7 +411,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
|
||||
}
|
||||
.compactMap { $0 }
|
||||
|
||||
LocationManager.resetLastEvent()
|
||||
RxLocationManager.resetLastEvent()
|
||||
|
||||
if vehicleResult.vehicle.unrecognized {
|
||||
let realm = try Realm()
|
||||
|
||||
@ -1,44 +1,7 @@
|
||||
import UIKit
|
||||
import Eureka
|
||||
import RxSwift
|
||||
|
||||
enum AddedBy: String, CustomStringConvertible, CaseIterable {
|
||||
case anyone
|
||||
case me
|
||||
case anyoneButMe
|
||||
|
||||
var description: String {
|
||||
switch self {
|
||||
case .anyone: return NSLocalizedString("Anyone", comment: "Added by")
|
||||
case .me: return NSLocalizedString("Me", comment: "Added by")
|
||||
case .anyoneButMe: return NSLocalizedString("Anyone but me", comment: "Added by")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum SortParameter: String, CustomStringConvertible, CaseIterable {
|
||||
case addedDate
|
||||
case updatedDate
|
||||
|
||||
var description: String {
|
||||
switch self {
|
||||
case .addedDate: return NSLocalizedString("added time", comment: "sort by added time")
|
||||
case .updatedDate: return NSLocalizedString("updated time", comment: "sort by updated time")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum SortOrder: String, CustomStringConvertible, CaseIterable {
|
||||
case ascending
|
||||
case descending
|
||||
|
||||
var description: String {
|
||||
switch self {
|
||||
case .ascending: return NSLocalizedString("ascending", comment: "sort order")
|
||||
case .descending: return NSLocalizedString("descending", comment: "sort order")
|
||||
}
|
||||
}
|
||||
}
|
||||
import AutoCatCore
|
||||
|
||||
class FiltersController: FormViewController {
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import WebKit
|
||||
import CommonCrypto
|
||||
import RxSwift
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
struct TokenResponse: Codable {
|
||||
var id_token: String
|
||||
|
||||
@ -6,6 +6,7 @@ import RealmSwift
|
||||
import PKHUD
|
||||
import MobileCoreServices
|
||||
import ExceptionCatcher
|
||||
import AutoCatCore
|
||||
|
||||
class EventPin: NSObject, MKAnnotation {
|
||||
var coordinate: CLLocationCoordinate2D
|
||||
|
||||
@ -2,6 +2,7 @@ import UIKit
|
||||
import MapKit
|
||||
import RxSwift
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class GlobalEventsController: UIViewController {
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ import UIKit
|
||||
import Eureka
|
||||
import RxSwift
|
||||
import CoreLocation
|
||||
import AutoCatCore
|
||||
|
||||
class LocationEditController: FormViewController {
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import MapKit
|
||||
import Eureka
|
||||
import RxSwift
|
||||
import Intents
|
||||
import AutoCatCore
|
||||
|
||||
public struct Placemark: Equatable {
|
||||
var latitude: Double
|
||||
@ -124,7 +125,7 @@ public class LocationPickerController : UIViewController, TypedRowControllerType
|
||||
|
||||
self.address = nil
|
||||
self.geocodingDisposable?.dispose()
|
||||
self.geocodingDisposable = LocationManager
|
||||
self.geocodingDisposable = RxLocationManager
|
||||
.getAddressForLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
|
||||
.observeOn(MainScheduler.instance)
|
||||
.subscribe(onSuccess: { address in
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import MapKit
|
||||
import AutoCatCore
|
||||
|
||||
class ShowEventController: UIViewController {
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import Eureka
|
||||
import PKHUD
|
||||
import RxSwift
|
||||
import RxCocoa
|
||||
import AutoCatCore
|
||||
|
||||
enum OsagoCheckSource: Equatable, CustomStringConvertible {
|
||||
case plateNumber(number: String)
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import UIKit
|
||||
import Eureka
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class OsagoController: FormViewController {
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import Eureka
|
||||
import AutoCatCore
|
||||
|
||||
class OwnersController: FormViewController {
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@ import CoreSpotlight
|
||||
import MobileCoreServices
|
||||
import os.log
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class RecordsController: UIViewController, UITableViewDelegate {
|
||||
|
||||
@ -94,7 +95,7 @@ class RecordsController: UIViewController, UITableViewDelegate {
|
||||
var alert: UIAlertController?
|
||||
var url: URL!
|
||||
|
||||
let locationObservable = LocationManager.requestCurrentLocation()
|
||||
let locationObservable = RxLocationManager.requestCurrentLocation()
|
||||
.map(Optional.init)
|
||||
.catchErrorJustReturn(nil)
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import RxSwift
|
||||
import AutoCatCore
|
||||
|
||||
class RegionsDataSourse: UITableViewDiffableDataSource<VehicleRegion, Int> {
|
||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
||||
|
||||
@ -3,6 +3,7 @@ import Kingfisher
|
||||
import LinkPresentation
|
||||
import RealmSwift
|
||||
import Eureka
|
||||
import AutoCatCore
|
||||
|
||||
class ReportController: FormViewController, MediaBrowserViewControllerDataSource, MediaBrowserViewControllerDelegate, UIActivityItemSource {
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@ import RxCocoa
|
||||
import RealmSwift
|
||||
import PKHUD
|
||||
import ExceptionCatcher
|
||||
import AutoCatCore
|
||||
|
||||
class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDelegate, UIScrollViewDelegate {
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import UIKit
|
||||
import Eureka
|
||||
import AuthenticationServices
|
||||
import AutoCatCore
|
||||
|
||||
class SettingsController: FormViewController {
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import Foundation
|
||||
import SwiftDate
|
||||
import DifferenceKit
|
||||
import AutoCatCore
|
||||
|
||||
protocol Dated {
|
||||
var added: Date { get }
|
||||
|
||||
27
AutoCat/Extensions/Error.swift
Normal file
27
AutoCat/Extensions/Error.swift
Normal file
@ -0,0 +1,27 @@
|
||||
import UIKit
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
extension UIViewController {
|
||||
func show(error: Error, animated: Bool = true, completion: (() -> Void)? = nil) {
|
||||
let msg = (error as NSError).displayMessage
|
||||
let alert = UIAlertController(title: msg.title, message: msg.body, preferredStyle: .alert)
|
||||
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in
|
||||
completion?()
|
||||
}))
|
||||
self.present(alert, animated: animated)
|
||||
}
|
||||
|
||||
func showAlert(title: String, message: String) {
|
||||
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
|
||||
self.present(alert, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
extension HUD {
|
||||
static func show(error: Error) {
|
||||
let msg = (error as NSError).displayMessage
|
||||
self.flash(.labeledError(title: msg.title, subtitle: msg.body), delay: 2.0)
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import Kingfisher
|
||||
import AutoCatCore
|
||||
|
||||
extension Vehicle {
|
||||
func drawLine(y: CGFloat, width: CGFloat, margin: CGFloat = 15,context: CGContext) {
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
enum DebugInfoStatus: Int {
|
||||
case success = 0
|
||||
case error = 1
|
||||
case warning = 2
|
||||
}
|
||||
|
||||
class DebugInfo: Object, Decodable {
|
||||
@objc dynamic var autocod: DebugInfoEntry!
|
||||
@objc dynamic var vin01vin: DebugInfoEntry!
|
||||
@objc dynamic var vin01base: DebugInfoEntry!
|
||||
@objc dynamic var vin01history: DebugInfoEntry!
|
||||
@objc dynamic var nomerogram: DebugInfoEntry!
|
||||
}
|
||||
|
||||
class DebugInfoEntry: Object, Decodable {
|
||||
@objc dynamic var fields: Int64 = 0
|
||||
@objc dynamic var error: String?
|
||||
@objc dynamic var status: Int = 0
|
||||
|
||||
var statusEnum: DebugInfoStatus {
|
||||
get { DebugInfoStatus(rawValue: self.status)! }
|
||||
set { self.status = newValue.rawValue }
|
||||
}
|
||||
}
|
||||
@ -1,75 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
struct Filter {
|
||||
var searchString = ""
|
||||
var brand: String?
|
||||
var model: String?
|
||||
var color: String?
|
||||
var year: String?
|
||||
var regions: [Int]?
|
||||
var addedBy: AddedBy?
|
||||
var sortBy: SortParameter? = .updatedDate
|
||||
var sortOrder: SortOrder? = .descending
|
||||
var fromDate: Date?
|
||||
var toDate: Date?
|
||||
var fromDateUpdated: Date?
|
||||
var toDateUpdated: Date?
|
||||
|
||||
mutating func clear() {
|
||||
self.brand = nil
|
||||
self.model = nil
|
||||
self.color = nil
|
||||
self.year = nil
|
||||
self.regions = nil
|
||||
self.addedBy = nil
|
||||
self.sortBy = .updatedDate
|
||||
self.sortOrder = .descending
|
||||
self.fromDate = nil
|
||||
self.toDate = nil
|
||||
self.fromDateUpdated = nil
|
||||
self.toDateUpdated = nil
|
||||
}
|
||||
|
||||
func queryDictionary() -> [String: String] {
|
||||
var dict: [String: String] = ["query": self.searchString]
|
||||
|
||||
if let brand = self.brand {
|
||||
dict["brand"] = brand
|
||||
}
|
||||
if let model = self.model {
|
||||
dict["model"] = model
|
||||
}
|
||||
if let color = self.color {
|
||||
dict["color"] = color
|
||||
}
|
||||
if let year = self.year {
|
||||
dict["year"] = year
|
||||
}
|
||||
if let regions = self.regions {
|
||||
dict["regions"] = regions.map(String.init).joined(separator: ",")
|
||||
}
|
||||
if let addedBy = self.addedBy {
|
||||
dict["addedBy"] = addedBy.rawValue
|
||||
}
|
||||
if let sortBy = self.sortBy {
|
||||
dict["sortBy"] = sortBy.rawValue
|
||||
}
|
||||
if let sortOrder = self.sortOrder {
|
||||
dict["sortOrder"] = sortOrder.rawValue
|
||||
}
|
||||
if let fromDate = self.fromDate {
|
||||
dict["fromDate"] = String(fromDate.timeIntervalSince1970)
|
||||
}
|
||||
if let toDate = self.toDate {
|
||||
dict["toDate"] = String(toDate.timeIntervalSince1970)
|
||||
}
|
||||
if let fromDateUpdated = self.fromDateUpdated {
|
||||
dict["fromDateUpdated"] = String(fromDateUpdated.timeIntervalSince1970)
|
||||
}
|
||||
if let toDateUpdated = self.toDateUpdated {
|
||||
dict["toDateUpdated"] = String(toDateUpdated.timeIntervalSince1970)
|
||||
}
|
||||
|
||||
return dict
|
||||
}
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
class Osago: Object, Decodable, Cloneable {
|
||||
@objc dynamic var date: TimeInterval = 0
|
||||
@objc dynamic var number: String = ""
|
||||
@objc dynamic var vin: String?
|
||||
@objc dynamic var plateNumber: String?
|
||||
@objc dynamic var name: String = ""
|
||||
@objc dynamic var status: String = ""
|
||||
@objc dynamic var restrictions: String = ""
|
||||
@objc dynamic var insurant: String?
|
||||
@objc dynamic var owner: String?
|
||||
@objc dynamic var usageRegion: String?
|
||||
|
||||
required init(copy: Osago) {
|
||||
self.date = copy.date
|
||||
self.number = copy.number
|
||||
self.vin = copy.vin
|
||||
self.plateNumber = copy.plateNumber
|
||||
self.name = copy.name
|
||||
self.status = copy.status
|
||||
self.restrictions = copy.restrictions
|
||||
self.insurant = copy.insurant
|
||||
self.owner = copy.owner
|
||||
self.usageRegion = copy.usageRegion
|
||||
}
|
||||
|
||||
required init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
class PagedResponse<T>: Decodable where T: Decodable {
|
||||
let count: Int?
|
||||
let pageToken: String?
|
||||
let items: [T]
|
||||
|
||||
init() {
|
||||
self.items = []
|
||||
self.count = nil
|
||||
self.pageToken = nil
|
||||
}
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
struct User: Codable {
|
||||
let email: String
|
||||
var token: String
|
||||
var firebaseIdToken: String?
|
||||
var firebaseRefreshToken: String?
|
||||
|
||||
init() {
|
||||
self.email = ""
|
||||
self.token = ""
|
||||
}
|
||||
}
|
||||
@ -1,33 +0,0 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
class VehicleAd: Object, Decodable, Cloneable {
|
||||
@objc dynamic var id: Int = 0
|
||||
@objc dynamic var url: String?
|
||||
@objc dynamic var price: String?
|
||||
@objc dynamic var date: TimeInterval = Date().timeIntervalSince1970
|
||||
@objc dynamic var mileage: String?
|
||||
@objc dynamic var region: String?
|
||||
@objc dynamic var city: String?
|
||||
@objc dynamic var adDescription: String?
|
||||
var photos = List<String>()
|
||||
|
||||
required init(copy: VehicleAd) {
|
||||
self.id = copy.id
|
||||
self.url = copy.url
|
||||
self.price = copy.price
|
||||
self.date = copy.date
|
||||
self.mileage = copy.mileage
|
||||
self.region = copy.region
|
||||
self.city = copy.city
|
||||
self.adDescription = copy.adDescription
|
||||
|
||||
let photos = List<String>()
|
||||
photos.append(objectsIn: copy.photos)
|
||||
self.photos = photos
|
||||
}
|
||||
|
||||
required init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
struct VehicleRegion: Codable, Hashable {
|
||||
var name: String
|
||||
var codes: [Int]
|
||||
|
||||
static func == (lhs: VehicleRegion, rhs: VehicleRegion) -> Bool {
|
||||
return lhs.name == rhs.name
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,7 @@ import os.log
|
||||
import AVFoundation
|
||||
import RxSwift
|
||||
import PKHUD
|
||||
import AutoCatCore
|
||||
|
||||
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
enum Constants {
|
||||
static var baseUrl: String {
|
||||
#if DEBUG
|
||||
return "http://127.0.0.1:3000/"
|
||||
//return "http://192.168.1.67:3000/"
|
||||
//return "https://vps.aliencat.pro:8443/"
|
||||
#else
|
||||
return "https://vps.aliencat.pro:8443/"
|
||||
#endif
|
||||
}
|
||||
|
||||
static let pnLettersMap: [Character: Character] = [
|
||||
"А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O", "Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X"
|
||||
]
|
||||
|
||||
static let googleAuthURL = "https://accounts.google.com/o/oauth2/v2/auth"
|
||||
static let googleTokenURL = "https://oauth2.googleapis.com/token"
|
||||
static let googleRedirectURL = "com.googleusercontent.apps.994679674451-k7clunkk4nicl6iuajdtc5u7hvustbdb:/oauth2callback"
|
||||
|
||||
static let fbClientId = "994679674451-k7clunkk4nicl6iuajdtc5u7hvustbdb.apps.googleusercontent.com"
|
||||
static let fbApiKey = "AIzaSyDVlrQj_05y6AeZNf8enpSWFIiHhgwfnGI"
|
||||
|
||||
static let fbClientVersion = "iOS/FirebaseSDK/6.5.1/FirebaseCore-iOS"
|
||||
static let fbVerifyAssertion = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion"
|
||||
static let fbRefreshToken = "https://securetoken.googleapis.com/v1/token"
|
||||
static let fbUserAgent = "FirebaseAuth.iOS/6.5.1 ru.Vin01/1.0 iPhone/13.5 hw/sim"
|
||||
|
||||
static let secondProviderBundleId = "ru.Vin01"
|
||||
|
||||
static let reportLinkTokenSecret = "#TheTruthIsOutThere"
|
||||
static let reportLinkBaseURL = "https://auto.aliencat.pro/report.html"
|
||||
}
|
||||
@ -2,6 +2,7 @@ import UIKit
|
||||
import RealmSwift
|
||||
import DifferenceKit
|
||||
import ExceptionCatcher
|
||||
import AutoCatCore
|
||||
|
||||
typealias FilterPredicate<T> = (T) -> Bool
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ import UIKit
|
||||
import DifferenceKit
|
||||
import RxSwift
|
||||
import RxCocoa
|
||||
import AutoCatCore
|
||||
|
||||
class RxSectionedDataSource<Item,Cell>: NSObject, UITableViewDataSource where Item: Dated & Hashable & Differentiable & Decodable, Cell: UITableViewCell & ConfigurableCell, Cell.Item == Item {
|
||||
private var tv: UITableView
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import UIKit
|
||||
import AutoCatCore
|
||||
|
||||
protocol PNKeyboardDelegate: class {
|
||||
func returnClicked()
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import UIKit
|
||||
import AutoCatCore
|
||||
|
||||
class PlateView: UIView {
|
||||
// Some driver plate parameters from "ГОСТ Р 50577-93"
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import UIKit
|
||||
import Eureka
|
||||
import AutoCatCore
|
||||
|
||||
extension DebugInfoStatus {
|
||||
var color: UIColor {
|
||||
|
||||
19
AutoCatCore/AutoCatCore.h
Normal file
19
AutoCatCore/AutoCatCore.h
Normal file
@ -0,0 +1,19 @@
|
||||
//
|
||||
// AutoCatCore.h
|
||||
// AutoCatCore
|
||||
//
|
||||
// Created by Selim Mustafaev on 14.06.2021.
|
||||
// Copyright © 2021 Selim Mustafaev. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
//! Project version number for AutoCatCore.
|
||||
FOUNDATION_EXPORT double AutoCatCoreVersionNumber;
|
||||
|
||||
//! Project version string for AutoCatCore.
|
||||
FOUNDATION_EXPORT const unsigned char AutoCatCoreVersionString[];
|
||||
|
||||
// In this header, you should import all the public headers of your framework using statements like #import <AutoCatCore/PublicHeader.h>
|
||||
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
import UIKit
|
||||
import PKHUD
|
||||
import CoreLocation
|
||||
|
||||
extension NSError {
|
||||
var displayMessage: (title: String, body: String) {
|
||||
public var displayMessage: (title: String, body: String) {
|
||||
if let description = self.userInfo[NSLocalizedDescriptionKey] as? String {
|
||||
return (title: "Error", body: description)
|
||||
} else if let failure = self.userInfo[NSLocalizedFailureErrorKey] as? String, let reason = self.localizedFailureReason {
|
||||
@ -19,11 +17,11 @@ extension NSError {
|
||||
}
|
||||
|
||||
extension CocoaError {
|
||||
static func error(_ description: String) -> NSError {
|
||||
public static func error(_ description: String) -> NSError {
|
||||
return error(Code(rawValue: 0), userInfo: [NSLocalizedDescriptionKey: description], url: nil) as NSError
|
||||
}
|
||||
|
||||
static func error(_ error: String, reason: String, suggestion: String? = nil) -> NSError {
|
||||
public static func error(_ error: String, reason: String, suggestion: String? = nil) -> NSError {
|
||||
var info = [
|
||||
NSLocalizedFailureErrorKey: error,
|
||||
NSLocalizedFailureReasonErrorKey: reason
|
||||
@ -37,30 +35,6 @@ extension CocoaError {
|
||||
}
|
||||
}
|
||||
|
||||
extension UIViewController {
|
||||
func show(error: Error, animated: Bool = true, completion: (() -> Void)? = nil) {
|
||||
let msg = (error as NSError).displayMessage
|
||||
let alert = UIAlertController(title: msg.title, message: msg.body, preferredStyle: .alert)
|
||||
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in
|
||||
completion?()
|
||||
}))
|
||||
self.present(alert, animated: animated)
|
||||
}
|
||||
|
||||
func showAlert(title: String, message: String) {
|
||||
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
|
||||
self.present(alert, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
extension HUD {
|
||||
static func show(error: Error) {
|
||||
let msg = (error as NSError).displayMessage
|
||||
self.flash(.labeledError(title: msg.title, subtitle: msg.body), delay: 2.0)
|
||||
}
|
||||
}
|
||||
|
||||
extension CLError.Code: CustomStringConvertible {
|
||||
public var description: String {
|
||||
switch self {
|
||||
@ -1,6 +1,6 @@
|
||||
import Foundation
|
||||
|
||||
protocol Exportable {
|
||||
public protocol Exportable {
|
||||
static var csvHeader: String { get }
|
||||
var csvLine: String { get }
|
||||
}
|
||||
22
AutoCatCore/Info.plist
Normal file
22
AutoCatCore/Info.plist
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -2,30 +2,30 @@ import Foundation
|
||||
import RealmSwift
|
||||
import DifferenceKit
|
||||
|
||||
class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
|
||||
public class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
|
||||
|
||||
@objc dynamic var path: String = ""
|
||||
@objc dynamic var number: String?
|
||||
@objc dynamic var rawText: String = ""
|
||||
@objc public dynamic var path: String = ""
|
||||
@objc public dynamic var number: String?
|
||||
@objc public dynamic var rawText: String = ""
|
||||
@objc private dynamic var addedDate: TimeInterval = 0
|
||||
@objc dynamic var duration: TimeInterval = 0
|
||||
@objc dynamic var event: VehicleEvent?
|
||||
@objc public dynamic var duration: TimeInterval = 0
|
||||
@objc public dynamic var event: VehicleEvent?
|
||||
|
||||
var identifier: TimeInterval = 0
|
||||
var id: TimeInterval {
|
||||
public var identifier: TimeInterval = 0
|
||||
public var id: TimeInterval {
|
||||
if self.identifier == 0 {
|
||||
self.identifier = self.addedDate
|
||||
}
|
||||
return self.identifier
|
||||
}
|
||||
|
||||
var differenceIdentifier: TimeInterval { id }
|
||||
public var differenceIdentifier: TimeInterval { id }
|
||||
|
||||
func isContentEqual(to source: AudioRecord) -> Bool {
|
||||
public func isContentEqual(to source: AudioRecord) -> Bool {
|
||||
return self == source
|
||||
}
|
||||
|
||||
init(path: String, number: String?, raw: String, duration: TimeInterval, event: VehicleEvent?) {
|
||||
public init(path: String, number: String?, raw: String, duration: TimeInterval, event: VehicleEvent?) {
|
||||
self.path = path
|
||||
self.number = number
|
||||
self.duration = duration
|
||||
@ -38,15 +38,15 @@ class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
|
||||
super.init()
|
||||
}
|
||||
|
||||
override static func primaryKey() -> String? {
|
||||
public override static func primaryKey() -> String? {
|
||||
return "path"
|
||||
}
|
||||
|
||||
override class func ignoredProperties() -> [String] {
|
||||
public override class func ignoredProperties() -> [String] {
|
||||
return ["id", "identifier", "differenceIdentifier"]
|
||||
}
|
||||
|
||||
func getAddedDate() -> TimeInterval {
|
||||
public func getAddedDate() -> TimeInterval {
|
||||
if self.identifier == 0 {
|
||||
self.identifier = self.addedDate
|
||||
print("getAddedDate: \(self.identifier)")
|
||||
@ -57,7 +57,7 @@ class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
|
||||
|
||||
// MARK: - Cloneable
|
||||
|
||||
required init(copy: AudioRecord) {
|
||||
required public init(copy: AudioRecord) {
|
||||
self.path = copy.path
|
||||
self.number = copy.number
|
||||
self.rawText = copy.rawText
|
||||
@ -1,11 +1,11 @@
|
||||
import Foundation
|
||||
|
||||
protocol Cloneable {
|
||||
public protocol Cloneable {
|
||||
init(copy: Self)
|
||||
}
|
||||
|
||||
extension Cloneable {
|
||||
func clone() -> Self {
|
||||
public func clone() -> Self {
|
||||
return Self.init(copy: self)
|
||||
}
|
||||
}
|
||||
@ -2,24 +2,24 @@ import Foundation
|
||||
import SwiftDate
|
||||
import DifferenceKit
|
||||
|
||||
struct DateSection<T>: Differentiable, DifferentiableSection, Hashable where T: Differentiable & Hashable {
|
||||
public struct DateSection<T>: Differentiable, DifferentiableSection, Hashable where T: Differentiable & Hashable {
|
||||
|
||||
var timestamp: Double = 0
|
||||
var header: String
|
||||
var elements: [T]
|
||||
public var header: String
|
||||
public var elements: [T]
|
||||
|
||||
init<C>(source: DateSection<T>, elements: C) where C : Swift.Collection, C.Element == Self.Collection.Element {
|
||||
public init<C>(source: DateSection<T>, elements: C) where C : Swift.Collection, C.Element == Self.Collection.Element {
|
||||
self.timestamp = source.timestamp
|
||||
self.header = source.header
|
||||
self.elements = Array(elements)
|
||||
}
|
||||
|
||||
init(original: DateSection, items: [T]) {
|
||||
public init(original: DateSection, items: [T]) {
|
||||
self = original
|
||||
self.elements = items
|
||||
}
|
||||
|
||||
init(timestamp: Double, items: [T]) {
|
||||
public init(timestamp: Double, items: [T]) {
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateStyle = .medium
|
||||
formatter.timeStyle = .medium
|
||||
@ -51,27 +51,27 @@ struct DateSection<T>: Differentiable, DifferentiableSection, Hashable where T:
|
||||
self.elements = items
|
||||
}
|
||||
|
||||
mutating func append(_ element: T) {
|
||||
public mutating func append(_ element: T) {
|
||||
self.elements.append(element)
|
||||
}
|
||||
|
||||
// MARK: - Differentiable
|
||||
|
||||
var differenceIdentifier: String {
|
||||
public var differenceIdentifier: String {
|
||||
return header
|
||||
}
|
||||
|
||||
func isContentEqual(to source: DateSection<T>) -> Bool {
|
||||
public func isContentEqual(to source: DateSection<T>) -> Bool {
|
||||
return self.differenceIdentifier == source.differenceIdentifier
|
||||
}
|
||||
|
||||
// MARK: - Hashable
|
||||
|
||||
static func == (lhs: DateSection<T>, rhs: DateSection<T>) -> Bool {
|
||||
public static func == (lhs: DateSection<T>, rhs: DateSection<T>) -> Bool {
|
||||
return lhs.timestamp == rhs.timestamp && lhs.elements == rhs.elements
|
||||
}
|
||||
|
||||
func hash(into hasher: inout Hasher) {
|
||||
public func hash(into hasher: inout Hasher) {
|
||||
hasher.combine(self.timestamp)
|
||||
hasher.combine(self.elements)
|
||||
}
|
||||
27
AutoCatCore/Models/DebugInfo.swift
Normal file
27
AutoCatCore/Models/DebugInfo.swift
Normal file
@ -0,0 +1,27 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
public enum DebugInfoStatus: Int {
|
||||
case success = 0
|
||||
case error = 1
|
||||
case warning = 2
|
||||
}
|
||||
|
||||
public class DebugInfo: Object, Decodable {
|
||||
@objc public dynamic var autocod: DebugInfoEntry!
|
||||
@objc public dynamic var vin01vin: DebugInfoEntry!
|
||||
@objc public dynamic var vin01base: DebugInfoEntry!
|
||||
@objc public dynamic var vin01history: DebugInfoEntry!
|
||||
@objc public dynamic var nomerogram: DebugInfoEntry!
|
||||
}
|
||||
|
||||
public class DebugInfoEntry: Object, Decodable {
|
||||
@objc public dynamic var fields: Int64 = 0
|
||||
@objc public dynamic var error: String?
|
||||
@objc public dynamic var status: Int = 0
|
||||
|
||||
public var statusEnum: DebugInfoStatus {
|
||||
get { DebugInfoStatus(rawValue: self.status)! }
|
||||
set { self.status = newValue.rawValue }
|
||||
}
|
||||
}
|
||||
116
AutoCatCore/Models/Filter.swift
Normal file
116
AutoCatCore/Models/Filter.swift
Normal file
@ -0,0 +1,116 @@
|
||||
import Foundation
|
||||
|
||||
public enum AddedBy: String, CustomStringConvertible, CaseIterable {
|
||||
case anyone
|
||||
case me
|
||||
case anyoneButMe
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .anyone: return NSLocalizedString("Anyone", comment: "Added by")
|
||||
case .me: return NSLocalizedString("Me", comment: "Added by")
|
||||
case .anyoneButMe: return NSLocalizedString("Anyone but me", comment: "Added by")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum SortParameter: String, CustomStringConvertible, CaseIterable {
|
||||
case addedDate
|
||||
case updatedDate
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .addedDate: return NSLocalizedString("added time", comment: "sort by added time")
|
||||
case .updatedDate: return NSLocalizedString("updated time", comment: "sort by updated time")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum SortOrder: String, CustomStringConvertible, CaseIterable {
|
||||
case ascending
|
||||
case descending
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .ascending: return NSLocalizedString("ascending", comment: "sort order")
|
||||
case .descending: return NSLocalizedString("descending", comment: "sort order")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct Filter {
|
||||
public var searchString = ""
|
||||
public var brand: String?
|
||||
public var model: String?
|
||||
public var color: String?
|
||||
public var year: String?
|
||||
public var regions: [Int]?
|
||||
public var addedBy: AddedBy?
|
||||
public var sortBy: SortParameter? = .updatedDate
|
||||
public var sortOrder: SortOrder? = .descending
|
||||
public var fromDate: Date?
|
||||
public var toDate: Date?
|
||||
public var fromDateUpdated: Date?
|
||||
public var toDateUpdated: Date?
|
||||
|
||||
public init() {
|
||||
}
|
||||
|
||||
public mutating func clear() {
|
||||
self.brand = nil
|
||||
self.model = nil
|
||||
self.color = nil
|
||||
self.year = nil
|
||||
self.regions = nil
|
||||
self.addedBy = nil
|
||||
self.sortBy = .updatedDate
|
||||
self.sortOrder = .descending
|
||||
self.fromDate = nil
|
||||
self.toDate = nil
|
||||
self.fromDateUpdated = nil
|
||||
self.toDateUpdated = nil
|
||||
}
|
||||
|
||||
public func queryDictionary() -> [String: String] {
|
||||
var dict: [String: String] = ["query": self.searchString]
|
||||
|
||||
if let brand = self.brand {
|
||||
dict["brand"] = brand
|
||||
}
|
||||
if let model = self.model {
|
||||
dict["model"] = model
|
||||
}
|
||||
if let color = self.color {
|
||||
dict["color"] = color
|
||||
}
|
||||
if let year = self.year {
|
||||
dict["year"] = year
|
||||
}
|
||||
if let regions = self.regions {
|
||||
dict["regions"] = regions.map(String.init).joined(separator: ",")
|
||||
}
|
||||
if let addedBy = self.addedBy {
|
||||
dict["addedBy"] = addedBy.rawValue
|
||||
}
|
||||
if let sortBy = self.sortBy {
|
||||
dict["sortBy"] = sortBy.rawValue
|
||||
}
|
||||
if let sortOrder = self.sortOrder {
|
||||
dict["sortOrder"] = sortOrder.rawValue
|
||||
}
|
||||
if let fromDate = self.fromDate {
|
||||
dict["fromDate"] = String(fromDate.timeIntervalSince1970)
|
||||
}
|
||||
if let toDate = self.toDate {
|
||||
dict["toDate"] = String(toDate.timeIntervalSince1970)
|
||||
}
|
||||
if let fromDateUpdated = self.fromDateUpdated {
|
||||
dict["fromDateUpdated"] = String(fromDateUpdated.timeIntervalSince1970)
|
||||
}
|
||||
if let toDateUpdated = self.toDateUpdated {
|
||||
dict["toDateUpdated"] = String(toDateUpdated.timeIntervalSince1970)
|
||||
}
|
||||
|
||||
return dict
|
||||
}
|
||||
}
|
||||
32
AutoCatCore/Models/Osago.swift
Normal file
32
AutoCatCore/Models/Osago.swift
Normal file
@ -0,0 +1,32 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
public class Osago: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var date: TimeInterval = 0
|
||||
@objc public dynamic var number: String = ""
|
||||
@objc public dynamic var vin: String?
|
||||
@objc public dynamic var plateNumber: String?
|
||||
@objc public dynamic var name: String = ""
|
||||
@objc public dynamic var status: String = ""
|
||||
@objc public dynamic var restrictions: String = ""
|
||||
@objc public dynamic var insurant: String?
|
||||
@objc public dynamic var owner: String?
|
||||
@objc public dynamic var usageRegion: String?
|
||||
|
||||
public required init(copy: Osago) {
|
||||
self.date = copy.date
|
||||
self.number = copy.number
|
||||
self.vin = copy.vin
|
||||
self.plateNumber = copy.plateNumber
|
||||
self.name = copy.name
|
||||
self.status = copy.status
|
||||
self.restrictions = copy.restrictions
|
||||
self.insurant = copy.insurant
|
||||
self.owner = copy.owner
|
||||
self.usageRegion = copy.usageRegion
|
||||
}
|
||||
|
||||
required init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
13
AutoCatCore/Models/PagedResponse.swift
Normal file
13
AutoCatCore/Models/PagedResponse.swift
Normal file
@ -0,0 +1,13 @@
|
||||
import Foundation
|
||||
|
||||
public class PagedResponse<T>: Decodable where T: Decodable {
|
||||
public let count: Int?
|
||||
public let pageToken: String?
|
||||
public let items: [T]
|
||||
|
||||
public init() {
|
||||
self.items = []
|
||||
self.count = nil
|
||||
self.pageToken = nil
|
||||
}
|
||||
}
|
||||
@ -1,24 +1,24 @@
|
||||
import Foundation
|
||||
|
||||
class PlateNumber {
|
||||
public class PlateNumber {
|
||||
private var number: String
|
||||
private var numberEnglish: String
|
||||
|
||||
init(_ string: String) {
|
||||
public init(_ string: String) {
|
||||
self.number = string
|
||||
self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 })
|
||||
}
|
||||
|
||||
func asString() -> String {
|
||||
public func asString() -> String {
|
||||
return self.number
|
||||
}
|
||||
|
||||
func mainPart() -> String {
|
||||
public func mainPart() -> String {
|
||||
let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6)
|
||||
return String(self.numberEnglish[..<index])
|
||||
}
|
||||
|
||||
func region() -> String {
|
||||
public func region() -> String {
|
||||
let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6)
|
||||
return String(self.numberEnglish[index...])
|
||||
}
|
||||
@ -1,10 +1,10 @@
|
||||
import Foundation
|
||||
|
||||
class Settings {
|
||||
public class Settings {
|
||||
private static let defaults = UserDefaults.standard
|
||||
public static let shared = Settings()
|
||||
|
||||
var user: User {
|
||||
public var user: User {
|
||||
didSet {
|
||||
if let json = try? JSONEncoder().encode(self.user) {
|
||||
Settings.defaults.set(json, forKey: "user")
|
||||
@ -13,35 +13,35 @@ class Settings {
|
||||
}
|
||||
}
|
||||
|
||||
var recognizeAlternativeOrder: Bool = false {
|
||||
public var recognizeAlternativeOrder: Bool = false {
|
||||
didSet {
|
||||
Settings.defaults.set(self.recognizeAlternativeOrder, forKey: "recognizeAlternativeOrder")
|
||||
Settings.defaults.synchronize()
|
||||
}
|
||||
}
|
||||
|
||||
var recognizeShortenedNumbers: Bool = false {
|
||||
public var recognizeShortenedNumbers: Bool = false {
|
||||
didSet {
|
||||
Settings.defaults.set(self.recognizeShortenedNumbers, forKey: "recognizeShortenedNumbers")
|
||||
Settings.defaults.synchronize()
|
||||
}
|
||||
}
|
||||
|
||||
var defaultRegion: String = "" {
|
||||
public var defaultRegion: String = "" {
|
||||
didSet {
|
||||
Settings.defaults.set(self.defaultRegion, forKey: "defaultRegion")
|
||||
Settings.defaults.synchronize()
|
||||
}
|
||||
}
|
||||
|
||||
var recordBeep: Bool = false {
|
||||
public var recordBeep: Bool = false {
|
||||
didSet {
|
||||
Settings.defaults.set(self.recordBeep, forKey: "recordBeep")
|
||||
Settings.defaults.synchronize()
|
||||
}
|
||||
}
|
||||
|
||||
var showDebugInfo: Bool = false {
|
||||
public var showDebugInfo: Bool = false {
|
||||
didSet {
|
||||
Settings.defaults.set(self.showDebugInfo, forKey: "showDebugInfo")
|
||||
Settings.defaults.synchronize()
|
||||
13
AutoCatCore/Models/User.swift
Normal file
13
AutoCatCore/Models/User.swift
Normal file
@ -0,0 +1,13 @@
|
||||
import Foundation
|
||||
|
||||
public struct User: Codable {
|
||||
public let email: String
|
||||
public var token: String
|
||||
public var firebaseIdToken: String?
|
||||
public var firebaseRefreshToken: String?
|
||||
|
||||
public init() {
|
||||
self.email = ""
|
||||
self.token = ""
|
||||
}
|
||||
}
|
||||
@ -2,11 +2,11 @@ import Foundation
|
||||
import RealmSwift
|
||||
import DifferenceKit
|
||||
|
||||
class VehicleName: Object, Decodable, Cloneable {
|
||||
@objc dynamic var original: String?
|
||||
@objc dynamic var normalized: String?
|
||||
public class VehicleName: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var original: String?
|
||||
@objc public dynamic var normalized: String?
|
||||
|
||||
required init(copy: VehicleName) {
|
||||
public required init(copy: VehicleName) {
|
||||
self.original = copy.original
|
||||
self.normalized = copy.normalized
|
||||
}
|
||||
@ -15,11 +15,11 @@ class VehicleName: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleBrand: Object, Decodable, Cloneable {
|
||||
@objc dynamic var name: VehicleName?
|
||||
@objc dynamic var logo: String?
|
||||
public class VehicleBrand: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var name: VehicleName?
|
||||
@objc public dynamic var logo: String?
|
||||
|
||||
required init(copy: VehicleBrand) {
|
||||
public required init(copy: VehicleBrand) {
|
||||
self.name = copy.name?.clone()
|
||||
self.logo = copy.logo
|
||||
}
|
||||
@ -29,10 +29,10 @@ class VehicleBrand: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleModel: Object, Decodable, Cloneable {
|
||||
public class VehicleModel: Object, Decodable, Cloneable {
|
||||
@objc dynamic var name: VehicleName?
|
||||
|
||||
required init(copy: VehicleModel) {
|
||||
public required init(copy: VehicleModel) {
|
||||
self.name = copy.name?.clone()
|
||||
}
|
||||
|
||||
@ -41,18 +41,18 @@ class VehicleModel: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleEngine: Object, Decodable, Cloneable {
|
||||
@objc dynamic var number: String?
|
||||
var volume: RealmOptional<Int> = RealmOptional(0)
|
||||
@objc dynamic var powerHp: Float = 0
|
||||
var powerKw: RealmOptional<Float> = RealmOptional(0)
|
||||
@objc dynamic var fuelType: String?
|
||||
public class VehicleEngine: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var number: String?
|
||||
public var volume: RealmOptional<Int> = RealmOptional(0)
|
||||
@objc public dynamic var powerHp: Float = 0
|
||||
public var powerKw: RealmOptional<Float> = RealmOptional(0)
|
||||
@objc public dynamic var fuelType: String?
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case number, volume, powerHp, powerKw, fuelType
|
||||
}
|
||||
|
||||
required init(from decoder: Decoder) throws {
|
||||
required public init(from decoder: Decoder) throws {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
self.number = try container.decodeIfPresent(String.self, forKey: .number)
|
||||
self.volume = RealmOptional(try container.decodeIfPresent(Int.self, forKey: .volume))
|
||||
@ -65,7 +65,7 @@ class VehicleEngine: Object, Decodable, Cloneable {
|
||||
super.init()
|
||||
}
|
||||
|
||||
required init(copy: VehicleEngine) {
|
||||
public required init(copy: VehicleEngine) {
|
||||
self.number = copy.number
|
||||
self.volume = copy.volume
|
||||
self.powerHp = copy.powerHp
|
||||
@ -74,13 +74,13 @@ class VehicleEngine: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
class VehiclePhoto: Object, Decodable, Cloneable {
|
||||
@objc dynamic var brand: String?
|
||||
@objc dynamic var model: String?
|
||||
@objc dynamic var date: TimeInterval = 0
|
||||
@objc dynamic var url: String = ""
|
||||
public class VehiclePhoto: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var brand: String?
|
||||
@objc public dynamic var model: String?
|
||||
@objc public dynamic var date: TimeInterval = 0
|
||||
@objc public dynamic var url: String = ""
|
||||
|
||||
override var description: String {
|
||||
public override var description: String {
|
||||
let formatter = DateFormatter()
|
||||
formatter.timeZone = TimeZone(identifier:"GMT")
|
||||
formatter.dateStyle = .medium
|
||||
@ -90,7 +90,7 @@ class VehiclePhoto: Object, Decodable, Cloneable {
|
||||
return "\(self.brand ?? "") \(self.model ?? "") (\(dateStr))"
|
||||
}
|
||||
|
||||
required init(copy: VehiclePhoto) {
|
||||
public required init(copy: VehiclePhoto) {
|
||||
self.brand = copy.brand
|
||||
self.model = copy.model
|
||||
self.date = copy.date
|
||||
@ -102,11 +102,11 @@ class VehiclePhoto: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
enum OwnerType: String, CustomStringConvertible {
|
||||
public enum OwnerType: String, CustomStringConvertible {
|
||||
case legal
|
||||
case individual
|
||||
|
||||
var description: String {
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .legal: return NSLocalizedString("legal", comment: "Owner type")
|
||||
case .individual: return NSLocalizedString("individual", comment: "Owner type")
|
||||
@ -114,12 +114,12 @@ enum OwnerType: String, CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
enum SteeringWheelPosition: CustomStringConvertible {
|
||||
public enum SteeringWheelPosition: CustomStringConvertible {
|
||||
case left
|
||||
case right
|
||||
case unknown
|
||||
|
||||
var description: String {
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .left: return "Left"
|
||||
case .right: return "Right"
|
||||
@ -128,20 +128,20 @@ enum SteeringWheelPosition: CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
class VehicleOwnershipPeriod: Object, Decodable, Cloneable {
|
||||
@objc dynamic var lastOperation: String = ""
|
||||
@objc dynamic var ownerType: String = ""
|
||||
@objc dynamic var from: Int64 = 0
|
||||
@objc dynamic var to: Int64 = 0
|
||||
@objc dynamic var region: String?
|
||||
@objc dynamic var registrationRegion: String?
|
||||
@objc dynamic var locality: String?
|
||||
@objc dynamic var code: String?
|
||||
@objc dynamic var street: String?
|
||||
@objc dynamic var building: String?
|
||||
@objc dynamic var inn: String?
|
||||
public class VehicleOwnershipPeriod: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var lastOperation: String = ""
|
||||
@objc public dynamic var ownerType: String = ""
|
||||
@objc public dynamic var from: Int64 = 0
|
||||
@objc public dynamic var to: Int64 = 0
|
||||
@objc public dynamic var region: String?
|
||||
@objc public dynamic var registrationRegion: String?
|
||||
@objc public dynamic var locality: String?
|
||||
@objc public dynamic var code: String?
|
||||
@objc public dynamic var street: String?
|
||||
@objc public dynamic var building: String?
|
||||
@objc public dynamic var inn: String?
|
||||
|
||||
required init(copy: VehicleOwnershipPeriod) {
|
||||
required public init(copy: VehicleOwnershipPeriod) {
|
||||
self.lastOperation = copy.lastOperation
|
||||
self.ownerType = copy.ownerType
|
||||
self.from = copy.from
|
||||
@ -160,30 +160,30 @@ class VehicleOwnershipPeriod: Object, Decodable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Exportable {
|
||||
@objc dynamic var brand: VehicleBrand?
|
||||
@objc dynamic var model: VehicleModel?
|
||||
@objc dynamic var color: String?
|
||||
@objc dynamic var year: Int = 0
|
||||
@objc dynamic var category: String?
|
||||
@objc dynamic var engine: VehicleEngine?
|
||||
public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Exportable {
|
||||
@objc public dynamic var brand: VehicleBrand?
|
||||
@objc public dynamic var model: VehicleModel?
|
||||
@objc public dynamic var color: String?
|
||||
@objc public dynamic var year: Int = 0
|
||||
@objc public dynamic var category: String?
|
||||
@objc public dynamic var engine: VehicleEngine?
|
||||
@objc private dynamic var number: String = ""
|
||||
@objc dynamic var currentNumber: String?
|
||||
@objc dynamic var vin1: String?
|
||||
@objc dynamic var vin2: String?
|
||||
@objc dynamic var sts: String?
|
||||
@objc dynamic var pts: String?
|
||||
var isRightWheel = RealmOptional<Bool>()
|
||||
var isJapanese: RealmOptional<Bool> = RealmOptional<Bool>()
|
||||
@objc dynamic var addedDate: TimeInterval = 0
|
||||
@objc dynamic var updatedDate: TimeInterval = 0
|
||||
@objc dynamic var addedBy: String = ""
|
||||
var photos = List<VehiclePhoto>()
|
||||
var ownershipPeriods = List<VehicleOwnershipPeriod>()
|
||||
var events = List<VehicleEvent>()
|
||||
var osagoContracts = List<Osago>()
|
||||
var ads = List<VehicleAd>()
|
||||
@objc dynamic var debugInfo: DebugInfo?
|
||||
@objc public dynamic var currentNumber: String?
|
||||
@objc public dynamic var vin1: String?
|
||||
@objc public dynamic var vin2: String?
|
||||
@objc public dynamic var sts: String?
|
||||
@objc public dynamic var pts: String?
|
||||
public var isRightWheel = RealmOptional<Bool>()
|
||||
public var isJapanese: RealmOptional<Bool> = RealmOptional<Bool>()
|
||||
@objc public dynamic var addedDate: TimeInterval = 0
|
||||
@objc public dynamic var updatedDate: TimeInterval = 0
|
||||
@objc public dynamic var addedBy: String = ""
|
||||
public var photos = List<VehiclePhoto>()
|
||||
public var ownershipPeriods = List<VehicleOwnershipPeriod>()
|
||||
public var events = List<VehicleEvent>()
|
||||
public var osagoContracts = List<Osago>()
|
||||
public var ads = List<VehicleAd>()
|
||||
@objc public dynamic var debugInfo: DebugInfo?
|
||||
|
||||
lazy var formatter: DateFormatter = {
|
||||
let f = DateFormatter()
|
||||
@ -192,9 +192,9 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
|
||||
return f
|
||||
}()
|
||||
|
||||
var differenceIdentifier: String { self.number }
|
||||
public var differenceIdentifier: String { self.number }
|
||||
|
||||
func isContentEqual(to source: Vehicle) -> Bool {
|
||||
public func isContentEqual(to source: Vehicle) -> Bool {
|
||||
return self.number == source.number &&
|
||||
self.addedDate == source.addedDate &&
|
||||
self.updatedDate == source.updatedDate
|
||||
@ -226,7 +226,7 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
|
||||
case debugInfo
|
||||
}
|
||||
|
||||
required init(from decoder: Decoder) throws {
|
||||
required public init(from decoder: Decoder) throws {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
self.brand = try container.decodeIfPresent(VehicleBrand.self, forKey: .brand)
|
||||
self.model = try container.decodeIfPresent(VehicleModel.self, forKey: .model)
|
||||
@ -272,29 +272,29 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
|
||||
super.init()
|
||||
}
|
||||
|
||||
init(_ number: String) {
|
||||
public init(_ number: String) {
|
||||
self.number = number
|
||||
self.addedDate = Date().timeIntervalSince1970
|
||||
self.updatedDate = self.addedDate
|
||||
}
|
||||
|
||||
func getNumber() -> String {
|
||||
public func getNumber() -> String {
|
||||
return self.number
|
||||
}
|
||||
|
||||
override static func primaryKey() -> String? {
|
||||
public override static func primaryKey() -> String? {
|
||||
return "number"
|
||||
}
|
||||
|
||||
override class func ignoredProperties() -> [String] {
|
||||
public override class func ignoredProperties() -> [String] {
|
||||
return ["id", "identifier", "differenceIdentifier", "formatter"]
|
||||
}
|
||||
|
||||
var unrecognized: Bool {
|
||||
public var unrecognized: Bool {
|
||||
return self.brand == nil
|
||||
}
|
||||
|
||||
var outdated: Bool {
|
||||
public var outdated: Bool {
|
||||
if let current = self.currentNumber {
|
||||
return current != self.number
|
||||
} else {
|
||||
@ -304,7 +304,7 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
|
||||
|
||||
// MARK: - Cloneable
|
||||
|
||||
required init(copy: Vehicle) {
|
||||
required public init(copy: Vehicle) {
|
||||
self.brand = copy.brand
|
||||
self.model = copy.model
|
||||
self.color = copy.color
|
||||
@ -346,11 +346,11 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
|
||||
|
||||
// MARK: - Exportable
|
||||
|
||||
static var csvHeader: String {
|
||||
public static var csvHeader: String {
|
||||
return "Model, Color, Year, Plate Number, VIN, STS, PTS, Added Date, Updated date"
|
||||
}
|
||||
|
||||
var csvLine: String {
|
||||
public var csvLine: String {
|
||||
let model = self.brand?.name?.original ?? "<unknown>"
|
||||
let added = self.formatter.string(from: Date(timeIntervalSince1970: self.addedDate))
|
||||
let updated = self.formatter.string(from: Date(timeIntervalSince1970: self.updatedDate))
|
||||
33
AutoCatCore/Models/VehicleAd.swift
Normal file
33
AutoCatCore/Models/VehicleAd.swift
Normal file
@ -0,0 +1,33 @@
|
||||
import Foundation
|
||||
import RealmSwift
|
||||
|
||||
public class VehicleAd: Object, Decodable, Cloneable {
|
||||
@objc public dynamic var id: Int = 0
|
||||
@objc public dynamic var url: String?
|
||||
@objc public dynamic var price: String?
|
||||
@objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970
|
||||
@objc public dynamic var mileage: String?
|
||||
@objc public dynamic var region: String?
|
||||
@objc public dynamic var city: String?
|
||||
@objc public dynamic var adDescription: String?
|
||||
public var photos = List<String>()
|
||||
|
||||
public required init(copy: VehicleAd) {
|
||||
self.id = copy.id
|
||||
self.url = copy.url
|
||||
self.price = copy.price
|
||||
self.date = copy.date
|
||||
self.mileage = copy.mileage
|
||||
self.region = copy.region
|
||||
self.city = copy.city
|
||||
self.adDescription = copy.adDescription
|
||||
|
||||
let photos = List<String>()
|
||||
photos.append(objectsIn: copy.photos)
|
||||
self.photos = photos
|
||||
}
|
||||
|
||||
required init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
@ -3,21 +3,21 @@ import RealmSwift
|
||||
import RxSwift
|
||||
import CoreLocation
|
||||
|
||||
class VehicleEvent: Object, Codable, Cloneable {
|
||||
@objc dynamic var id: String?
|
||||
@objc dynamic var date: TimeInterval = Date().timeIntervalSince1970
|
||||
@objc dynamic var latitude: Double = 0
|
||||
@objc dynamic var longitude: Double = 0
|
||||
@objc dynamic var speed: Double = 0
|
||||
@objc dynamic var direction: Double = 0
|
||||
@objc dynamic var address: String? = nil
|
||||
public class VehicleEvent: Object, Codable, Cloneable {
|
||||
@objc public dynamic var id: String?
|
||||
@objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970
|
||||
@objc public dynamic var latitude: Double = 0
|
||||
@objc public dynamic var longitude: Double = 0
|
||||
@objc public dynamic var speed: Double = 0
|
||||
@objc public dynamic var direction: Double = 0
|
||||
@objc public dynamic var address: String? = nil
|
||||
|
||||
var number: String?
|
||||
var coordinate: CLLocationCoordinate2D {
|
||||
public var number: String?
|
||||
public var coordinate: CLLocationCoordinate2D {
|
||||
return CLLocationCoordinate2D(latitude: self.latitude, longitude: self.longitude)
|
||||
}
|
||||
|
||||
init(lat: Double, lon: Double, speed: Double, dir: Double) {
|
||||
public init(lat: Double, lon: Double, speed: Double, dir: Double) {
|
||||
self.latitude = lat
|
||||
self.longitude = lon
|
||||
self.speed = speed
|
||||
@ -28,11 +28,11 @@ class VehicleEvent: Object, Codable, Cloneable {
|
||||
super.init()
|
||||
}
|
||||
|
||||
func findAddress() -> Single<Void> {
|
||||
public func findAddress() -> Single<Void> {
|
||||
if address != nil {
|
||||
return Single.just(())
|
||||
} else {
|
||||
return LocationManager
|
||||
return RxLocationManager
|
||||
.getAddressForLocation(latitude: self.latitude, longitude: self.longitude)
|
||||
.map { addr in
|
||||
if let realm = self.realm {
|
||||
@ -44,11 +44,11 @@ class VehicleEvent: Object, Codable, Cloneable {
|
||||
}
|
||||
}
|
||||
|
||||
override static func ignoredProperties() -> [String] {
|
||||
public override static func ignoredProperties() -> [String] {
|
||||
return ["plateNumber"]
|
||||
}
|
||||
|
||||
func getMapLink() -> URL? {
|
||||
public func getMapLink() -> URL? {
|
||||
var urlString = "http://maps.apple.com/?sll=\(self.latitude),\(self.longitude)"
|
||||
if let address = self.address?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
|
||||
urlString = urlString + "&address=" + address
|
||||
@ -56,7 +56,7 @@ class VehicleEvent: Object, Codable, Cloneable {
|
||||
return URL(string: urlString)
|
||||
}
|
||||
|
||||
func getLocationString() -> String {
|
||||
public func getLocationString() -> String {
|
||||
let coordinates = "Lat: \(self.latitude), Lon: \(self.longitude)"
|
||||
if let addressString = self.address {
|
||||
return "\(addressString) (\(coordinates)"
|
||||
@ -67,7 +67,7 @@ class VehicleEvent: Object, Codable, Cloneable {
|
||||
|
||||
// MARK: - Cloneable
|
||||
|
||||
required init(copy: VehicleEvent) {
|
||||
public required init(copy: VehicleEvent) {
|
||||
self.id = copy.id
|
||||
self.date = copy.date
|
||||
self.latitude = copy.latitude
|
||||
10
AutoCatCore/Models/VehicleRegion.swift
Normal file
10
AutoCatCore/Models/VehicleRegion.swift
Normal file
@ -0,0 +1,10 @@
|
||||
import Foundation
|
||||
|
||||
public struct VehicleRegion: Codable, Hashable {
|
||||
public var name: String
|
||||
public var codes: [Int]
|
||||
|
||||
public static func == (lhs: VehicleRegion, rhs: VehicleRegion) -> Bool {
|
||||
return lhs.name == rhs.name
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,7 @@ import Foundation
|
||||
import RxSwift
|
||||
import RxCocoa
|
||||
|
||||
class Api {
|
||||
public class Api {
|
||||
|
||||
private static let session: URLSession = {
|
||||
let sessionConfig = URLSessionConfiguration.default
|
||||
34
AutoCatCore/Utils/Constants.swift
Normal file
34
AutoCatCore/Utils/Constants.swift
Normal file
@ -0,0 +1,34 @@
|
||||
import Foundation
|
||||
|
||||
public enum Constants {
|
||||
public static var baseUrl: String {
|
||||
#if DEBUG
|
||||
return "http://127.0.0.1:3000/"
|
||||
//return "http://192.168.1.67:3000/"
|
||||
//return "https://vps.aliencat.pro:8443/"
|
||||
#else
|
||||
return "https://vps.aliencat.pro:8443/"
|
||||
#endif
|
||||
}
|
||||
|
||||
public static let pnLettersMap: [Character: Character] = [
|
||||
"А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O", "Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X"
|
||||
]
|
||||
|
||||
public static let googleAuthURL = "https://accounts.google.com/o/oauth2/v2/auth"
|
||||
public static let googleTokenURL = "https://oauth2.googleapis.com/token"
|
||||
public static let googleRedirectURL = "com.googleusercontent.apps.994679674451-k7clunkk4nicl6iuajdtc5u7hvustbdb:/oauth2callback"
|
||||
|
||||
public static let fbClientId = "994679674451-k7clunkk4nicl6iuajdtc5u7hvustbdb.apps.googleusercontent.com"
|
||||
public static let fbApiKey = "AIzaSyDVlrQj_05y6AeZNf8enpSWFIiHhgwfnGI"
|
||||
|
||||
public static let fbClientVersion = "iOS/FirebaseSDK/6.5.1/FirebaseCore-iOS"
|
||||
public static let fbVerifyAssertion = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion"
|
||||
public static let fbRefreshToken = "https://securetoken.googleapis.com/v1/token"
|
||||
public static let fbUserAgent = "FirebaseAuth.iOS/6.5.1 ru.Vin01/1.0 iPhone/13.5 hw/sim"
|
||||
|
||||
public static let secondProviderBundleId = "ru.Vin01"
|
||||
|
||||
public static let reportLinkTokenSecret = "#TheTruthIsOutThere"
|
||||
public static let reportLinkBaseURL = "https://auto.aliencat.pro/report.html"
|
||||
}
|
||||
@ -61,33 +61,33 @@ extension String {
|
||||
}
|
||||
}
|
||||
|
||||
protocol JwtPayload: Codable {
|
||||
public protocol JwtPayload: Codable {
|
||||
var exp: Int { get }
|
||||
}
|
||||
|
||||
extension JwtPayload {
|
||||
var exp: Int { 0 }
|
||||
public var exp: Int { 0 }
|
||||
}
|
||||
|
||||
struct EmptyPayload: JwtPayload { }
|
||||
public struct EmptyPayload: JwtPayload { }
|
||||
|
||||
struct FirebasePayload: JwtPayload {
|
||||
var email: String
|
||||
var name: String
|
||||
public struct FirebasePayload: JwtPayload {
|
||||
public var email: String
|
||||
public var name: String
|
||||
}
|
||||
|
||||
struct NumberPayload: JwtPayload {
|
||||
var plateNumber: String
|
||||
public struct NumberPayload: JwtPayload {
|
||||
public var plateNumber: String
|
||||
}
|
||||
|
||||
class JWT<T> where T: JwtPayload {
|
||||
public class JWT<T> where T: JwtPayload {
|
||||
private var jwt: String
|
||||
public let payload: T
|
||||
public var expired: Bool {
|
||||
return TimeInterval(self.payload.exp) < Date().timeIntervalSince1970
|
||||
}
|
||||
|
||||
init?(string: String) {
|
||||
public init?(string: String) {
|
||||
self.jwt = string
|
||||
|
||||
let parts = string.split(separator: ".")
|
||||
@ -111,7 +111,7 @@ class JWT<T> where T: JwtPayload {
|
||||
}
|
||||
}
|
||||
|
||||
static func generate(for plateNumber: String) throws -> String {
|
||||
public static func generate(for plateNumber: String) throws -> String {
|
||||
let header = #"{ "typ": "JWT", "alg": "HS256" }"#
|
||||
let bodyDict: [String: Any] = [
|
||||
"iat": Date().timeIntervalSince1970,
|
||||
@ -65,15 +65,16 @@ class RxLocationManagerDelegateProxy: DelegateProxy<CLLocationManager, CLLocatio
|
||||
}
|
||||
}
|
||||
|
||||
class LocationManager {
|
||||
public class RxLocationManager {
|
||||
private static let manager: CLLocationManager = {
|
||||
let mgr = CLLocationManager()
|
||||
mgr.desiredAccuracy = kCLLocationAccuracyBest
|
||||
return mgr
|
||||
}()
|
||||
|
||||
private static let bag = DisposeBag()
|
||||
private static var eventObservable: Single<VehicleEvent>?
|
||||
private(set) static var lastEvent: VehicleEvent?
|
||||
public private(set) static var lastEvent: VehicleEvent?
|
||||
|
||||
private static func checkPermissions() -> Single<Void> {
|
||||
return Single<Void>.create { observer in
|
||||
@ -114,7 +115,7 @@ class LocationManager {
|
||||
return single
|
||||
}
|
||||
|
||||
static func requestCurrentLocation() -> Single<VehicleEvent> {
|
||||
public static func requestCurrentLocation() -> Single<VehicleEvent> {
|
||||
if let result = self.eventObservable {
|
||||
return result
|
||||
} else {
|
||||
@ -128,11 +129,11 @@ class LocationManager {
|
||||
}
|
||||
}
|
||||
|
||||
static func locationRequestInProgress() -> Bool {
|
||||
public static func locationRequestInProgress() -> Bool {
|
||||
return self.eventObservable != nil
|
||||
}
|
||||
|
||||
static func getAddressForLocation(latitude: Double, longitude: Double) -> Single<String> {
|
||||
public static func getAddressForLocation(latitude: Double, longitude: Double) -> Single<String> {
|
||||
return Single.create { observer in
|
||||
let geocoder = CLGeocoder()
|
||||
let location = CLLocation(latitude: latitude, longitude: longitude)
|
||||
@ -152,7 +153,7 @@ class LocationManager {
|
||||
}
|
||||
}
|
||||
|
||||
static func resetLastEvent() {
|
||||
public static func resetLastEvent() {
|
||||
self.lastEvent = nil
|
||||
}
|
||||
}
|
||||
19
AutoCatTests/AutoCatTests.swift
Normal file
19
AutoCatTests/AutoCatTests.swift
Normal file
@ -0,0 +1,19 @@
|
||||
import XCTest
|
||||
import AutoCatCore
|
||||
|
||||
class AutoCatTests: XCTestCase {
|
||||
|
||||
override func setUpWithError() throws {
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||
}
|
||||
|
||||
override func tearDownWithError() throws {
|
||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||
}
|
||||
|
||||
func testExample() throws {
|
||||
// This is an example of a functional test case.
|
||||
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||
}
|
||||
|
||||
}
|
||||
22
AutoCatTests/Info.plist
Normal file
22
AutoCatTests/Info.plist
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
16
AutoCatTests/Mocks/FakeLocationManager.swift
Normal file
16
AutoCatTests/Mocks/FakeLocationManager.swift
Normal file
@ -0,0 +1,16 @@
|
||||
import Foundation
|
||||
import CoreLocation
|
||||
|
||||
class FakeLocationManager: CLLocationManager {
|
||||
override func requestAlwaysAuthorization() {
|
||||
|
||||
}
|
||||
|
||||
override func requestLocation() {
|
||||
|
||||
}
|
||||
|
||||
override func stopUpdatingLocation() {
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user