diff --git a/.DS_Store b/.DS_Store
index e7ee97e4..3af32433 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/Clew.xcodeproj/project.pbxproj b/Clew.xcodeproj/project.pbxproj
index a7cbd60c..9e3e8d8b 100644
--- a/Clew.xcodeproj/project.pbxproj
+++ b/Clew.xcodeproj/project.pbxproj
@@ -7,10 +7,14 @@
objects = {
/* Begin PBXBuildFile section */
+ 1F2B9D7222C3B50D00317DC8 /* HelpCompiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F2B9D7022C3B50D00317DC8 /* HelpCompiler.swift */; };
+ 1F2B9D8722C5446B00317DC8 /* (null) in Resources */ = {isa = PBXBuildFile; };
2748B8490FCBA95C7AA028D7 /* Pods_Clew.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 942F73299DA8DCF97FAA974A /* Pods_Clew.framework */; };
4D6B00E51F33C9B800952242 /* Crumb.obj in Resources */ = {isa = PBXBuildFile; fileRef = 4D6B00E41F33C85500952242 /* Crumb.obj */; };
4DF05CC81F34EB6B008B0E31 /* Confirm.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 4DF05CC71F34EB56008B0E31 /* Confirm.mp3 */; };
77467DAF22BBC1D300FA7DEE /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 77467DAE22BBC1D300FA7DEE /* Default-568h@2x.png */; };
+ 77A734E222C156AC00E124EA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 77A734E122C156AC00E124EA /* GoogleService-Info.plist */; };
+ 77A734E322C156AC00E124EA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 77A734E122C156AC00E124EA /* GoogleService-Info.plist */; };
82569F4E22187E6500448B45 /* help in Resources */ = {isa = PBXBuildFile; fileRef = 82569F4D22187E6500448B45 /* help */; };
82569F4F22187E6500448B45 /* help in Resources */ = {isa = PBXBuildFile; fileRef = 82569F4D22187E6500448B45 /* help */; };
B0A563F6FE1007A2716DC876 /* Pods_Clew_Dev.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3532E390954571B93729786A /* Pods_Clew_Dev.framework */; };
@@ -42,18 +46,12 @@
E5470F0D22C119F5001092A4 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E5470EB722C119F4001092A4 /* SettingsViewController.m */; };
E5470F0E22C119F5001092A4 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E5470EB922C119F4001092A4 /* Settings.bundle */; };
E5470F0F22C119F5001092A4 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E5470EB922C119F4001092A4 /* Settings.bundle */; };
- E5470F1022C119F5001092A4 /* LaunchScreen.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5470EBC22C119F4001092A4 /* LaunchScreen.strings */; };
- E5470F1122C119F5001092A4 /* LaunchScreen.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5470EBC22C119F4001092A4 /* LaunchScreen.strings */; };
- E5470F1222C119F5001092A4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5470EBE22C119F4001092A4 /* Localizable.strings */; };
- E5470F1322C119F5001092A4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5470EBE22C119F4001092A4 /* Localizable.strings */; };
E5470F1622C119F5001092A4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED022C119F4001092A4 /* Assets.xcassets */; };
E5470F1722C119F5001092A4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED022C119F4001092A4 /* Assets.xcassets */; };
E5470F1822C119F5001092A4 /* StartRecording.aiff in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED222C119F4001092A4 /* StartRecording.aiff */; };
E5470F1922C119F5001092A4 /* StartRecording.aiff in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED222C119F4001092A4 /* StartRecording.aiff */; };
E5470F1A22C119F5001092A4 /* StopRecording.aiff in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED322C119F4001092A4 /* StopRecording.aiff */; };
E5470F1B22C119F5001092A4 /* StopRecording.aiff in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED322C119F4001092A4 /* StopRecording.aiff */; };
- E5470F1C22C119F5001092A4 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED422C119F4001092A4 /* GoogleService-Info.plist */; };
- E5470F1D22C119F5001092A4 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E5470ED422C119F4001092A4 /* GoogleService-Info.plist */; };
E5470F1E22C119F5001092A4 /* NSStringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470ED622C119F4001092A4 /* NSStringExtension.swift */; };
E5470F1F22C119F5001092A4 /* NSStringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470ED622C119F4001092A4 /* NSStringExtension.swift */; };
E5470F2022C119F5001092A4 /* UIViewControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470ED722C119F4001092A4 /* UIViewControllerExtensions.swift */; };
@@ -92,25 +90,35 @@
E5470F4122C119F5001092A4 /* StateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EEC22C119F4001092A4 /* StateController.swift */; };
E5470F4222C119F5001092A4 /* UIConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EEE22C119F4001092A4 /* UIConstants.swift */; };
E5470F4322C119F5001092A4 /* UIConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EEE22C119F4001092A4 /* UIConstants.swift */; };
- E5470F4422C119F5001092A4 /* SettingsAndHelp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E5470EEF22C119F4001092A4 /* SettingsAndHelp.storyboard */; };
- E5470F4522C119F5001092A4 /* SettingsAndHelp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E5470EEF22C119F4001092A4 /* SettingsAndHelp.storyboard */; };
E5470F4622C119F5001092A4 /* RootContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EF022C119F4001092A4 /* RootContainerView.swift */; };
E5470F4722C119F5001092A4 /* RootContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EF022C119F4001092A4 /* RootContainerView.swift */; };
- E5470F4822C119F5001092A4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E5470EF122C119F4001092A4 /* LaunchScreen.storyboard */; };
- E5470F4922C119F5001092A4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E5470EF122C119F4001092A4 /* LaunchScreen.storyboard */; };
E5470F4A22C119F5001092A4 /* RouteTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EF322C119F4001092A4 /* RouteTableViewCell.swift */; };
E5470F4B22C119F5001092A4 /* RouteTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5470EF322C119F4001092A4 /* RouteTableViewCell.swift */; };
E5470F4E22C119F5001092A4 /* GoogleService-Info_dev.plist in Resources */ = {isa = PBXBuildFile; fileRef = E5470EF522C119F4001092A4 /* GoogleService-Info_dev.plist */; };
E5470F4F22C119F5001092A4 /* GoogleService-Info_dev.plist in Resources */ = {isa = PBXBuildFile; fileRef = E5470EF522C119F4001092A4 /* GoogleService-Info_dev.plist */; };
+ E59DA6B522C65F4A00FCD5A1 /* LaunchScreen.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69822C65F4A00FCD5A1 /* LaunchScreen.strings */; };
+ E59DA6B622C65F4A00FCD5A1 /* LaunchScreen.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69822C65F4A00FCD5A1 /* LaunchScreen.strings */; };
+ E59DA6B722C65F4A00FCD5A1 /* SettingsAndHelp.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69A22C65F4A00FCD5A1 /* SettingsAndHelp.strings */; };
+ E59DA6B822C65F4A00FCD5A1 /* SettingsAndHelp.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69A22C65F4A00FCD5A1 /* SettingsAndHelp.strings */; };
+ E59DA6B922C65F4A00FCD5A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69C22C65F4A00FCD5A1 /* Localizable.strings */; };
+ E59DA6BA22C65F4A00FCD5A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69C22C65F4A00FCD5A1 /* Localizable.strings */; };
+ E59DA6BB22C65F4A00FCD5A1 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69E22C65F4A00FCD5A1 /* Info.plist */; };
+ E59DA6BC22C65F4A00FCD5A1 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E59DA69E22C65F4A00FCD5A1 /* Info.plist */; };
+ E59DA6BF22C65F5900FCD5A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E59DA6BD22C65F5900FCD5A1 /* LaunchScreen.storyboard */; };
+ E59DA6C022C65F5900FCD5A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E59DA6BD22C65F5900FCD5A1 /* LaunchScreen.storyboard */; };
+ E59DA6C122C65F5900FCD5A1 /* SettingsAndHelp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E59DA6BE22C65F5900FCD5A1 /* SettingsAndHelp.storyboard */; };
+ E59DA6C222C65F5900FCD5A1 /* SettingsAndHelp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E59DA6BE22C65F5900FCD5A1 /* SettingsAndHelp.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
08FA9C31721F9F8CDCC23AE9 /* Pods-Clew.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Clew.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Clew/Pods-Clew.debug.xcconfig"; sourceTree = ""; };
+ 1F2B9D7022C3B50D00317DC8 /* HelpCompiler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HelpCompiler.swift; sourceTree = ""; };
3532E390954571B93729786A /* Pods_Clew_Dev.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Clew_Dev.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4D6B00C01F33C1C400952242 /* Clew.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Clew.app; sourceTree = BUILT_PRODUCTS_DIR; };
4D6B00E41F33C85500952242 /* Crumb.obj */ = {isa = PBXFileReference; lastKnownFileType = text; path = Crumb.obj; sourceTree = ""; };
4DF05CC71F34EB56008B0E31 /* Confirm.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Confirm.mp3; sourceTree = ""; };
77467DAE22BBC1D300FA7DEE /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; };
+ 77A734E122C156AC00E124EA /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
822E27F8210E3F260024A5E3 /* Clew Dev-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Clew Dev-Info.plist"; sourceTree = ""; };
82569F4D22187E6500448B45 /* help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = help; sourceTree = ""; };
85A1A72DC19F87F15B738291 /* Pods-Clew Dev.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Clew Dev.release.xcconfig"; path = "Pods/Target Support Files/Pods-Clew Dev/Pods-Clew Dev.release.xcconfig"; sourceTree = ""; };
@@ -133,27 +141,9 @@
E5470EB822C119F4001092A4 /* Clew Dev-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Clew Dev-Bridging-Header.h"; sourceTree = ""; };
E5470EB922C119F4001092A4 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; };
E5470EBA22C119F4001092A4 /* SettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsTableViewController.h; sourceTree = ""; };
- E5470EBD22C119F4001092A4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; };
- E5470EBF22C119F4001092A4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
- E5470EC122C119F4001092A4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/Info.plist"; sourceTree = ""; };
- E5470EC222C119F4001092A4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; };
- E5470EC322C119F4001092A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
- E5470EC422C119F4001092A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/Info.plist; sourceTree = ""; };
- E5470EC522C119F4001092A4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; };
- E5470EC622C119F4001092A4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
- E5470EC722C119F4001092A4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = es; path = es.lproj/Info.plist; sourceTree = ""; };
- E5470EC822C119F4001092A4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; };
- E5470EC922C119F4001092A4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; };
- E5470ECA22C119F4001092A4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = ""; };
- E5470ECB22C119F4001092A4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
- E5470ECC22C119F4001092A4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ru; path = ru.lproj/Info.plist; sourceTree = ""; };
- E5470ECD22C119F4001092A4 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/LaunchScreen.strings; sourceTree = ""; };
- E5470ECE22C119F4001092A4 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; };
- E5470ECF22C119F4001092A4 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = th; path = th.lproj/Info.plist; sourceTree = ""; };
E5470ED022C119F4001092A4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
E5470ED222C119F4001092A4 /* StartRecording.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = StartRecording.aiff; sourceTree = ""; };
E5470ED322C119F4001092A4 /* StopRecording.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = StopRecording.aiff; sourceTree = ""; };
- E5470ED422C119F4001092A4 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
E5470ED622C119F4001092A4 /* NSStringExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSStringExtension.swift; sourceTree = ""; };
E5470ED722C119F4001092A4 /* UIViewControllerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewControllerExtensions.swift; sourceTree = ""; };
E5470ED822C119F4001092A4 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; };
@@ -175,12 +165,33 @@
E5470EEB22C119F4001092A4 /* RoutesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoutesViewController.swift; sourceTree = ""; };
E5470EEC22C119F4001092A4 /* StateController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateController.swift; sourceTree = ""; };
E5470EEE22C119F4001092A4 /* UIConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIConstants.swift; sourceTree = ""; };
- E5470EEF22C119F4001092A4 /* SettingsAndHelp.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SettingsAndHelp.storyboard; sourceTree = ""; };
E5470EF022C119F4001092A4 /* RootContainerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootContainerView.swift; sourceTree = ""; };
- E5470EF222C119F4001092A4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
E5470EF322C119F4001092A4 /* RouteTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteTableViewCell.swift; sourceTree = ""; };
E5470EF422C119F4001092A4 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
E5470EF522C119F4001092A4 /* GoogleService-Info_dev.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info_dev.plist"; sourceTree = ""; };
+ E59DA69922C65F4A00FCD5A1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ E59DA69B22C65F4A00FCD5A1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SettingsAndHelp.strings"; sourceTree = ""; };
+ E59DA69D22C65F4A00FCD5A1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
+ E59DA69F22C65F4A00FCD5A1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/Info.plist"; sourceTree = ""; };
+ E59DA6A022C65F4A00FCD5A1 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; };
+ E59DA6A122C65F4A00FCD5A1 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6A322C65F4A00FCD5A1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6A422C65F4A00FCD5A1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
+ E59DA6A522C65F4A00FCD5A1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/Info.plist; sourceTree = ""; };
+ E59DA6A622C65F4A00FCD5A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; };
+ E59DA6A722C65F4A00FCD5A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6A822C65F4A00FCD5A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ E59DA6A922C65F4A00FCD5A1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = es; path = es.lproj/Info.plist; sourceTree = ""; };
+ E59DA6AA22C65F4A00FCD5A1 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; };
+ E59DA6AB22C65F4A00FCD5A1 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6AD22C65F4A00FCD5A1 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = ""; };
+ E59DA6AE22C65F4A00FCD5A1 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6B022C65F4A00FCD5A1 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ru; path = ru.lproj/Info.plist; sourceTree = ""; };
+ E59DA6B122C65F4A00FCD5A1 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/LaunchScreen.strings; sourceTree = ""; };
+ E59DA6B222C65F4A00FCD5A1 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/SettingsAndHelp.strings; sourceTree = ""; };
+ E59DA6B422C65F4A00FCD5A1 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = th; path = th.lproj/Info.plist; sourceTree = ""; };
+ E59DA6BD22C65F5900FCD5A1 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; };
+ E59DA6BE22C65F5900FCD5A1 /* SettingsAndHelp.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SettingsAndHelp.storyboard; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -250,22 +261,22 @@
E5470EA922C119F4001092A4 /* Clew */ = {
isa = PBXGroup;
children = (
+ E59DA69722C65F4A00FCD5A1 /* localizations */,
E5470EAA22C119F4001092A4 /* Voice Notes */,
E5470EAF22C119F4001092A4 /* Misc */,
E5470EB722C119F4001092A4 /* SettingsViewController.m */,
E5470EB822C119F4001092A4 /* Clew Dev-Bridging-Header.h */,
E5470EB922C119F4001092A4 /* Settings.bundle */,
E5470EBA22C119F4001092A4 /* SettingsTableViewController.h */,
- E5470EBB22C119F4001092A4 /* localizations */,
E5470ED022C119F4001092A4 /* Assets.xcassets */,
E5470ED122C119F4001092A4 /* Sound Effects */,
- E5470ED422C119F4001092A4 /* GoogleService-Info.plist */,
E5470ED522C119F4001092A4 /* Extensions */,
E5470EDB22C119F4001092A4 /* SettingsViewController.h */,
E5470EDC22C119F4001092A4 /* Clew-Bridging-Header.h */,
E5470EDD22C119F4001092A4 /* Controllers */,
E5470EED22C119F4001092A4 /* Views */,
E5470EF422C119F4001092A4 /* Info.plist */,
+ 77A734E122C156AC00E124EA /* GoogleService-Info.plist */,
E5470EF522C119F4001092A4 /* GoogleService-Info_dev.plist */,
);
path = Clew;
@@ -291,21 +302,12 @@
E5470EB322C119F4001092A4 /* FeedbackLogger.swift */,
E5470EB422C119F4001092A4 /* PathFinder.swift */,
E5470EB522C119F4001092A4 /* Utility.swift */,
+ 1F2B9D7022C3B50D00317DC8 /* HelpCompiler.swift */,
E5470EB622C119F4001092A4 /* AppDelegate.swift */,
);
path = Misc;
sourceTree = "";
};
- E5470EBB22C119F4001092A4 /* localizations */ = {
- isa = PBXGroup;
- children = (
- E5470EBC22C119F4001092A4 /* LaunchScreen.strings */,
- E5470EBE22C119F4001092A4 /* Localizable.strings */,
- E5470EC022C119F4001092A4 /* Info.plist */,
- );
- path = localizations;
- sourceTree = "";
- };
E5470ED122C119F4001092A4 /* Sound Effects */ = {
isa = PBXGroup;
children = (
@@ -366,15 +368,26 @@
E5470EED22C119F4001092A4 /* Views */ = {
isa = PBXGroup;
children = (
+ E59DA6BD22C65F5900FCD5A1 /* LaunchScreen.storyboard */,
+ E59DA6BE22C65F5900FCD5A1 /* SettingsAndHelp.storyboard */,
E5470EEE22C119F4001092A4 /* UIConstants.swift */,
- E5470EEF22C119F4001092A4 /* SettingsAndHelp.storyboard */,
E5470EF022C119F4001092A4 /* RootContainerView.swift */,
- E5470EF122C119F4001092A4 /* LaunchScreen.storyboard */,
E5470EF322C119F4001092A4 /* RouteTableViewCell.swift */,
);
path = Views;
sourceTree = "";
};
+ E59DA69722C65F4A00FCD5A1 /* localizations */ = {
+ isa = PBXGroup;
+ children = (
+ E59DA69822C65F4A00FCD5A1 /* LaunchScreen.strings */,
+ E59DA69A22C65F4A00FCD5A1 /* SettingsAndHelp.strings */,
+ E59DA69C22C65F4A00FCD5A1 /* Localizable.strings */,
+ E59DA69E22C65F4A00FCD5A1 /* Info.plist */,
+ );
+ path = localizations;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -466,19 +479,23 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ E59DA6BB22C65F4A00FCD5A1 /* Info.plist in Resources */,
4DF05CC81F34EB6B008B0E31 /* Confirm.mp3 in Resources */,
E5470F1822C119F5001092A4 /* StartRecording.aiff in Resources */,
- E5470F1022C119F5001092A4 /* LaunchScreen.strings in Resources */,
+ 77A734E222C156AC00E124EA /* GoogleService-Info.plist in Resources */,
+ 4D6B00E51F33C9B800952242 /* Crumb.obj in Resources */,
+ E59DA6B522C65F4A00FCD5A1 /* LaunchScreen.strings in Resources */,
4D6B00E51F33C9B800952242 /* Crumb.obj in Resources */,
- E5470F1C22C119F5001092A4 /* GoogleService-Info.plist in Resources */,
- E5470F1222C119F5001092A4 /* Localizable.strings in Resources */,
E5470F0E22C119F5001092A4 /* Settings.bundle in Resources */,
82569F4E22187E6500448B45 /* help in Resources */,
E5470F1622C119F5001092A4 /* Assets.xcassets in Resources */,
+ E59DA6BF22C65F5900FCD5A1 /* LaunchScreen.storyboard in Resources */,
E5470F4E22C119F5001092A4 /* GoogleService-Info_dev.plist in Resources */,
- E5470F4422C119F5001092A4 /* SettingsAndHelp.storyboard in Resources */,
- E5470F4822C119F5001092A4 /* LaunchScreen.storyboard in Resources */,
+ 1F2B9D8722C5446B00317DC8 /* (null) in Resources */,
+ E59DA6C122C65F5900FCD5A1 /* SettingsAndHelp.storyboard in Resources */,
+ E59DA6B922C65F4A00FCD5A1 /* Localizable.strings in Resources */,
E5470F1A22C119F5001092A4 /* StopRecording.aiff in Resources */,
+ E59DA6B722C65F4A00FCD5A1 /* SettingsAndHelp.strings in Resources */,
77467DAF22BBC1D300FA7DEE /* Default-568h@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -487,19 +504,21 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ E59DA6C222C65F5900FCD5A1 /* SettingsAndHelp.storyboard in Resources */,
E5470F0F22C119F5001092A4 /* Settings.bundle in Resources */,
+ E59DA6B622C65F4A00FCD5A1 /* LaunchScreen.strings in Resources */,
E5470F1922C119F5001092A4 /* StartRecording.aiff in Resources */,
- E5470F1322C119F5001092A4 /* Localizable.strings in Resources */,
E5470F1B22C119F5001092A4 /* StopRecording.aiff in Resources */,
B7EB59E220F693EB00FBBC6A /* Confirm.mp3 in Resources */,
B7EB59E320F693EB00FBBC6A /* Crumb.obj in Resources */,
- E5470F4522C119F5001092A4 /* SettingsAndHelp.storyboard in Resources */,
- E5470F4922C119F5001092A4 /* LaunchScreen.storyboard in Resources */,
+ E59DA6BC22C65F4A00FCD5A1 /* Info.plist in Resources */,
E5470F4F22C119F5001092A4 /* GoogleService-Info_dev.plist in Resources */,
- E5470F1122C119F5001092A4 /* LaunchScreen.strings in Resources */,
+ E59DA6B822C65F4A00FCD5A1 /* SettingsAndHelp.strings in Resources */,
+ E59DA6BA22C65F4A00FCD5A1 /* Localizable.strings in Resources */,
82569F4F22187E6500448B45 /* help in Resources */,
- E5470F1D22C119F5001092A4 /* GoogleService-Info.plist in Resources */,
+ E59DA6C022C65F5900FCD5A1 /* LaunchScreen.storyboard in Resources */,
E5470F1722C119F5001092A4 /* Assets.xcassets in Resources */,
+ 77A734E322C156AC00E124EA /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -666,6 +685,7 @@
E5470EF722C119F5001092A4 /* RecordButtonKit.swift in Sources */,
E5470F0722C119F5001092A4 /* PathFinder.swift in Sources */,
E5470F2D22C119F5001092A4 /* StartNavigationController.swift in Sources */,
+ 1F2B9D7222C3B50D00317DC8 /* HelpCompiler.swift in Sources */,
E5470F3122C119F5001092A4 /* RouteRatingController.swift in Sources */,
E5470F4322C119F5001092A4 /* UIConstants.swift in Sources */,
E5470F2122C119F5001092A4 /* UIViewControllerExtensions.swift in Sources */,
@@ -692,50 +712,53 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
- E5470EBC22C119F4001092A4 /* LaunchScreen.strings */ = {
+ E59DA69822C65F4A00FCD5A1 /* LaunchScreen.strings */ = {
isa = PBXVariantGroup;
children = (
- E5470EBD22C119F4001092A4 /* zh-Hans */,
- E5470EC222C119F4001092A4 /* ja */,
- E5470EC522C119F4001092A4 /* es */,
- E5470EC822C119F4001092A4 /* ko */,
- E5470ECA22C119F4001092A4 /* ru */,
- E5470ECD22C119F4001092A4 /* th */,
+ E59DA69922C65F4A00FCD5A1 /* zh-Hans */,
+ E59DA6A022C65F4A00FCD5A1 /* ja */,
+ E59DA6A622C65F4A00FCD5A1 /* es */,
+ E59DA6AA22C65F4A00FCD5A1 /* ko */,
+ E59DA6AD22C65F4A00FCD5A1 /* ru */,
+ E59DA6B122C65F4A00FCD5A1 /* th */,
);
name = LaunchScreen.strings;
sourceTree = "";
};
- E5470EBE22C119F4001092A4 /* Localizable.strings */ = {
+ E59DA69A22C65F4A00FCD5A1 /* SettingsAndHelp.strings */ = {
isa = PBXVariantGroup;
children = (
- E5470EBF22C119F4001092A4 /* zh-Hans */,
- E5470EC322C119F4001092A4 /* en */,
- E5470EC622C119F4001092A4 /* es */,
- E5470EC922C119F4001092A4 /* ko */,
- E5470ECB22C119F4001092A4 /* ru */,
- E5470ECE22C119F4001092A4 /* th */,
- );
- name = Localizable.strings;
+ E59DA69B22C65F4A00FCD5A1 /* zh-Hans */,
+ E59DA6A122C65F4A00FCD5A1 /* ja */,
+ E59DA6A322C65F4A00FCD5A1 /* en */,
+ E59DA6A722C65F4A00FCD5A1 /* es */,
+ E59DA6AB22C65F4A00FCD5A1 /* ko */,
+ E59DA6AE22C65F4A00FCD5A1 /* ru */,
+ E59DA6B222C65F4A00FCD5A1 /* th */,
+ );
+ name = SettingsAndHelp.strings;
sourceTree = "";
};
- E5470EC022C119F4001092A4 /* Info.plist */ = {
+ E59DA69C22C65F4A00FCD5A1 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
- E5470EC122C119F4001092A4 /* zh-Hans */,
- E5470EC422C119F4001092A4 /* en */,
- E5470EC722C119F4001092A4 /* es */,
- E5470ECC22C119F4001092A4 /* ru */,
- E5470ECF22C119F4001092A4 /* th */,
+ E59DA69D22C65F4A00FCD5A1 /* zh-Hans */,
+ E59DA6A422C65F4A00FCD5A1 /* en */,
+ E59DA6A822C65F4A00FCD5A1 /* es */,
);
- name = Info.plist;
+ name = Localizable.strings;
sourceTree = "";
};
- E5470EF122C119F4001092A4 /* LaunchScreen.storyboard */ = {
+ E59DA69E22C65F4A00FCD5A1 /* Info.plist */ = {
isa = PBXVariantGroup;
children = (
- E5470EF222C119F4001092A4 /* Base */,
+ E59DA69F22C65F4A00FCD5A1 /* zh-Hans */,
+ E59DA6A522C65F4A00FCD5A1 /* en */,
+ E59DA6A922C65F4A00FCD5A1 /* es */,
+ E59DA6B022C65F4A00FCD5A1 /* ru */,
+ E59DA6B422C65F4A00FCD5A1 /* th */,
);
- name = LaunchScreen.storyboard;
+ name = Info.plist;
sourceTree = "";
};
/* End PBXVariantGroup section */
@@ -903,7 +926,7 @@
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 787TUDMR8Q;
INFOPLIST_FILE = "Clew Dev-Info.plist";
- IPHONEOS_DEPLOYMENT_TARGET = 12.2;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_SWIFT_FLAGS = "$(inherited) \"-DDEVELOPER\" \"-DIS_DEV_TARGET\"";
PRODUCT_BUNDLE_IDENTIFIER = "edu.occam.Clew-Dev";
@@ -927,7 +950,7 @@
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 787TUDMR8Q;
INFOPLIST_FILE = "Clew Dev-Info.plist";
- IPHONEOS_DEPLOYMENT_TARGET = 12.2;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_SWIFT_FLAGS = "$(inherited) \"-DDEVELOPER\" \"-DIS_DEV_TARGET\"";
PRODUCT_BUNDLE_IDENTIFIER = "edu.occam.Clew-Dev";
diff --git a/Clew/Assets.xcassets/Align.imageset/Align.png b/Clew/Assets.xcassets/Align.imageset/Align.png
new file mode 100644
index 00000000..def13154
Binary files /dev/null and b/Clew/Assets.xcassets/Align.imageset/Align.png differ
diff --git a/Clew/Assets.xcassets/Align.imageset/Contents.json b/Clew/Assets.xcassets/Align.imageset/Contents.json
new file mode 100644
index 00000000..d5ff3a5b
--- /dev/null
+++ b/Clew/Assets.xcassets/Align.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Align.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "align@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "align@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Align.imageset/align@2x.png b/Clew/Assets.xcassets/Align.imageset/align@2x.png
new file mode 100644
index 00000000..24b6f728
Binary files /dev/null and b/Clew/Assets.xcassets/Align.imageset/align@2x.png differ
diff --git a/Clew/Assets.xcassets/Align.imageset/align@3x.png b/Clew/Assets.xcassets/Align.imageset/align@3x.png
new file mode 100644
index 00000000..1a947462
Binary files /dev/null and b/Clew/Assets.xcassets/Align.imageset/align@3x.png differ
diff --git a/Clew/Assets.xcassets/Contact.imageset/Contact.png b/Clew/Assets.xcassets/Contact.imageset/Contact.png
new file mode 100644
index 00000000..5d75feef
Binary files /dev/null and b/Clew/Assets.xcassets/Contact.imageset/Contact.png differ
diff --git a/Clew/Assets.xcassets/Contact.imageset/Contents.json b/Clew/Assets.xcassets/Contact.imageset/Contents.json
new file mode 100644
index 00000000..fe94257c
--- /dev/null
+++ b/Clew/Assets.xcassets/Contact.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Contact.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "feedback@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "feedback@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Contact.imageset/feedback@2x.png b/Clew/Assets.xcassets/Contact.imageset/feedback@2x.png
new file mode 100644
index 00000000..f17039fd
Binary files /dev/null and b/Clew/Assets.xcassets/Contact.imageset/feedback@2x.png differ
diff --git a/Clew/Assets.xcassets/Contact.imageset/feedback@3x.png b/Clew/Assets.xcassets/Contact.imageset/feedback@3x.png
new file mode 100644
index 00000000..bb51d1ea
Binary files /dev/null and b/Clew/Assets.xcassets/Contact.imageset/feedback@3x.png differ
diff --git a/Clew/Assets.xcassets/Describe.imageset/Contents.json b/Clew/Assets.xcassets/Describe.imageset/Contents.json
new file mode 100644
index 00000000..cd993dac
--- /dev/null
+++ b/Clew/Assets.xcassets/Describe.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Describe.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Describe@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Describe@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Describe.imageset/Describe.png b/Clew/Assets.xcassets/Describe.imageset/Describe.png
new file mode 100644
index 00000000..bce1ed9f
Binary files /dev/null and b/Clew/Assets.xcassets/Describe.imageset/Describe.png differ
diff --git a/Clew/Assets.xcassets/Describe.imageset/Describe@2x.png b/Clew/Assets.xcassets/Describe.imageset/Describe@2x.png
new file mode 100644
index 00000000..c96720ad
Binary files /dev/null and b/Clew/Assets.xcassets/Describe.imageset/Describe@2x.png differ
diff --git a/Clew/Assets.xcassets/Describe.imageset/Describe@3x.png b/Clew/Assets.xcassets/Describe.imageset/Describe@3x.png
new file mode 100644
index 00000000..cd95f15c
Binary files /dev/null and b/Clew/Assets.xcassets/Describe.imageset/Describe@3x.png differ
diff --git a/Clew/Assets.xcassets/GetDirection.imageset/Contents.json b/Clew/Assets.xcassets/GetDirection.imageset/Contents.json
new file mode 100644
index 00000000..478af3f8
--- /dev/null
+++ b/Clew/Assets.xcassets/GetDirection.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "getDirections.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "getDirections@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "getDirections@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/GetDirection.imageset/getDirections.png b/Clew/Assets.xcassets/GetDirection.imageset/getDirections.png
new file mode 100644
index 00000000..7e71f81a
Binary files /dev/null and b/Clew/Assets.xcassets/GetDirection.imageset/getDirections.png differ
diff --git a/Clew/Assets.xcassets/GetDirection.imageset/getDirections@2x.png b/Clew/Assets.xcassets/GetDirection.imageset/getDirections@2x.png
new file mode 100644
index 00000000..e3099e33
Binary files /dev/null and b/Clew/Assets.xcassets/GetDirection.imageset/getDirections@2x.png differ
diff --git a/Clew/Assets.xcassets/GetDirection.imageset/getDirections@3x.png b/Clew/Assets.xcassets/GetDirection.imageset/getDirections@3x.png
new file mode 100644
index 00000000..5554dc57
Binary files /dev/null and b/Clew/Assets.xcassets/GetDirection.imageset/getDirections@3x.png differ
diff --git a/Clew/Assets.xcassets/HelpButton.imageset/Contents.json b/Clew/Assets.xcassets/HelpButton.imageset/Contents.json
new file mode 100644
index 00000000..a4fe1446
--- /dev/null
+++ b/Clew/Assets.xcassets/HelpButton.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "HelpButton.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "help@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "help@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/HelpButton.imageset/HelpButton.png b/Clew/Assets.xcassets/HelpButton.imageset/HelpButton.png
new file mode 100644
index 00000000..8e9708e3
Binary files /dev/null and b/Clew/Assets.xcassets/HelpButton.imageset/HelpButton.png differ
diff --git a/Clew/Assets.xcassets/HelpButton.imageset/help@2x.png b/Clew/Assets.xcassets/HelpButton.imageset/help@2x.png
new file mode 100644
index 00000000..ecc13898
Binary files /dev/null and b/Clew/Assets.xcassets/HelpButton.imageset/help@2x.png differ
diff --git a/Clew/Assets.xcassets/HelpButton.imageset/help@3x.png b/Clew/Assets.xcassets/HelpButton.imageset/help@3x.png
new file mode 100644
index 00000000..83692747
Binary files /dev/null and b/Clew/Assets.xcassets/HelpButton.imageset/help@3x.png differ
diff --git a/Clew/Assets.xcassets/Landmark.imageset/Contents.json b/Clew/Assets.xcassets/Landmark.imageset/Contents.json
new file mode 100644
index 00000000..bd365440
--- /dev/null
+++ b/Clew/Assets.xcassets/Landmark.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Landmark.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "landmark@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "landmark@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Landmark.imageset/Landmark.png b/Clew/Assets.xcassets/Landmark.imageset/Landmark.png
new file mode 100644
index 00000000..66482fca
Binary files /dev/null and b/Clew/Assets.xcassets/Landmark.imageset/Landmark.png differ
diff --git a/Clew/Assets.xcassets/Landmark.imageset/landmark@2x.png b/Clew/Assets.xcassets/Landmark.imageset/landmark@2x.png
new file mode 100644
index 00000000..dd29d0bc
Binary files /dev/null and b/Clew/Assets.xcassets/Landmark.imageset/landmark@2x.png differ
diff --git a/Clew/Assets.xcassets/Landmark.imageset/landmark@3x.png b/Clew/Assets.xcassets/Landmark.imageset/landmark@3x.png
new file mode 100644
index 00000000..019bcc2e
Binary files /dev/null and b/Clew/Assets.xcassets/Landmark.imageset/landmark@3x.png differ
diff --git a/Clew/Assets.xcassets/Pause.imageset/Contents.json b/Clew/Assets.xcassets/Pause.imageset/Contents.json
new file mode 100644
index 00000000..09def866
--- /dev/null
+++ b/Clew/Assets.xcassets/Pause.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Pause.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Pause@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Pause@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Pause.imageset/Pause.png b/Clew/Assets.xcassets/Pause.imageset/Pause.png
new file mode 100644
index 00000000..4109e58f
Binary files /dev/null and b/Clew/Assets.xcassets/Pause.imageset/Pause.png differ
diff --git a/Clew/Assets.xcassets/Pause.imageset/Pause@2x.png b/Clew/Assets.xcassets/Pause.imageset/Pause@2x.png
new file mode 100644
index 00000000..f58eec7c
Binary files /dev/null and b/Clew/Assets.xcassets/Pause.imageset/Pause@2x.png differ
diff --git a/Clew/Assets.xcassets/Pause.imageset/Pause@3x.png b/Clew/Assets.xcassets/Pause.imageset/Pause@3x.png
new file mode 100644
index 00000000..2ae35ff3
Binary files /dev/null and b/Clew/Assets.xcassets/Pause.imageset/Pause@3x.png differ
diff --git a/Clew/Assets.xcassets/Read.imageset/Contents.json b/Clew/Assets.xcassets/Read.imageset/Contents.json
new file mode 100644
index 00000000..a48d3919
--- /dev/null
+++ b/Clew/Assets.xcassets/Read.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Read.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Read@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Read@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Read.imageset/Read.png b/Clew/Assets.xcassets/Read.imageset/Read.png
new file mode 100644
index 00000000..ee489e91
Binary files /dev/null and b/Clew/Assets.xcassets/Read.imageset/Read.png differ
diff --git a/Clew/Assets.xcassets/Read.imageset/Read@2x.png b/Clew/Assets.xcassets/Read.imageset/Read@2x.png
new file mode 100644
index 00000000..7d99fcb0
Binary files /dev/null and b/Clew/Assets.xcassets/Read.imageset/Read@2x.png differ
diff --git a/Clew/Assets.xcassets/Read.imageset/Read@3x.png b/Clew/Assets.xcassets/Read.imageset/Read@3x.png
new file mode 100644
index 00000000..a4af18b5
Binary files /dev/null and b/Clew/Assets.xcassets/Read.imageset/Read@3x.png differ
diff --git a/Clew/Assets.xcassets/Record.imageset/Contents.json b/Clew/Assets.xcassets/Record.imageset/Contents.json
new file mode 100644
index 00000000..d04fd7c5
--- /dev/null
+++ b/Clew/Assets.xcassets/Record.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Record.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Record@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Record@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Record.imageset/Record.png b/Clew/Assets.xcassets/Record.imageset/Record.png
new file mode 100644
index 00000000..abcbdd22
Binary files /dev/null and b/Clew/Assets.xcassets/Record.imageset/Record.png differ
diff --git a/Clew/Assets.xcassets/Record.imageset/Record@2x.png b/Clew/Assets.xcassets/Record.imageset/Record@2x.png
new file mode 100644
index 00000000..9949b15d
Binary files /dev/null and b/Clew/Assets.xcassets/Record.imageset/Record@2x.png differ
diff --git a/Clew/Assets.xcassets/Record.imageset/Record@3x.png b/Clew/Assets.xcassets/Record.imageset/Record@3x.png
new file mode 100644
index 00000000..4b18574f
Binary files /dev/null and b/Clew/Assets.xcassets/Record.imageset/Record@3x.png differ
diff --git a/Clew/Assets.xcassets/Resume.imageset/Contents.json b/Clew/Assets.xcassets/Resume.imageset/Contents.json
new file mode 100644
index 00000000..3eaf8ef7
--- /dev/null
+++ b/Clew/Assets.xcassets/Resume.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "Resume.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Resume@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "Resume@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/Resume.imageset/Resume.png b/Clew/Assets.xcassets/Resume.imageset/Resume.png
new file mode 100644
index 00000000..59c6ab2a
Binary files /dev/null and b/Clew/Assets.xcassets/Resume.imageset/Resume.png differ
diff --git a/Clew/Assets.xcassets/Resume.imageset/Resume@2x.png b/Clew/Assets.xcassets/Resume.imageset/Resume@2x.png
new file mode 100644
index 00000000..88cb36da
Binary files /dev/null and b/Clew/Assets.xcassets/Resume.imageset/Resume@2x.png differ
diff --git a/Clew/Assets.xcassets/Resume.imageset/Resume@3x.png b/Clew/Assets.xcassets/Resume.imageset/Resume@3x.png
new file mode 100644
index 00000000..19aae7e1
Binary files /dev/null and b/Clew/Assets.xcassets/Resume.imageset/Resume@3x.png differ
diff --git a/Clew/Assets.xcassets/StartNavigation.imageset/Contents.json b/Clew/Assets.xcassets/StartNavigation.imageset/Contents.json
index 67743a8d..352e9f63 100644
--- a/Clew/Assets.xcassets/StartNavigation.imageset/Contents.json
+++ b/Clew/Assets.xcassets/StartNavigation.imageset/Contents.json
@@ -7,11 +7,19 @@
},
{
"idiom" : "universal",
+ "filename" : "StartNavigation@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
+ "filename" : "StartNavigation@3x.png",
"scale" : "3x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "StartRecording.png",
+ "unassigned" : true,
+ "scale" : "1x"
}
],
"info" : {
diff --git a/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation.png b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation.png
index 114e37e3..59c6ab2a 100644
Binary files a/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation.png and b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation.png differ
diff --git a/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@2x.png b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@2x.png
new file mode 100644
index 00000000..88cb36da
Binary files /dev/null and b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@2x.png differ
diff --git a/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@3x.png b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@3x.png
new file mode 100644
index 00000000..19aae7e1
Binary files /dev/null and b/Clew/Assets.xcassets/StartNavigation.imageset/StartNavigation@3x.png differ
diff --git a/Clew/Assets.xcassets/StartNavigation.imageset/StartRecording.png b/Clew/Assets.xcassets/StartNavigation.imageset/StartRecording.png
new file mode 100644
index 00000000..59c6ab2a
Binary files /dev/null and b/Clew/Assets.xcassets/StartNavigation.imageset/StartRecording.png differ
diff --git a/Clew/Assets.xcassets/StartRecording.imageset/StartRecording.png b/Clew/Assets.xcassets/StartRecording.imageset/StartRecording.png
deleted file mode 100644
index 86faab23..00000000
Binary files a/Clew/Assets.xcassets/StartRecording.imageset/StartRecording.png and /dev/null differ
diff --git a/Clew/Assets.xcassets/StopNavigation.imageset/Contents.json b/Clew/Assets.xcassets/StopNavigation.imageset/Contents.json
index e5345e94..b0ab4b29 100644
--- a/Clew/Assets.xcassets/StopNavigation.imageset/Contents.json
+++ b/Clew/Assets.xcassets/StopNavigation.imageset/Contents.json
@@ -7,10 +7,12 @@
},
{
"idiom" : "universal",
+ "filename" : "StopNavigation@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
+ "filename" : "StopNavigation@3x.png",
"scale" : "3x"
}
],
diff --git a/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation.png b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation.png
index 579f42dc..50268b71 100644
Binary files a/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation.png and b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation.png differ
diff --git a/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@2x.png b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@2x.png
new file mode 100644
index 00000000..aa49834c
Binary files /dev/null and b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@2x.png differ
diff --git a/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@3x.png b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@3x.png
new file mode 100644
index 00000000..f63e8bb4
Binary files /dev/null and b/Clew/Assets.xcassets/StopNavigation.imageset/StopNavigation@3x.png differ
diff --git a/Clew/Assets.xcassets/StopRecording.imageset/Contents.json b/Clew/Assets.xcassets/StopRecording.imageset/Contents.json
index e89fa43b..76e185a1 100644
--- a/Clew/Assets.xcassets/StopRecording.imageset/Contents.json
+++ b/Clew/Assets.xcassets/StopRecording.imageset/Contents.json
@@ -7,10 +7,12 @@
},
{
"idiom" : "universal",
+ "filename" : "StopRecording@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
+ "filename" : "StopRecording@3x.png",
"scale" : "3x"
}
],
diff --git a/Clew/Assets.xcassets/StopRecording.imageset/StopRecording.png b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording.png
index 214e8390..50268b71 100644
Binary files a/Clew/Assets.xcassets/StopRecording.imageset/StopRecording.png and b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording.png differ
diff --git a/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@2x.png b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@2x.png
new file mode 100644
index 00000000..aa49834c
Binary files /dev/null and b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@2x.png differ
diff --git a/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@3x.png b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@3x.png
new file mode 100644
index 00000000..f63e8bb4
Binary files /dev/null and b/Clew/Assets.xcassets/StopRecording.imageset/StopRecording@3x.png differ
diff --git a/Clew/Assets.xcassets/VoiceNote.imageset/Contents.json b/Clew/Assets.xcassets/VoiceNote.imageset/Contents.json
new file mode 100644
index 00000000..e30ea65c
--- /dev/null
+++ b/Clew/Assets.xcassets/VoiceNote.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "VoiceNote.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "VoiceNote@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "VoiceNote@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote.png b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote.png
new file mode 100644
index 00000000..e5950610
Binary files /dev/null and b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote.png differ
diff --git a/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@2x.png b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@2x.png
new file mode 100644
index 00000000..743ae00e
Binary files /dev/null and b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@2x.png differ
diff --git a/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@3x.png b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@3x.png
new file mode 100644
index 00000000..5e8e1247
Binary files /dev/null and b/Clew/Assets.xcassets/VoiceNote.imageset/VoiceNote@3x.png differ
diff --git a/Clew/Assets.xcassets/StartRecording.imageset/Contents.json b/Clew/Assets.xcassets/actualBackButton.imageset/Contents.json
similarity index 86%
rename from Clew/Assets.xcassets/StartRecording.imageset/Contents.json
rename to Clew/Assets.xcassets/actualBackButton.imageset/Contents.json
index bff1ad38..6695a9c8 100644
--- a/Clew/Assets.xcassets/StartRecording.imageset/Contents.json
+++ b/Clew/Assets.xcassets/actualBackButton.imageset/Contents.json
@@ -2,7 +2,7 @@
"images" : [
{
"idiom" : "universal",
- "filename" : "StartRecording.png",
+ "filename" : "actualBackButton.png",
"scale" : "1x"
},
{
diff --git a/Clew/Assets.xcassets/actualBackButton.imageset/actualBackButton.png b/Clew/Assets.xcassets/actualBackButton.imageset/actualBackButton.png
new file mode 100644
index 00000000..30402453
Binary files /dev/null and b/Clew/Assets.xcassets/actualBackButton.imageset/actualBackButton.png differ
diff --git a/Clew/Assets.xcassets/homeButton.imageset/Contents.json b/Clew/Assets.xcassets/homeButton.imageset/Contents.json
new file mode 100644
index 00000000..b1b2a0fe
--- /dev/null
+++ b/Clew/Assets.xcassets/homeButton.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "backButton.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "homeButton@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "homeButton@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/homeButton.imageset/backButton.png b/Clew/Assets.xcassets/homeButton.imageset/backButton.png
new file mode 100644
index 00000000..8c4b2a17
Binary files /dev/null and b/Clew/Assets.xcassets/homeButton.imageset/backButton.png differ
diff --git a/Clew/Assets.xcassets/homeButton.imageset/homeButton@2x.png b/Clew/Assets.xcassets/homeButton.imageset/homeButton@2x.png
new file mode 100644
index 00000000..021b63ae
Binary files /dev/null and b/Clew/Assets.xcassets/homeButton.imageset/homeButton@2x.png differ
diff --git a/Clew/Assets.xcassets/homeButton.imageset/homeButton@3x.png b/Clew/Assets.xcassets/homeButton.imageset/homeButton@3x.png
new file mode 100644
index 00000000..ad4b5628
Binary files /dev/null and b/Clew/Assets.xcassets/homeButton.imageset/homeButton@3x.png differ
diff --git a/Clew/Assets.xcassets/route.imageset/Contents.json b/Clew/Assets.xcassets/route.imageset/Contents.json
new file mode 100644
index 00000000..cc471dc4
--- /dev/null
+++ b/Clew/Assets.xcassets/route.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "route.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "routes@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "routes@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/route.imageset/route.png b/Clew/Assets.xcassets/route.imageset/route.png
new file mode 100644
index 00000000..a5aa37c2
Binary files /dev/null and b/Clew/Assets.xcassets/route.imageset/route.png differ
diff --git a/Clew/Assets.xcassets/route.imageset/routes@2x.png b/Clew/Assets.xcassets/route.imageset/routes@2x.png
new file mode 100644
index 00000000..98bc45be
Binary files /dev/null and b/Clew/Assets.xcassets/route.imageset/routes@2x.png differ
diff --git a/Clew/Assets.xcassets/route.imageset/routes@3x.png b/Clew/Assets.xcassets/route.imageset/routes@3x.png
new file mode 100644
index 00000000..5fc0bb7c
Binary files /dev/null and b/Clew/Assets.xcassets/route.imageset/routes@3x.png differ
diff --git a/Clew/Assets.xcassets/settingsGear.imageset/Contents.json b/Clew/Assets.xcassets/settingsGear.imageset/Contents.json
new file mode 100644
index 00000000..38284dc9
--- /dev/null
+++ b/Clew/Assets.xcassets/settingsGear.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "IMG_4923.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "settings@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "settings@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Clew/Assets.xcassets/settingsGear.imageset/IMG_4923.png b/Clew/Assets.xcassets/settingsGear.imageset/IMG_4923.png
new file mode 100644
index 00000000..012ab3cc
Binary files /dev/null and b/Clew/Assets.xcassets/settingsGear.imageset/IMG_4923.png differ
diff --git a/Clew/Assets.xcassets/settingsGear.imageset/settings@2x.png b/Clew/Assets.xcassets/settingsGear.imageset/settings@2x.png
new file mode 100644
index 00000000..3c198e3b
Binary files /dev/null and b/Clew/Assets.xcassets/settingsGear.imageset/settings@2x.png differ
diff --git a/Clew/Assets.xcassets/settingsGear.imageset/settings@3x.png b/Clew/Assets.xcassets/settingsGear.imageset/settings@3x.png
new file mode 100644
index 00000000..71d5e6b3
Binary files /dev/null and b/Clew/Assets.xcassets/settingsGear.imageset/settings@3x.png differ
diff --git a/Clew/Assets.xcassets/thumbs_down.imageset/Contents.json b/Clew/Assets.xcassets/thumbs_down.imageset/Contents.json
index d6b9579c..9f70b042 100644
--- a/Clew/Assets.xcassets/thumbs_down.imageset/Contents.json
+++ b/Clew/Assets.xcassets/thumbs_down.imageset/Contents.json
@@ -7,10 +7,12 @@
},
{
"idiom" : "universal",
+ "filename" : "thumbsDownWhite@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
+ "filename" : "thumbsDownWhite@3x.png",
"scale" : "3x"
}
],
diff --git a/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@2x.png b/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@2x.png
new file mode 100644
index 00000000..351afc15
Binary files /dev/null and b/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@2x.png differ
diff --git a/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@3x.png b/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@3x.png
new file mode 100644
index 00000000..abab98ea
Binary files /dev/null and b/Clew/Assets.xcassets/thumbs_down.imageset/thumbsDownWhite@3x.png differ
diff --git a/Clew/Assets.xcassets/thumbs_down.imageset/thumbs_down.png b/Clew/Assets.xcassets/thumbs_down.imageset/thumbs_down.png
index fa8682ca..87203721 100644
Binary files a/Clew/Assets.xcassets/thumbs_down.imageset/thumbs_down.png and b/Clew/Assets.xcassets/thumbs_down.imageset/thumbs_down.png differ
diff --git a/Clew/Assets.xcassets/thumbs_up.imageset/Contents.json b/Clew/Assets.xcassets/thumbs_up.imageset/Contents.json
index b48ac8b9..5dfeff0b 100644
--- a/Clew/Assets.xcassets/thumbs_up.imageset/Contents.json
+++ b/Clew/Assets.xcassets/thumbs_up.imageset/Contents.json
@@ -7,10 +7,12 @@
},
{
"idiom" : "universal",
+ "filename" : "thumbsUpWhite@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
+ "filename" : "thumbsUpWhite@3x.png",
"scale" : "3x"
}
],
diff --git a/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@2x.png b/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@2x.png
new file mode 100644
index 00000000..d0500570
Binary files /dev/null and b/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@2x.png differ
diff --git a/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@3x.png b/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@3x.png
new file mode 100644
index 00000000..8f0e3354
Binary files /dev/null and b/Clew/Assets.xcassets/thumbs_up.imageset/thumbsUpWhite@3x.png differ
diff --git a/Clew/Assets.xcassets/thumbs_up.imageset/thumbs_up.png b/Clew/Assets.xcassets/thumbs_up.imageset/thumbs_up.png
index a8ce6a81..29e262f3 100644
Binary files a/Clew/Assets.xcassets/thumbs_up.imageset/thumbs_up.png and b/Clew/Assets.xcassets/thumbs_up.imageset/thumbs_up.png differ
diff --git a/Clew/Controllers/PopOvers/FeedbackViewController.swift b/Clew/Controllers/PopOvers/FeedbackViewController.swift
index 75a54ace..fe9b9476 100644
--- a/Clew/Controllers/PopOvers/FeedbackViewController.swift
+++ b/Clew/Controllers/PopOvers/FeedbackViewController.swift
@@ -38,7 +38,7 @@ class FeedbackViewController : UIViewController, UITextViewDelegate, UIPopoverPr
startTimerForShowScrollIndicator()
///sets the title of the popover
- title = "Clew Feedback"
+ title = "\(NSLocalizedString("feedbackMenuTitle", comment: "this is the title on the feedback popover content"))"
}
@@ -64,17 +64,7 @@ class FeedbackViewController : UIViewController, UITextViewDelegate, UIPopoverPr
}
//MARK: Actions
-
- ///called whenever you start editing the feedback text field
- func textViewDidBeginEditing(_ textView: UITextView) {
-
- ///checks to see if the value is equal to the default value so that it will only clear the text if it is the default value
- if feedbackTextField.text == "Enter Feedback"{
-
- ///clears the text in the text field
- feedbackTextField.text = ""
- }
- }
+
///This is a function which takes the feedback from the form and sends it to firebase. This function is called when the send feedback button is pressed
@IBAction func sendFeedback(_ sender: UIButton) {
@@ -86,42 +76,36 @@ class FeedbackViewController : UIViewController, UITextViewDelegate, UIPopoverPr
var name = nameTextField.text!
///performs input processing on the name to make sure that the user inputted a name
- if name == "Name" || name == "Please enter a name"{
- ///if the user did not input a name it prompts them to do so and sets the value of the name to a special value so the feedback request is not sent
- nameTextField.text = "Please enter a name"
- name = "NONE"
+ if name == ""{
+ ///if the user did not input a name the program just sets the value of the users 'name to a special empty value
+ name = "NO NAME GIVEN"
}
///retrieves the name from the form
var number = phoneNumberTextField.text!
///performs input processing on the name to make sure that the user inputted a name
- if number == "Phone Number (optional)" {
- ///if the user did not input a phone number it sets the value of the ohone number to a special value
+ if number == "" {
+ ///if the user did not input a phone number it sets the value of the phone number to a special value
number = "NONE"
}
///retrieves the name from the form
var email = emailTextField.text!
- if email == "Email (optional)" {
- ///if the user did not input an email it sets the value of the ohone number to a special value
+ if email == "" {
+ ///if the user did not input an email it sets the value of the email to a special value
email = "NONE"
}
///retrieves the feedback message from the form
var feedback = feedbackTextField.text!
-
- if feedback == "Enter Feedback"{
- ///if the user did not input any feedback the program prompts them to do so and sets the value of theor feedback to a special value so that the file will not get sent.
- feedbackTextField.text = "Please enter feedback on Clew"
+ if feedback == "" {
+ ///if the user did not input textual feedback it sets the value to a special empty value
feedback = "NONE"
}
- ///if the user insists on sending an empty feedback message close the popover as you normally would to give the user the impression that they sent it however do not actually send the message so as to minimize the number of invalid responses saved to the database
- if feedback == "Please enter feedback on Clew"{
- closeFeedback()
- }
- ///if the feedback was entered properly
- if feedback != "NONE" && name != "NONE" && feedback != "Please enter feedback on Clew"{
+
+ ///if the user properly included a name
+ if audio != nil || feedback != "NONE"{
///retrieves the data from the feedback field and sends it to firebase using functions described in the feedback logger class. sucessvalue is a variable which stores a zero or one corresponding to the sucess of the upload (one means that there was a failure
let sucessvalue = feedbackLogger.saveFeedback(name: name, message: feedback, country: countryTextField.text!, phone: number, email: email,audio: audio)
@@ -138,6 +122,12 @@ class FeedbackViewController : UIViewController, UITextViewDelegate, UIPopoverPr
}
///closes the popup
closeFeedback()
+
+ }else{
+
+ //closes the popup without sending if the user did not enter any feedback
+ closeFeedback()
+
}
}
diff --git a/Clew/Controllers/PopOvers/HelpViewController.swift b/Clew/Controllers/PopOvers/HelpViewController.swift
index 417f7d7d..8a9b47b6 100644
--- a/Clew/Controllers/PopOvers/HelpViewController.swift
+++ b/Clew/Controllers/PopOvers/HelpViewController.swift
@@ -10,18 +10,19 @@ import Foundation
import WebKit
/// The view controller for the help dialog. This is a thin wrapper on top of WKWebView, which displays the main content.
-class HelpViewController : UIViewController {
+class HelpViewController : UIViewController, WKUIDelegate, WKNavigationDelegate {
+
+ /// instzntiates an instance of a help compiler
+ var helpCompiler = HelpCompiler()
/// The view that displays the help as a webpage
@IBOutlet var webContent: WKWebView!
-
+
/// When the view has loaded, the index.html file will be loaded and rendered by webContent.
override func viewDidLoad() {
title = "Clew Help"
- let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "help")!
- webContent.loadFileURL(url, allowingReadAccessTo: url)
- let request = URLRequest(url: url)
- webContent.load(request)
+ ///creates and loads the website
+ helpCompiler.loadWebContent(webView: webContent)
}
/// This is called when the view should close. This method posts a notification "ClewPopoverDismissed" that can be listened to if an object needs to know that the view is being closed.
diff --git a/Clew/Controllers/PopOvers/RoutesViewController.swift b/Clew/Controllers/PopOvers/RoutesViewController.swift
index 0f050bdc..8fbb599a 100644
--- a/Clew/Controllers/PopOvers/RoutesViewController.swift
+++ b/Clew/Controllers/PopOvers/RoutesViewController.swift
@@ -25,7 +25,7 @@ class RoutesViewController : UIViewController, UITableViewDataSource, UITableVie
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.dataSource = self
- title = NSLocalizedString("Saved Routes List", comment: "The title to a list of routes that have been saved by the user.")
+ title = NSLocalizedString("saved-routes-list.title", comment: "The title to a list of routes that have been saved by the user.")
}
/// Called when the user selects an element from the routes table.
@@ -36,9 +36,9 @@ class RoutesViewController : UIViewController, UITableViewDataSource, UITableVie
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.tableView.deselectRow(at: indexPath, animated: true)
// Set title and message for the alert dialog
- let alertController = UIAlertController(title: NSLocalizedString("Route direction", comment: "The header of a pop-up"), message: "", preferredStyle: .alert)
+ let alertController = UIAlertController(title: NSLocalizedString("route-direction.popup.title", comment: "The header of a pop-up"), message: "", preferredStyle: .alert)
// The confirm action taking the inputs
- let startToEndAction = UIAlertAction(title: NSLocalizedString("Start to End", comment: "Option for user to select"), style: .default) { (_) in
+ let startToEndAction = UIAlertAction(title: NSLocalizedString("start-to-end.action", comment: "Option for user to select"), style: .default) { (_) in
self.rootViewController?.onRouteTableViewCellClicked(route: self.routes[indexPath.row], navigateStartToEnd: true)
self.dismiss(animated: true, completion: nil)
}
@@ -46,7 +46,7 @@ class RoutesViewController : UIViewController, UITableViewDataSource, UITableVie
startToEndAction.isEnabled = false
}
- let endToStartAction = UIAlertAction(title: NSLocalizedString("End to Start", comment: "Option for user to select"), style: .default) { (_) in
+ let endToStartAction = UIAlertAction(title: NSLocalizedString("end-to-start.action", comment: "Option for user to select"), style: .default) { (_) in
self.rootViewController?.onRouteTableViewCellClicked(route: self.routes[indexPath.row], navigateStartToEnd: false)
self.dismiss(animated: true, completion: nil)
}
diff --git a/Clew/Controllers/StateViews/PauseTrackingController.swift b/Clew/Controllers/StateViews/PauseTrackingController.swift
index af3de5c6..8f49bd39 100644
--- a/Clew/Controllers/StateViews/PauseTrackingController.swift
+++ b/Clew/Controllers/StateViews/PauseTrackingController.swift
@@ -8,6 +8,18 @@
import UIKit
+class TransparentTouchView: UIView {
+ override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
+ for view in self.subviews {
+ if view.isUserInteractionEnabled, view.point(inside: self.convert(point, to: view), with: event) {
+ return true
+ }
+ }
+
+ return false
+ }
+}
+
/// A View Controller for handling the pause route state
/// also handles associated buttons
class PauseTrackingController: UIViewController {
@@ -25,12 +37,11 @@ class PauseTrackingController: UIViewController {
/// called when the view has loaded. We setup various app elements in here.
override func viewDidLoad() {
super.viewDidLoad()
+ view = TransparentTouchView(frame:CGRect(x: 0,
+ y: 0,
+ width: UIScreen.main.bounds.size.width,
+ height: UIScreen.main.bounds.size.height))
- view.frame = CGRect(x: 0,
- y: 0,
- width: UIScreen.main.bounds.size.width,
- height: UIScreen.main.bounds.size.height)
-
let label = UILabel(frame: CGRect(x: 15,
y: UIScreen.main.bounds.size.height/5,
width: UIScreen.main.bounds.size.width-30,
@@ -39,7 +50,7 @@ class PauseTrackingController: UIViewController {
view.backgroundColor = UIColor.black.withAlphaComponent(0.4)
let waitingPeriod = ViewController.alignmentWaitingPeriod
- let mainText = String.localizedStringWithFormat(NSLocalizedString("Landmarks allow you to save or pause your route. You will need to return to the landmark to load or unpause your route. Before creating the landmark, specify text or voice to help you remember its location. To create a landmark, hold your device flat with the screen facing up. Press the top (short) edge flush against a flat vertical surface (such as a wall). The \"align\" button starts a %lu-second countdown. During this time, do not move the device.", comment: "Info for user"), waitingPeriod)
+ let mainText = String.localizedStringWithFormat(NSLocalizedString("landmark-instruction.message", comment: "Info for user"), waitingPeriod)
label.textColor = UIColor.white
label.textAlignment = .center
label.numberOfLines = 0
@@ -51,17 +62,17 @@ class PauseTrackingController: UIViewController {
enterLandmarkDescriptionButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.left,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Describe"),
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Describe")!),
label: "Enter text to help you remember this landmark")
recordVoiceNoteButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.right,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Voice Note"),
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "VoiceNote")!),
label: "Record audio to help you remember this landmark")
confirmAlignmentButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Align"),
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Align")!),
label: "Start \(ViewController.alignmentWaitingPeriod)-second alignment countdown")
if let parent: UIViewController = parent {
diff --git a/Clew/Controllers/StateViews/RecordPathController.swift b/Clew/Controllers/StateViews/RecordPathController.swift
index 1a35c46b..fcccfc22 100644
--- a/Clew/Controllers/StateViews/RecordPathController.swift
+++ b/Clew/Controllers/StateViews/RecordPathController.swift
@@ -50,18 +50,18 @@ class RecordPathController: UIViewController {
recordPathButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
- appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "StartRecording")!),
- label: NSLocalizedString("Record path", comment: "Video record path to a destination"))
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Record")!),
+ label: NSLocalizedString("record-path.button.label", comment: "A button that allows you to video record path to a destination"))
addLandmarkButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.right,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Landmark"),
- label: "Saved routes list")
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Landmark")!),
+ label: NSLocalizedString("landmark.button.label", comment: "A button that allows you to create a landmark to save a route"))
routesButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.left,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Routes"),
- label: "Saved routes list")
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "route")!),
+ label: NSLocalizedString("open-saved-routes.button.label", comment: "The label of a button that allows you to access your list of saved routes"))
if let parent: UIViewController = parent {
routesButton.addTarget(parent,
diff --git a/Clew/Controllers/StateViews/ResumeTrackingConfirmController.swift b/Clew/Controllers/StateViews/ResumeTrackingConfirmController.swift
index 54329b1d..fd22441b 100644
--- a/Clew/Controllers/StateViews/ResumeTrackingConfirmController.swift
+++ b/Clew/Controllers/StateViews/ResumeTrackingConfirmController.swift
@@ -63,13 +63,13 @@ class ResumeTrackingConfirmController: UIViewController {
/// The button that plays back the recorded voice note associated with a landmark
readVoiceNoteButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.left,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Play Note"),
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Read")!),
label: "Play recorded voice note")
// MARK: ConfirmAlignmentButton
confirmAlignmentButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Align"),
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Align")!),
label: "Start \(ViewController.alignmentWaitingPeriod)-second alignment countdown")
if let parent: UIViewController = parent {
diff --git a/Clew/Controllers/StateViews/ResumeTrackingController.swift b/Clew/Controllers/StateViews/ResumeTrackingController.swift
index 534ff007..862715c8 100644
--- a/Clew/Controllers/StateViews/ResumeTrackingController.swift
+++ b/Clew/Controllers/StateViews/ResumeTrackingController.swift
@@ -30,7 +30,7 @@ class ResumeTrackingController: UIViewController {
view.backgroundColor = UIColor.black.withAlphaComponent(0.4)
- let mainText = NSLocalizedString("Return to the last paused location and press Resume for further instructions.", comment: "A message displayed to the user")
+ let mainText = NSLocalizedString("resume-tracking.message", comment: "A message displayed to the user")
label.textColor = UIColor.white
label.textAlignment = .center
label.numberOfLines = 0
@@ -44,8 +44,8 @@ class ResumeTrackingController: UIViewController {
/// The button that the allows the user to resume a paused route
resumeButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Resume"),
- label: NSLocalizedString("Resume", comment: "Resume paused route"))
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Resume")!),
+ label: NSLocalizedString("resume-paused-route.button.label", comment: "Resume paused route"))
if let parent: UIViewController = parent {
diff --git a/Clew/Controllers/StateViews/RouteRatingController.swift b/Clew/Controllers/StateViews/RouteRatingController.swift
index 00bc6a9c..dec6d17b 100644
--- a/Clew/Controllers/StateViews/RouteRatingController.swift
+++ b/Clew/Controllers/StateViews/RouteRatingController.swift
@@ -47,11 +47,11 @@ class RouteRatingController: UIViewController {
thumbsDownButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.leftcenter,
appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "thumbs_down")!),
- label: NSLocalizedString("Bad", comment: "Unsatisfactory service"))
+ label: NSLocalizedString("thumbs-down.label", comment: "Unsatisfactory service"))
thumbsUpButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.rightcenter,
appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "thumbs_up")!),
- label: NSLocalizedString("Good", comment: "Satisfactory service"))
+ label: NSLocalizedString("thumbs-up.label", comment: "Satisfactory service"))
if let parent: UIViewController = parent {
thumbsUpButton.addTarget(parent,
diff --git a/Clew/Controllers/StateViews/StartNavigationController.swift b/Clew/Controllers/StateViews/StartNavigationController.swift
index f0d1a549..db366695 100644
--- a/Clew/Controllers/StateViews/StartNavigationController.swift
+++ b/Clew/Controllers/StateViews/StartNavigationController.swift
@@ -48,12 +48,12 @@ class StartNavigationController: UIViewController {
startNavigationButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "StartNavigation")!),
- label: NSLocalizedString("Start navigation", comment: "The name of the button that allows user to start navigating."))
+ label: NSLocalizedString("start-navigation.button.label", comment: "The name of the button that allows user to start navigating."))
pauseButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.right,
- appearance: UIConstants.ButtonAppearance.textButton(label: "Pause"),
- label: "Pause session")
+ appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "Pause")!),
+ label: NSLocalizedString("pause-session.button.label", comment: "A button that allows user to pause the navigation session"))
if let parent: UIViewController = parent {
startNavigationButton.addTarget(parent,
diff --git a/Clew/Controllers/StateViews/StopNavigationController.swift b/Clew/Controllers/StateViews/StopNavigationController.swift
index b70a8b18..4f728427 100644
--- a/Clew/Controllers/StateViews/StopNavigationController.swift
+++ b/Clew/Controllers/StateViews/StopNavigationController.swift
@@ -45,7 +45,7 @@ class StopNavigationController: UIViewController {
stopNavigationButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "StopNavigation")!),
- label: NSLocalizedString("Stop navigation", comment: "The name of the button that allows user to stop navigating."))
+ label: NSLocalizedString("stop-navigation.button.label", comment: "The name of the button that allows user to stop navigating."))
if let parent: UIViewController = parent {
stopNavigationButton.addTarget(parent,
diff --git a/Clew/Controllers/StateViews/StopRecordingController.swift b/Clew/Controllers/StateViews/StopRecordingController.swift
index 58fd6988..56d58fb0 100644
--- a/Clew/Controllers/StateViews/StopRecordingController.swift
+++ b/Clew/Controllers/StateViews/StopRecordingController.swift
@@ -45,7 +45,7 @@ class StopRecordingController: UIViewController {
stopRecordingButton = UIButton.makeImageButton(view,
alignment: UIConstants.ButtonContainerHorizontalAlignment.center,
appearance: UIConstants.ButtonAppearance.imageButton(image: UIImage(named: "StopRecording")!),
- label: NSLocalizedString("Stop recording", comment: "The name of the button that allows user to stop recording."))
+ label: NSLocalizedString("stop-recording.button.label", comment: "The name of the button that allows user to stop recording."))
if let parent: UIViewController = parent {
stopRecordingButton.addTarget(parent,
diff --git a/Clew/Controllers/ViewController.swift b/Clew/Controllers/ViewController.swift
index 3b21af63..f5e5be61 100644
--- a/Clew/Controllers/ViewController.swift
+++ b/Clew/Controllers/ViewController.swift
@@ -349,21 +349,25 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
rootContainerView.countdownTimer.isHidden = false
rootContainerView.countdownTimer.start(beginingValue: ViewController.alignmentWaitingPeriod, interval: 1)
delayTransition()
- DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(ViewController.alignmentWaitingPeriod)) {
+ playAlignmentConfirmation = DispatchWorkItem{
self.rootContainerView.countdownTimer.isHidden = true
self.pauseTracking()
}
+ DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(ViewController.alignmentWaitingPeriod), execute: playAlignmentConfirmation!)
}
/// Handler for the completingPauseProcedure app state
func handleStateTransitionToCompletingPauseProcedure() {
// TODO: we should not be able to create a route landmark if we are in the relocalizing state... (might want to handle this when the user stops navigation on a route they loaded.... This would obviate the need to handle this in the recordPath code as well
+ print("completing pause procedure")
if creatingRouteLandmark {
guard let currentTransform = sceneView.session.currentFrame?.camera.transform else {
print("can't properly save landmark: TODO communicate this to the user somehow")
return
}
beginRouteLandmark.transform = currentTransform
+ print("setting transform", beginRouteLandmark.transform)
+
Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(playSound)), userInfo: nil, repeats: false)
// rootContainerView.pauseTrackingView.isHidden = true
pauseTrackingController.remove()
@@ -410,6 +414,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
@objc func routesButtonPressed() {
let storyBoard: UIStoryboard = UIStoryboard(name: "SettingsAndHelp", bundle: nil)
let popoverContent = storyBoard.instantiateViewController(withIdentifier: "Routes") as! RoutesViewController
+ popoverContent.preferredContentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
popoverContent.rootViewController = self
popoverContent.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: popoverContent, action: #selector(popoverContent.doneWithRoutes))
popoverContent.updateRoutes(routes: dataPersistence.routes)
@@ -435,7 +440,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
pauseTrackingController.remove()
resumeTrackingConfirmController.remove()
resumeTrackingController.remove()
-// rootContainerView.countdownTimer.isHidden = true
+ rootContainerView.countdownTimer.isHidden = true
}
/// This handles when a route cell is clicked (triggering the route to be loaded).
@@ -544,9 +549,12 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// start route navigation VC
var startNavigationController: StartNavigationController!
+ /// work item for playing alignment confirmation sound
+ var playAlignmentConfirmation: DispatchWorkItem?
+
/// stop route navigation VC
var stopNavigationController: StopNavigationController!
-
+
/// called when the view has loaded. We setup various app elements in here.
override func viewDidLoad() {
super.viewDidLoad()
@@ -580,6 +588,8 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
rootContainerView.settingsButton.addTarget(self, action: #selector(settingsButtonPressed), for: .touchUpInside)
rootContainerView.helpButton.addTarget(self, action: #selector(helpButtonPressed), for: .touchUpInside)
+
+ rootContainerView.homeButton.addTarget(self, action: #selector(homeButtonPressed), for: .touchUpInside)
rootContainerView.getDirectionButton.addTarget(self, action: #selector(announceDirectionHelpPressed), for: .touchUpInside)
@@ -690,15 +700,15 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
if showedRecordPathWithoutLandmarkWarning == nil && beginRouteLandmark.transform == nil {
userDefaults.set(true, forKey: "showedRecordPathWithoutLandmarkWarning")
// Show logging disclaimer when user opens app for the first time
- let alert = UIAlertController(title: "Creating reusable routes",
- message: NSLocalizedString("To navigate this route in the forward direction at a later time, you must create a landmark before starting the recording.", comment: "A message to the user"),
+ let alert = UIAlertController(title: NSLocalizedString("create-reusable-routes.popup.title", comment: "Heading of a popup that allows users to create reusable routes"),
+ message: NSLocalizedString("navigate-forward-instruction.message", comment: "A message to the user"),
preferredStyle: .alert)
- alert.addAction(UIAlertAction(title: NSLocalizedString("Continue with single-use route", comment: "The label of an option for the user"), style: .default, handler: { action -> Void in
+ alert.addAction(UIAlertAction(title: NSLocalizedString("single-route.popup.action", comment: "The label of an option for the user"), style: .default, handler: { action -> Void in
// proceed to recording
self.state = .recordingRoute
}
))
- alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel recording", comment: "The label of an option for the user"), style: .default, handler: { action -> Void in
+ alert.addAction(UIAlertAction(title: NSLocalizedString("cancel-recording.popup.action", comment: "The label of an option for the user"), style: .default, handler: { action -> Void in
// nothing to do, just stay on the main screen
}
))
@@ -716,15 +726,15 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
if showedNavigatePathWithoutLandmarkWarning == nil && endRouteLandmark.transform == nil && !isResumedRoute {
userDefaults.set(true, forKey: "showedNavigatePathWithoutLandmarkWarning")
// Show logging disclaimer when user opens app for the first time
- let alert = UIAlertController(title: NSLocalizedString("Creating reusable routes", comment: "Header of a pop-up message"),
- message: NSLocalizedString("To navigate this route in the reverse direction at a later time, you must activate the pause button before navigating the route.", comment: "A message to the user"),
+ let alert = UIAlertController(title: NSLocalizedString("create-reusable-routes.popup.title", comment: "Header of a pop-up message"),
+ message: NSLocalizedString("navigate-backwards-instruction.message", comment: "A message to the user"),
preferredStyle: .alert)
- alert.addAction(UIAlertAction(title: NSLocalizedString("Continue with single-use route", comment: "Option for user to select"), style: .default, handler: { action -> Void in
+ alert.addAction(UIAlertAction(title: NSLocalizedString("single-route.popup.action", comment: "Option for user to select"), style: .default, handler: { action -> Void in
// proceed to navigation
self.state = .navigatingRoute
}
))
- alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel navigation", comment: "Option for user to select"), style: .default, handler: { action -> Void in
+ alert.addAction(UIAlertAction(title: NSLocalizedString("cancel-navigation.popup.action", comment: "Option for user to select"), style: .default, handler: { action -> Void in
// nothing to do, just stay on the current screen
}
))
@@ -734,7 +744,52 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
}
}
+ /// func that prepares the state transition to home by clearing active processes and data
+ func clearState() {
+ // TODO: check for code reuse
+ // Clearing All State Processes and Data
+ rootContainerView.homeButton.isHidden = true
+ recordPathController.isAccessibilityElement = false
+ if case .navigatingRoute = self.state {
+ keypointNode.removeFromParentNode()
+ }
+ followingCrumbs?.invalidate()
+ routeName = nil
+ beginRouteLandmark = RouteLandmark()
+ endRouteLandmark = RouteLandmark()
+ playAlignmentConfirmation?.cancel()
+ rootContainerView.announcementText.isHidden = true
+ nav.headingOffset = 0.0
+ headingRingBuffer.clear()
+ locationRingBuffer.clear()
+ logger.resetNavigationLog()
+ logger.resetPathLog()
+ hapticTimer?.invalidate()
+ logger.resetStateSequenceLog()
+ }
+
+ /// function that creates alerts for the home button
+ func homePageNavigationProcesses() {
+ // Create alert to warn users of lost information
+ let alert = UIAlertController(title: NSLocalizedString("home-are-you-sure.popup.title", comment: "The heading of a pop-up that asks the user for confirmation to return to home screen"),
+ message: NSLocalizedString("home-are-you-sure.popup.message", comment: "A informative message for the user that informs them of the results of going to the home screen"),
+ preferredStyle: .alert)
+ alert.addAction(UIAlertAction(title: NSLocalizedString("go-home.popup.action", comment: "An option for user to select."), style: .default, handler: { action -> Void in
+ // proceed to home page
+ self.clearState()
+ self.hideAllViewsHelper()
+ self.state = .mainScreen(announceArrival: false)
+ }
+ ))
+ alert.addAction(UIAlertAction(title: NSLocalizedString("home-cancel.popup.action", comment: "Another option for user to select to close the pop-up and stay on the current screen of the app."), style: .default, handler: { action -> Void in
+ // nothing to do, just stay on the page
+ }
+ ))
+ self.present(alert, animated: true, completion: nil)
+ }
+
+ /// Display a warning that tells the user they must create a landmark to be able to use this route again in the forward direction
/// Display the dialog that prompts the user to enter a route name. If the user enters a route name, the route along with the optional world map will be persisted.
///
/// - Parameter mapAsAny: the world map to save (the `Any?` type is used to indicate that the map is optional and to preserve backwards compatibility with iOS 11.3)
@@ -743,9 +798,9 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
if #available(iOS 12.0, *) {
justUsedMap = mapAsAny as! ARWorldMap?
}
- let alertController = UIAlertController(title: NSLocalizedString("Save route", comment: "The title of a popup window where user enters a name for the route they want to save."), message: NSLocalizedString("Enter the name of the route", comment: "Ask user to provide a descriptive name for the route they want to save."), preferredStyle: .alert)
+ let alertController = UIAlertController(title: NSLocalizedString("save-a-route.popup.title", comment: "The title of a pop-up window where user enters a name for the route they want to save."), message: NSLocalizedString("save-a-route.popup.message", comment: "Ask user to provide a descriptive name for the route they want to save."), preferredStyle: .alert)
// The confirm action taking the inputs
- let saveAction = UIAlertAction(title: NSLocalizedString("Save", comment: "An option for the user to select"), style: .default) { (_) in
+ let saveAction = UIAlertAction(title: NSLocalizedString("save.action", comment: "The action a user can take to confirm their input."), style: .default) { (_) in
let id = String(Int64(NSDate().timeIntervalSince1970 * 1000)) as NSString
// Get the input values from user, if it's nil then use timestamp
self.routeName = alertController.textFields?[0].text as NSString? ?? id
@@ -753,14 +808,14 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
}
// The cancel action saves the just traversed route so you can navigate back along it later
- let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "An option for the user to select"), style: .cancel) { (_) in
+ let cancelAction = UIAlertAction(title: NSLocalizedString("cancel.action", comment: "An option for the user to select"), style: .cancel) { (_) in
self.justTraveledRoute = SavedRoute(id: "dummyid", name: "Last route", crumbs: self.crumbs, dateCreated: Date() as NSDate, beginRouteLandmark: self.beginRouteLandmark, endRouteLandmark: self.endRouteLandmark)
}
// Add textfield to our dialog box
alertController.addTextField { (textField) in
textField.becomeFirstResponder()
- textField.placeholder = NSLocalizedString("Enter route title", comment: "A placeholder before user enters text in textbox")
+ textField.placeholder = NSLocalizedString("enter-route-title.placeholder", comment: "A placeholder before user enters text in textbox")
}
// Add the action to dialogbox
@@ -774,10 +829,12 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Show the dialog that allows the user to enter textual information to help them remember a landmark.
@objc func showLandmarkInformationDialog() {
+ rootContainerView.homeButton.isHidden = false
+// backButton.isHidden = true
// Set title and message for the alert dialog
- let alertController = UIAlertController(title: NSLocalizedString("Landmark information", comment: "The header of a pop-up menu"), message: NSLocalizedString("Enter text about the landmark that will help you find it later.", comment: "Prompts user to enter information"), preferredStyle: .alert)
+ let alertController = UIAlertController(title: NSLocalizedString("landmark-information.popup.title", comment: "The header of a pop-up menu"), message: NSLocalizedString("landmark-information.popup.message", comment: "Prompts user to enter information"), preferredStyle: .alert)
// The confirm action taking the inputs
- let saveAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "A button for user to click to acknowledge and close a pop-up"), style: .default) { (_) in
+ let saveAction = UIAlertAction(title: NSLocalizedString("ok.button", comment: "A button for user to click to acknowledge and close a pop-up"), style: .default) { (_) in
if self.creatingRouteLandmark {
self.beginRouteLandmark.information = alertController.textFields?[0].text as NSString?
} else {
@@ -786,13 +843,13 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
}
// The cancel action saves the just traversed route so you can navigate back along it later
- let cancelAction = UIAlertAction(title: NSLocalizedString("Don't specify this information", comment: "A button for user to click"), style: .cancel) { (_) in
+ let cancelAction = UIAlertAction(title: NSLocalizedString("don't-specify-this-information.button", comment: "A button for user to click"), style: .cancel) { (_) in
}
// Add textfield to our dialog box
alertController.addTextField { (textField) in
textField.becomeFirstResponder()
- textField.placeholder = NSLocalizedString("Enter landmark information", comment: "A placeholder that appears in text box before user enters any text.")
+ textField.placeholder = NSLocalizedString("enter-landmark-information.placeholder", comment: "A placeholder that appears in text box before user enters any text.")
}
// Add the action to dialogbox
@@ -836,8 +893,8 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Show logging disclaimer when user opens app for the first time.
func showLogAlert() {
- let logAlertVC = UIAlertController(title: NSLocalizedString("Sharing your experience with Clew", comment: "The heading of a pop-up"),
- message: NSLocalizedString("Help us improve the app by logging your Clew experience. These logs will not include any images or personal information. You can turn this off in Settings.", comment: "Disclaimer shown to the user when they open the app for the first time"),
+ let logAlertVC = UIAlertController(title: NSLocalizedString("share-experience.popup.title", comment: "The heading of a pop-up"),
+ message: NSLocalizedString("share-experience.popup.message", comment: "Disclaimer shown to the user when they open the app for the first time"),
preferredStyle: .alert)
logAlertVC.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: "What the user clicks to acknowledge a message and dismiss pop-up"), style: .default, handler: { action -> Void in
self.showSafetyAlert()
@@ -848,8 +905,8 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Show safety disclaimer when user opens app for the first time.
func showSafetyAlert() {
- let safetyAlertVC = UIAlertController(title: NSLocalizedString("For your safety", comment: "The heading of a pop-up"),
- message: NSLocalizedString("While using the app, please be aware of your surroundings. You agree that your use of the App is at your own risk, and it is solely your responsibility to maintain your personal safety. Visit www.clewapp.org for more information on how to use the app.", comment: "Disclaimer shown to the user when they open the app for the first time"),
+ let safetyAlertVC = UIAlertController(title: NSLocalizedString("safety-disclaimer.popup.title", comment: "The heading of a pop-up"),
+ message: NSLocalizedString("safety-disclaimer.popup.message", comment: "Disclaimer shown to the user when they open the app for the first time"),
preferredStyle: .alert)
safetyAlertVC.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: "What the user clicks to acknowledge a message and dismiss pop-up"), style: .default, handler: nil))
self.present(safetyAlertVC, animated: true, completion: nil)
@@ -975,14 +1032,10 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
// rootContainerView.recordPathView.isHidden = false
// rootContainerView.routeRatingView.isHidden = true
// rootContainerView.stopNavigationView.isHidden = true
-// add(recordPathController)
- addChild(recordPathController)
+ add(recordPathController)
+ /// handling main screen transitions outside of the first load
/// add the view of the child to the view of the parent
- recordPathController.view.isHidden = false
- rootContainerView.addSubview(recordPathController.view)
- /// notify the child that it was moved to a parent
- recordPathController.didMove(toParent: self)
-
+ //recordPathController.view.isHidden = false
routeRatingController.remove()
stopNavigationController.remove()
@@ -991,9 +1044,10 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
rootContainerView.settingsButton.isHidden = false
rootContainerView.helpButton.isHidden = false
rootContainerView.feedbackButton.isHidden = false
+ rootContainerView.homeButton.isHidden = true
if announceArrival {
- delayTransition(announcement: NSLocalizedString("You've arrived.", comment: "You have arrived at your destination."))
+ delayTransition(announcement: NSLocalizedString("you-have-arrived.announcement", comment: "You have arrived at your destination."))
} else {
delayTransition()
}
@@ -1002,9 +1056,9 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Called when the UI of the view changes dramatically (e.g., if a different subview is displayed). The optional `announcement` input is will be spoken 2 seconds after the transition occurs. The delay is necessary to prevent the accessibility notification for screen changed to cut off the announcement.
///
/// - Parameter announcement: the announcement to read after a 2 second delay
- func delayTransition(announcement: String? = nil) {
+ func delayTransition(announcement: String? = nil, initialFocus: UIView? = nil) {
// this notification currently cuts off the announcement of the button that was just pressed
- UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: nil)
+ UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: initialFocus)
if let announcement = announcement {
if UIAccessibility.isVoiceOverRunning {
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { timer in
@@ -1018,19 +1072,16 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Display stop recording view/hide all other views
@objc func showStopRecordingButton() {
+ rootContainerView.homeButton.isHidden = false // home button here
recordPathController.remove()
recordPathController.view.isAccessibilityElement = false
add(stopRecordingController)
- delayTransition(announcement: NSLocalizedString("Hold vertically with the rear camera facing forward.", comment: "Hold the phone vertically with the rear camera facing forward."))
+ delayTransition(announcement: NSLocalizedString("You've arrived.", comment: "Hold the phone vertically with the rear camera facing forward."))
}
/// Display start navigation view/hide all other views
@objc func showStartNavigationButton(allowPause: Bool) {
-// rootContainerView.resumeTrackingView.isHidden = true
-// rootContainerView.resumeTrackingConfirmView.isHidden = true
-// rootContainerView.stopRecordingView.isHidden = true
-// rootContainerView.startNavigationView.getButtonByTag(tag: UIView.pauseButtonTag)?.isHidden = !allowPause
-// rootContainerView.startNavigationView.isHidden = false
+ rootContainerView.homeButton.isHidden = false // home button here
resumeTrackingController.remove()
resumeTrackingConfirmController.remove()
stopRecordingController.remove()
@@ -1041,29 +1092,26 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// Display the pause tracking view/hide all other views
func showPauseTrackingButton() throws {
-// rootContainerView.recordPathView.isHidden = true
-// rootContainerView.startNavigationView.isHidden = true
-// rootContainerView.pauseTrackingView.isHidden = false
+ rootContainerView.homeButton.isHidden = false // home button here
recordPathController.remove()
startNavigationController.remove()
add(pauseTrackingController)
+
delayTransition()
}
/// Display the resume tracking view/hide all other views
@objc func showResumeTrackingButton() {
-// rootContainerView.pauseTrackingView.isHidden = true
-// rootContainerView.resumeTrackingView.isHidden = false
+ rootContainerView.homeButton.isHidden = false // no home button here
pauseTrackingController.remove()
add(resumeTrackingController)
+ UIApplication.shared.keyWindow!.bringSubviewToFront(rootContainerView)
delayTransition()
}
/// Display the resume tracking confirm view/hide all other views.
func showResumeTrackingConfirmButton(route: SavedRoute, navigateStartToEnd: Bool) {
-// rootContainerView.resumeTrackingView.isHidden = true
-// rootContainerView.resumeTrackingConfirmView.isHidden = false
-// rootContainerView.resumeTrackingConfirmView.mainText?.text = ""
+ rootContainerView.homeButton.isHidden = false
resumeTrackingController.remove()
add(resumeTrackingConfirmController)
resumeTrackingConfirmController.view.mainText?.text = ""
@@ -1096,14 +1144,13 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
// rootContainerView.resumeTrackingConfirmView.getButtonByTag(tag: UIView.readVoiceNoteButtonTag)?.isHidden = voiceNoteToPlay == nil
resumeTrackingConfirmController.readVoiceNoteButton?.isHidden = voiceNoteToPlay == nil
let waitingPeriod = ViewController.alignmentWaitingPeriod
- resumeTrackingConfirmController.view.mainText?.text?.append(String.localizedStringWithFormat(NSLocalizedString("Hold your device flat with the screen facing up. Press the top (short) edge flush against the same vertical surface that you used to create the landmark. When you are ready, activate the align button to start the %lu-second alignment countdown that will complete the procedure. Do not move the device until the phone provides confirmation via a vibration or sound cue.", comment: "Informative mssage that appears to the user."), waitingPeriod))
+ resumeTrackingConfirmController.view.mainText?.text?.append(String.localizedStringWithFormat(NSLocalizedString("align-instruction.message", comment: "Informative mssage that appears to the user."), waitingPeriod))
delayTransition()
}
/// display stop navigation view/hide all other views
@objc func showStopNavigationButton() {
-// rootContainerView.startNavigationView.isHidden = true
-// rootContainerView.stopNavigationView.isHidden = false
+ rootContainerView.homeButton.isHidden = false
rootContainerView.getDirectionButton.isHidden = false
startNavigationController.remove()
add(stopNavigationController)
@@ -1114,15 +1161,14 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// display route rating view/hide all other views
@objc func showRouteRating(announceArrival: Bool) {
-// rootContainerView.stopNavigationView.isHidden = true
rootContainerView.getDirectionButton.isHidden = true
-// rootContainerView.routeRatingView.isHidden = false
+ rootContainerView.homeButton.isHidden = true
stopNavigationController.remove()
add(routeRatingController)
if announceArrival {
- routeRatingController.view.mainText?.text = NSLocalizedString("You've arrived. Please rate your service.", comment: "Announce to the user that they have arrived at their destination and ask user to rate their experience.")
+ routeRatingController.view.mainText?.text = NSLocalizedString("arrived-and-rate-service.message", comment: "Announce to the user that they have arrived at their destination and ask user to rate their experience.")
} else {
- routeRatingController.view.mainText?.text = NSLocalizedString("Please rate your service.", comment: "Ask user to rate their experience.")
+ routeRatingController.view.mainText?.text = NSLocalizedString("rate-service.message", comment: "Ask user to rate their experience.")
}
feedbackGenerator = nil
@@ -1288,6 +1334,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// - Parameter sender: the button that generated the event
@objc func stopRecording(_ sender: UIButton) {
if beginRouteLandmark.transform != nil {
+ print("Attempting to save route")
if #available(iOS 12.0, *) {
sceneView.session.getCurrentWorldMap { worldMap, error in
self.getRouteNameAndSaveRouteHelper(mapAsAny: worldMap)
@@ -1313,7 +1360,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
func restartSessionIfFailedToRelocalize() {
if attemptingRelocalization {
if !suppressTrackingWarnings {
- announce(announcement: NSLocalizedString("Could not match environment to the saved route. Starting new tracking session.", comment: "Current environment does not match up with the environment in previously saved route. About to start a new tracking session."))
+ announce(announcement: NSLocalizedString("could-not-match-to-saved-route.announcement", comment: "Current environment does not match up with the environment in previously saved route. About to start a new tracking session."))
}
if #available(iOS 12.0, *) {
configuration.initialWorldMap = nil
@@ -1355,8 +1402,11 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
/// handles the user pressing the landmark button
@objc func startCreateLandmarkProcedure() {
+ rootContainerView.homeButton.isHidden = false
+// backButton.isHidden = true
creatingRouteLandmark = true
// make sure to clear out any relative transform and paused transform so the alignment is accurate
+ print("starting pause procedure", creatingRouteLandmark)
sceneView.session.setWorldOrigin(relativeTransform: simd_float4x4.makeTranslation(0, 0, 0))
state = .startingPauseProcedure
}
@@ -1688,11 +1738,50 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: (#selector(announceDirectionHelp)), userInfo: nil, repeats: false)
}
+ // Called when home button is pressed
+ // Chooses the states in which the home page alerts pop up
+ @objc func homeButtonPressed() {
+ // if the state case needs to have a home button alert, send it to the function that creates the relevant alert
+ if case .navigatingRoute = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .recordingRoute = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .readyToNavigateOrPause = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .pauseWaitingPeriod = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .startingPauseProcedure = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .completingPauseProcedure = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .pauseProcedureCompleted = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .readyForFinalResumeAlignment = self.state {
+ homePageNavigationProcesses()
+ }
+ else if case .startingResumeProcedure = self.state {
+ homePageNavigationProcesses()
+ }
+ else {
+ // proceed to home page
+ clearState()
+ hideAllViewsHelper()
+ self.state = .mainScreen(announceArrival: false)
+ }
+ }
+
/// Called when the settings button is pressed. This function will display the settings view (managed by SettingsViewController) as a popover.
@objc func settingsButtonPressed() {
let storyBoard: UIStoryboard = UIStoryboard(name: "SettingsAndHelp", bundle: nil)
let popoverContent = storyBoard.instantiateViewController(withIdentifier: "Settings") as! SettingsViewController
-
+ popoverContent.preferredContentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
let nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = .popover
let popover = nav.popoverPresentationController
@@ -1710,12 +1799,13 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
@objc func helpButtonPressed() {
let storyBoard: UIStoryboard = UIStoryboard(name: "SettingsAndHelp", bundle: nil)
let popoverContent = storyBoard.instantiateViewController(withIdentifier: "Help") as! HelpViewController
+ popoverContent.preferredContentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
let nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = .popover
let popover = nav.popoverPresentationController
popover?.delegate = self
popover?.sourceView = self.view
- popover?.sourceRect = CGRect(x: 0, y: UIConstants.settingsAndHelpFrameHeight/2, width: 0,height: 0)
+ popover?.sourceRect = CGRect(x: 0, y: 0, width: 0, height: 0)
popoverContent.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: popoverContent, action: #selector(popoverContent.doneWithHelp))
suppressTrackingWarnings = true
self.present(nav, animated: true, completion: nil)
@@ -1725,6 +1815,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
@objc func feedbackButtonPressed() {
let storyBoard: UIStoryboard = UIStoryboard(name: "SettingsAndHelp", bundle: nil)
let popoverContent = storyBoard.instantiateViewController(withIdentifier: "Feedback") as! FeedbackViewController
+ popoverContent.preferredContentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
let nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = .popover
let popover = nav.popoverPresentationController
@@ -1761,16 +1852,17 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
if(slope > 0.3) { // Go upstairs
if(hapticFeedback) {
- dir += "\(Directions[direction.hapticDirection]!)" + NSLocalizedString(" and proceed upstairs", comment: "Additional directions given to user")
+ //TODO: Use NSLocalizedStringWithFormat to better deal with string concatination
+ dir += "\(Directions[direction.hapticDirection]!)" + NSLocalizedString("proceed-upstairs.message", comment: "Additional directions given to user")
} else {
- dir += "\(Directions[direction.clockDirection]!)" + NSLocalizedString(" and proceed upstairs", comment: "Additional directions given to user")
+ dir += "\(Directions[direction.clockDirection]!)" + NSLocalizedString("proceed-upstairs.message", comment: "Additional directions given to user")
}
updateDirectionText(dir, distance: 0, displayDistance: false)
} else if (slope < -0.3) { // Go downstairs
if(hapticFeedback) {
- dir += "\(Directions[direction.hapticDirection]!) and proceed downstairs"
+ dir += "\(Directions[direction.hapticDirection]!)" + NSLocalizedString("proceed-downstairs.message", comment: "Additional directions given to user")
} else {
- dir += "\(Directions[direction.clockDirection]!) and proceed downstairs"
+ dir += "\(Directions[direction.clockDirection]!)" + NSLocalizedString("proceed-downstairs.message", comment: "Additional directions given to user")
}
updateDirectionText(dir, distance: direction.distance, displayDistance: false)
} else { // nromal directions
@@ -1922,7 +2014,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
logString = "ExcessiveMotion"
print("Excessive motion")
if !suppressTrackingWarnings {
- announce(announcement: NSLocalizedString("Excessive motion.\nTracking performance is degraded.", comment: "Let user know that there is too much movement of their phone and thus the app's ability to track a route has been lowered."))
+ announce(announcement: NSLocalizedString("excessive-motion.announcement", comment: "Let user know that there is too much movement of their phone and thus the app's ability to track a route has been lowered."))
if soundFeedback {
playSystemSound(id: 1050)
}
@@ -1931,7 +2023,7 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
logString = "InsufficientFeatures"
print("InsufficientFeatures")
if !suppressTrackingWarnings {
- announce(announcement: NSLocalizedString("Insufficient visual features.\nTracking performance is degraded.", comment: "Let user know that their current surroundings do not have enough visual markers and thus the app's ability to track a route has been lowered."))
+ announce(announcement: NSLocalizedString("insufficient-visual-features.announcement", comment: "Let user know that their current surroundings do not have enough visual markers and thus the app's ability to track a route has been lowered."))
if soundFeedback {
playSystemSound(id: 1050)
}
@@ -1949,15 +2041,15 @@ class ViewController: UIViewController, ARSCNViewDelegate, SRCountdownTimerDeleg
logString = "Normal"
if #available(iOS 12.0, *), configuration.initialWorldMap != nil, attemptingRelocalization {
if !suppressTrackingWarnings {
- announce(announcement: NSLocalizedString("Successfully matched current environment to saved route.", comment: "Let user know that their surroundings match up to the surroundings of a saved route and that they can begin navigating."))
+ announce(announcement: NSLocalizedString("successful-match-to-saved-route.announcement", comment: "Let user know that their surroundings match up to the surroundings of a saved route and that they can begin navigating."))
}
attemptingRelocalization = false
} else if case let .limited(reason)? = trackingSessionState {
if !suppressTrackingWarnings {
if reason == .initializing {
- announce(announcement: NSLocalizedString("Tracking session initialized.", comment: "Let user know that the tracking session has started."))
+ announce(announcement: NSLocalizedString("tracking-session-initialized.announcement", comment: "Let user know that the tracking session has started."))
} else {
- announce(announcement: NSLocalizedString("Tracking performance normal.", comment: "Let user know that the ability to track and record a route is normal."))
+ announce(announcement: NSLocalizedString("tracking-performance-normal.announcement", comment: "Let user know that the ability to track and record a route is normal."))
if soundFeedback {
playSystemSound(id: 1025)
}
diff --git a/Clew/Extensions/UIButtonExtensions.swift b/Clew/Extensions/UIButtonExtensions.swift
index 52ebd094..177d85db 100644
--- a/Clew/Extensions/UIButtonExtensions.swift
+++ b/Clew/Extensions/UIButtonExtensions.swift
@@ -47,9 +47,9 @@ extension UIButton {
button.center.x = containerView.center.x - UIScreen.main.bounds.size.width/4.5
}
if containerView.mainText != nil {
- button.center.y = containerView.bounds.size.height * (8/10)
+ button.center.y = containerView.bounds.size.height * (31/40)
} else {
- button.center.y = containerView.bounds.size.height * (6/10)
+ button.center.y = containerView.bounds.size.height * (5/10)
}
switch appearance {
diff --git a/Clew/Misc/FeedbackLogger.swift b/Clew/Misc/FeedbackLogger.swift
index d87546b2..1e55984c 100644
--- a/Clew/Misc/FeedbackLogger.swift
+++ b/Clew/Misc/FeedbackLogger.swift
@@ -73,17 +73,26 @@ class FeedbackLogger {
}
///takes in all the different pieces of data and combines them into a properly formatted string of type Data
- func makeData(name: String, message: String, country inputCountry: String?, phone: String, email: String) -> Data? {
+ func makeData(name: String, message: String, country inputCountry: String?, phone: String, email: String,isAudio: Bool) -> Data? {
var country: String = "NONE"
///performs input processing on the country Field
- if inputCountry == "Country (optional)"{
+ if inputCountry == ""{
country = "NONE"
}else{
country = inputCountry!
}
+ ///sets the default state to not have an audio file
+ var audioData = "NONE"
+
+ ///performs input processing on the audio data to say whether or not there is an audio file
+ if isAudio {
+ ///sets the address of the audio file if there is one
+ audioData = "\(name)_Recording_\(uniqueID).wav"
+ }
+
///places the data into a dictionary to be formatted into JSON later
let body: [String : Any] = ["FeedbackDate": "\(Date().description(with: .current))",
"PhoneNumber": phone,
@@ -92,7 +101,7 @@ class FeedbackLogger {
"Country": country,
"Message": message,
"AppInstanceID": Analytics.appInstanceID(),
- "AudioFileName": "\(name)_Recording_\(uniqueID).wav"]
+ "AudioFileName": audioData]
do {
///converts the data into JSON
let data = try JSONSerialization.data(withJSONObject: body, options: .prettyPrinted)
@@ -106,6 +115,13 @@ class FeedbackLogger {
///combines the information together and saves a file to Firebase containing the user's feedback
func saveFeedback(name: String, message: String, country: String?, phone: String, email: String,audio: URL?) -> Int{
///calls the functions to create the properly formatted data and upload the result to firebase
- return writeFeedbackToFirebase(name: name, data: makeData(name: name, message: message, country: country, phone: phone, email: email)!,audio: audio)
+ if audio == nil {
+ ///if there is no audio log tell the program to notate theat in the log
+ return writeFeedbackToFirebase(name: name, data: makeData(name: name, message: message, country: country, phone: phone, email: email, isAudio: false)!,audio: audio)
+ }else{
+ ///if there is an audio file tell the program to notate that in the log
+ return writeFeedbackToFirebase(name: name, data: makeData(name: name, message: message, country: country, phone: phone, email: email, isAudio: true)!,audio: audio)
+ }
+
}
}
diff --git a/Clew/Misc/HelpCompiler.swift b/Clew/Misc/HelpCompiler.swift
new file mode 100644
index 00000000..c4013a1b
--- /dev/null
+++ b/Clew/Misc/HelpCompiler.swift
@@ -0,0 +1,170 @@
+//
+// HelpCompiler.swift
+// Clew
+//
+// Created by tad on 6/26/19.
+// Copyright © 2019 OccamLab. All rights reserved.
+//
+
+import Foundation
+import UIKit
+import WebKit
+
+///and external class which contains the information necessary for loading the help documentation website
+class HelpCompiler {
+
+ ///creates a dictionry which sets up the HTML structure for all of the help menu sections. the format for a section is (NSLocalizedString describing the section header, html describing section content with NSLocalized strings for relevant sections)
+ let contentDictioanry = [("\(NSLocalizedString("appFeaturesHeading", comment: "this is a heading in the help documentation. it is also used for the creation of the accessability labels used to inform the user as to how to interact with the help documantatio's accordian menu"))","""
+ \(NSLocalizedString("appFeaturesCurrentVersionHeading", comment: "this is a heading in the help documentation and part of the app features section."))
+ \(NSLocalizedString("appfeaturesCurrentVersionContent", comment: "this is a paragraph in the app features section of the help menu which describes the main features of Clew"))
+ \(NSLocalizedString("appFeaturesNewFeaturesContent", comment: "This is a short section which describes the latest features added to the clew app."))
+ \(NSLocalizedString("appFeaturesFutureVersionsHeader", comment: "This is a heading in the app features section of the help documentation."))
+ \(NSLocalizedString("appFeaturesFutureVersionsContent", comment: "this is a paragraph in the app Features section of the help documentation which describes the features which are under development for future versions of the app."))
+ """),("\(NSLocalizedString("howWellDoesClewWorkHeader", comment: "This is a section heading in the help documentation menu"))","""
+ \(NSLocalizedString("howWellDoesClewWorkContentParagraph1", comment: "This is a paragraph in the How well does Clew work? section of the help documentation. This paragraph describes how the app actually works"))
+ \(NSLocalizedString("howWellDoesClewWorkContentParagraph2", comment: "This is a paragraph in the How well does Clew work section of the help documentation. This paragraph describes how users should use CLew to supplement their orientation and mobility skills rather than using the app as a replacement for their traditional. orientation and mobility skills" ))
+ """),("\(NSLocalizedString("recordingARouteHeader", comment: "This is a section heading in the help documentation menu"))","""
+ \(NSLocalizedString("recordingARouteContent", comment: "This is a paragraph in the recording a route section which describes how to record a single use route"))
+
\(NSLocalizedString("recordingARouteProperPositioningHeading", comment: "This is a heading in the recording a route section of the help documentation."))
+ \(NSLocalizedString("recordingARouteProperPositioningContent", comment: "This is a paragraph in the recording a route section of the help menu. This paragraph describes how to properly hold the phone while recording a route for optimal performance"))
+ """),("\(NSLocalizedString("savedRoutesHeader", comment: "This is a section header in the help documentation"))","""
+ \(NSLocalizedString("savedRoutesContent", comment: "this is a paragraph in the saved routes section of the help documentation. this paragraph describes the basic functionaliuty of the saved routes feature"))
+ \(NSLocalizedString("savedRoutesLoadingARouteHeader", comment: "This is a header in the saving routes section of the help documentation menu"))
+ \(NSLocalizedString("savedRoutesLoadingARouteContent", comment: "This is a paragraph in the saving routes section of the help menu which describes the process for loading a saved route for navigation."))
+ \(NSLocalizedString("savedRoutesDeletingASavedRouteHeader", comment: "This is a header in the saved routes section of the help documentation"))
+ \(NSLocalizedString("savedRoutesDeletingASavedRouteContent", comment: "This is a paragraph in the saved routes section of the help documentation. This paragraph describes how to delete a saved route."))
+ """),("\(NSLocalizedString("followingARouteHeader", comment: "This is a header for the following a route section of the help documentation."))","""
+ \(NSLocalizedString("followingARouteContent", comment: "This is a paragraph which is in the following a route section of the help documentation."))
+ \(NSLocalizedString("followingARouteHapticFeedbackHeader", comment: "This is a header inside the following a route section of the help documentation"))
+ \(NSLocalizedString("followingARouteHapticFeedbackContent", comment: "this is a paragraph in the following a route section of the help documentation which describes the meaning of haptic feedback that the user recieves during navigation."))
+ \(NSLocalizedString("followingARouteAuditoryBeepsHeader", comment: "This is a header inside the following a route section of the help documentation"))
+ \(NSLocalizedString("followingARouteAuditoryBeepsContent", comment: "This is a paragraph in the following a route section of the help documentation which describes the menaing of audityory meps during navigation."))
+
+ \(NSLocalizedString("followingARouteSpeechFeedbackHeader", comment: "This is a header inside the following a route section of the help documentation"))
+ \(NSLocalizedString("followingARouteSpeechFeedbackContent", comment: "this is a paragraph in the following a route section of the help documentation which describes the meaning of auditory speech feedback during navigation."))
+
+
+
+ """),("\(NSLocalizedString("appSoundsAndTheirMeaningsHeader", comment: "This is a section header in the help documentation"))","""
+ \(NSLocalizedString("appSoundsAndTheirMeaningsContent", comment: "This is a paragraph in the App sounds and their meanings section."))
+
+ \(NSLocalizedString("appSoundsAndTheirMeaningsNormalMotionTrackingSoundBullet", comment: "This is a bullet point which describes the normal motion tracking sound and its meaning"))
+ \(NSLocalizedString("appSoundsAndTheirMeaningsMotionTrackingWarningSoundBullet", comment: "This is a bullet point which describes the motion tracking warning sound and its meaning"))
+
+ """),("\(NSLocalizedString("ratingYourNavigationExperienceHeader", comment: "This is a section header in the help documentation menu"))","""
+ \(NSLocalizedString("ratingYourNavigationExperienceContent", comment: "This is a paragraph in the rating your navigation experiennce section of the help menu."))
+ """),("\(NSLocalizedString("providingFeedbackToTheDevelopmentTeamHeader", comment: "this is a section in the help documentation menu"))","""
+ \(NSLocalizedString("providingFeedbackToTheDevelopmentTeamContent", comment: "This is a paragraph which describes how to send feedback to the development team"))
+