From 08aab9b9e9dd412d4092afcdd6631c1a5b898d60 Mon Sep 17 00:00:00 2001 From: saniazafar Date: Wed, 17 Feb 2021 23:06:00 +0400 Subject: [PATCH] Trac Mobility Assignment - iOS --- .gitignore | 24 + Podfile | 9 + Podfile.lock | 46 ++ TracMobility.xcodeproj/project.pbxproj | 470 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + TracMobility/AppDelegate.swift | 40 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 ++++ TracMobility/Assets.xcassets/Contents.json | 6 + .../facebook-icon.imageset/Contents.json | 21 + .../facebook-icon@3x.png | Bin 0 -> 676 bytes .../free-ride.imageset/Contents.json | 21 + .../free-ride.imageset/free-ride@3x.png | Bin 0 -> 1168 bytes .../google-icon.imageset/Contents.json | 21 + .../google-icon.imageset/google-icon@3x.png | Bin 0 -> 1194 bytes .../inbox-icon.imageset/Contents.json | 21 + .../inbox-icon.imageset/inbox-icon@3x.png | Bin 0 -> 2684 bytes .../map-marker.imageset/Contents.json | 21 + .../map-marker.imageset/map-marker@3x.png | Bin 0 -> 1593 bytes .../membership.imageset/Contents.json | 21 + .../membership.imageset/membership@3x.png | Bin 0 -> 908 bytes .../menu-icon.imageset/Contents.json | 21 + .../menu-icon.imageset/menu-icon@3x.png | Bin 0 -> 524 bytes .../profile-icon.imageset/Contents.json | 21 + .../profile-icon.imageset/profile-icon@3x.png | Bin 0 -> 2105 bytes .../promos.imageset/Contents.json | 21 + .../promos.imageset/promos@3x.png | Bin 0 -> 1311 bytes .../settings.imageset/Contents.json | 21 + .../settings.imageset/settings@3x.png | Bin 0 -> 1797 bytes .../trac-icon.imageset/Contents.json | 21 + .../trac-mobility-logo@3x.png | Bin 0 -> 9551 bytes .../trac-mobility-icon.imageset/Contents.json | 21 + .../trac-mobility-logo@3x.png | Bin 0 -> 33804 bytes .../wallet.imageset/Contents.json | 21 + .../wallet.imageset/wallet@3x.png | Bin 0 -> 1036 bytes .../your-ride.imageset/Contents.json | 21 + .../your-ride.imageset/you-ride@3x.png | Bin 0 -> 1383 bytes TracMobility/Auth/AuthViewController.swift | 113 ++++ .../Base.lproj/LaunchScreen.storyboard | 25 + TracMobility/Base.lproj/Main.storyboard | 523 ++++++++++++++++++ TracMobility/GoogleService-Info.plist | 14 + TracMobility/Info.plist | 88 +++ TracMobility/Map/MapViewController.swift | 167 ++++++ TracMobility/SceneDelegate.swift | 52 ++ .../Splash/SplashViewController.swift | 40 ++ 48 files changed, 2053 insertions(+) create mode 100644 .gitignore create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 TracMobility.xcodeproj/project.pbxproj create mode 100644 TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TracMobility.xcworkspace/contents.xcworkspacedata create mode 100644 TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TracMobility/AppDelegate.swift create mode 100644 TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TracMobility/Assets.xcassets/Contents.json create mode 100644 TracMobility/Assets.xcassets/facebook-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/facebook-icon.imageset/facebook-icon@3x.png create mode 100644 TracMobility/Assets.xcassets/free-ride.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/free-ride.imageset/free-ride@3x.png create mode 100644 TracMobility/Assets.xcassets/google-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/google-icon.imageset/google-icon@3x.png create mode 100644 TracMobility/Assets.xcassets/inbox-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/inbox-icon.imageset/inbox-icon@3x.png create mode 100644 TracMobility/Assets.xcassets/map-marker.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/map-marker.imageset/map-marker@3x.png create mode 100644 TracMobility/Assets.xcassets/membership.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/membership.imageset/membership@3x.png create mode 100644 TracMobility/Assets.xcassets/menu-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/menu-icon.imageset/menu-icon@3x.png create mode 100644 TracMobility/Assets.xcassets/profile-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/profile-icon.imageset/profile-icon@3x.png create mode 100644 TracMobility/Assets.xcassets/promos.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/promos.imageset/promos@3x.png create mode 100644 TracMobility/Assets.xcassets/settings.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/settings.imageset/settings@3x.png create mode 100644 TracMobility/Assets.xcassets/trac-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/trac-icon.imageset/trac-mobility-logo@3x.png create mode 100644 TracMobility/Assets.xcassets/trac-mobility-icon.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/trac-mobility-icon.imageset/trac-mobility-logo@3x.png create mode 100644 TracMobility/Assets.xcassets/wallet.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/wallet.imageset/wallet@3x.png create mode 100644 TracMobility/Assets.xcassets/your-ride.imageset/Contents.json create mode 100644 TracMobility/Assets.xcassets/your-ride.imageset/you-ride@3x.png create mode 100644 TracMobility/Auth/AuthViewController.swift create mode 100644 TracMobility/Base.lproj/LaunchScreen.storyboard create mode 100644 TracMobility/Base.lproj/Main.storyboard create mode 100644 TracMobility/GoogleService-Info.plist create mode 100644 TracMobility/Info.plist create mode 100644 TracMobility/Map/MapViewController.swift create mode 100644 TracMobility/SceneDelegate.swift create mode 100644 TracMobility/Splash/SplashViewController.swift diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..db8d09f --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Xcode +screenshot_* +.irb-history +.DS_Store +*/build/* +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.moved-aside +DerivedData +.idea/ +.vscode/ +*.hmap +*.xccheckout +*.xcuserstate +build/* +Pods/* +Trac.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..e1707e9 --- /dev/null +++ b/Podfile @@ -0,0 +1,9 @@ +platform :ios, '12.0' + +target 'TracMobility' do + use_frameworks! + + pod 'GoogleSignIn' + pod 'GoogleMaps','~> 4.0.0' + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..3284ce3 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,46 @@ +PODS: + - AppAuth (1.4.0): + - AppAuth/Core (= 1.4.0) + - AppAuth/ExternalUserAgent (= 1.4.0) + - AppAuth/Core (1.4.0) + - AppAuth/ExternalUserAgent (1.4.0) + - GoogleMaps (4.0.0): + - GoogleMaps/Maps (= 4.0.0) + - GoogleMaps/Base (4.0.0) + - GoogleMaps/Maps (4.0.0): + - GoogleMaps/Base + - GoogleSignIn (5.0.2): + - AppAuth (~> 1.2) + - GTMAppAuth (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - GTMAppAuth (1.1.0): + - AppAuth/Core (~> 1.4) + - GTMSessionFetcher (~> 1.4) + - GTMSessionFetcher (1.5.0): + - GTMSessionFetcher/Full (= 1.5.0) + - GTMSessionFetcher/Core (1.5.0) + - GTMSessionFetcher/Full (1.5.0): + - GTMSessionFetcher/Core (= 1.5.0) + +DEPENDENCIES: + - GoogleMaps (~> 4.0.0) + - GoogleSignIn + +SPEC REPOS: + trunk: + - AppAuth + - GoogleMaps + - GoogleSignIn + - GTMAppAuth + - GTMSessionFetcher + +SPEC CHECKSUMS: + AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 + GoogleMaps: b7f7fc569a9b354a3af0d9729dbec40957b7d41e + GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 + GTMAppAuth: 197a8dabfea5d665224aa00d17f164fc2248dab9 + GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52 + +PODFILE CHECKSUM: 4fc49cffc75fad4a1e35dde53564c9cf5a0ea5ec + +COCOAPODS: 1.10.0 diff --git a/TracMobility.xcodeproj/project.pbxproj b/TracMobility.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d99266c --- /dev/null +++ b/TracMobility.xcodeproj/project.pbxproj @@ -0,0 +1,470 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 1A7821BC25DC544900245833 /* AuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7821BB25DC544900245833 /* AuthViewController.swift */; }; + 1A7821C725DC58E400245833 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1A7821C625DC58E400245833 /* GoogleService-Info.plist */; }; + 1A7821CD25DC5C5100245833 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7821CC25DC5C5100245833 /* MapViewController.swift */; }; + 1A7821FC25DD598F00245833 /* SplashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7821FB25DD598F00245833 /* SplashViewController.swift */; }; + 1AEDA1F225DC48D500C4EF60 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEDA1F125DC48D500C4EF60 /* AppDelegate.swift */; }; + 1AEDA1F425DC48D500C4EF60 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEDA1F325DC48D500C4EF60 /* SceneDelegate.swift */; }; + 1AEDA1F925DC48D500C4EF60 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1AEDA1F725DC48D500C4EF60 /* Main.storyboard */; }; + 1AEDA1FB25DC48D600C4EF60 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1AEDA1FA25DC48D600C4EF60 /* Assets.xcassets */; }; + 1AEDA1FE25DC48D600C4EF60 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1AEDA1FC25DC48D600C4EF60 /* LaunchScreen.storyboard */; }; + 363F217020836BB61C8E27EC /* Pods_TracMobility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 272AB8765F759E60ADB223EA /* Pods_TracMobility.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1A7821BB25DC544900245833 /* AuthViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewController.swift; sourceTree = ""; }; + 1A7821C625DC58E400245833 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 1A7821CC25DC5C5100245833 /* MapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; + 1A7821FB25DD598F00245833 /* SplashViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewController.swift; sourceTree = ""; }; + 1AEDA1EE25DC48D500C4EF60 /* TracMobility.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TracMobility.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AEDA1F125DC48D500C4EF60 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 1AEDA1F325DC48D500C4EF60 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 1AEDA1F825DC48D500C4EF60 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 1AEDA1FA25DC48D600C4EF60 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1AEDA1FD25DC48D600C4EF60 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1AEDA1FF25DC48D600C4EF60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 272AB8765F759E60ADB223EA /* Pods_TracMobility.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TracMobility.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4080F9BDCED395A4F496A9B9 /* Pods-TracMobility.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TracMobility.release.xcconfig"; path = "Target Support Files/Pods-TracMobility/Pods-TracMobility.release.xcconfig"; sourceTree = ""; }; + A67CFB51ABFEA3CE58401FB4 /* Pods-TracMobility.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TracMobility.debug.xcconfig"; path = "Target Support Files/Pods-TracMobility/Pods-TracMobility.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1AEDA1EB25DC48D500C4EF60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 363F217020836BB61C8E27EC /* Pods_TracMobility.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A7821BA25DC543300245833 /* Auth */ = { + isa = PBXGroup; + children = ( + 1A7821BB25DC544900245833 /* AuthViewController.swift */, + ); + path = Auth; + sourceTree = ""; + }; + 1A7821CB25DC5C3D00245833 /* Map */ = { + isa = PBXGroup; + children = ( + 1A7821CC25DC5C5100245833 /* MapViewController.swift */, + ); + path = Map; + sourceTree = ""; + }; + 1A7821FA25DD597D00245833 /* Splash */ = { + isa = PBXGroup; + children = ( + 1A7821FB25DD598F00245833 /* SplashViewController.swift */, + ); + path = Splash; + sourceTree = ""; + }; + 1AEDA1E525DC48D400C4EF60 = { + isa = PBXGroup; + children = ( + 1AEDA1F025DC48D500C4EF60 /* TracMobility */, + 1AEDA1EF25DC48D500C4EF60 /* Products */, + A6BA836A8ADB57283B7F8970 /* Pods */, + 91A7ECE33AA839FD3B57CACD /* Frameworks */, + ); + sourceTree = ""; + }; + 1AEDA1EF25DC48D500C4EF60 /* Products */ = { + isa = PBXGroup; + children = ( + 1AEDA1EE25DC48D500C4EF60 /* TracMobility.app */, + ); + name = Products; + sourceTree = ""; + }; + 1AEDA1F025DC48D500C4EF60 /* TracMobility */ = { + isa = PBXGroup; + children = ( + 1A7821FA25DD597D00245833 /* Splash */, + 1A7821BA25DC543300245833 /* Auth */, + 1A7821CB25DC5C3D00245833 /* Map */, + 1AEDA1F125DC48D500C4EF60 /* AppDelegate.swift */, + 1AEDA1F325DC48D500C4EF60 /* SceneDelegate.swift */, + 1AEDA1F725DC48D500C4EF60 /* Main.storyboard */, + 1AEDA1FA25DC48D600C4EF60 /* Assets.xcassets */, + 1AEDA1FC25DC48D600C4EF60 /* LaunchScreen.storyboard */, + 1A7821C625DC58E400245833 /* GoogleService-Info.plist */, + 1AEDA1FF25DC48D600C4EF60 /* Info.plist */, + ); + path = TracMobility; + sourceTree = ""; + }; + 91A7ECE33AA839FD3B57CACD /* Frameworks */ = { + isa = PBXGroup; + children = ( + 272AB8765F759E60ADB223EA /* Pods_TracMobility.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + A6BA836A8ADB57283B7F8970 /* Pods */ = { + isa = PBXGroup; + children = ( + A67CFB51ABFEA3CE58401FB4 /* Pods-TracMobility.debug.xcconfig */, + 4080F9BDCED395A4F496A9B9 /* Pods-TracMobility.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1AEDA1ED25DC48D500C4EF60 /* TracMobility */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AEDA20225DC48D600C4EF60 /* Build configuration list for PBXNativeTarget "TracMobility" */; + buildPhases = ( + 6A0F56C992DDDFDBAF19806D /* [CP] Check Pods Manifest.lock */, + 1AEDA1EA25DC48D500C4EF60 /* Sources */, + 1AEDA1EB25DC48D500C4EF60 /* Frameworks */, + 1AEDA1EC25DC48D500C4EF60 /* Resources */, + 6256E5EA9D4974F209A327E9 /* [CP] Embed Pods Frameworks */, + 5EE71DABB069A23F9AE5F65D /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TracMobility; + productName = TracMobility; + productReference = 1AEDA1EE25DC48D500C4EF60 /* TracMobility.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1AEDA1E625DC48D400C4EF60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1230; + LastUpgradeCheck = 1230; + TargetAttributes = { + 1AEDA1ED25DC48D500C4EF60 = { + CreatedOnToolsVersion = 12.3; + }; + }; + }; + buildConfigurationList = 1AEDA1E925DC48D400C4EF60 /* Build configuration list for PBXProject "TracMobility" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1AEDA1E525DC48D400C4EF60; + productRefGroup = 1AEDA1EF25DC48D500C4EF60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1AEDA1ED25DC48D500C4EF60 /* TracMobility */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1AEDA1EC25DC48D500C4EF60 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AEDA1FE25DC48D600C4EF60 /* LaunchScreen.storyboard in Resources */, + 1A7821C725DC58E400245833 /* GoogleService-Info.plist in Resources */, + 1AEDA1FB25DC48D600C4EF60 /* Assets.xcassets in Resources */, + 1AEDA1F925DC48D500C4EF60 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5EE71DABB069A23F9AE5F65D /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 6256E5EA9D4974F209A327E9 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 6A0F56C992DDDFDBAF19806D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-TracMobility-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1AEDA1EA25DC48D500C4EF60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A7821BC25DC544900245833 /* AuthViewController.swift in Sources */, + 1AEDA1F225DC48D500C4EF60 /* AppDelegate.swift in Sources */, + 1A7821FC25DD598F00245833 /* SplashViewController.swift in Sources */, + 1A7821CD25DC5C5100245833 /* MapViewController.swift in Sources */, + 1AEDA1F425DC48D500C4EF60 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 1AEDA1F725DC48D500C4EF60 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1AEDA1F825DC48D500C4EF60 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 1AEDA1FC25DC48D600C4EF60 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1AEDA1FD25DC48D600C4EF60 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1AEDA20025DC48D600C4EF60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1AEDA20125DC48D600C4EF60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1AEDA20325DC48D600C4EF60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A67CFB51ABFEA3CE58401FB4 /* Pods-TracMobility.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 26GZ63PU38; + INFOPLIST_FILE = TracMobility/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = saniazafar.TracMobility; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 1AEDA20425DC48D600C4EF60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4080F9BDCED395A4F496A9B9 /* Pods-TracMobility.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 26GZ63PU38; + INFOPLIST_FILE = TracMobility/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = saniazafar.TracMobility; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1AEDA1E925DC48D400C4EF60 /* Build configuration list for PBXProject "TracMobility" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AEDA20025DC48D600C4EF60 /* Debug */, + 1AEDA20125DC48D600C4EF60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1AEDA20225DC48D600C4EF60 /* Build configuration list for PBXNativeTarget "TracMobility" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AEDA20325DC48D600C4EF60 /* Debug */, + 1AEDA20425DC48D600C4EF60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1AEDA1E625DC48D400C4EF60 /* Project object */; +} diff --git a/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TracMobility.xcworkspace/contents.xcworkspacedata b/TracMobility.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..007dbb8 --- /dev/null +++ b/TracMobility.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TracMobility/AppDelegate.swift b/TracMobility/AppDelegate.swift new file mode 100644 index 0000000..304ce95 --- /dev/null +++ b/TracMobility/AppDelegate.swift @@ -0,0 +1,40 @@ +// +// AppDelegate.swift +// TracMobility +// +// Created by sania zafar on 16/02/2021. +// + +import UIKit +import GoogleSignIn +import GoogleMaps + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + GIDSignIn.sharedInstance().clientID = "794354601493-r1a1l9plivj613gqrca0g62aohdsg67s.apps.googleusercontent.com" + GMSServices.provideAPIKey("AIzaSyCfuOzONBl21S8Uxv7wQwOVMjOKDdTIk_Y") + + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json b/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json b/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/Contents.json b/TracMobility/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TracMobility/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/facebook-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/facebook-icon.imageset/Contents.json new file mode 100644 index 0000000..16de9b1 --- /dev/null +++ b/TracMobility/Assets.xcassets/facebook-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "facebook-icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/facebook-icon.imageset/facebook-icon@3x.png b/TracMobility/Assets.xcassets/facebook-icon.imageset/facebook-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4feab54c56fc7da60df863ab60ad4a1ab7a59d69 GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Skh{mIefF+_BdOJQ-iLYX|2)b68rlDFVt!n5w|+_H?X7i67wUM^ zBR+_P#-8+=@K^5Lo^Nuj3?C$(uV}r=&QQS4zVI0%L(Cypp6W_=Kf{><4XBR-kAX*V+FFkGLx|CylPQU?3g`Hz#h z3~yWpMu=*OYeY#(Vo9o1a#1RfVlXl=GSD@!&^0g*F*39=G_x`>);2J(GBDW7r+NxS zLvDUbW?Cg~4QGPqmH{NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk)%;^pR@D3V-pLf zP|Z7ocg@o_Ozu6C{7S{R&(KMH?z4UV%hud7U1u>deD)^2T0iq-)$&5;NP`8N|2+CJ zX?g!ePd~@L)+KYF$Dftka)`Tbcbc!!PT7w)Ulm9k-^w$$jBRb!y!CB~ zo1}(^W#_-!sS~+tdFi~mz10revwyLC7qtqg=6ZI0$<_q{6V@H= z;!oyjl{wAum`CJ<^hq(}fc4DI&vq|x*sH@fuk}fJMDQ7hzo7x@LhMe}4)#S&>y__q z%P{)SqQadbx+gjO_?ZcN3=gHfu=%hdMYcMfnfJ;S_PFX_6KfZg1gWL{U#t13IW_oz zo*&ye<~p9A=h%F=Y@B5>fq#bXHTE}h3cD-=%vi5F{GGJqU&EU4Nnb1!c58c9NlvKU za=vh`hYZK}#!!>X4}^I(p68ji#nAumzKh!#OjuI7y)xQ=IpnV>JMaGLTliIGtvf9{ zxm5JrRocufI;cTv#?l+=sdcHmV5*M2NlcPX?dER^Z-oI6O z@^SB%zhF{0eKCT$pofPcHe=^^ao_f|-Sw)IMb)s44jp8nkZCU!@h&*SR+ z*V|{SIYe$(OFmYbdS^k(l~pxso+MkPUiSYJ`kUGMrib!OE$1lRdxk#1r2J6jvx>(A zg@fwN{BgU!RaPnYr2#XaYKdz^NlIc#s#S7PDv)9@GB7gKH89dOG!HQ}w=y=eGBVOO zFt9Q(*xOgI8AU^GeoAIqC2kF8E}!5BYLEok5S*V@Ql40p%1~Zju9umYU7Va)kgAto Vls@~NjTBH3gQu&X%Q~loCIGANS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk;W9`+gvlS*R3Qbu0w(8e{O?R%UWi3wJy`ezd@rTCR z1xCTjmljwx8nYPKhvoBQKd*&Nno2jBQn^^m` z&J-=%(abIPtUDoX-V1(sUg{`+;bximGar8*SzcUW_pvZ%CV$PJ zC(9R~xcX;4Q}d2~F`MJ&Eg!|}mL$rSC7CxB|7hRnZ8Q12{ZxCC=a=!dW{9?}5P4VL8O*)go^iu57lD4$P6$*zBd98fd`jBN> zbcBv+jo}=JMGquugbpixbeC%^nR;MG*5(Hf1athw>b&dCe+#g=>GXK+ac|d&aP^*7i?-aW3-mfzm3n8*ipbb$;Wzyr%rQ!PK4qs* zrkeKG^-QeVCQ9>WNjxozFfwu!2CF8hy6NqNNV^e?_|2->&kZPuJnv->OVoS%^XW4=z=hy27g_x@#S z%d8JDPfXrj7yiLf{CL?!6{bBeKBTo&9$frSYH~$XlCN?i8`!U{_Ql?_ks+_~%gimq)g@E~w>fGx^7;aePX^n@9Uxf!R{E#5JNM zC9x#cD!C{XNHG{07#ZjqSm+v A{r~^~ literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/inbox-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/inbox-icon.imageset/Contents.json new file mode 100644 index 0000000..017493f --- /dev/null +++ b/TracMobility/Assets.xcassets/inbox-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inbox-icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/inbox-icon.imageset/inbox-icon@3x.png b/TracMobility/Assets.xcassets/inbox-icon.imageset/inbox-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcdad44ca9b5e8d71ee97623553759119ae51ab6 GIT binary patch literal 2684 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 literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/map-marker.imageset/Contents.json b/TracMobility/Assets.xcassets/map-marker.imageset/Contents.json new file mode 100644 index 0000000..0562b74 --- /dev/null +++ b/TracMobility/Assets.xcassets/map-marker.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "map-marker@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/map-marker.imageset/map-marker@3x.png b/TracMobility/Assets.xcassets/map-marker.imageset/map-marker@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8bfb1ac12f7d626530ef99019c20d01043fb98 GIT binary patch literal 1593 zcmZ`%dpJ~S82^wNX6Cqr6uIQuBF%^{^T;g|lZc`XyRJz{ZqrE9K1QY3cC*P`&TwWB z+vIVn)~;%+8K!kvw^eQE5h4*qrBg z005zTd+vtOO}^Ds;EB~`y?|j^th=u}09W&fA0k!Z-89;Jw=V$4tN>u20$>iN*kb@3 zApZWrl$!l_2GSsa$Pp1y5yBG^`63cuNa6|Q=VuG%;ad%^2(a1e z93g@#U=V;}1ilDVR1mnu|KcGSpr~3w(P9SSVPIilv9l&xj1-i}^E{DeVIh1V!nN29 z6>4%JsR%()MWKj<$~7PY2*40jxIDj19W8};h#~PYA|E60rIA0IPHu(54FrWfA%*;0oCV>@O&|(H z2+YH_3ObTdu2z8&YH*662EqkJA$Q3!9!3zrabOix2wfF{a}~rT7R7WzXtIL0h$IjK zkw{x14^luF5z6La2vdRfQf1~kulKEal(TO1g4r|OzQn8Z)U-hjnSMyexv^? zpX`EQmSxZPq!kA}b~?}|DpcFQd_J9d{I9Oqk-#G#j?Q>XqGrh#qu)#Qw*M%!U>Hno zeR^{beXVaxjJg-M-vXteiU$y4+p2u_<4=QAcJc zHWjy(u02~;m{rc@iq-i$er7sVy@)D*Y}#(mlwgv&U~=J;w#kmlsY}ysTO{cNTRVT! z_qbBAx2l?1mBNaD7(Wr;-L37EF|i3)hszqbXB@wOz%@ekmqQ#`ooc;j$;(KV^Xin7 zH<&MKhtq>jmJ67n)9oy&AFJy9m`kW}gk;t%3U6`rED0Z4c9gx%YTnhZW!s0GKZ=96 zc<glS+Ly0-ABLNh)se_u$>%rW;ufik(B@0{9xL$^s{u=jkh!Q^k z{8X-N)wwCHYX1pG`}=*C$EBUAxKU5m_@|i%Z;SM6zb>kWs%93LL2iQstp;jg=7N-u zjPOKBmxdSquMcda1k*&@fz za7bp$E*Ce{m0fYaXw}K;*UE}AzlTfn6jORThi~<24u@_Dn-RRSaJH7kuE@FEf4go} z#UzIlGR&NrvV1tVIl9GKKNoYcY|qql(R?&?+UgGf&{V>XZ!g8qpAI*h&Mvh(EPjtk z&i9(wFzBwq{U$-rT9ge-+_6!!&FWHGvMxJ!&<^O-N3uuM{8a3`l2=E3abgFMeAafcJq bq9c=I?2}Ss3n!foAPCTDexB7H5hwlzoMWVj literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/membership.imageset/Contents.json b/TracMobility/Assets.xcassets/membership.imageset/Contents.json new file mode 100644 index 0000000..dd5e833 --- /dev/null +++ b/TracMobility/Assets.xcassets/membership.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "membership@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/membership.imageset/membership@3x.png b/TracMobility/Assets.xcassets/membership.imageset/membership@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0007770d15cfde2fbce54312024e578516f92ccb GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk zB&w}VVWZ`wPKiwcU-K9A=!kY6Io@!}gI!Ez)dkZ(Oezvw{~NZM=w8^%vm)qd$Q83d z`zwkQ9S-T#O6)M(zRkJEo=NC?Y|Z(P7c1}2seZRHS&$hBngwa&H)Qq-3%#R>ydr_@!-}@2s4}?B4SE&Uf3*J)I9W2zKQz z7dcS!WQtW{8-KdZ>@x*IlGbzm4k&MpTI|Jbeode>Gw`eScZ0bM`e%Kw@_ReKoW7!? zBOv^nmldORR%oEP&NIuaCvtM8)&8DRx!!fB)aoc_g_=<9w?7P@-{0=)qVfCN9I;YG zZpMqv86WPPu2FK!bqv1UlzM7PJ+w|;YSY%t ze({;4e_XRi%h!NY-z}7S3}08X^*_4WvUfS>iVe$EZ5I5y-5xlXS+`1DeJg`tj@Zk> zBhq<>b_QoY_ZH6%?R&9t#-GABsb={ujEq-aTzdE`{<1TBL+$;(7mYnL7F8?kc>X`0 zUxLxCK`?>k#P|8)YM+-bT_Khia3H-j_ow2|3)`<0saIqxUh~c@%V3jtQ@uG!$Ij}A zv-+2r=U#dG?owX7KJqVzz3RLTvY+LhjCSN)e)8yqR&GKgcyqV(DCY@~pS7(8A5T-G@y GGywqJYHol4 literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/menu-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/menu-icon.imageset/Contents.json new file mode 100644 index 0000000..1753fd9 --- /dev/null +++ b/TracMobility/Assets.xcassets/menu-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/menu-icon.imageset/menu-icon@3x.png b/TracMobility/Assets.xcassets/menu-icon.imageset/menu-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..782cf014bafda5101c294eb95732ebbd2d5053e9 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G|oWRD7{FBlj~4Hy_+B``2p&0t^72p%%3Zyxw&f}RmpJ&EA zAmW`i7f5o>o(7#Neh z-CYE)dPuZ#Uj>TXIlJpa*@4${(eP<8m`+X%r^Bh6zK1pe%-7} z?#v3v`%jiEBhj zN@7W>RdP`(kYX@0Ff!CNFw!+N4>2^hGBLL@G0-+Jure@seD#hGiiX_$l+3hB+!`iz zq-L1P+nfHmzkGcoSayYs+V7sKKq@G6i^X^r>mdKI;Vst0QPIH A00000 literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/profile-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/profile-icon.imageset/Contents.json new file mode 100644 index 0000000..8db2be7 --- /dev/null +++ b/TracMobility/Assets.xcassets/profile-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "profile-icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/profile-icon.imageset/profile-icon@3x.png b/TracMobility/Assets.xcassets/profile-icon.imageset/profile-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fef56c42e6f70b15381bb220707f7887e9e807fc GIT binary patch literal 2105 zcmV-92*&q`P)K~#90)tgOdB*zuU|F3#lnr_LOkw&v)%?wd?55X22Rz$3m zg@Dcakc&UU2JBPVctZ%7#?1VadR2s!zXkhO#HLU!?jA&D1-H3@5D z%o<7ap_!hK)_k_q(^WZ4OCEhsPgPHn-)W`o_v*c;uC7f71%Tk1tMIJ&82<^z>`rV6@YrB^b8Sx0bohS2niktfmdedQ-2v% z!AJqH?cyRl_Im(NjykYn?n2{NyT?-;KYydR7Qn~?w*8xlfw{2`pK;U(|Qn~>^8%AK5 zDWKWa(jNglFKgXFcE=`Cyh4cB$y zd41b7O@prMFwH4E^2iKK(^N4WAn?oheCo$1J#u0I>{{uX|JqBjv$KstA&+jiJJj=r zVIZB(U}9p_1abhvcjI%ZH;(=9;{xD+?QcVJ&ev*Hl*=UqU2TX6XU?QBHb>eAnE&bh(iIWS4z)7GQ+D>EI5uMqhcS9IYDGGzzHj^TgM9(ms+C@X#KuMlfnqT)`?`jyd&&24kG%jC zi$&Al(vD2C*;M-KAH;DSG@DH+9YWyMVzIcFXzT^R)U}r(xu0(~8#3bK8YAud3Sb}r zekDhWRx8x^_BmSs&dow!Wheh*F4z*wLH z(?~GJplL(ZI!05CbJVEa1GF&NG<0a8}WkHzAuRE=c}0ZKFftWF6t zGcgc_Hw}mwW@cjQ^a+t>PP5}T&r5+7sMbPyLq*9M6 z)!Cl{P&WmD{#QDa$ttb%5)m?)tnyWc(4PXz*)3|S2m%oyozB283wp~Z9Rz}WlK_ofn*w|SAuR9O)&kHs-*1Yoc%FxRJ~!6lXHbL?$mesXmdyu!-3vg+^fhpVXRBtsJO0+&CL^2n}Y8vfPnxkEG%@0aQ!HWX0wS#Bm848RWurnW6uzYaDA}P zc;9x|@4bC+P{_7xs%;FNV{Crl`?$x!dVnVcUK#v_>$+n(^HWW$)jBj~ec$$dAPyBo z{Kn(EyFc4@JtPyu=YZ{Zk7}wux+0|Us{kxOU~9_`$GS1lw_O1JCaJ4OJ#%CL;_-zw z!Pu2ntJV8|`0^izKYe?Gu`9=Qk{??WoSjX+Z`<{o;h8rcY`cE*qz>{Ei=yW*yz@fT zFg{gp)_8~-#;4~myz|0I&z#yToXh>qsFvtqr`u6mln)uxFiVM)IGfF0I@%^W|t?r*4ryJf$XaJ&7 zW6PK}zWLZ=%kKr1mAN)Y|Gt0k*X>UG`we93-6 zLkYkjAAaz`mnKd9J3X)Wm0qv+#h&LSh38Fi!FA3>zfX}7XT)66w01<(EKQ57NA$=) jciQe77oK<`)coT=AMttBiQQ1y00000NkvXXu0mjfBvRqz literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/promos.imageset/Contents.json b/TracMobility/Assets.xcassets/promos.imageset/Contents.json new file mode 100644 index 0000000..1a2a5f0 --- /dev/null +++ b/TracMobility/Assets.xcassets/promos.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "promos@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/promos.imageset/promos@3x.png b/TracMobility/Assets.xcassets/promos.imageset/promos@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..151cfa9ea60f49b32937b829dd29fe13f3edc791 GIT binary patch literal 1311 zcmZ`(X;jjA6#bF8WNJ}bY9g7IrGhLCCSj=uMvyVX4UOZZDF|*5QYzI9gG)6^i&=-t z)J~i-v&HO4YNn0mMobQx;)0Z#=9Flgxn$12`8FTsymQ|>_r7=E`}R)m-4kGGZf_0% zu%uDRAyD=G4zuM@1~E0^P+p$k7vu*(<>{4QV~rucF^(D%1b}!80FrC~<{?S)27p5t z0RD~vfG7uGy`ZR;L4q2~4$uS00F=v|aS&S}phl$uVAcE`u=DO#8z9kCL<^#rzFr20 zJGx93GyDNCnxv8a!ni||^8H+gaO;+a6_-8w&5V&!1q@j+j1;gQ(2A`YmE4rDOVt}A zk7uYOwcYtH zO;=C8xx4%^!ABWCt#PwFNu#&f>ePR*jYo3l>*ZAgHtIp5Pp-H9#%sb2XHO?mG&BIVI>c;-YotQTQhWV${z=x=9_pVc(u#CEYyf-1hC z#C;;9HsiQVN$<0jxE3wBTXd=J2WBnn;t1wTK8!|n9b<~OJKTHk9+?9SpW^-HlayC6COX2UWn)y{N9-J9@H1fWb=4Ok!NZP~#n+pKM{~=48yKaYSx4!De`1e1~FP zfnYsI>xVPgW+Kh=RHV(_e>WW_Iv$g-v~L4@thV*+Tw0mm$^YDV?UY3IA!5zZ?MBn* zCkTBDf}s{=j=zU0swcv+wKwBjb8sQoucsEGZ{)8xfA!Nnr;EeyM|G{A!8`0E zT-^4)R)${4V;pF-ad|m)Vy4O|CC|PId|CMV^TG6z+=y{o5haSwa?~45XO@|uD{(D! z1gv=m3^w+{X7!nv9*Blbz}m3QtG*f+jV}uI+D@SP1V;TQBa*?*hWsK@T(8kk&W^Qw zMjlVcULv9sLkd1I#?HS8J*$%tTtp{bSWo)kR(_8>9nh^GL%qQwSes@K4V4tQ5ValI3kma6Du=bC{d^~-Vl!&4 zp-n%!$No+C9Q-i!3pR@=k)rrm5t|q%WJ3kuFgPp literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/settings.imageset/Contents.json b/TracMobility/Assets.xcassets/settings.imageset/Contents.json new file mode 100644 index 0000000..89a160d --- /dev/null +++ b/TracMobility/Assets.xcassets/settings.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "settings@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/settings.imageset/settings@3x.png b/TracMobility/Assets.xcassets/settings.imageset/settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0384e2f5a488ae0712c5e1c54f69eee72b0577e1 GIT binary patch literal 1797 zcmV+g2m1JlP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL0010qNS#tmY4#WTe4#WYKD-Ig~000McNliru*oD8_x8d z?|fH!3SuA&ILbY8bdTSd&%meA^)%+woFIsflYSoNQye9Xj*u!=pI5X4bM&2g?b0Rl zHdf=!+iY)Be~-Xk)7!;)txHYo?tV5eaSni+W&*za#G$;U{NJoV4Pnp=LEa0mV{&oz`JP*`05OSHPcN&u+F#;y&| z)&<{Q>Z3XexYF)}=17HAEMzqL61em{L&0M4*d+bUQZ_&Ud%e(Emzz`dtCq_H4%)lA~20z#PM||O) zY7C-*M+R}8N{8QQc*}y!rkKNzbkfaz6APUq$IkstriHpcom&RA)8UOX3-LbPbh4M( zb~%!E67A!T_*C2b>5(J&J`WAj!8wQZ5z>+v7;w#~bA)pn?{mcv4F-AG;Vg3O9HUe$ zu%9>SrkhS$3X=xL8pLG=#X3;VMT4$#IIVQjO}ELQ0p`gL|KbRx3&WOXAiBw*KM6&6 zEXhrSxC;bixp@NH6K$a!y4s+Bh(vV(aHmAs#NleB&Q~N!4|FDp1M1L2pHvuKkt7XE zcIJ(iBwfqDjD(SguKA>5D47GfL?tPCKB;HoKz4#gk;nx+z3h{Ub>N<)xcSPeDpR6G zsA`jZMLY1SB&-A(^>6DmngTgHnh+3UMG{(g7 zKN+kTVvso(GrU&7DQBGtM7ONXxnf|zg{sa`+mbrNu$FV z!3BFHH@JrqgJ`n7?`F8e&z%rK35gFDm6FwP+Ya9)nw}(HyiF6AE$_CQ`TJ6`35q6L z2MJ0_YdD`bix23b$EF~;-UnPfY*PA*;>eelmj-Yv*+~@ba0kDrv^>$p zUHL{L`Nf3QR$=tjYzzz7X0K-3m|qxn3h>QV@5(6Hr2qMHYRf2F`r~?TC->`c(0&8y zm$EyfjP{@Wt@%C8exb+x;egeeck1Rl&|v^hwBm)JO&QVK0St2*zcSC$;bN2RcF8Z( ztuvi4tCKw@YxLvMHueIgX~7Lgl(>@BO9PRw@}CSgKtVa62w% zQDCWd6qU5v@3>NJ;$n5HBeyPr)PJa#Z=se0zHjG>^32NhW+K+x8j^T@Tt~p)yUHseeeCAu=lZ} z6aCYwt5|)-$NcQzS7=FI>r!P4+-HkbSNxC5S=wk`&*`Fht1{ONX{NWi=q?rMK*~wt zpHSPgKShIFNOLUE{82_e2lJ9dDf4JIwH1K7v@^H3<0?o00&hdx^Oa?eDgXcgC3Hnt zbYx+4WjbSWWnpw>05UK#F)c7MEipG#F*iCgHaayjD=;uRFfe~E1`q%M03~!qSaf7z zbY(hiZ)9m^c>ppnGBGVMGA%JTR53R?GB!FjGAl4JIxsK}bH1zq000?uMObuGZ)S9N nVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs00000NkvXXu0mjfrm-~y literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/trac-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/trac-icon.imageset/Contents.json new file mode 100644 index 0000000..3a75a66 --- /dev/null +++ b/TracMobility/Assets.xcassets/trac-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "trac-mobility-logo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/trac-icon.imageset/trac-mobility-logo@3x.png b/TracMobility/Assets.xcassets/trac-icon.imageset/trac-mobility-logo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d44e04ba412755c0f0ac65ea11c3b2a79dd752 GIT binary patch literal 9551 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 Y*Eg#-m6XVj|CA>w$f!!!OPYuM2Usp{^Z)<= literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/trac-mobility-icon.imageset/Contents.json b/TracMobility/Assets.xcassets/trac-mobility-icon.imageset/Contents.json new file mode 100644 index 0000000..3a75a66 --- /dev/null +++ b/TracMobility/Assets.xcassets/trac-mobility-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "trac-mobility-logo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/trac-mobility-icon.imageset/trac-mobility-logo@3x.png b/TracMobility/Assets.xcassets/trac-mobility-icon.imageset/trac-mobility-logo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c43197a0fa5221c4c1091ca6f6acb55f9888f5d9 GIT binary patch literal 33804 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%0ADM*OF3vv7=D{M$z{g+#(#eB4=GFWS!^%xA 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 literal 0 HcmV?d00001 diff --git a/TracMobility/Assets.xcassets/your-ride.imageset/Contents.json b/TracMobility/Assets.xcassets/your-ride.imageset/Contents.json new file mode 100644 index 0000000..d10f0ba --- /dev/null +++ b/TracMobility/Assets.xcassets/your-ride.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "you-ride@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/Assets.xcassets/your-ride.imageset/you-ride@3x.png b/TracMobility/Assets.xcassets/your-ride.imageset/you-ride@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..93137763ab351ef442049864fce1c056f0e8e809 GIT binary patch literal 1383 zcmZ`(YdjNr82)eO+QFofbh;cuMr~MfIW^i`kL0o=(p<(|b6svlJ5Fx7%}U5EmnhZA z3`sVZYNSkLnEHiq+{R)Na%p`$AI^v8d4A9HzR&Od_NJaYYauJMPX+)WYh{Ub5Gm#- zq+lWj9?$S1hWVP>ngT%2+Ogp&F7k(nmJYT6#Hs^8xema(D56XQa2W}}tOo!_c>pMd z7B<SUfVS%`drij^fPh=lpgELqm@bG|

sxiVPeJc}zyW;Z*UJ zg{W&&oW%;{m}kt{6P?yGyRxe{)JHl^1>~@K@q(4;ze>Vh+Xb-^O>4oK@Bd(xKkWSX z;FNrycalb0K)jg2nKy>oOrme(Ns0c!cc_fR3I+O!{4t><^ikKRw>JI6g2!lLmuPpjkAPE*|VCpN3E zJy}0IJTn@>%?$K^b^4A_ERRb?{1%&>B2`qq`S>2fsii^90J^Q{*fnu+#eGTa{;be6 zZv6ru{7UYEaO3-@j9UIQ2eCtM)Nbs9lQwRCCNHxPoWytO2cMnH+J38A+P?X1{(k zHDy)3=q`kPh8Tuda>g&KEUvwGV~XhwKUcYuNAE| zARqyWZDq-r*4WiVBZB;AmDU#mV}m|6i)v4kt%Diz{cfYIy?Its z5XO0+KwzW@68X=&PwmqG4sveQ@E|5~yoG7>ocR`hZtNX&8RGDQBmo}_HV)Vda(g#j zJGpL*z+tD$&2v7P0ql@>u7FY3OB!Uv6gyoU1#^C!uNr}Q5@gYbcuON;H6nMZWYH56Slxt zl+~p%V4dm=FykM>4G|OzW?1>R<~o@SUrzkQH}}xAKByn04!8mx${x(X{@&r$58K(8 z%A@nAsAvoCEp07=aEEjtuVc4ccw*cF-A`h))6_{3XfiU06|YeZ_8cgc`gh)EWl0KS zp4?- zkHUtO(ee=VJG(7d+Ai8fO0wfnzouT@^jBV=aatV?HTlRr*?k$#ERVUqY?TWztbSBu z4aZR{xWZhgP_g-PX*&`fAT6AyZi6iUcX|n$bxxw6a)gXKPxkgC`xp_!eMACuk-8`y zq^=IizzJnwq=z&@q7X=P{kE8JP^KV}{YKLFyyc1r*N literal 0 HcmV?d00001 diff --git a/TracMobility/Auth/AuthViewController.swift b/TracMobility/Auth/AuthViewController.swift new file mode 100644 index 0000000..d45b49c --- /dev/null +++ b/TracMobility/Auth/AuthViewController.swift @@ -0,0 +1,113 @@ +// +// AuthViewController.swift +// TracMobility +// +// Created by Sania Zafar on 16/02/2021. +// + +import UIKit +import GoogleSignIn + +class AuthViewController: UIViewController { + + @IBOutlet weak var firstNameTextField: UITextField! + @IBOutlet weak var lastNameTextField: UITextField! + @IBOutlet weak var emailTextField: UITextField! + static let GoogleSignInCancelCode = -5 + + + // MARK: - View LifeCycle methods + + override func viewDidLoad() { + super.viewDidLoad() + self.configureUI() + } + + + // MARK: - IBActions + + @IBAction func tappedSignup(_ sender: Any) { + self.isValidUserInfo() ? self.navigateToMaps() : self.showAlert(with: "Please Enter all Fields") + } + + @IBAction func tappedGoogleLogin(_ sender: Any) { + GIDSignIn.sharedInstance()?.delegate = self + GIDSignIn.sharedInstance()?.presentingViewController = self + GIDSignIn.sharedInstance()?.shouldFetchBasicProfile = true + GIDSignIn.sharedInstance()?.signIn() + } + + @IBAction func tappedFacebookLogin(_ sender: Any) { + //TODO + self.showAlert(with: "We're sorry! Stay with us while we develop this feature") + } + +} + + +// MARK: - Private + +private extension AuthViewController { + + func configureUI() { + firstNameTextField.delegate = self + lastNameTextField.delegate = self + emailTextField.delegate = self + } + + func navigateToMaps() { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + if let mapViewController = storyboard.instantiateViewController(withIdentifier: "MapViewController") as? MapViewController { + mapViewController.modalPresentationStyle = .fullScreen + self.present(mapViewController, animated: true, completion: nil) + } + } + + ///This method only checks for empty text fields, we can also add validation for Name and Email later + func isValidUserInfo() -> Bool { + + return !(self.firstNameTextField.text?.isEmpty ?? true) && + !(self.lastNameTextField.text?.isEmpty ?? true) && + !(self.emailTextField.text?.isEmpty ?? true) + } + + func showAlert(with message: String) { + let alertController = UIAlertController(title: "Trac Mobility", message: message, preferredStyle: .alert) + let alertAction = UIAlertAction(title: "OK", style: .default, handler: nil) + alertController.addAction(alertAction) + self.present(alertController, animated: true, completion: nil) + } + +} + + +// MARK: - UITextFieldDelegate + +extension AuthViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + + return true + } + +} + + +// MARK: - GIDSignInDelegate Methods + +extension AuthViewController: GIDSignInDelegate { + + func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { + if let googleError = error as NSError?, googleError.code != AuthViewController.GoogleSignInCancelCode { + + } else if let googleError = error as NSError?, + googleError.code == AuthViewController.GoogleSignInCancelCode { + + return + } else if user != nil, let _ = user.authentication { + self.navigateToMaps() + } + } + +} diff --git a/TracMobility/Base.lproj/LaunchScreen.storyboard b/TracMobility/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/TracMobility/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Base.lproj/Main.storyboard b/TracMobility/Base.lproj/Main.storyboard new file mode 100644 index 0000000..206b689 --- /dev/null +++ b/TracMobility/Base.lproj/Main.storyboard @@ -0,0 +1,523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/GoogleService-Info.plist b/TracMobility/GoogleService-Info.plist new file mode 100644 index 0000000..c507e8e --- /dev/null +++ b/TracMobility/GoogleService-Info.plist @@ -0,0 +1,14 @@ + + + + + CLIENT_ID + 794354601493-r1a1l9plivj613gqrca0g62aohdsg67s.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.794354601493-r1a1l9plivj613gqrca0g62aohdsg67s + PLIST_VERSION + 1 + BUNDLE_ID + saniazafar.TracMobility + + diff --git a/TracMobility/Info.plist b/TracMobility/Info.plist new file mode 100644 index 0000000..9f5121a --- /dev/null +++ b/TracMobility/Info.plist @@ -0,0 +1,88 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.794354601493-r1a1l9plivj613gqrca0g62aohdsg67s + + + + CFBundleVersion + 1 + LSApplicationQueriesSchemes + + googlechromes + comgooglemaps + + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + Without this permission, the Trac App cannot help detect your address + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + location + processing + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TracMobility/Map/MapViewController.swift b/TracMobility/Map/MapViewController.swift new file mode 100644 index 0000000..7b87db9 --- /dev/null +++ b/TracMobility/Map/MapViewController.swift @@ -0,0 +1,167 @@ +// +// MapViewController.swift +// TracMobility +// +// Created by sania zafar on 17/02/2021. +// + +import UIKit +import GoogleMaps + +class MapViewController: UIViewController { + + @IBOutlet weak var mapView: GMSMapView! + @IBOutlet weak var markerVerticalConstraint: NSLayoutConstraint! + @IBOutlet weak var menuView: UIView! + let locationManager = CLLocationManager() + var location = CLLocationCoordinate2D() + + + // MARK: - View LifeCycle methods + + override func viewDidLoad() { + super.viewDidLoad() + self.setupMapServices() + self.configLocationServices() + self.menuView.isHidden = true + } + + + // MARK: - Private + + private func reverseGeocode(coordinate: CLLocationCoordinate2D) { + let geocoder = GMSGeocoder() + geocoder.reverseGeocodeCoordinate(coordinate) { [weak self] (response, error) in + self?.location = coordinate + UIView.animate(withDuration: 0.25) { + self?.markerVerticalConstraint.constant = -30 + self?.view.layoutIfNeeded() + } + } + } + + private func setupMapServices() { + locationManager.delegate = self + mapView.delegate = self + locationManager.requestLocation() + mapView.isMyLocationEnabled = true + } + + func configLocationServices() { + locationManager.delegate = self + let status = CLLocationManager.authorizationStatus() + if status == .notDetermined { + locationManager.requestWhenInUseAuthorization() + } else if status == .denied || status == .restricted { + self.showLocationSetUpAlert(false) + } else { + if #available(iOS 14.0, *) { + if locationManager.accuracyAuthorization == .reducedAccuracy { + self.showLocationSetUpAlert(true) + } else { + self.updateLocationManagerAttributes() + } + } else { + self.updateLocationManagerAttributes() + } + } + } + + func showLocationSetUpAlert(_ forIos14Later: Bool) { + let alert = UIAlertController(title: forIos14Later ? "Location Services Disabled" : "Precise Location Disabled", message: "Let us find your location by allowing us access from your phone settings", preferredStyle: .alert) + let okAction = UIAlertAction(title: "Settings", style: .default) { (okAction) in + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } + } + let cancelAction = UIAlertAction(title: "Cancel", style: .default) { (cancelAction) in + self.dismiss(animated: true, completion: nil) + } + alert.addAction(okAction) + alert.addAction(cancelAction) + present(alert, animated: true, completion: nil) + } + + func updateLocationManagerAttributes() { + self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer + self.locationManager.distanceFilter = 500 + self.locationManager.startUpdatingLocation() + } + + + // MARK: - IBAction + + @IBAction func openCloseMenu(_ sender: UIButton) { + ///can add animations to show/hide menu view + self.menuView.isHidden = sender.tag == 1 + } + +} + + +// MARK: - CLLocationManagerDelegate + +extension MapViewController: CLLocationManagerDelegate { + + + // MARK: - CLLocationManager Delegate + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + let userLocation = locations.last + let camera = GMSCameraPosition.camera(withLatitude: userLocation!.coordinate.latitude, + longitude: userLocation!.coordinate.longitude, zoom: 16.0) + if self.location.latitude != 0 , self.location.longitude != 0 { + mapView.animate(to: GMSCameraPosition.camera(withLatitude: self.location.latitude, + longitude: self.location.longitude, zoom: 16.0)) + } else { + mapView.animate(to: camera) + } + locationManager.stopUpdatingLocation() + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + if status == .authorizedWhenInUse || status == .authorizedAlways { + self.updateLocationManagerAttributes() + } else { + self.showLocationSetUpAlert(false) + } + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print(error) + } + + @available(iOS 14.0, *) + func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { + print(CLLocationManager.authorizationStatus()) + switch CLLocationManager.authorizationStatus() { + case .authorizedWhenInUse, .authorizedAlways: + if locationManager.accuracyAuthorization == .reducedAccuracy { + self.showLocationSetUpAlert(true) + } else { + self.updateLocationManagerAttributes() + } + default: + self.showLocationSetUpAlert(true) + } + switch manager.accuracyAuthorization { + case .fullAccuracy: + self.updateLocationManagerAttributes() + default: + self.showLocationSetUpAlert(true) + } + } + +} + + +// MARK: - GMSMapViewDelegate + +extension MapViewController: GMSMapViewDelegate { + + func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { + reverseGeocode(coordinate: position.target) + + } + +} diff --git a/TracMobility/SceneDelegate.swift b/TracMobility/SceneDelegate.swift new file mode 100644 index 0000000..371e42c --- /dev/null +++ b/TracMobility/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// TracMobility +// +// Created by sania zafar on 16/02/2021. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/TracMobility/Splash/SplashViewController.swift b/TracMobility/Splash/SplashViewController.swift new file mode 100644 index 0000000..caa7327 --- /dev/null +++ b/TracMobility/Splash/SplashViewController.swift @@ -0,0 +1,40 @@ +// +// SplashViewController.swift +// TracMobility +// +// Created by sania zafar on 17/02/2021. +// + +import UIKit + +class SplashViewController: UIViewController { + + @IBOutlet weak var logoImageView: UIImageView! + + + // MARK: - View LifeCycle methods + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + UIView.animate(withDuration: 1.0, delay: 0.0, options: .curveEaseInOut) { [weak self] in + self?.logoImageView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) + } completion: { [weak self] (completed) in + UIView.animate(withDuration: 1.0) { + self?.logoImageView.transform = .identity + self?.perform(#selector(self?.navigateToAuthScreen), with: nil, afterDelay: 1.0) + } + } + } + + + // MARK: - Private + + @objc private func navigateToAuthScreen() { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + if let authViewController = storyboard.instantiateViewController(withIdentifier: "AuthViewController") as? AuthViewController { + authViewController.modalPresentationStyle = .fullScreen + self.present(authViewController, animated: true, completion: nil) + } + } + +}