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"))

+ + + """)] + + ///compiles all of the web content into a giant string of HTML + func compileWebContent()->String{ + + ///creates a string which will contain the html for the website and prep it witth the content which is rendered above any content specific to different help sections. this means that this creates the header, css, and loads the website title + var result:String = """ + + + + + + + + \(NSLocalizedString( +

\(NSLocalizedString("clewHelpTitle", comment: "This is the top heading of the help documentation"))

+ """ + + ///itterates through the dictionary of help sections and their content + for (key,value) in contentDictioanry{ + + //for each section this adds it to the html as a collapseable section with the proper content + let section = """ + + + + +
+ \(value) +
+ """ + /// appends the latest section to the stack of sections + result = result + section + } + ///appends the footer information to the html string. this includes adding the javascript for handeling accesability (included inside this folder rather than a remote javascript file so it can be localized) and the javascript which handels the expanding and contracting menus. + result = result + """ + + + + + + """ + + ///returns the string which contains the full html for the website + return result + } + + ///loads the help documentation content into a website + func loadWebContent(webView: WKWebView){ + //gives access to the resources folder + let url = Bundle.main.url(forResource: "helpDocsJavascript", withExtension: "js", subdirectory: "help/assets")! + //let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "help")! + webView.loadFileURL(url, allowingReadAccessTo: url) + + //creates the string of HTML that contains the web content for the help page + let webContent = compileWebContent() + ///loads the web content into a website by loading the HTML string provided in the item object + webView.loadHTMLString(webContent, baseURL: url) + } + +} diff --git a/Clew/Misc/Navigation.swift b/Clew/Misc/Navigation.swift index 3f8ef10e..215c0919 100644 --- a/Clew/Misc/Navigation.swift +++ b/Clew/Misc/Navigation.swift @@ -66,18 +66,18 @@ public struct DirectionInfo { /// * Keys (`Int` from 1 to 12 inclusive): clock position /// * Values (`String`): corresponding spoken direction (e.g. "Slight right towards 2 o'clock") public let ClockDirections = [ - 12: NSLocalizedString("Continue straight", comment: "Continue moving in forward direction"), - 1: NSLocalizedString("Slight right towards 1 o'clock", comment: "Angle your body towards the 1 o'clock direction"), - 2: NSLocalizedString("Slight right towards 2 o'clock", comment: "Angle your body towards the 2 o'clock direction"), - 3: NSLocalizedString("Turn right", comment: "Turn to your right"), - 4: NSLocalizedString("Turn towards 4 o'clock", comment: "Angle your body towards 4 o'clock direction"), - 5: NSLocalizedString("Turn around towards 5 o'clock", comment: "Angle your body towards 5 o'clock direction"), - 6: NSLocalizedString("Turn around towards 6 o'clock", comment: "Angle your body towards 6 o'clock direction"), - 7: NSLocalizedString("Turn around towards 7 o'clock", comment: "Angle your body towards 7 o'clock direction"), - 8: NSLocalizedString("Turn towards 8 o'clock", comment: "Angle your body towards 8 o'clock direction"), - 9: NSLocalizedString("Turn left", comment: "Turn to your left"), - 10: NSLocalizedString("Slight left towards 10 o'clock", comment: "Angle your body towards the 10 o'clock direction"), - 11: NSLocalizedString("Slight left towards 11 o'clock", comment: "Angle your body towards the 11 o'clock direction") + 12: NSLocalizedString("continue-straight.message", comment: "Continue moving in forward direction"), + 1: NSLocalizedString("slight-right-1-o'clock.message", comment: "Angle your body towards the 1 o'clock direction"), + 2: NSLocalizedString("slight-right-2-o'clock.message", comment: "Angle your body towards the 2 o'clock direction"), + 3: NSLocalizedString("turn-right.message", comment: "Turn to your right"), + 4: NSLocalizedString("turn-to-4-o'clock.message", comment: "Angle your body towards 4 o'clock direction"), + 5: NSLocalizedString("turn-to-5-o'clock.message", comment: "Angle your body towards 5 o'clock direction"), + 6: NSLocalizedString("turn-to-6-o'clock.message", comment: "Angle your body towards 6 o'clock direction"), + 7: NSLocalizedString("turn-to-7-o'clock.message", comment: "Angle your body towards 7 o'clock direction"), + 8: NSLocalizedString("turn-to-8-o'clock.message", comment: "Angle your body towards 8 o'clock direction"), + 9: NSLocalizedString("turn-left.message", comment: "Turn to your left"), + 10: NSLocalizedString("slight-left-10-o'clock.message", comment: "Angle your body towards the 10 o'clock direction"), + 11: NSLocalizedString("slight-left-11-o'clock.message", comment: "Angle your body towards the 11 o'clock direction") ] /// Dictionary of directions, somehow based on haptic feedback. @@ -89,12 +89,12 @@ public let ClockDirections = [ /// - Explain the rationale of this division /// - Consider restructuring this public let HapticDirections = [ - 1: NSLocalizedString("Continue straight", comment: "Continue moving in forward direction"), - 2: NSLocalizedString("Slight right", comment: "Angle your body slightly towards the right"), - 3: NSLocalizedString("Turn right", comment: "Turn to your right"), - 4: NSLocalizedString("Turn around", comment: "Turn completely around"), - 5: NSLocalizedString("Turn left", comment: "Turn to your left"), - 6: NSLocalizedString("Slight left", comment: "Angle your body slightly towards the left"), + 1: NSLocalizedString("continue-straight.message", comment: "Continue moving in forward direction"), + 2: NSLocalizedString("slight-right.message", comment: "Angle your body slightly towards the right"), + 3: NSLocalizedString("turn-right.message", comment: "Turn to your right"), + 4: NSLocalizedString("turn-around.message", comment: "Turn completely around"), + 5: NSLocalizedString("turn-left.message", comment: "Turn to your left"), + 6: NSLocalizedString("slight-left.message", comment: "Angle your body slightly towards the left"), 0: "ERROR" ] diff --git a/Clew/Views/Base.lproj/LaunchScreen.storyboard b/Clew/Views/LaunchScreen.storyboard similarity index 100% rename from Clew/Views/Base.lproj/LaunchScreen.storyboard rename to Clew/Views/LaunchScreen.storyboard diff --git a/Clew/Views/RootContainerView.swift b/Clew/Views/RootContainerView.swift index 2f33907e..8f539850 100644 --- a/Clew/Views/RootContainerView.swift +++ b/Clew/Views/RootContainerView.swift @@ -35,6 +35,9 @@ class RootContainerView: UIView { /// button for bringing up the help menu var helpButton: UIButton! + /// button for going to the main screen + var homeButton: UIButton! + /// button for bringing up the feedback menu var feedbackButton: UIButton! @@ -59,47 +62,58 @@ class RootContainerView: UIView { super.init(frame: frame) // MARK: Settings Button - settingsButton = UIButton(frame: CGRect(x: 0, - y: UIConstants.yOriginOfSettingsAndHelpButton, - width: UIConstants.buttonFrameWidth/3, - height: UIConstants.settingsAndHelpFrameHeight)) + settingsButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/(10/0.5), + y: 10, + width: UIConstants.buttonFrameWidth/7, + height: UIConstants.buttonFrameWidth/7)) settingsButton.isAccessibilityElement = true settingsButton.setTitle("Settings", for: .normal) - settingsButton.accessibilityLabel = "Settings" + settingsButton.accessibilityLabel = NSLocalizedString("settings.button.accessibility.label", comment: "A button that displays the settings") settingsButton.titleLabel?.font = UIFont.systemFont(ofSize: 24.0) - settingsButton.backgroundColor = UIColor.black.withAlphaComponent(0.4) + settingsButton.setImage(UIImage(named: "settingsGear"), for: .normal) + // MARK: Help Button - helpButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/3, - y: UIConstants.yOriginOfSettingsAndHelpButton, - width: UIConstants.buttonFrameWidth/3, - height: UIConstants.settingsAndHelpFrameHeight)) + helpButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/(7/3), + y: UIConstants.yOriginOfSettingsAndHelpButton + 10, + width: UIConstants.buttonFrameWidth/7, + height: UIConstants.buttonFrameWidth/7)) helpButton.isAccessibilityElement = true helpButton.setTitle("Help", for: .normal) helpButton.titleLabel?.font = UIFont.systemFont(ofSize: 24.0) - helpButton.accessibilityLabel = "Help" - helpButton.backgroundColor = UIColor.black.withAlphaComponent(0.4) + helpButton.accessibilityLabel = NSLocalizedString("help.button.accessibility.label", comment: "A button that displays the help menu") + helpButton.setImage(UIImage(named: "HelpButton"), for: .normal) + + // MARK: Home Button + homeButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/7, + y: UIConstants.yOriginOfSettingsAndHelpButton + 10, + width: UIConstants.buttonFrameWidth/7, + height: UIConstants.buttonFrameWidth/7)) + homeButton.isAccessibilityElement = true + homeButton.setTitle("Home Button", for: .normal) + homeButton.titleLabel?.font = UIFont.systemFont(ofSize: 24.0) + homeButton.accessibilityLabel = NSLocalizedString("clew-home-screen.button.accessibility.label", comment: "A button that allows the user to return to the home screen") + homeButton.setImage(UIImage(named: "homeButton"), for: .normal) - // button that shows feedback menu - feedbackButton = UIButton(frame: CGRect(x: 2*UIConstants.buttonFrameWidth/3, - y: UIConstants.yOriginOfSettingsAndHelpButton, - width: UIConstants.buttonFrameWidth/3, - height: UIConstants.settingsAndHelpFrameHeight)) + feedbackButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/(10/8), + y: 10, + width: UIConstants.buttonFrameWidth/7, + height: UIConstants.buttonFrameWidth/7)) feedbackButton.isAccessibilityElement = true feedbackButton.setTitle("Feedback", for: .normal) feedbackButton.titleLabel?.font = UIFont.systemFont(ofSize: 24.0) - feedbackButton.accessibilityLabel = "Feedback" - feedbackButton.backgroundColor = UIColor.black.withAlphaComponent(0.4) + feedbackButton.accessibilityLabel = NSLocalizedString("feedback.button.accessibility.label", comment: "A button that displays the feedback form a user can fill out") + feedbackButton.setImage(UIImage(named: "Contact"), for: .normal) + + + getDirectionButton = UIButton(frame: CGRect(x: UIConstants.buttonFrameWidth/(7/5), + y: UIConstants.yOriginOfSettingsAndHelpButton + 10, + width: UIConstants.buttonFrameWidth/7, + height: UIConstants.buttonFrameWidth/7)) - // MARK: Directions Button - // an invisible button which can be pressed to get the directions - // to the next waypoint. - getDirectionButton = UIButton(frame: CGRect(x: 0, - y: 0, - width: UIConstants.buttonFrameWidth, - height: UIConstants.yOriginOfButtonFrame)) getDirectionButton.isAccessibilityElement = true - getDirectionButton.accessibilityLabel = "Get Directions" + getDirectionButton.accessibilityLabel = NSLocalizedString("get-directions.button.acessibility.label", comment: "A button that will give the user specific directions to their destination") + getDirectionButton.setImage(UIImage(named: "GetDirection"), for: .normal) getDirectionButton.isHidden = true // MARK: Announcement Text @@ -139,5 +153,6 @@ class RootContainerView: UIView { addSubview(helpButton) addSubview(countdownTimer) addSubview(feedbackButton) + addSubview(homeButton) } } diff --git a/Clew/Views/SettingsAndHelp.storyboard b/Clew/Views/SettingsAndHelp.storyboard index 9a30822c..d0064c76 100644 --- a/Clew/Views/SettingsAndHelp.storyboard +++ b/Clew/Views/SettingsAndHelp.storyboard @@ -149,13 +149,13 @@ - + - + @@ -179,7 +179,7 @@ - + @@ -192,7 +192,7 @@ - + @@ -214,7 +214,7 @@ - + @@ -294,9 +294,9 @@