Moving non-interface related code into framework (for later using it in unit test)

This commit is contained in:
Selim Mustafaev 2021-06-27 15:51:21 +03:00
parent 2107848fd6
commit a42fd3eddb
75 changed files with 1138 additions and 575 deletions

2
.idea/autocat.iml Normal file
View 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
View 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>

View File

@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager"> <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"> <EXTENSION ID="org.jetbrains.appcode.reveal.RevealRunConfigurationExtension">
<REVEAL_SETTINGS autoInject="false" autoInstall="true" askToEnableAutoInstall="true" /> <REVEAL_SETTINGS autoInject="false" autoInstall="true" askToEnableAutoInstall="true" />
</EXTENSION> </EXTENSION>

View File

@ -7,15 +7,11 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* 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 */; }; 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 */; }; 7A0420AD2561A0B100034941 /* OsagoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420AC2561A0B100034941 /* OsagoController.swift */; };
7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B02561A0E100034941 /* OsagoAddController.swift */; }; 7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B02561A0E100034941 /* OsagoAddController.swift */; };
7A0420B62568650C00034941 /* DkbmController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B52568650C00034941 /* DkbmController.swift */; }; 7A0420B62568650C00034941 /* DkbmController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0420B52568650C00034941 /* DkbmController.swift */; };
7A0420BA25693D2C00034941 /* dkbm.js in Resources */ = {isa = PBXBuildFile; fileRef = 7A0420B925693D2C00034941 /* dkbm.js */; }; 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 */; }; 7A0B96A0257D6D4B000B39AD /* MultilineLabelRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0B969F257D6D4B000B39AD /* MultilineLabelRow.swift */; };
7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090E724A394F100B4F0B2 /* AudioRecordCell.swift */; }; 7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090E724A394F100B4F0B2 /* AudioRecordCell.swift */; };
7A1090EA24A3A26300B4F0B2 /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090E924A3A26300B4F0B2 /* AudioPlayer.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 */; }; 7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471523FDEB2A00B424AF /* MainSplitController.swift */; };
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471723FDEBFA00B424AF /* ReportController.swift */; }; 7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471723FDEBFA00B424AF /* ReportController.swift */; };
7A11471A23FE839000B424AF /* AuthController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471923FE839000B424AF /* AuthController.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 */; }; 7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */; };
7A21112A24FC3D7E003BBF6F /* AudioEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A21112924FC3D7E003BBF6F /* AudioEngine.swift */; }; 7A21112A24FC3D7E003BBF6F /* AudioEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A21112924FC3D7E003BBF6F /* AudioEngine.swift */; };
7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADC6249D43210035F39E /* RegionsController.swift */; }; 7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADC6249D43210035F39E /* RegionsController.swift */; };
7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF2249F8B650035F39E /* RecordsController.swift */; }; 7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF2249F8B650035F39E /* RecordsController.swift */; };
7A27ADF5249FD2F90035F39E /* FileManagerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */; }; 7A27ADF5249FD2F90035F39E /* FileManagerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */; };
7A27ADF7249FEF690035F39E /* Recorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF6249FEF690035F39E /* Recorder.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 */; }; 7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69A25869ABD00A113FC /* AdsController.swift */; };
7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69D2589606A00A113FC /* ImageGridRow.swift */; }; 7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69D2589606A00A113FC /* ImageGridRow.swift */; };
7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A33381024990DAE00D878F1 /* FiltersController.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 */; }; 7A3F07AB24360DC800E59687 /* Dated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AA24360DC800E59687 /* Dated.swift */; };
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AC2436350B00E59687 /* SearchController.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 */; }; 7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7924001D3300CBFE6E /* CheckController.swift */; };
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A530B7D24017FEE00CBFE6E /* VehicleCell.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 */; }; 7A61FF8B2575A2CD00D905D5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FF892575A2CD00D905D5 /* Localizable.strings */; };
7A61FF912575A5B300D905D5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FF8F2575A5B300D905D5 /* InfoPlist.strings */; }; 7A61FF912575A5B300D905D5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FF8F2575A5B300D905D5 /* InfoPlist.strings */; };
7A61FFA0257D3CFC00D905D5 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 7A61FFA2257D3CFC00D905D5 /* Localizable.stringsdict */; }; 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 */; }; 7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE702469DFB600ABE48E /* MediaContentView.swift */; };
7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE712469DFB600ABE48E /* MediaBrowserViewController.swift */; }; 7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE712469DFB600ABE48E /* MediaBrowserViewController.swift */; };
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A64AE722469DFB600ABE48E /* ContentTransformers.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 */; }; 7A659B5B24A3768A0043A0F2 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5A24A3768A0043A0F2 /* Substrings.swift */; };
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; }; 7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; };
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.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 */; }; 7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; }; 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 */; }; 7A6E03282485951700DB22ED /* OwnersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6E03272485951700DB22ED /* OwnersController.swift */; };
7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7547DF24032CB6004E8406 /* VehiclePhotoCell.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 */; }; 7A813DBE2506A57100CC93B9 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A813DBD2506A57100CC93B9 /* AuthenticationServices.framework */; };
7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A813DC22508EE4F00CC93B9 /* EventCell.swift */; }; 7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A813DC22508EE4F00CC93B9 /* EventCell.swift */; };
7A813DC5250AAF3C00CC93B9 /* LocationEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A813DC4250AAF3C00CC93B9 /* LocationEditController.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 */; }; 7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A2208248D10EC0073DFD9 /* ResizeImage.swift */; };
7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */; }; 7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */; };
7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76425A0DB8F00ECF2C1 /* BundleVersion.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 */; }; 7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76A25A1D95500ECF2C1 /* SourceStatusRow.swift */; };
7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE2C246B2B7400297C33 /* GoogleSignInController.swift */; }; 7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE2C246B2B7400297C33 /* GoogleSignInController.swift */; };
7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; }; 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 */; }; 7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */; };
7AA7BC2C25A5DFB80053A5D5 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471C23FEA18700B424AF /* RxSwift */; }; 7AA7BC2C25A5DFB80053A5D5 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471C23FEA18700B424AF /* RxSwift */; };
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471E23FEA18700B424AF /* RxRelay */; }; 7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471E23FEA18700B424AF /* RxRelay */; };
@ -95,9 +82,9 @@
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE1C2532F3EB0041AFC6 /* PKHUD */; }; 7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE1C2532F3EB0041AFC6 /* PKHUD */; };
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE22253327F10041AFC6 /* DifferenceKit */; }; 7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE22253327F10041AFC6 /* DifferenceKit */; };
7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */ = {isa = PBXBuildFile; productRef = 7AEF47A3253DC4D2001D6238 /* Eureka */; }; 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 */; }; 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 */; }; 7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; };
7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; }; 7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; };
7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C92250B954900F237B2 /* Navigation.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 */; }; 7AE26A3324EEF9EC00625033 /* UIViewControllerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */; };
7AE26A3524F31B0700625033 /* EventsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE26A3424F31B0700625033 /* EventsController.swift */; }; 7AE26A3524F31B0700625033 /* EventsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE26A3424F31B0700625033 /* EventsController.swift */; };
7AE492A1259232F000322D2E /* MultilineLinkRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE492A0259232F000322D2E /* MultilineLinkRow.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 */; }; 7AEFC3BE2529D3CC00BADFB2 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEFC3BD2529D3CC00BADFB2 /* ConfigurableCell.swift */; };
7AEFE728240455E200910EB7 /* SettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEFE727240455E200910EB7 /* SettingsController.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 */ /* 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 */ /* Begin PBXFileReference section */
6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PagedResponse.swift; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -242,6 +293,7 @@
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */, 7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */,
7AA7BC2E25A5DFB80053A5D5 /* RxCocoa in Frameworks */, 7AA7BC2E25A5DFB80053A5D5 /* RxCocoa in Frameworks */,
7AA7BC3425A5DFB80053A5D5 /* SwiftDate in Frameworks */, 7AA7BC3425A5DFB80053A5D5 /* SwiftDate in Frameworks */,
7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */,
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */, 7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */,
7AA7BC3225A5DFB80053A5D5 /* RxRealm in Frameworks */, 7AA7BC3225A5DFB80053A5D5 /* RxRealm in Frameworks */,
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */, 7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */,
@ -249,6 +301,27 @@
); );
runOnlyForDeploymentPostprocessing = 0; 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 */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
@ -285,6 +358,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7A1146FF23FDE7E500B424AF /* AutoCat */, 7A1146FF23FDE7E500B424AF /* AutoCat */,
7AF6D1DE2677A7E00086EA64 /* AutoCatTests */,
7AF6D1F02677C03B0086EA64 /* AutoCatCore */,
7A1146FE23FDE7E500B424AF /* Products */, 7A1146FE23FDE7E500B424AF /* Products */,
7A11474C23FFEE8700B424AF /* Frameworks */, 7A11474C23FFEE8700B424AF /* Frameworks */,
); );
@ -294,6 +369,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7A1146FD23FDE7E500B424AF /* AutoCat.app */, 7A1146FD23FDE7E500B424AF /* AutoCat.app */,
7AF6D1DD2677A7E00086EA64 /* AutoCatTests.xctest */,
7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -306,7 +383,6 @@
7A3F07A924360D9100E59687 /* Extensions */, 7A3F07A924360D9100E59687 /* Extensions */,
7A6DD90424326788009DE740 /* Fonts */, 7A6DD90424326788009DE740 /* Fonts */,
7A0420B825693CEE00034941 /* JS */, 7A0420B825693CEE00034941 /* JS */,
7A11474523FF2A9000B424AF /* Models */,
7A11472C23FECA3E00B424AF /* ThirdParty */, 7A11472C23FECA3E00B424AF /* ThirdParty */,
7A11474223FF06B600B424AF /* Utils */, 7A11474223FF06B600B424AF /* Utils */,
7A6DD901242BF48D009DE740 /* Views */, 7A6DD901242BF48D009DE740 /* Views */,
@ -350,8 +426,6 @@
children = ( children = (
7A64AE6E2469DFB600ABE48E /* ATGMediaBrowser */, 7A64AE6E2469DFB600ABE48E /* ATGMediaBrowser */,
7A6DD90724329144009DE740 /* CenterTextLayer.swift */, 7A6DD90724329144009DE740 /* CenterTextLayer.swift */,
7A96AE32246C095700297C33 /* Base64FS.swift */,
7A15051124DB3E3000F39631 /* AnyEncodable.swift */,
7ADF6C9C250FA96000F237B2 /* SwiftMaskTextfield.swift */, 7ADF6C9C250FA96000F237B2 /* SwiftMaskTextfield.swift */,
); );
path = ThirdParty; path = ThirdParty;
@ -360,12 +434,8 @@
7A11474223FF06B600B424AF /* Utils */ = { 7A11474223FF06B600B424AF /* Utils */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7A96AE30246B2FE400297C33 /* Constants.swift */,
7A43F9F7246C8A6200BA5B49 /* JWT.swift */,
7A11474323FF06CA00B424AF /* Api.swift */,
7A27ADF6249FEF690035F39E /* Recorder.swift */, 7A27ADF6249FEF690035F39E /* Recorder.swift */,
7A1090E924A3A26300B4F0B2 /* AudioPlayer.swift */, 7A1090E924A3A26300B4F0B2 /* AudioPlayer.swift */,
7A000AA124C2EEDE001F5B00 /* Location.swift */,
7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */, 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */,
7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */, 7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */,
); );
@ -411,9 +481,7 @@
7A21112924FC3D7E003BBF6F /* AudioEngine.swift */, 7A21112924FC3D7E003BBF6F /* AudioEngine.swift */,
7A8AB76425A0DB8F00ECF2C1 /* BundleVersion.swift */, 7A8AB76425A0DB8F00ECF2C1 /* BundleVersion.swift */,
7AE24C5E251F1B4E00758E39 /* Buttons.swift */, 7AE24C5E251F1B4E00758E39 /* Buttons.swift */,
7A27ADF824A09CAD0035F39E /* CocoaError.swift */,
7A3F07AA24360DC800E59687 /* Dated.swift */, 7A3F07AA24360DC800E59687 /* Dated.swift */,
7AE8424D26109F78002F6B31 /* Exportable.swift */,
7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */, 7A27ADF4249FD2F90035F39E /* FileManagerExt.swift */,
7ADF6CA02512244400F237B2 /* MapExt.swift */, 7ADF6CA02512244400F237B2 /* MapExt.swift */,
7ADF6C92250B954900F237B2 /* Navigation.swift */, 7ADF6C92250B954900F237B2 /* Navigation.swift */,
@ -421,6 +489,7 @@
7A659B5A24A3768A0043A0F2 /* Substrings.swift */, 7A659B5A24A3768A0043A0F2 /* Substrings.swift */,
7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */, 7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */,
7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */, 7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */,
7A761C0A267E8FF90005F28F /* Error.swift */,
); );
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
@ -473,6 +542,15 @@
path = Fonts; path = Fonts;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7A761C06267E8E720005F28F /* ThirdParty */ = {
isa = PBXGroup;
children = (
7A96AE32246C095700297C33 /* Base64FS.swift */,
7A15051124DB3E3000F39631 /* AnyEncodable.swift */,
);
path = ThirdParty;
sourceTree = "<group>";
};
7A813DC7250B5C6E00CC93B9 /* Location */ = { 7A813DC7250B5C6E00CC93B9 /* Location */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -486,8 +564,69 @@
path = Location; path = Location;
sourceTree = "<group>"; 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 */ /* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
7AF6D1EA2677C03B0086EA64 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
7A1146FC23FDE7E500B424AF /* AutoCat */ = { 7A1146FC23FDE7E500B424AF /* AutoCat */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
@ -496,10 +635,12 @@
7A1146F923FDE7E500B424AF /* Sources */, 7A1146F923FDE7E500B424AF /* Sources */,
7A1146FA23FDE7E500B424AF /* Frameworks */, 7A1146FA23FDE7E500B424AF /* Frameworks */,
7A1146FB23FDE7E500B424AF /* Resources */, 7A1146FB23FDE7E500B424AF /* Resources */,
7AF6D2092677C03B0086EA64 /* Embed Frameworks */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
7AF6D2032677C03B0086EA64 /* PBXTargetDependency */,
); );
name = AutoCat; name = AutoCat;
packageProductDependencies = ( packageProductDependencies = (
@ -521,19 +662,71 @@
productReference = 7A1146FD23FDE7E500B424AF /* AutoCat.app */; productReference = 7A1146FD23FDE7E500B424AF /* AutoCat.app */;
productType = "com.apple.product-type.application"; 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 */ /* End PBXNativeTarget section */
/* Begin PBXProject section */ /* Begin PBXProject section */
7A1146F523FDE7E500B424AF /* Project object */ = { 7A1146F523FDE7E500B424AF /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 1130; LastSwiftUpdateCheck = 1250;
LastUpgradeCheck = 1130; LastUpgradeCheck = 1130;
ORGANIZATIONNAME = "Selim Mustafaev"; ORGANIZATIONNAME = "Selim Mustafaev";
TargetAttributes = { TargetAttributes = {
7A1146FC23FDE7E500B424AF = { 7A1146FC23FDE7E500B424AF = {
CreatedOnToolsVersion = 11.3.1; CreatedOnToolsVersion = 11.3.1;
}; };
7AF6D1DC2677A7E00086EA64 = {
CreatedOnToolsVersion = 12.5;
TestTargetID = 7A1146FC23FDE7E500B424AF;
};
7AF6D1EE2677C03B0086EA64 = {
CreatedOnToolsVersion = 12.5;
};
}; };
}; };
buildConfigurationList = 7A1146F823FDE7E500B424AF /* Build configuration list for PBXProject "AutoCat" */; buildConfigurationList = 7A1146F823FDE7E500B424AF /* Build configuration list for PBXProject "AutoCat" */;
@ -562,6 +755,8 @@
projectRoot = ""; projectRoot = "";
targets = ( targets = (
7A1146FC23FDE7E500B424AF /* AutoCat */, 7A1146FC23FDE7E500B424AF /* AutoCat */,
7AF6D1EE2677C03B0086EA64 /* AutoCatCore */,
7AF6D1DC2677A7E00086EA64 /* AutoCatTests */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@ -583,6 +778,20 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
7AF6D1DB2677A7E00086EA64 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
7AF6D1ED2677C03B0086EA64 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
@ -591,12 +800,8 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7AEFC3BE2529D3CC00BADFB2 /* ConfigurableCell.swift in Sources */, 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 */, 7A11470123FDE7E500B424AF /* AppDelegate.swift in Sources */,
7ADF6C9D250FA96000F237B2 /* SwiftMaskTextfield.swift in Sources */, 7ADF6C9D250FA96000F237B2 /* SwiftMaskTextfield.swift in Sources */,
7A27ADF924A09CAD0035F39E /* CocoaError.swift in Sources */,
7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */, 7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */,
7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */, 7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */,
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */, 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */,
@ -604,10 +809,9 @@
7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */, 7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */,
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */, 7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */,
7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */, 7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */,
7AB562BA249C9E9B00473D53 /* VehicleRegion.swift in Sources */,
7A0B96A0257D6D4B000B39AD /* MultilineLabelRow.swift in Sources */, 7A0B96A0257D6D4B000B39AD /* MultilineLabelRow.swift in Sources */,
7A659B5924A2B1BA0043A0F2 /* AudioRecord.swift in Sources */,
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */, 7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */,
7A761C0B267E8FF90005F28F /* Error.swift in Sources */,
7AE26A3524F31B0700625033 /* EventsController.swift in Sources */, 7AE26A3524F31B0700625033 /* EventsController.swift in Sources */,
7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */, 7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */,
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */, 7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */,
@ -617,7 +821,6 @@
7AE26A3324EEF9EC00625033 /* UIViewControllerExt.swift in Sources */, 7AE26A3324EEF9EC00625033 /* UIViewControllerExt.swift in Sources */,
7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */, 7A27ADF3249F8B650035F39E /* RecordsController.swift in Sources */,
7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */, 7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */,
7A6DD90E24337930009DE740 /* PlateNumber.swift in Sources */,
7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */, 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */,
7A659B5B24A3768A0043A0F2 /* Substrings.swift in Sources */, 7A659B5B24A3768A0043A0F2 /* Substrings.swift in Sources */,
7AEFE728240455E200910EB7 /* SettingsController.swift in Sources */, 7AEFE728240455E200910EB7 /* SettingsController.swift in Sources */,
@ -625,35 +828,24 @@
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */, 7A3F07AB24360DC800E59687 /* Dated.swift in Sources */,
7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */, 7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */,
7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */, 7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */,
7A11474923FF2B2D00B424AF /* Response.swift in Sources */,
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */, 7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */,
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */, 7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */,
7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */, 7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */,
7AF12B1D258C9CFF0090F8B8 /* Cloneable.swift in Sources */,
7A11471A23FE839000B424AF /* AuthController.swift in Sources */, 7A11471A23FE839000B424AF /* AuthController.swift in Sources */,
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */, 7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */,
7A6E03282485951700DB22ED /* OwnersController.swift in Sources */, 7A6E03282485951700DB22ED /* OwnersController.swift in Sources */,
7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */, 7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */,
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */, 7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */,
7AE8424E26109F78002F6B31 /* Exportable.swift in Sources */,
7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */, 7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */,
7A15051224DB3E3000F39631 /* AnyEncodable.swift in Sources */,
7A1090EA24A3A26300B4F0B2 /* AudioPlayer.swift in Sources */, 7A1090EA24A3A26300B4F0B2 /* AudioPlayer.swift in Sources */,
7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */, 7A0420B12561A0E100034941 /* OsagoAddController.swift in Sources */,
7A11474723FF2AA500B424AF /* User.swift in Sources */,
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */, 7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */,
7A2DE69825868AC800A113FC /* VehicleAd.swift in Sources */,
7A813DC5250AAF3C00CC93B9 /* LocationEditController.swift in Sources */, 7A813DC5250AAF3C00CC93B9 /* LocationEditController.swift in Sources */,
7A43F9F8246C8A6200BA5B49 /* JWT.swift in Sources */,
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */, 7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
7A8AB76825A0DC8200ECF2C1 /* DebugInfo.swift in Sources */,
7ADF6C9F251201D200F237B2 /* GlobalEventsController.swift in Sources */, 7ADF6C9F251201D200F237B2 /* GlobalEventsController.swift in Sources */,
7AAE6AD324CDDF950023860B /* VehicleEvent.swift in Sources */,
7A11470323FDE7E500B424AF /* SceneDelegate.swift in Sources */, 7A11470323FDE7E500B424AF /* SceneDelegate.swift in Sources */,
7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */, 7A530B7E24017FEE00CBFE6E /* VehicleCell.swift in Sources */,
7A813DCB250B5DC900CC93B9 /* LocationPickerController.swift in Sources */, 7A813DCB250B5DC900CC93B9 /* LocationPickerController.swift in Sources */,
7A0420AA25619AEC00034941 /* Osago.swift in Sources */,
7A11474423FF06CA00B424AF /* Api.swift in Sources */,
7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */, 7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */,
7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */, 7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */,
7A0420AD2561A0B100034941 /* OsagoController.swift in Sources */, 7A0420AD2561A0B100034941 /* OsagoController.swift in Sources */,
@ -662,23 +854,70 @@
7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */, 7A8A220B248D67B60073DFD9 /* VehicleReportImage.swift in Sources */,
7ADF6C95250D037700F237B2 /* ShowEventController.swift in Sources */, 7ADF6C95250D037700F237B2 /* ShowEventController.swift in Sources */,
7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */, 7A27ADC7249D43210035F39E /* RegionsController.swift in Sources */,
7A05161A2414FF0900FC55AC /* DateSection.swift in Sources */,
7AE492A1259232F000322D2E /* MultilineLinkRow.swift in Sources */, 7AE492A1259232F000322D2E /* MultilineLinkRow.swift in Sources */,
7A333814249A532400D878F1 /* Filter.swift in Sources */,
7A11474B23FF368B00B424AF /* Settings.swift in Sources */,
7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */, 7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */,
7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */, 7A64AE752469DFB600ABE48E /* MediaBrowserViewController.swift in Sources */,
7A64AE732469DFB600ABE48E /* DismissAnimationController.swift in Sources */, 7A64AE732469DFB600ABE48E /* DismissAnimationController.swift in Sources */,
7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */, 7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */,
7A000AA224C2EEDE001F5B00 /* Location.swift in Sources */,
7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */, 7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */,
6841A85D4B60DB71D1E68DA0 /* ImageGrid.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; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXSourcesBuildPhase section */ /* 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 */ /* Begin PBXVariantGroup section */
7A11470623FDE7E500B424AF /* Main.storyboard */ = { 7A11470623FDE7E500B424AF /* Main.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
@ -848,6 +1087,7 @@
7A11471223FDE7E600B424AF /* Debug */ = { 7A11471223FDE7E600B424AF /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -872,6 +1112,7 @@
7A11471323FDE7E600B424AF /* Release */ = { 7A11471323FDE7E600B424AF /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -893,6 +1134,106 @@
}; };
name = Release; 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 */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
@ -914,6 +1255,24 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; 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 */ /* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */
@ -1037,6 +1396,16 @@
package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */; package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */;
productName = 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 */ = { 7AABDE1C2532F3EB0041AFC6 /* PKHUD */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 7AABDE1B2532F3EB0041AFC6 /* XCRemoteSwiftPackageReference "PKHUD" */; package = 7AABDE1B2532F3EB0041AFC6 /* XCRemoteSwiftPackageReference "PKHUD" */;
@ -1057,6 +1426,31 @@
package = 7AF58D322402A91C00CE01A0 /* XCRemoteSwiftPackageReference "Kingfisher" */; package = 7AF58D322402A91C00CE01A0 /* XCRemoteSwiftPackageReference "Kingfisher" */;
productName = 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 */ /* End XCSwiftPackageProductDependency section */
}; };
rootObject = 7A1146F523FDE7E500B424AF /* Project object */; rootObject = 7A1146F523FDE7E500B424AF /* Project object */;

View File

@ -33,7 +33,7 @@
"repositoryURL": "https://github.com/onevcat/Kingfisher", "repositoryURL": "https://github.com/onevcat/Kingfisher",
"state": { "state": {
"branch": null, "branch": null,
"revision": "2a10bf41da75599a9f8e872dbd44fe0155a2e00c", "revision": "1a0c2df04b31ed7aa318354f3583faea24f006fc",
"version": "5.15.8" "version": "5.15.8"
} }
}, },

View File

@ -28,6 +28,26 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<Testables> <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> </Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction

View File

@ -9,194 +9,199 @@
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>0</integer>
</dict> </dict>
<key>AutoCatCore.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>DifferenceKit (Playground) 1.xcscheme</key> <key>DifferenceKit (Playground) 1.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>5</integer> <integer>7</integer>
</dict> </dict>
<key>DifferenceKit (Playground) 2.xcscheme</key> <key>DifferenceKit (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>6</integer> <integer>8</integer>
</dict> </dict>
<key>DifferenceKit (Playground).xcscheme</key> <key>DifferenceKit (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>4</integer> <integer>2</integer>
</dict> </dict>
<key>Eureka (Playground) 1.xcscheme</key> <key>Eureka (Playground) 1.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>8</integer> <integer>10</integer>
</dict> </dict>
<key>Eureka (Playground) 2.xcscheme</key> <key>Eureka (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>9</integer> <integer>11</integer>
</dict> </dict>
<key>Eureka (Playground) 3.xcscheme</key> <key>Eureka (Playground) 3.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>19</integer> <integer>23</integer>
</dict> </dict>
<key>Eureka (Playground) 4.xcscheme</key> <key>Eureka (Playground) 4.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>21</integer> <integer>25</integer>
</dict> </dict>
<key>Eureka (Playground) 5.xcscheme</key> <key>Eureka (Playground) 5.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>23</integer> <integer>27</integer>
</dict> </dict>
<key>Eureka (Playground).xcscheme</key> <key>Eureka (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>7</integer> <integer>9</integer>
</dict> </dict>
<key>GettingStarted (Playground) 1.xcscheme</key> <key>GettingStarted (Playground) 1.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>14</integer> <integer>16</integer>
</dict> </dict>
<key>GettingStarted (Playground) 2.xcscheme</key> <key>GettingStarted (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>15</integer> <integer>17</integer>
</dict> </dict>
<key>GettingStarted (Playground) 3.xcscheme</key> <key>GettingStarted (Playground) 3.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>13</integer> <integer>14</integer>
</dict> </dict>
<key>GettingStarted (Playground) 4.xcscheme</key> <key>GettingStarted (Playground) 4.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>16</integer> <integer>18</integer>
</dict> </dict>
<key>GettingStarted (Playground) 5.xcscheme</key> <key>GettingStarted (Playground) 5.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>18</integer> <integer>21</integer>
</dict> </dict>
<key>GettingStarted (Playground).xcscheme</key> <key>GettingStarted (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>13</integer> <integer>15</integer>
</dict> </dict>
<key>Rx (Playground) 1.xcscheme</key> <key>Rx (Playground) 1.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>4</integer>
</dict> </dict>
<key>Rx (Playground) 2.xcscheme</key> <key>Rx (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>5</integer>
</dict> </dict>
<key>Rx (Playground) 3.xcscheme</key> <key>Rx (Playground) 3.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>16</integer> <integer>19</integer>
</dict> </dict>
<key>Rx (Playground) 4.xcscheme</key> <key>Rx (Playground) 4.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>17</integer> <integer>20</integer>
</dict> </dict>
<key>Rx (Playground) 5.xcscheme</key> <key>Rx (Playground) 5.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>18</integer> <integer>22</integer>
</dict> </dict>
<key>Rx (Playground).xcscheme</key> <key>Rx (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>3</integer>
</dict> </dict>
<key>SwiftDate (Playground) 1.xcscheme</key> <key>SwiftDate (Playground) 1.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>12</integer> <integer>12</integer>
</dict> </dict>
<key>SwiftDate (Playground) 2.xcscheme</key> <key>SwiftDate (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>10</integer> <integer>13</integer>
</dict> </dict>
<key>SwiftDate (Playground) 3.xcscheme</key> <key>SwiftDate (Playground) 3.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>20</integer> <integer>24</integer>
</dict> </dict>
<key>SwiftDate (Playground) 4.xcscheme</key> <key>SwiftDate (Playground) 4.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>22</integer> <integer>26</integer>
</dict> </dict>
<key>SwiftDate (Playground) 5.xcscheme</key> <key>SwiftDate (Playground) 5.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>24</integer> <integer>28</integer>
</dict> </dict>
<key>SwiftDate (Playground).xcscheme</key> <key>SwiftDate (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false />
<key>orderHint</key> <key>orderHint</key>
<integer>11</integer> <integer>6</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
@ -204,7 +209,7 @@
<key>7A1146FC23FDE7E500B424AF</key> <key>7A1146FC23FDE7E500B424AF</key>
<dict> <dict>
<key>primary</key> <key>primary</key>
<true/> <true />
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -4,6 +4,7 @@ import RxSwift
import RxCocoa import RxCocoa
import os.log import os.log
import PKHUD import PKHUD
import AutoCatCore
extension OSLog { extension OSLog {
static let startup = OSLog(subsystem: "pro.aliencat.autocat.startup", category: "startup") static let startup = OSLog(subsystem: "pro.aliencat.autocat.startup", category: "startup")

View File

@ -1,6 +1,7 @@
import UIKit import UIKit
import RxSwift import RxSwift
import PKHUD import PKHUD
import AutoCatCore
class AudioRecordCell: UITableViewCell, ConfigurableCell { class AudioRecordCell: UITableViewCell, ConfigurableCell {

View File

@ -1,4 +1,5 @@
import UIKit import UIKit
import AutoCatCore
class EventCell: UITableViewCell { class EventCell: UITableViewCell {
@IBOutlet weak var address: UILabel! @IBOutlet weak var address: UILabel!

View File

@ -1,4 +1,5 @@
import UIKit import UIKit
import AutoCatCore
class VehicleCell: UITableViewCell, ConfigurableCell { class VehicleCell: UITableViewCell, ConfigurableCell {

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import Kingfisher import Kingfisher
import AutoCatCore
class VehiclePhotoCell: UICollectionViewCell { class VehiclePhotoCell: UICollectionViewCell {
@IBOutlet weak var photo: UIImageView! @IBOutlet weak var photo: UIImageView!

View File

@ -2,6 +2,7 @@ import UIKit
import Eureka import Eureka
import Kingfisher import Kingfisher
import SafariServices import SafariServices
import AutoCatCore
class AdsController: FormViewController, MediaBrowserViewControllerDataSource { class AdsController: FormViewController, MediaBrowserViewControllerDataSource {

View File

@ -4,6 +4,7 @@ import RxCocoa
import RealmSwift import RealmSwift
import AuthenticationServices import AuthenticationServices
import PKHUD import PKHUD
import AutoCatCore
class AuthController: UIViewController, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { class AuthController: UIViewController, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {

View File

@ -5,6 +5,7 @@ import SwiftDate
import RxRealm import RxRealm
import PKHUD import PKHUD
import CoreLocation import CoreLocation
import AutoCatCore
enum EventAction: Equatable { enum EventAction: Equatable {
case doNotSend case doNotSend
@ -251,7 +252,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
// MARK: - UITextFieldDelegate // MARK: - UITextFieldDelegate
@IBAction func textFieldDidBeginEditing(_ textField: UITextField) { @IBAction func textFieldDidBeginEditing(_ textField: UITextField) {
LocationManager.requestCurrentLocation().subscribe().disposed(by: self.bag) RxLocationManager.requestCurrentLocation().subscribe().disposed(by: self.bag)
} }
@IBAction func textFieldDidChange(_ textField: UITextField) { @IBAction func textFieldDidChange(_ textField: UITextField) {
@ -362,10 +363,10 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
return Single.just(event) 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) return Single<VehicleEvent>.just(event)
} else { } else {
return LocationManager.requestCurrentLocation() return RxLocationManager.requestCurrentLocation()
} }
} }
@ -410,7 +411,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
} }
.compactMap { $0 } .compactMap { $0 }
LocationManager.resetLastEvent() RxLocationManager.resetLastEvent()
if vehicleResult.vehicle.unrecognized { if vehicleResult.vehicle.unrecognized {
let realm = try Realm() let realm = try Realm()

View File

@ -1,44 +1,7 @@
import UIKit import UIKit
import Eureka import Eureka
import RxSwift import RxSwift
import AutoCatCore
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")
}
}
}
class FiltersController: FormViewController { class FiltersController: FormViewController {

View File

@ -3,6 +3,7 @@ import WebKit
import CommonCrypto import CommonCrypto
import RxSwift import RxSwift
import PKHUD import PKHUD
import AutoCatCore
struct TokenResponse: Codable { struct TokenResponse: Codable {
var id_token: String var id_token: String

View File

@ -6,6 +6,7 @@ import RealmSwift
import PKHUD import PKHUD
import MobileCoreServices import MobileCoreServices
import ExceptionCatcher import ExceptionCatcher
import AutoCatCore
class EventPin: NSObject, MKAnnotation { class EventPin: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D var coordinate: CLLocationCoordinate2D

View File

@ -2,6 +2,7 @@ import UIKit
import MapKit import MapKit
import RxSwift import RxSwift
import PKHUD import PKHUD
import AutoCatCore
class GlobalEventsController: UIViewController { class GlobalEventsController: UIViewController {

View File

@ -2,6 +2,7 @@ import UIKit
import Eureka import Eureka
import RxSwift import RxSwift
import CoreLocation import CoreLocation
import AutoCatCore
class LocationEditController: FormViewController { class LocationEditController: FormViewController {

View File

@ -3,6 +3,7 @@ import MapKit
import Eureka import Eureka
import RxSwift import RxSwift
import Intents import Intents
import AutoCatCore
public struct Placemark: Equatable { public struct Placemark: Equatable {
var latitude: Double var latitude: Double
@ -124,7 +125,7 @@ public class LocationPickerController : UIViewController, TypedRowControllerType
self.address = nil self.address = nil
self.geocodingDisposable?.dispose() self.geocodingDisposable?.dispose()
self.geocodingDisposable = LocationManager self.geocodingDisposable = RxLocationManager
.getAddressForLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude) .getAddressForLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
.observeOn(MainScheduler.instance) .observeOn(MainScheduler.instance)
.subscribe(onSuccess: { address in .subscribe(onSuccess: { address in

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import MapKit import MapKit
import AutoCatCore
class ShowEventController: UIViewController { class ShowEventController: UIViewController {

View File

@ -3,6 +3,7 @@ import Eureka
import PKHUD import PKHUD
import RxSwift import RxSwift
import RxCocoa import RxCocoa
import AutoCatCore
enum OsagoCheckSource: Equatable, CustomStringConvertible { enum OsagoCheckSource: Equatable, CustomStringConvertible {
case plateNumber(number: String) case plateNumber(number: String)

View File

@ -1,6 +1,7 @@
import UIKit import UIKit
import Eureka import Eureka
import PKHUD import PKHUD
import AutoCatCore
class OsagoController: FormViewController { class OsagoController: FormViewController {

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import Eureka import Eureka
import AutoCatCore
class OwnersController: FormViewController { class OwnersController: FormViewController {

View File

@ -8,6 +8,7 @@ import CoreSpotlight
import MobileCoreServices import MobileCoreServices
import os.log import os.log
import PKHUD import PKHUD
import AutoCatCore
class RecordsController: UIViewController, UITableViewDelegate { class RecordsController: UIViewController, UITableViewDelegate {
@ -94,7 +95,7 @@ class RecordsController: UIViewController, UITableViewDelegate {
var alert: UIAlertController? var alert: UIAlertController?
var url: URL! var url: URL!
let locationObservable = LocationManager.requestCurrentLocation() let locationObservable = RxLocationManager.requestCurrentLocation()
.map(Optional.init) .map(Optional.init)
.catchErrorJustReturn(nil) .catchErrorJustReturn(nil)

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import RxSwift import RxSwift
import AutoCatCore
class RegionsDataSourse: UITableViewDiffableDataSource<VehicleRegion, Int> { class RegionsDataSourse: UITableViewDiffableDataSource<VehicleRegion, Int> {
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

View File

@ -3,6 +3,7 @@ import Kingfisher
import LinkPresentation import LinkPresentation
import RealmSwift import RealmSwift
import Eureka import Eureka
import AutoCatCore
class ReportController: FormViewController, MediaBrowserViewControllerDataSource, MediaBrowserViewControllerDelegate, UIActivityItemSource { class ReportController: FormViewController, MediaBrowserViewControllerDataSource, MediaBrowserViewControllerDelegate, UIActivityItemSource {

View File

@ -4,6 +4,7 @@ import RxCocoa
import RealmSwift import RealmSwift
import PKHUD import PKHUD
import ExceptionCatcher import ExceptionCatcher
import AutoCatCore
class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDelegate, UIScrollViewDelegate { class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDelegate, UIScrollViewDelegate {

View File

@ -1,6 +1,7 @@
import UIKit import UIKit
import Eureka import Eureka
import AuthenticationServices import AuthenticationServices
import AutoCatCore
class SettingsController: FormViewController { class SettingsController: FormViewController {

View File

@ -1,6 +1,7 @@
import Foundation import Foundation
import SwiftDate import SwiftDate
import DifferenceKit import DifferenceKit
import AutoCatCore
protocol Dated { protocol Dated {
var added: Date { get } var added: Date { get }

View 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)
}
}

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import Kingfisher import Kingfisher
import AutoCatCore
extension Vehicle { extension Vehicle {
func drawLine(y: CGFloat, width: CGFloat, margin: CGFloat = 15,context: CGContext) { func drawLine(y: CGFloat, width: CGFloat, margin: CGFloat = 15,context: CGContext) {

View File

@ -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 }
}
}

View File

@ -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
}
}

View File

@ -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()
}
}

View File

@ -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
}
}

View File

@ -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 = ""
}
}

View File

@ -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()
}
}

View File

@ -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
}
}

View File

@ -3,6 +3,7 @@ import os.log
import AVFoundation import AVFoundation
import RxSwift import RxSwift
import PKHUD import PKHUD
import AutoCatCore
class SceneDelegate: UIResponder, UIWindowSceneDelegate { class SceneDelegate: UIResponder, UIWindowSceneDelegate {

View File

@ -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"
}

View File

@ -2,6 +2,7 @@ import UIKit
import RealmSwift import RealmSwift
import DifferenceKit import DifferenceKit
import ExceptionCatcher import ExceptionCatcher
import AutoCatCore
typealias FilterPredicate<T> = (T) -> Bool typealias FilterPredicate<T> = (T) -> Bool

View File

@ -2,6 +2,7 @@ import UIKit
import DifferenceKit import DifferenceKit
import RxSwift import RxSwift
import RxCocoa import RxCocoa
import AutoCatCore
class RxSectionedDataSource<Item,Cell>: NSObject, UITableViewDataSource where Item: Dated & Hashable & Differentiable & Decodable, Cell: UITableViewCell & ConfigurableCell, Cell.Item == Item { class RxSectionedDataSource<Item,Cell>: NSObject, UITableViewDataSource where Item: Dated & Hashable & Differentiable & Decodable, Cell: UITableViewCell & ConfigurableCell, Cell.Item == Item {
private var tv: UITableView private var tv: UITableView

View File

@ -1,4 +1,5 @@
import UIKit import UIKit
import AutoCatCore
protocol PNKeyboardDelegate: class { protocol PNKeyboardDelegate: class {
func returnClicked() func returnClicked()

View File

@ -1,4 +1,5 @@
import UIKit import UIKit
import AutoCatCore
class PlateView: UIView { class PlateView: UIView {
// Some driver plate parameters from "ГОСТ Р 50577-93" // Some driver plate parameters from "ГОСТ Р 50577-93"

View File

@ -1,5 +1,6 @@
import UIKit import UIKit
import Eureka import Eureka
import AutoCatCore
extension DebugInfoStatus { extension DebugInfoStatus {
var color: UIColor { var color: UIColor {

19
AutoCatCore/AutoCatCore.h Normal file
View 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>

View File

@ -1,9 +1,7 @@
import UIKit
import PKHUD
import CoreLocation import CoreLocation
extension NSError { extension NSError {
var displayMessage: (title: String, body: String) { public var displayMessage: (title: String, body: String) {
if let description = self.userInfo[NSLocalizedDescriptionKey] as? String { if let description = self.userInfo[NSLocalizedDescriptionKey] as? String {
return (title: "Error", body: description) return (title: "Error", body: description)
} else if let failure = self.userInfo[NSLocalizedFailureErrorKey] as? String, let reason = self.localizedFailureReason { } else if let failure = self.userInfo[NSLocalizedFailureErrorKey] as? String, let reason = self.localizedFailureReason {
@ -19,11 +17,11 @@ extension NSError {
} }
extension CocoaError { 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 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 = [ var info = [
NSLocalizedFailureErrorKey: error, NSLocalizedFailureErrorKey: error,
NSLocalizedFailureReasonErrorKey: reason 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 { extension CLError.Code: CustomStringConvertible {
public var description: String { public var description: String {
switch self { switch self {

View File

@ -1,6 +1,6 @@
import Foundation import Foundation
protocol Exportable { public protocol Exportable {
static var csvHeader: String { get } static var csvHeader: String { get }
var csvLine: String { get } var csvLine: String { get }
} }

22
AutoCatCore/Info.plist Normal file
View 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>

View File

@ -2,30 +2,30 @@ import Foundation
import RealmSwift import RealmSwift
import DifferenceKit import DifferenceKit
class AudioRecord: Object, Identifiable, Differentiable, Cloneable { public class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
@objc dynamic var path: String = "" @objc public dynamic var path: String = ""
@objc dynamic var number: String? @objc public dynamic var number: String?
@objc dynamic var rawText: String = "" @objc public dynamic var rawText: String = ""
@objc private dynamic var addedDate: TimeInterval = 0 @objc private dynamic var addedDate: TimeInterval = 0
@objc dynamic var duration: TimeInterval = 0 @objc public dynamic var duration: TimeInterval = 0
@objc dynamic var event: VehicleEvent? @objc public dynamic var event: VehicleEvent?
var identifier: TimeInterval = 0 public var identifier: TimeInterval = 0
var id: TimeInterval { public var id: TimeInterval {
if self.identifier == 0 { if self.identifier == 0 {
self.identifier = self.addedDate self.identifier = self.addedDate
} }
return self.identifier 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 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.path = path
self.number = number self.number = number
self.duration = duration self.duration = duration
@ -38,15 +38,15 @@ class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
super.init() super.init()
} }
override static func primaryKey() -> String? { public override static func primaryKey() -> String? {
return "path" return "path"
} }
override class func ignoredProperties() -> [String] { public override class func ignoredProperties() -> [String] {
return ["id", "identifier", "differenceIdentifier"] return ["id", "identifier", "differenceIdentifier"]
} }
func getAddedDate() -> TimeInterval { public func getAddedDate() -> TimeInterval {
if self.identifier == 0 { if self.identifier == 0 {
self.identifier = self.addedDate self.identifier = self.addedDate
print("getAddedDate: \(self.identifier)") print("getAddedDate: \(self.identifier)")
@ -57,7 +57,7 @@ class AudioRecord: Object, Identifiable, Differentiable, Cloneable {
// MARK: - Cloneable // MARK: - Cloneable
required init(copy: AudioRecord) { required public init(copy: AudioRecord) {
self.path = copy.path self.path = copy.path
self.number = copy.number self.number = copy.number
self.rawText = copy.rawText self.rawText = copy.rawText

View File

@ -1,11 +1,11 @@
import Foundation import Foundation
protocol Cloneable { public protocol Cloneable {
init(copy: Self) init(copy: Self)
} }
extension Cloneable { extension Cloneable {
func clone() -> Self { public func clone() -> Self {
return Self.init(copy: self) return Self.init(copy: self)
} }
} }

View File

@ -2,24 +2,24 @@ import Foundation
import SwiftDate import SwiftDate
import DifferenceKit 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 timestamp: Double = 0
var header: String public var header: String
var elements: [T] 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.timestamp = source.timestamp
self.header = source.header self.header = source.header
self.elements = Array(elements) self.elements = Array(elements)
} }
init(original: DateSection, items: [T]) { public init(original: DateSection, items: [T]) {
self = original self = original
self.elements = items self.elements = items
} }
init(timestamp: Double, items: [T]) { public init(timestamp: Double, items: [T]) {
let formatter = DateFormatter() let formatter = DateFormatter()
formatter.dateStyle = .medium formatter.dateStyle = .medium
formatter.timeStyle = .medium formatter.timeStyle = .medium
@ -51,27 +51,27 @@ struct DateSection<T>: Differentiable, DifferentiableSection, Hashable where T:
self.elements = items self.elements = items
} }
mutating func append(_ element: T) { public mutating func append(_ element: T) {
self.elements.append(element) self.elements.append(element)
} }
// MARK: - Differentiable // MARK: - Differentiable
var differenceIdentifier: String { public var differenceIdentifier: String {
return header return header
} }
func isContentEqual(to source: DateSection<T>) -> Bool { public func isContentEqual(to source: DateSection<T>) -> Bool {
return self.differenceIdentifier == source.differenceIdentifier return self.differenceIdentifier == source.differenceIdentifier
} }
// MARK: - Hashable // 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 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.timestamp)
hasher.combine(self.elements) hasher.combine(self.elements)
} }

View 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 }
}
}

View 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
}
}

View 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()
}
}

View 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
}
}

View File

@ -1,24 +1,24 @@
import Foundation import Foundation
class PlateNumber { public class PlateNumber {
private var number: String private var number: String
private var numberEnglish: String private var numberEnglish: String
init(_ string: String) { public init(_ string: String) {
self.number = string self.number = string
self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 }) self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 })
} }
func asString() -> String { public func asString() -> String {
return self.number return self.number
} }
func mainPart() -> String { public func mainPart() -> String {
let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6) let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6)
return String(self.numberEnglish[..<index]) return String(self.numberEnglish[..<index])
} }
func region() -> String { public func region() -> String {
let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6) let index = self.numberEnglish.index(self.numberEnglish.startIndex, offsetBy: 6)
return String(self.numberEnglish[index...]) return String(self.numberEnglish[index...])
} }

View File

@ -1,10 +1,10 @@
import Foundation import Foundation
class Settings { public class Settings {
private static let defaults = UserDefaults.standard private static let defaults = UserDefaults.standard
public static let shared = Settings() public static let shared = Settings()
var user: User { public var user: User {
didSet { didSet {
if let json = try? JSONEncoder().encode(self.user) { if let json = try? JSONEncoder().encode(self.user) {
Settings.defaults.set(json, forKey: "user") Settings.defaults.set(json, forKey: "user")
@ -13,35 +13,35 @@ class Settings {
} }
} }
var recognizeAlternativeOrder: Bool = false { public var recognizeAlternativeOrder: Bool = false {
didSet { didSet {
Settings.defaults.set(self.recognizeAlternativeOrder, forKey: "recognizeAlternativeOrder") Settings.defaults.set(self.recognizeAlternativeOrder, forKey: "recognizeAlternativeOrder")
Settings.defaults.synchronize() Settings.defaults.synchronize()
} }
} }
var recognizeShortenedNumbers: Bool = false { public var recognizeShortenedNumbers: Bool = false {
didSet { didSet {
Settings.defaults.set(self.recognizeShortenedNumbers, forKey: "recognizeShortenedNumbers") Settings.defaults.set(self.recognizeShortenedNumbers, forKey: "recognizeShortenedNumbers")
Settings.defaults.synchronize() Settings.defaults.synchronize()
} }
} }
var defaultRegion: String = "" { public var defaultRegion: String = "" {
didSet { didSet {
Settings.defaults.set(self.defaultRegion, forKey: "defaultRegion") Settings.defaults.set(self.defaultRegion, forKey: "defaultRegion")
Settings.defaults.synchronize() Settings.defaults.synchronize()
} }
} }
var recordBeep: Bool = false { public var recordBeep: Bool = false {
didSet { didSet {
Settings.defaults.set(self.recordBeep, forKey: "recordBeep") Settings.defaults.set(self.recordBeep, forKey: "recordBeep")
Settings.defaults.synchronize() Settings.defaults.synchronize()
} }
} }
var showDebugInfo: Bool = false { public var showDebugInfo: Bool = false {
didSet { didSet {
Settings.defaults.set(self.showDebugInfo, forKey: "showDebugInfo") Settings.defaults.set(self.showDebugInfo, forKey: "showDebugInfo")
Settings.defaults.synchronize() Settings.defaults.synchronize()

View 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 = ""
}
}

View File

@ -2,11 +2,11 @@ import Foundation
import RealmSwift import RealmSwift
import DifferenceKit import DifferenceKit
class VehicleName: Object, Decodable, Cloneable { public class VehicleName: Object, Decodable, Cloneable {
@objc dynamic var original: String? @objc public dynamic var original: String?
@objc dynamic var normalized: String? @objc public dynamic var normalized: String?
required init(copy: VehicleName) { public required init(copy: VehicleName) {
self.original = copy.original self.original = copy.original
self.normalized = copy.normalized self.normalized = copy.normalized
} }
@ -15,11 +15,11 @@ class VehicleName: Object, Decodable, Cloneable {
} }
} }
class VehicleBrand: Object, Decodable, Cloneable { public class VehicleBrand: Object, Decodable, Cloneable {
@objc dynamic var name: VehicleName? @objc public dynamic var name: VehicleName?
@objc dynamic var logo: String? @objc public dynamic var logo: String?
required init(copy: VehicleBrand) { public required init(copy: VehicleBrand) {
self.name = copy.name?.clone() self.name = copy.name?.clone()
self.logo = copy.logo 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? @objc dynamic var name: VehicleName?
required init(copy: VehicleModel) { public required init(copy: VehicleModel) {
self.name = copy.name?.clone() self.name = copy.name?.clone()
} }
@ -41,18 +41,18 @@ class VehicleModel: Object, Decodable, Cloneable {
} }
} }
class VehicleEngine: Object, Decodable, Cloneable { public class VehicleEngine: Object, Decodable, Cloneable {
@objc dynamic var number: String? @objc public dynamic var number: String?
var volume: RealmOptional<Int> = RealmOptional(0) public var volume: RealmOptional<Int> = RealmOptional(0)
@objc dynamic var powerHp: Float = 0 @objc public dynamic var powerHp: Float = 0
var powerKw: RealmOptional<Float> = RealmOptional(0) public var powerKw: RealmOptional<Float> = RealmOptional(0)
@objc dynamic var fuelType: String? @objc public dynamic var fuelType: String?
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case number, volume, powerHp, powerKw, fuelType 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) let container = try decoder.container(keyedBy: CodingKeys.self)
self.number = try container.decodeIfPresent(String.self, forKey: .number) self.number = try container.decodeIfPresent(String.self, forKey: .number)
self.volume = RealmOptional(try container.decodeIfPresent(Int.self, forKey: .volume)) self.volume = RealmOptional(try container.decodeIfPresent(Int.self, forKey: .volume))
@ -65,7 +65,7 @@ class VehicleEngine: Object, Decodable, Cloneable {
super.init() super.init()
} }
required init(copy: VehicleEngine) { public required init(copy: VehicleEngine) {
self.number = copy.number self.number = copy.number
self.volume = copy.volume self.volume = copy.volume
self.powerHp = copy.powerHp self.powerHp = copy.powerHp
@ -74,13 +74,13 @@ class VehicleEngine: Object, Decodable, Cloneable {
} }
} }
class VehiclePhoto: Object, Decodable, Cloneable { public class VehiclePhoto: Object, Decodable, Cloneable {
@objc dynamic var brand: String? @objc public dynamic var brand: String?
@objc dynamic var model: String? @objc public dynamic var model: String?
@objc dynamic var date: TimeInterval = 0 @objc public dynamic var date: TimeInterval = 0
@objc dynamic var url: String = "" @objc public dynamic var url: String = ""
override var description: String { public override var description: String {
let formatter = DateFormatter() let formatter = DateFormatter()
formatter.timeZone = TimeZone(identifier:"GMT") formatter.timeZone = TimeZone(identifier:"GMT")
formatter.dateStyle = .medium formatter.dateStyle = .medium
@ -90,7 +90,7 @@ class VehiclePhoto: Object, Decodable, Cloneable {
return "\(self.brand ?? "") \(self.model ?? "") (\(dateStr))" return "\(self.brand ?? "") \(self.model ?? "") (\(dateStr))"
} }
required init(copy: VehiclePhoto) { public required init(copy: VehiclePhoto) {
self.brand = copy.brand self.brand = copy.brand
self.model = copy.model self.model = copy.model
self.date = copy.date 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 legal
case individual case individual
var description: String { public var description: String {
switch self { switch self {
case .legal: return NSLocalizedString("legal", comment: "Owner type") case .legal: return NSLocalizedString("legal", comment: "Owner type")
case .individual: return NSLocalizedString("individual", 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 left
case right case right
case unknown case unknown
var description: String { public var description: String {
switch self { switch self {
case .left: return "Left" case .left: return "Left"
case .right: return "Right" case .right: return "Right"
@ -128,20 +128,20 @@ enum SteeringWheelPosition: CustomStringConvertible {
} }
} }
class VehicleOwnershipPeriod: Object, Decodable, Cloneable { public class VehicleOwnershipPeriod: Object, Decodable, Cloneable {
@objc dynamic var lastOperation: String = "" @objc public dynamic var lastOperation: String = ""
@objc dynamic var ownerType: String = "" @objc public dynamic var ownerType: String = ""
@objc dynamic var from: Int64 = 0 @objc public dynamic var from: Int64 = 0
@objc dynamic var to: Int64 = 0 @objc public dynamic var to: Int64 = 0
@objc dynamic var region: String? @objc public dynamic var region: String?
@objc dynamic var registrationRegion: String? @objc public dynamic var registrationRegion: String?
@objc dynamic var locality: String? @objc public dynamic var locality: String?
@objc dynamic var code: String? @objc public dynamic var code: String?
@objc dynamic var street: String? @objc public dynamic var street: String?
@objc dynamic var building: String? @objc public dynamic var building: String?
@objc dynamic var inn: String? @objc public dynamic var inn: String?
required init(copy: VehicleOwnershipPeriod) { required public init(copy: VehicleOwnershipPeriod) {
self.lastOperation = copy.lastOperation self.lastOperation = copy.lastOperation
self.ownerType = copy.ownerType self.ownerType = copy.ownerType
self.from = copy.from self.from = copy.from
@ -160,30 +160,30 @@ class VehicleOwnershipPeriod: Object, Decodable, Cloneable {
} }
} }
class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Exportable { public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Exportable {
@objc dynamic var brand: VehicleBrand? @objc public dynamic var brand: VehicleBrand?
@objc dynamic var model: VehicleModel? @objc public dynamic var model: VehicleModel?
@objc dynamic var color: String? @objc public dynamic var color: String?
@objc dynamic var year: Int = 0 @objc public dynamic var year: Int = 0
@objc dynamic var category: String? @objc public dynamic var category: String?
@objc dynamic var engine: VehicleEngine? @objc public dynamic var engine: VehicleEngine?
@objc private dynamic var number: String = "" @objc private dynamic var number: String = ""
@objc dynamic var currentNumber: String? @objc public dynamic var currentNumber: String?
@objc dynamic var vin1: String? @objc public dynamic var vin1: String?
@objc dynamic var vin2: String? @objc public dynamic var vin2: String?
@objc dynamic var sts: String? @objc public dynamic var sts: String?
@objc dynamic var pts: String? @objc public dynamic var pts: String?
var isRightWheel = RealmOptional<Bool>() public var isRightWheel = RealmOptional<Bool>()
var isJapanese: RealmOptional<Bool> = RealmOptional<Bool>() public var isJapanese: RealmOptional<Bool> = RealmOptional<Bool>()
@objc dynamic var addedDate: TimeInterval = 0 @objc public dynamic var addedDate: TimeInterval = 0
@objc dynamic var updatedDate: TimeInterval = 0 @objc public dynamic var updatedDate: TimeInterval = 0
@objc dynamic var addedBy: String = "" @objc public dynamic var addedBy: String = ""
var photos = List<VehiclePhoto>() public var photos = List<VehiclePhoto>()
var ownershipPeriods = List<VehicleOwnershipPeriod>() public var ownershipPeriods = List<VehicleOwnershipPeriod>()
var events = List<VehicleEvent>() public var events = List<VehicleEvent>()
var osagoContracts = List<Osago>() public var osagoContracts = List<Osago>()
var ads = List<VehicleAd>() public var ads = List<VehicleAd>()
@objc dynamic var debugInfo: DebugInfo? @objc public dynamic var debugInfo: DebugInfo?
lazy var formatter: DateFormatter = { lazy var formatter: DateFormatter = {
let f = DateFormatter() let f = DateFormatter()
@ -192,9 +192,9 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
return f 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 && return self.number == source.number &&
self.addedDate == source.addedDate && self.addedDate == source.addedDate &&
self.updatedDate == source.updatedDate self.updatedDate == source.updatedDate
@ -226,7 +226,7 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
case debugInfo case debugInfo
} }
required init(from decoder: Decoder) throws { required public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self) let container = try decoder.container(keyedBy: CodingKeys.self)
self.brand = try container.decodeIfPresent(VehicleBrand.self, forKey: .brand) self.brand = try container.decodeIfPresent(VehicleBrand.self, forKey: .brand)
self.model = try container.decodeIfPresent(VehicleModel.self, forKey: .model) self.model = try container.decodeIfPresent(VehicleModel.self, forKey: .model)
@ -272,29 +272,29 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
super.init() super.init()
} }
init(_ number: String) { public init(_ number: String) {
self.number = number self.number = number
self.addedDate = Date().timeIntervalSince1970 self.addedDate = Date().timeIntervalSince1970
self.updatedDate = self.addedDate self.updatedDate = self.addedDate
} }
func getNumber() -> String { public func getNumber() -> String {
return self.number return self.number
} }
override static func primaryKey() -> String? { public override static func primaryKey() -> String? {
return "number" return "number"
} }
override class func ignoredProperties() -> [String] { public override class func ignoredProperties() -> [String] {
return ["id", "identifier", "differenceIdentifier", "formatter"] return ["id", "identifier", "differenceIdentifier", "formatter"]
} }
var unrecognized: Bool { public var unrecognized: Bool {
return self.brand == nil return self.brand == nil
} }
var outdated: Bool { public var outdated: Bool {
if let current = self.currentNumber { if let current = self.currentNumber {
return current != self.number return current != self.number
} else { } else {
@ -304,7 +304,7 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
// MARK: - Cloneable // MARK: - Cloneable
required init(copy: Vehicle) { required public init(copy: Vehicle) {
self.brand = copy.brand self.brand = copy.brand
self.model = copy.model self.model = copy.model
self.color = copy.color self.color = copy.color
@ -346,11 +346,11 @@ class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable, Expor
// MARK: - Exportable // MARK: - Exportable
static var csvHeader: String { public static var csvHeader: String {
return "Model, Color, Year, Plate Number, VIN, STS, PTS, Added Date, Updated date" 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 model = self.brand?.name?.original ?? "<unknown>"
let added = self.formatter.string(from: Date(timeIntervalSince1970: self.addedDate)) let added = self.formatter.string(from: Date(timeIntervalSince1970: self.addedDate))
let updated = self.formatter.string(from: Date(timeIntervalSince1970: self.updatedDate)) let updated = self.formatter.string(from: Date(timeIntervalSince1970: self.updatedDate))

View 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()
}
}

View File

@ -3,21 +3,21 @@ import RealmSwift
import RxSwift import RxSwift
import CoreLocation import CoreLocation
class VehicleEvent: Object, Codable, Cloneable { public class VehicleEvent: Object, Codable, Cloneable {
@objc dynamic var id: String? @objc public dynamic var id: String?
@objc dynamic var date: TimeInterval = Date().timeIntervalSince1970 @objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970
@objc dynamic var latitude: Double = 0 @objc public dynamic var latitude: Double = 0
@objc dynamic var longitude: Double = 0 @objc public dynamic var longitude: Double = 0
@objc dynamic var speed: Double = 0 @objc public dynamic var speed: Double = 0
@objc dynamic var direction: Double = 0 @objc public dynamic var direction: Double = 0
@objc dynamic var address: String? = nil @objc public dynamic var address: String? = nil
var number: String? public var number: String?
var coordinate: CLLocationCoordinate2D { public var coordinate: CLLocationCoordinate2D {
return CLLocationCoordinate2D(latitude: self.latitude, longitude: self.longitude) 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.latitude = lat
self.longitude = lon self.longitude = lon
self.speed = speed self.speed = speed
@ -28,11 +28,11 @@ class VehicleEvent: Object, Codable, Cloneable {
super.init() super.init()
} }
func findAddress() -> Single<Void> { public func findAddress() -> Single<Void> {
if address != nil { if address != nil {
return Single.just(()) return Single.just(())
} else { } else {
return LocationManager return RxLocationManager
.getAddressForLocation(latitude: self.latitude, longitude: self.longitude) .getAddressForLocation(latitude: self.latitude, longitude: self.longitude)
.map { addr in .map { addr in
if let realm = self.realm { 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"] return ["plateNumber"]
} }
func getMapLink() -> URL? { public func getMapLink() -> URL? {
var urlString = "http://maps.apple.com/?sll=\(self.latitude),\(self.longitude)" var urlString = "http://maps.apple.com/?sll=\(self.latitude),\(self.longitude)"
if let address = self.address?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) { if let address = self.address?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
urlString = urlString + "&address=" + address urlString = urlString + "&address=" + address
@ -56,7 +56,7 @@ class VehicleEvent: Object, Codable, Cloneable {
return URL(string: urlString) return URL(string: urlString)
} }
func getLocationString() -> String { public func getLocationString() -> String {
let coordinates = "Lat: \(self.latitude), Lon: \(self.longitude)" let coordinates = "Lat: \(self.latitude), Lon: \(self.longitude)"
if let addressString = self.address { if let addressString = self.address {
return "\(addressString) (\(coordinates)" return "\(addressString) (\(coordinates)"
@ -67,7 +67,7 @@ class VehicleEvent: Object, Codable, Cloneable {
// MARK: - Cloneable // MARK: - Cloneable
required init(copy: VehicleEvent) { public required init(copy: VehicleEvent) {
self.id = copy.id self.id = copy.id
self.date = copy.date self.date = copy.date
self.latitude = copy.latitude self.latitude = copy.latitude

View 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
}
}

View File

@ -2,7 +2,7 @@ import Foundation
import RxSwift import RxSwift
import RxCocoa import RxCocoa
class Api { public class Api {
private static let session: URLSession = { private static let session: URLSession = {
let sessionConfig = URLSessionConfiguration.default let sessionConfig = URLSessionConfiguration.default

View 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"
}

View File

@ -61,33 +61,33 @@ extension String {
} }
} }
protocol JwtPayload: Codable { public protocol JwtPayload: Codable {
var exp: Int { get } var exp: Int { get }
} }
extension JwtPayload { extension JwtPayload {
var exp: Int { 0 } public var exp: Int { 0 }
} }
struct EmptyPayload: JwtPayload { } public struct EmptyPayload: JwtPayload { }
struct FirebasePayload: JwtPayload { public struct FirebasePayload: JwtPayload {
var email: String public var email: String
var name: String public var name: String
} }
struct NumberPayload: JwtPayload { public struct NumberPayload: JwtPayload {
var plateNumber: String public var plateNumber: String
} }
class JWT<T> where T: JwtPayload { public class JWT<T> where T: JwtPayload {
private var jwt: String private var jwt: String
public let payload: T public let payload: T
public var expired: Bool { public var expired: Bool {
return TimeInterval(self.payload.exp) < Date().timeIntervalSince1970 return TimeInterval(self.payload.exp) < Date().timeIntervalSince1970
} }
init?(string: String) { public init?(string: String) {
self.jwt = string self.jwt = string
let parts = string.split(separator: ".") 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 header = #"{ "typ": "JWT", "alg": "HS256" }"#
let bodyDict: [String: Any] = [ let bodyDict: [String: Any] = [
"iat": Date().timeIntervalSince1970, "iat": Date().timeIntervalSince1970,

View File

@ -65,15 +65,16 @@ class RxLocationManagerDelegateProxy: DelegateProxy<CLLocationManager, CLLocatio
} }
} }
class LocationManager { public class RxLocationManager {
private static let manager: CLLocationManager = { private static let manager: CLLocationManager = {
let mgr = CLLocationManager() let mgr = CLLocationManager()
mgr.desiredAccuracy = kCLLocationAccuracyBest mgr.desiredAccuracy = kCLLocationAccuracyBest
return mgr return mgr
}() }()
private static let bag = DisposeBag() private static let bag = DisposeBag()
private static var eventObservable: Single<VehicleEvent>? 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> { private static func checkPermissions() -> Single<Void> {
return Single<Void>.create { observer in return Single<Void>.create { observer in
@ -114,7 +115,7 @@ class LocationManager {
return single return single
} }
static func requestCurrentLocation() -> Single<VehicleEvent> { public static func requestCurrentLocation() -> Single<VehicleEvent> {
if let result = self.eventObservable { if let result = self.eventObservable {
return result return result
} else { } else {
@ -128,11 +129,11 @@ class LocationManager {
} }
} }
static func locationRequestInProgress() -> Bool { public static func locationRequestInProgress() -> Bool {
return self.eventObservable != nil 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 return Single.create { observer in
let geocoder = CLGeocoder() let geocoder = CLGeocoder()
let location = CLLocation(latitude: latitude, longitude: longitude) let location = CLLocation(latitude: latitude, longitude: longitude)
@ -152,7 +153,7 @@ class LocationManager {
} }
} }
static func resetLastEvent() { public static func resetLastEvent() {
self.lastEvent = nil self.lastEvent = nil
} }
} }

View 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
View 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>

View File

@ -0,0 +1,16 @@
import Foundation
import CoreLocation
class FakeLocationManager: CLLocationManager {
override func requestAlwaysAuthorization() {
}
override func requestLocation() {
}
override func stopUpdatingLocation() {
}
}