Commit a6057915 by SunARcTech2

Fix issues

parent cb84b66a
No preview for this file type
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>Bhagyashree.xcscheme</key> <key>Bhagyashree.xcscheme</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>6</integer> <integer>34</integer>
</dict> </dict>
</dict> </dict>
</dict> </dict>
......
...@@ -9,13 +9,13 @@ ...@@ -9,13 +9,13 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Appointment/AppointmentExt.swift" filePath = "Bhagyashree/Sunarc/Controller/Appointment/CompletedServicesViewController.swift"
timestampString = "559566819.66458" timestampString = "560762814.7603379"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "25" startingLineNumber = "128"
endingLineNumber = "25" endingLineNumber = "128"
landmarkName = "getAppointmentDetails(incrementId:success:failure:)" landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
...@@ -25,13 +25,13 @@ ...@@ -25,13 +25,13 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Appointment/Appointment.swift" filePath = "Bhagyashree/Sunarc/Controller/Appointment/OnGoingServicesViewController.swift"
timestampString = "558792923.172263" timestampString = "560762814.760757"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "38" startingLineNumber = "133"
endingLineNumber = "38" endingLineNumber = "133"
landmarkName = "initWithJSON(json:)" landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
...@@ -41,13 +41,13 @@ ...@@ -41,13 +41,13 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Me/OrderDetailsExt.swift" filePath = "Bhagyashree/Sunarc/Controller/Appointment/ServicesListViewController.swift"
timestampString = "559480213.945861" timestampString = "560761689.705489"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "22" startingLineNumber = "128"
endingLineNumber = "22" endingLineNumber = "128"
landmarkName = "getOrderDetail(incrementId:success:failure:)" landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
...@@ -57,13 +57,93 @@ ...@@ -57,13 +57,93 @@
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Other/HTTP/HTTP.swift" filePath = "Bhagyashree/Sunarc/Controller/Appointment/ProcessingViewController.swift"
timestampString = "559213005.3192461" timestampString = "560762814.760976"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "326" startingLineNumber = "128"
endingLineNumber = "326" endingLineNumber = "128"
landmarkName = "uploadFileTmp(withThumbNail:api:filePath:type:result:)" landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Controller/Appointment/InvalidServicesViewController.swift"
timestampString = "560762814.761176"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "128"
endingLineNumber = "128"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Controller/Me/MyOngoingServiceOrderViewController.swift"
timestampString = "560761702.329962"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "128"
endingLineNumber = "128"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Controller/Me/MyUploadResultViewController.swift"
timestampString = "560761704.866033"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "121"
endingLineNumber = "121"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Controller/Me/MyCompletedOrdersViewController.swift"
timestampString = "560770072.590113"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "121"
endingLineNumber = "121"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/AppDelegate.swift"
timestampString = "560951661.375753"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "30"
endingLineNumber = "30"
landmarkName = "messaging(_:didReceiveRegistrationToken:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
......
No preview for this file type
...@@ -15,8 +15,8 @@ var DEFAULT_WEBSITE_ID = "1" ...@@ -15,8 +15,8 @@ var DEFAULT_WEBSITE_ID = "1"
var BASE_DOMAIN = "http://18.136.9.203" // test //var BASE_DOMAIN = "http://18.136.9.203" // test
//var BASE_DOMAIN = "http://54.251.144.17" // dev var BASE_DOMAIN = "http://54.251.144.17" // dev
//var BASE_DOMAIN = "http://13.251.93.24" //var BASE_DOMAIN = "http://13.251.93.24"
var HOST_NAME = BASE_DOMAIN+"/index.php/" var HOST_NAME = BASE_DOMAIN+"/index.php/"
......
...@@ -25,7 +25,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD ...@@ -25,7 +25,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
var window: UIWindow? var window: UIWindow?
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
UIPasteboard.general.string = fcmToken // UIPasteboard.general.string = fcmToken
print(fcmToken)
deviceTokenData = fcmToken deviceTokenData = fcmToken
let defaults = UserDefaults.standard; let defaults = UserDefaults.standard;
......
{
"images" : [
{
"idiom" : "universal",
"filename" : "dot_border.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
<key>AD_UNIT_ID_FOR_INTERSTITIAL_TEST</key> <key>AD_UNIT_ID_FOR_INTERSTITIAL_TEST</key>
<string>ca-app-pub-3940256099942544/4411468910</string> <string>ca-app-pub-3940256099942544/4411468910</string>
<key>CLIENT_ID</key> <key>CLIENT_ID</key>
<string>360669556539-gjg3t78lg0vnaqcis9o26vsrii77d9qn.apps.googleusercontent.com</string> <string>360669556539-tr24dr2sh481mum3ijjkassug7p7l04p.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key> <key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.360669556539-gjg3t78lg0vnaqcis9o26vsrii77d9qn</string> <string>com.googleusercontent.apps.360669556539-tr24dr2sh481mum3ijjkassug7p7l04p</string>
<key>API_KEY</key> <key>API_KEY</key>
<string>AIzaSyBbcoObffadmduuSAhDozLyWbyiqg7Mf9s</string> <string>AIzaSyBbcoObffadmduuSAhDozLyWbyiqg7Mf9s</string>
<key>GCM_SENDER_ID</key> <key>GCM_SENDER_ID</key>
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<key>PLIST_VERSION</key> <key>PLIST_VERSION</key>
<string>1</string> <string>1</string>
<key>BUNDLE_ID</key> <key>BUNDLE_ID</key>
<string>com.gdi.yuanzhongsiu-seller</string> <string>com.gdi.yuanzhongsiuseller</string>
<key>PROJECT_ID</key> <key>PROJECT_ID</key>
<string>fengshui-customer</string> <string>fengshui-customer</string>
<key>STORAGE_BUCKET</key> <key>STORAGE_BUCKET</key>
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<key>IS_SIGNIN_ENABLED</key> <key>IS_SIGNIN_ENABLED</key>
<true/> <true/>
<key>GOOGLE_APP_ID</key> <key>GOOGLE_APP_ID</key>
<string>1:360669556539:ios:84a8dd99e8502ac3</string> <string>1:360669556539:ios:53c921650750ae37</string>
<key>DATABASE_URL</key> <key>DATABASE_URL</key>
<string>https://fengshui-customer.firebaseio.com</string> <string>https://fengshui-customer.firebaseio.com</string>
</dict> </dict>
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0</string> <string>1.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>16</string> <string>1</string>
<key>Fabric</key> <key>Fabric</key>
<dict> <dict>
<key>APIKey</key> <key>APIKey</key>
......
...@@ -101,12 +101,17 @@ extension CompletedServicesViewController: UITableViewDelegate, UITableViewDataS ...@@ -101,12 +101,17 @@ extension CompletedServicesViewController: UITableViewDelegate, UITableViewDataS
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row > service.services.count-1 { // this will handel tap during the table reload
return
}
let selectedService = service.services[indexPath.row] let selectedService = service.services[indexPath.row]
if selectedService.serviceType == .BOOKING { if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .completed appointmentdetails.orderStatus = .COMPLETE
// appointmentdetails.serviceStatus = .completed
appointmentdetails.incrementId = selectedService.incrementId appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
...@@ -101,12 +101,17 @@ extension InvalidServicesViewController: UITableViewDelegate, UITableViewDataSou ...@@ -101,12 +101,17 @@ extension InvalidServicesViewController: UITableViewDelegate, UITableViewDataSou
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row > service.services.count-1 { // this will handel tap during the table reload
return
}
let selectedService = service.services[indexPath.row] let selectedService = service.services[indexPath.row]
if selectedService.serviceType == .BOOKING { if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .completed appointmentdetails.orderStatus = .CLOSED
// appointmentdetails.serviceStatus = .completed
appointmentdetails.incrementId = selectedService.incrementId appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
...@@ -101,6 +101,10 @@ extension OnGoingServicesViewController: UITableViewDelegate, UITableViewDataSou ...@@ -101,6 +101,10 @@ extension OnGoingServicesViewController: UITableViewDelegate, UITableViewDataSou
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row > service.services.count-1 { // this will handel tap during the table reload
return
}
let selectedService = service.services[indexPath.row] let selectedService = service.services[indexPath.row]
......
...@@ -101,12 +101,17 @@ extension ProcessingViewController: UITableViewDelegate, UITableViewDataSource { ...@@ -101,12 +101,17 @@ extension ProcessingViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row > service.services.count-1 { // this will handel tap during the table reload
return
}
let selectedService = service.services[indexPath.row] let selectedService = service.services[indexPath.row]
if selectedService.serviceType == .BOOKING { if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .tbc appointmentdetails.orderStatus = .PROCESSING
// appointmentdetails.serviceStatus = .tbc
appointmentdetails.incrementId = selectedService.incrementId appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
...@@ -25,6 +25,12 @@ class VideoCallingViewController: UIViewController { ...@@ -25,6 +25,12 @@ class VideoCallingViewController: UIViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
HTTP().connectionWithRequestObject(api: API.VIDEO_CALLING_STATUS + orderId, parameters: ["bySeller": 1], method: .post, indicator: false, success: { (result) in
}) { (errorMessage) in
print(errorMessage)
}
initializeAgoraEngine() initializeAgoraEngine()
setupVideo() setupVideo()
setupLocalVideo() setupLocalVideo()
......
...@@ -53,7 +53,7 @@ class BedSettingDateSelectionViewController: BaseViewController { ...@@ -53,7 +53,7 @@ class BedSettingDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal) self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" { } else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -49,7 +49,7 @@ class CompanyMovingDateSelectionViewController: BaseViewController { ...@@ -49,7 +49,7 @@ class CompanyMovingDateSelectionViewController: BaseViewController {
self.txtShareholders.text = option.value self.txtShareholders.text = option.value
} else if option.option == "Expected Day" { } else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -51,7 +51,7 @@ class GodSettingDateSelectionViewController: BaseViewController { ...@@ -51,7 +51,7 @@ class GodSettingDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal) self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" { } else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -47,7 +47,7 @@ class GroundbreakingDateSelectionViewController: BaseViewController { ...@@ -47,7 +47,7 @@ class GroundbreakingDateSelectionViewController: BaseViewController {
self.btnMonth.setTitle(option.value, for: .normal) self.btnMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Days" { } else if option.option == "Expected Days" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -53,7 +53,7 @@ class HouseMovingDateSelectionViewController: BaseViewController { ...@@ -53,7 +53,7 @@ class HouseMovingDateSelectionViewController: BaseViewController {
} else if option.option == "Expected Month" { } else if option.option == "Expected Month" {
self.btnExpectedMonth.setTitle(option.value, for: .normal) self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" { } else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -92,7 +92,7 @@ class MarriageDateSelectionViewController: BaseViewController { ...@@ -92,7 +92,7 @@ class MarriageDateSelectionViewController: BaseViewController {
} else if option.option == "Expected Month" { } else if option.option == "Expected Month" {
self.btnMonth.setTitle(option.value, for: .normal) self.btnMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" { } else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -60,7 +60,7 @@ class RegsirationDateSelectionViewController: BaseViewController { ...@@ -60,7 +60,7 @@ class RegsirationDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal) self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Days" { } else if option.option == "Expected Days" {
if option.value.lowercased() == "weekday" { if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn") self.imgWeekDay.image = UIImage(named: "radioOn")
} else { } else {
self.imgWeekend.image = UIImage(named: "radioOn") self.imgWeekend.image = UIImage(named: "radioOn")
......
...@@ -62,12 +62,12 @@ class FloorPlanFengshuiViewController: UIViewController { ...@@ -62,12 +62,12 @@ class FloorPlanFengshuiViewController: UIViewController {
self.txtRemarks.text = option.value self.txtRemarks.text = option.value
} else if option.option == "House - front entrance picture" { } else if option.option == "House - front entrance picture" {
let url = URL(string: option.value) let url = URL(string: option.value!)
self.imgHouseFrontImageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil) self.imgHouseFrontImageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil)
} else if option.option == "House - Bedroom picture" { } else if option.option == "House - Bedroom picture" {
let url = URL(string: option.value) let url = URL(string: option.value!)
self.imgBedRoomImageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil) self.imgBedRoomImageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil)
......
//
// FormViewController.swift
// Bhagyashree
//
// Created by SunARcTech2 on 10/10/18.
// Copyright © 2018 Sunarc. All rights reserved.
//
import UIKit
import Kingfisher
class FormViewController: UIViewController {
var incrementId: String?
var orderId: String?
var customOptions = [CustomOption]()
@IBOutlet var lblTitle: UILabel!
@IBOutlet weak var tblForm: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
if let incrementId = incrementId {
FormDetail.get(incrementId: incrementId, success: { (customOptions, productName) in
self.lblTitle.text = productName
self.customOptions = customOptions
self.tblForm.reloadData()
}) { (errorMessage) in
self.view.showToast(errorMessage, position: .bottom, popTime: 2.0, dismissOnTap: false)
}
}
}
@IBAction func submit() {
let editResult = Utils.viewController(storyboardName: "Appointment", ofType: EditResultViewController.self)
if let orderId = orderId {
editResult.orderId = orderId
}
self.navigationController?.pushViewController(editResult, animated: true)
}
@IBAction func back() {
self.navigationController?.popViewController(animated: true)
}
}
extension FormViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return customOptions.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let customOption = customOptions[indexPath.row]
if customOption.optionType == .image {
let imageCell = tableView.dequeueReusableCell(withIdentifier: "CustomOptionImageCell", for: indexPath) as! CustomOptionImageCell
imageCell.customOption = customOption
return imageCell
} else {
let textCell = tableView.dequeueReusableCell(withIdentifier: "CustomOptionTextCell", for: indexPath) as! CustomOptionTextCell
textCell.customOption = customOption
return textCell
}
}
}
class CustomOptionTextCell: UITableViewCell {
@IBOutlet var lblTitle: UILabel!
@IBOutlet var lblValue: UILabel!
var customOption: CustomOption? {
didSet {
if let customOption = customOption {
self.lblTitle.text = customOption.option
self.lblValue.text = customOption.value
}
}
}
}
class CustomOptionImageCell: UITableViewCell {
@IBOutlet var lblTitle: UILabel!
@IBOutlet var imgImageView: UIImageView!
var customOption: CustomOption? {
didSet {
if let customOption = customOption {
self.lblTitle.text = customOption.option
if let image = customOption.value {
let url = URL(string: image)
self.imgImageView.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil)
}
}
}
}
}
...@@ -60,7 +60,7 @@ class CompanyNamingServiceViewController: BaseViewController { ...@@ -60,7 +60,7 @@ class CompanyNamingServiceViewController: BaseViewController {
} else if option.option == "Characters (do not want to be used)" { } else if option.option == "Characters (do not want to be used)" {
self.txtCharectorsDoNotWantToUse.text = option.value self.txtCharectorsDoNotWantToUse.text = option.value
} else if option.option == "Owner Gender" { } else if option.option == "Owner Gender" {
if option.value.lowercased() == "male" { if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn") self.imgMale.image = UIImage(named: "radioOn")
} else { } else {
self.imgFemale.image = UIImage(named: "radioOn") self.imgFemale.image = UIImage(named: "radioOn")
......
...@@ -57,7 +57,7 @@ class CompanyReNamingServiceViewController: BaseViewController { ...@@ -57,7 +57,7 @@ class CompanyReNamingServiceViewController: BaseViewController {
self.txtCharectorsDoNotWantToUse.text = option.value self.txtCharectorsDoNotWantToUse.text = option.value
} else if option.option == "Owner Gender" { } else if option.option == "Owner Gender" {
if option.value.lowercased() == "male" { if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn") self.imgMale.image = UIImage(named: "radioOn")
} else { } else {
self.imgFemale.image = UIImage(named: "radioOff") self.imgFemale.image = UIImage(named: "radioOff")
......
...@@ -61,7 +61,7 @@ class IndividualNamingServiceViewController: BaseViewController { ...@@ -61,7 +61,7 @@ class IndividualNamingServiceViewController: BaseViewController {
self.txtBOD.text = option.value self.txtBOD.text = option.value
} else if option.option == "Gender" { } else if option.option == "Gender" {
if option.value.lowercased() == "male" { if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn") self.imgMale.image = UIImage(named: "radioOn")
} else { } else {
self.imgFemale.image = UIImage(named: "radioOn") self.imgFemale.image = UIImage(named: "radioOn")
......
...@@ -52,7 +52,7 @@ class IndividualReNamingServiceViewController: BaseViewController { ...@@ -52,7 +52,7 @@ class IndividualReNamingServiceViewController: BaseViewController {
self.txtBOD.text = option.value self.txtBOD.text = option.value
} else if option.option == "Gender" { } else if option.option == "Gender" {
if option.value.lowercased() == "male" { if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn") self.imgMale.image = UIImage(named: "radioOn")
} else { } else {
self.imgFemale.image = UIImage(named: "radioOff") self.imgFemale.image = UIImage(named: "radioOff")
......
...@@ -101,6 +101,8 @@ extension CompleteEnquiryViewController: UITableViewDataSource, UITableViewDeleg ...@@ -101,6 +101,8 @@ extension CompleteEnquiryViewController: UITableViewDataSource, UITableViewDeleg
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self) let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = enquiry.enquiries[indexPath.row].incrementId! enquiryDetailsViewController.incrementId = enquiry.enquiries[indexPath.row].incrementId!
enquiryDetailsViewController.orderId = enquiry.enquiries[indexPath.row].orderId! enquiryDetailsViewController.orderId = enquiry.enquiries[indexPath.row].orderId!
enquiryDetailsViewController.customerName = enquiry.enquiries[indexPath.row].customerName
enquiryDetailsViewController.customerImage = enquiry.enquiries[indexPath.row].customerProfileImage
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true) self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
} }
} }
......
...@@ -16,6 +16,8 @@ class FAQDetailsViewController: UIViewController { ...@@ -16,6 +16,8 @@ class FAQDetailsViewController: UIViewController {
var orderId: String = "" var orderId: String = ""
var incrementId: String = "" var incrementId: String = ""
let orderDetails = OrderDetails() let orderDetails = OrderDetails()
var customerName: String?
var customerImage: String?
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
...@@ -43,8 +45,8 @@ class FAQDetailsViewController: UIViewController { ...@@ -43,8 +45,8 @@ class FAQDetailsViewController: UIViewController {
let chatVC = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self) let chatVC = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self)
chatVC.orderId = orderId chatVC.orderId = orderId
chatVC.customerId = orderDetails.customerId ?? "" chatVC.customerId = orderDetails.customerId ?? ""
chatVC.customerName = orderDetails.customerName ?? "" chatVC.customerName = customerName ?? ""
chatVC.customerProfileImage = orderDetails.customerImage chatVC.customerProfileImage = customerImage ?? ""
chatVC.isOrderCompleted = true chatVC.isOrderCompleted = true
self.navigationController?.pushViewController(chatVC, animated: true) self.navigationController?.pushViewController(chatVC, animated: true)
} }
...@@ -71,6 +73,8 @@ extension FAQDetailsViewController: UITableViewDelegate, UITableViewDataSource { ...@@ -71,6 +73,8 @@ extension FAQDetailsViewController: UITableViewDelegate, UITableViewDataSource {
if indexPath.section == 0 { if indexPath.section == 0 {
let oderdetailCell = tableView.dequeueReusableCell(withIdentifier: "OrderdetailCell", for: indexPath) as! OrderdetailCell let oderdetailCell = tableView.dequeueReusableCell(withIdentifier: "OrderdetailCell", for: indexPath) as! OrderdetailCell
oderdetailCell.customerName = customerName
oderdetailCell.customerImage = customerImage
oderdetailCell.orderDetilas = orderDetails oderdetailCell.orderDetilas = orderDetails
return oderdetailCell return oderdetailCell
} else if indexPath.section == 1 { } else if indexPath.section == 1 {
...@@ -116,18 +120,20 @@ class OrderdetailCell: UITableViewCell { ...@@ -116,18 +120,20 @@ class OrderdetailCell: UITableViewCell {
@IBOutlet var lblPrice: UILabel! @IBOutlet var lblPrice: UILabel!
@IBOutlet var lblDateTime: UILabel! @IBOutlet var lblDateTime: UILabel!
@IBOutlet var imgSellerImage: UIImageView! @IBOutlet var imgSellerImage: UIImageView!
var customerName: String?
var customerImage: String?
var orderDetilas: OrderDetails? { var orderDetilas: OrderDetails? {
didSet { didSet {
if let orderDetilas = orderDetilas { if let orderDetilas = orderDetilas {
self.lblMasterName.text = orderDetilas.customerName self.lblMasterName.text = customerName
self.lblPrice.text = orderDetilas.price self.lblPrice.text = orderDetilas.price
self.lblDateTime.text = orderDetilas.orderDate self.lblDateTime.text = orderDetilas.orderDate
if let image = orderDetilas.customerImage { if let image = customerImage {
let url = URL(string: image) let url = URL(string: image)
imgSellerImage.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil) imgSellerImage.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil)
} }
...@@ -162,24 +168,25 @@ class FAQReviewCell: UITableViewCell { ...@@ -162,24 +168,25 @@ class FAQReviewCell: UITableViewCell {
if let rating = serviceReview.rating { if let rating = serviceReview.rating {
let ratingAsInt = Int(rating) if let ratingAsInt = Int(rating) {
if ratingAsInt > 0 {
if ratingAsInt! > 0 { imgRating1.image = UIImage(named: "star")
imgRating1.image = UIImage(named: "star") }
} if ratingAsInt > 1 {
if ratingAsInt! > 1 { imgRating2.image = UIImage(named: "star")
imgRating2.image = UIImage(named: "star") }
} if ratingAsInt > 2 {
if ratingAsInt! > 2 { imgRating3.image = UIImage(named: "star")
imgRating3.image = UIImage(named: "star") }
} if ratingAsInt > 3 {
if ratingAsInt! > 3 { imgRating4.image = UIImage(named: "star")
imgRating4.image = UIImage(named: "star") }
} if ratingAsInt > 4 {
if ratingAsInt! > 4 { imgRating5.image = UIImage(named: "star")
imgRating5.image = UIImage(named: "star") }
} }
} }
} }
......
...@@ -153,7 +153,7 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource { ...@@ -153,7 +153,7 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
self.navigationController?.pushViewController(videoCallVC, animated: true) self.navigationController?.pushViewController(videoCallVC, animated: true)
} else { } else {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .tbc appointmentdetails.orderStatus = dashboard.orders[indexPath.row-1].status
appointmentdetails.incrementId = order.incrementId appointmentdetails.incrementId = order.incrementId
appointmentdetails.orderId = order.orderId appointmentdetails.orderId = order.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
...@@ -172,22 +172,39 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource { ...@@ -172,22 +172,39 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self) let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = order.incrementId! enquiryDetailsViewController.incrementId = order.incrementId!
enquiryDetailsViewController.orderId = order.orderId! enquiryDetailsViewController.orderId = order.orderId!
enquiryDetailsViewController.customerName = dashboard.orders[indexPath.row-1].customerDetail.name
enquiryDetailsViewController.customerName = dashboard.orders[indexPath.row-1].customerDetail.profileImage
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true) self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
} }
} else if order.products.first?.serviceType == .FORM{ } else if order.products.first?.serviceType == .FORM{
if order.status == .COMPLETE { if order.status == .COMPLETE {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .tbc appointmentdetails.orderStatus = dashboard.orders[indexPath.row-1].status
appointmentdetails.incrementId = order.incrementId appointmentdetails.incrementId = order.incrementId
appointmentdetails.orderId = order.orderId appointmentdetails.orderId = order.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
} else { } else {
if let form = Form.VC(with: order.incrementId!, orderId: order.orderId!, categoryType: order.products.first!.categoryType){ let formVC = Utils.viewController(storyboardName: "Forms", ofType: FormViewController.self)
self.navigationController?.pushViewController(form, animated: true) formVC.incrementId = order.incrementId
} formVC.orderId = order.orderId
self.navigationController?.pushViewController(formVC, animated: true)
} }
// if order.status == .COMPLETE {
// let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
// appointmentdetails.orderStatus = dashboard.orders[indexPath.row-1].status
// appointmentdetails.incrementId = order.incrementId
// appointmentdetails.orderId = order.orderId
// self.navigationController?.pushViewController(appointmentdetails, animated: true)
// } else {
// if let form = Form.VC(with: order.incrementId!, orderId: order.orderId!, categoryType: order.products.first!.categoryType){
// self.navigationController?.pushViewController(form, animated: true)
// }
// }
} else { } else {
self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false) self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false)
...@@ -197,6 +214,8 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource { ...@@ -197,6 +214,8 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
} }
extension HomePageViewController: SellerProfileCellDelegate{ extension HomePageViewController: SellerProfileCellDelegate{
func showToast(message: String) { func showToast(message: String) {
self.view.showToast(message, position: .bottom, popTime: 2.0, dismissOnTap: false) self.view.showToast(message, position: .bottom, popTime: 2.0, dismissOnTap: false)
...@@ -300,7 +319,6 @@ class RecentServicesCell: UITableViewCell { ...@@ -300,7 +319,6 @@ class RecentServicesCell: UITableViewCell {
case .ONGOING: case .ONGOING:
self.imgStatus.image = UIImage(named: "service_ongoing") self.imgStatus.image = UIImage(named: "service_ongoing")
} }
if let profileImage = recentOrder.customerDetail.profileImage { if let profileImage = recentOrder.customerDetail.profileImage {
let url = URL(string: profileImage) let url = URL(string: profileImage)
self.imgCustomerImage.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil) self.imgCustomerImage.kf.setImage(with: url, placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .scaleFactor(1.0)], progressBlock: nil, completionHandler: nil)
......
...@@ -10,28 +10,28 @@ import UIKit ...@@ -10,28 +10,28 @@ import UIKit
import SVProgressHUD import SVProgressHUD
import ImageSlideshow import ImageSlideshow
import Kingfisher import Kingfisher
import SDWebImage
import INSPhotoGallery
class CorporateCultureViewController: BaseViewController {
var videoPlayerViewController: VideoPlayerViewController! class CorporateCultureViewController: BaseViewController {
@IBOutlet var tblCorporateCulture: UITableView! @IBOutlet var tblCorporateCulture: UITableView!
var videoPlayerViewController: VideoPlayerViewController!
let corporateCulture = CorporateCulture() let corporateCulture = CorporateCulture()
var contentCellHeight: CGFloat = 0.0 var contentCellHeight: CGFloat = 0.0
@IBOutlet var slideshow: ImageSlideshow!
// var bannerImages = [Kingfishers]()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
SVProgressHUD.show() SVProgressHUD.show()
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
corporateCulture.getCorporateCulture(success: { corporateCulture.getCorporateCulture(success: {
SVProgressHUD.dismiss() SVProgressHUD.dismiss()
self.tblCorporateCulture.reloadData() self.tblCorporateCulture.reloadData()
...@@ -43,7 +43,7 @@ class CorporateCultureViewController: BaseViewController { ...@@ -43,7 +43,7 @@ class CorporateCultureViewController: BaseViewController {
} }
} }
...@@ -63,14 +63,22 @@ extension CorporateCultureViewController: VideoPlayerViewControllerDelegate { ...@@ -63,14 +63,22 @@ extension CorporateCultureViewController: VideoPlayerViewControllerDelegate {
} }
extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSource { extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2 if corporateCulture.banners.count > 0 {
return 2
} else {
return 1
}
} }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 { if indexPath.row == 0 {
return UITableViewCell() let bannerCell = tableView.dequeueReusableCell(withIdentifier: "CorporateCultureBannerCell") as! CorporateCultureBannerCell
bannerCell.banners = corporateCulture.banners
bannerCell.addPlaybuttons()
return bannerCell
} else { } else {
let cell = tableView.dequeueReusableCell(withIdentifier: "corporateCultureContent", for: indexPath) as! CorporateCultureContentCell let cell = tableView.dequeueReusableCell(withIdentifier: "corporateCultureContent", for: indexPath) as! CorporateCultureContentCell
cell.content = corporateCulture.content cell.content = corporateCulture.content
...@@ -87,7 +95,7 @@ extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSo ...@@ -87,7 +95,7 @@ extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSo
return UITableViewAutomaticDimension return UITableViewAutomaticDimension
} }
} }
} }
extension CorporateCultureViewController: CorporateCultureContentCellDelegate { extension CorporateCultureViewController: CorporateCultureContentCellDelegate {
...@@ -132,9 +140,111 @@ class CorporateCultureContentCell: UITableViewCell, UIWebViewDelegate { ...@@ -132,9 +140,111 @@ class CorporateCultureContentCell: UITableViewCell, UIWebViewDelegate {
} }
class CorporateCultureBannerCell: UITableViewCell { class CorporateCultureBannerCell: UITableViewCell {
@IBOutlet var slideshow: ImageSlideshow!
var videoPlayerVC: VideoPlayerViewController!
var banners: [Banner]? {
didSet {
if let banners = banners {
var webImages = [SDWebImageSource]()
for banner in banners {
if let urlString = banner.imageUrl {
let webImage = SDWebImageSource(url: URL(string: urlString)!)
webImages.append(webImage)
}
}
let recognizer = UITapGestureRecognizer(target: self, action: #selector(CorporateCultureBannerCell.didTap))
slideshow.addGestureRecognizer(recognizer)
slideshow.backgroundColor = UIColor.white
slideshow.slideshowInterval = 5.0
slideshow.pageControlPosition = PageControlPosition.insideScrollView
slideshow.pageControl.currentPageIndicatorTintColor = UIColor.orange
slideshow.pageControl.pageIndicatorTintColor = UIColor.lightGray
slideshow.contentScaleMode = UIViewContentMode.scaleAspectFill
slideshow.activityIndicator = DefaultActivityIndicator()
slideshow.currentPageChanged = { page in
// if banners[page].type == .video {
// let imgPlay = UIImageView(image: UIImage(named: "play_icon"))
// imgPlay.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
// (self.slideshow.slideshowItems as! UIView).addSubview(imgPlay)
// imgPlay.center = (self.slideshow.slideshowItems as! UIView).center
// }
// let imgPlay = UIImageView(image: UIImage(named: "play_icon"))
// imgPlay.bounds = CGRect(x: 0, y: 0, width: (self.slideshow.slideshowItems[page] as View).bounds.size.height/10, height: ((self.slideshow.slideshowItems[page] as View).bounds.size.height/10)*0.8)
// (self.slideshow.slideshowItems[page] as View).addSubview(imgPlay)
// imgPlay.center = (self.slideshow.slideshowItems[page] as View).center
}
slideshow.setImageInputs(webImages)
}
}
}
func addPlaybuttons() {
// for view in slideshow.slideshowItems {
// let imgPlay = UIImageView(image: UIImage(named: "play_icon"))
// imgPlay.bounds = CGRect(x: 0, y: 0, width: view.bounds.size.height/10, height: (view.bounds.size.height/10)*0.8)
// view.imageView.addSubview(imgPlay)
// imgPlay.center = view.imageView.center
// }
}
@objc func didTap() {
if let banners = banners {
let selectedBanner = banners[slideshow.currentPage]
if banners[slideshow.currentPage].type == .image {
if let imageURL = selectedBanner.imageUrl {
let photo = INSPhoto(imageURL: URL(string: imageURL), thumbnailImageURL: nil)
let galleryPreview = INSPhotosViewController(photos: [photo], initialPhoto: photo, referenceView: self.viewController()?.navigationController?.view)
if let postInFullScreenView = Utils.viewFrom("PostInFullScreenView") as? PostInFullScreenView {
postInFullScreenView.setNeedsLayout()
postInFullScreenView.layoutIfNeeded()
postInFullScreenView.lbContent.text = ""
galleryPreview.overlayView = postInFullScreenView
}
galleryPreview.referenceViewForPhotoWhenDismissingHandler = { photo in
return nil
}
self.viewController()?.present(galleryPreview, animated: true, completion: nil)
}
} else if banners[slideshow.currentPage].type == .video {
if let videoURL = selectedBanner.videoUrl {
videoPlayerVC = Utils.viewController(storyboardName: "Me", ofType: VideoPlayerViewController.self)
videoPlayerVC.delegate = self
videoPlayerVC.url = URL(string: videoURL)
self.viewController()?.present(videoPlayerVC, animated: true, completion: nil)
}
}
}
}
} }
extension CorporateCultureBannerCell: VideoPlayerViewControllerDelegate{
func videoPlayerViewControllerCloseAction(_ viewController: VideoPlayerViewController) {
videoPlayerVC.dismiss(animated: true, completion: nil)
}
}
......
...@@ -126,7 +126,28 @@ extension MyAllServiceOrderViewController: UITableViewDelegate, UITableViewDataS ...@@ -126,7 +126,28 @@ extension MyAllServiceOrderViewController: UITableViewDelegate, UITableViewDataS
if selectedService.serviceType == .BOOKING { if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .tbc switch service.services[indexPath.row].status {
case .CANCELED:
appointmentdetails.orderStatus = .CANCELED
case .CLOSED:
appointmentdetails.orderStatus = .CLOSED
case .COMPLETE:
appointmentdetails.orderStatus = .COMPLETE
case .ONGOING:
appointmentdetails.orderStatus = .ONGOING
case .PENDING:
appointmentdetails.orderStatus = .PENDING
case .PROCESSING:
appointmentdetails.orderStatus = .PROCESSING
case .SERVICE_COMPLETE:
appointmentdetails.orderStatus = .SERVICE_COMPLETE
case .SERVICE_ONGOING:
appointmentdetails.orderStatus = .SERVICE_ONGOING
case .SERVICE_UPLOAD_RESULT:
appointmentdetails.orderStatus = .SERVICE_UPLOAD_RESULT
}
// appointmentdetails.serviceStatus = .tbc
appointmentdetails.incrementId = selectedService.incrementId appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true) self.navigationController?.pushViewController(appointmentdetails, animated: true)
...@@ -136,21 +157,39 @@ extension MyAllServiceOrderViewController: UITableViewDelegate, UITableViewDataS ...@@ -136,21 +157,39 @@ extension MyAllServiceOrderViewController: UITableViewDelegate, UITableViewDataS
let chatViewController = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self) let chatViewController = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self)
if let orderId = selectedService.orderId { if let orderId = selectedService.orderId {
chatViewController.orderId = orderId chatViewController.orderId = orderId
chatViewController.customerId = selectedService.customerId! if let customerId = selectedService.customerId {
self.navigationController?.pushViewController(chatViewController, animated: true) chatViewController.customerId = customerId
self.navigationController?.pushViewController(chatViewController, animated: true)
}
} }
} else { } else {
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self) let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = selectedService.incrementId! enquiryDetailsViewController.incrementId = selectedService.incrementId!
enquiryDetailsViewController.orderId = selectedService.orderId! enquiryDetailsViewController.orderId = selectedService.orderId!
enquiryDetailsViewController.customerImage = service.services[indexPath.row].customerProfileImage
enquiryDetailsViewController.customerName = service.services[indexPath.row].customerName
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true) self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
} }
} else if selectedService.serviceType == .FORM{ } else if selectedService.serviceType == .FORM{
if let form = Form.VC(with: selectedService.incrementId!, orderId: selectedService.orderId!, categoryType: selectedService.categoryType) { if selectedService.status == .COMPLETE {
self.navigationController?.pushViewController(form, animated: true) let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.orderStatus = .COMPLETE
appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
} else {
let formVC = Utils.viewController(storyboardName: "Forms", ofType: FormViewController.self)
formVC.incrementId = selectedService.incrementId
formVC.orderId = selectedService.orderId
self.navigationController?.pushViewController(formVC, animated: true)
} }
// if let form = Form.VC(with: selectedService.incrementId!, orderId: selectedService.orderId!, categoryType: selectedService.categoryType) {
// self.navigationController?.pushViewController(form, animated: true)
// }
} else { } else {
self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false) self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false)
} }
......
...@@ -121,6 +121,8 @@ extension MyCompletedOrdersViewController: UITableViewDelegate, UITableViewDataS ...@@ -121,6 +121,8 @@ extension MyCompletedOrdersViewController: UITableViewDelegate, UITableViewDataS
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self) let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = selectedService.incrementId! enquiryDetailsViewController.incrementId = selectedService.incrementId!
enquiryDetailsViewController.orderId = selectedService.orderId! enquiryDetailsViewController.orderId = selectedService.orderId!
enquiryDetailsViewController.customerImage = service.services[indexPath.row].customerProfileImage
enquiryDetailsViewController.customerName = service.services[indexPath.row].customerName
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true) self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
} }
......
...@@ -35,8 +35,6 @@ class Appointment { ...@@ -35,8 +35,6 @@ class Appointment {
func initWithJSON(json: Any) { func initWithJSON(json: Any) {
print(json)
if let response = json as? [String: Any] { if let response = json as? [String: Any] {
self.customerId = response["customer_Id"] as? String self.customerId = response["customer_Id"] as? String
self.customerName = response["buyerName"] as? String self.customerName = response["buyerName"] as? String
...@@ -102,6 +100,7 @@ class Appointment { ...@@ -102,6 +100,7 @@ class Appointment {
self.masterReply = masterReply self.masterReply = masterReply
} }
if let images = json["reply_image"] as? [String] { if let images = json["reply_image"] as? [String] {
self.images = "" self.images = ""
for image in images { for image in images {
self.images = self.images + "," + image self.images = self.images + "," + image
...@@ -115,9 +114,11 @@ class Appointment { ...@@ -115,9 +114,11 @@ class Appointment {
for audio in audios { for audio in audios {
self.audio = self.audio + "," + audio self.audio = self.audio + "," + audio
} }
if self.audio.count > 0 { if self.audio.count > 0 {
self.audio.removeLast() self.audio.removeFirst()
} }
} }
if let products = json["products"] as? [[String: Any]] { if let products = json["products"] as? [[String: Any]] {
for productJSON in products { for productJSON in products {
...@@ -158,8 +159,9 @@ class Appointment { ...@@ -158,8 +159,9 @@ class Appointment {
bookingTillSlot = dateComponentsBookingTill![2] bookingTillSlot = dateComponentsBookingTill![2]
} }
let finalDateString = bookingDate + "," + bookingFromsSlot + " -" + bookingTillSlot
return bookingDate + "," + bookingFromsSlot + "-" + bookingTillSlot return finalDateString
} }
} }
......
...@@ -69,15 +69,28 @@ class FormDetail { ...@@ -69,15 +69,28 @@ class FormDetail {
enum CustomOptionValue: String {
case image
case text
}
class CustomOption { class CustomOption {
var option: String var option: String?
var value: String var value: String?
var optionType: CustomOptionValue = .text
init(json: [String: Any]) { init(json: [String: Any]) {
self.option = json["label"] as! String self.option = json["label"] as? String
self.value = json["value"] as! String self.value = json["value"] as? String
if let value_ = self.value {
if value_.hasPrefix("http") {
optionType = .image
} else {
optionType = .text
}
}
} }
} }
......
...@@ -21,7 +21,7 @@ extension CorporateCulture { ...@@ -21,7 +21,7 @@ extension CorporateCulture {
} }
private func corporateCultureContent(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) { private func corporateCultureContent(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) {
...@@ -42,9 +42,9 @@ extension CorporateCulture { ...@@ -42,9 +42,9 @@ extension CorporateCulture {
}, failure: { (errorMessage) in }, failure: { (errorMessage) in
failure(errorMessage) failure(errorMessage)
}) })
} }
private func corporateCultureBanners(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) { private func corporateCultureBanners(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) {
...@@ -54,6 +54,8 @@ extension CorporateCulture { ...@@ -54,6 +54,8 @@ extension CorporateCulture {
HTTP().connectionWithRequestObject(api: API.CORPORATE_CULTURE, parameters: parameters, method: .post, indicator: false, success: { (response) in HTTP().connectionWithRequestObject(api: API.CORPORATE_CULTURE, parameters: parameters, method: .post, indicator: false, success: { (response) in
self.banners = [Banner]()
if let validResponse = response as? [[String: Any]] { if let validResponse = response as? [[String: Any]] {
if validResponse.count > 0 { if validResponse.count > 0 {
...@@ -86,5 +88,5 @@ extension CorporateCulture { ...@@ -86,5 +88,5 @@ extension CorporateCulture {
} }
} }
} }
...@@ -19,7 +19,6 @@ extension OrderDetails { ...@@ -19,7 +19,6 @@ extension OrderDetails {
params["incrementId"] = incrementId params["incrementId"] = incrementId
HTTP().connectionWithRequestObjectFormUrl(api: API.FAQ_ORDER_DETAILS, parameters: params, method: .post, indicator: true, success: { (result) in HTTP().connectionWithRequestObjectFormUrl(api: API.FAQ_ORDER_DETAILS, parameters: params, method: .post, indicator: true, success: { (result) in
if let json = result as? [String: Any] { if let json = result as? [String: Any] {
if let orderData = json["orderData"] as? [String: Any] { if let orderData = json["orderData"] as? [String: Any] {
if let itemList = orderData["itemList"] as? [[String: Any]] { if let itemList = orderData["itemList"] as? [[String: Any]] {
...@@ -28,6 +27,7 @@ extension OrderDetails { ...@@ -28,6 +27,7 @@ extension OrderDetails {
} }
} }
} }
if let orderDate = json["orderDate"] as? String { if let orderDate = json["orderDate"] as? String {
self.orderDate = orderDate self.orderDate = orderDate
} }
......
...@@ -9,4 +9,5 @@ ...@@ -9,4 +9,5 @@
import Foundation import Foundation
let kAPP_BLUE_COLOR = 0x066ba4 //Orange 0xf7b237 let kAPP_BLUE_COLOR = 0x066ba4 //Orange 0xf7b237
let kAGORA_APP_ID = "cb8a242be9344e3aba76c8de8707c10c" //let kAGORA_APP_ID = "cb8a242be9344e3aba76c8de8707c10c" // test
let kAGORA_APP_ID = "ccac037204af451a8e34ae3639441187" // live
...@@ -13,75 +13,75 @@ import RealmSwift ...@@ -13,75 +13,75 @@ import RealmSwift
extension Object { //extension Object {
//
func save() { // func save() {
try! DB.shared.realm.write { // try! DB.shared.realm.write {
DB.shared.realm.add(self, update: true) // DB.shared.realm.add(self, update: true)
} // }
} // }
//
func delete() { // func delete() {
try! DB.shared.realm.write { // try! DB.shared.realm.write {
DB.shared.realm.delete(self) // DB.shared.realm.delete(self)
} // }
} // }
//
//
} //}
//
//
//
//
//
//
//
//
extension Realm { //extension Realm {
//
class func deleteAll<Element: Object>(_ type: Element.Type) { // class func deleteAll<Element: Object>(_ type: Element.Type) {
try! DB.shared.realm.write { // try! DB.shared.realm.write {
DB.shared.realm.delete(DB.shared.realm.objects(type)) // DB.shared.realm.delete(DB.shared.realm.objects(type))
} // }
} // }
//
} //}
//
//
//
//
//
//
//
//
extension Results { //extension Results {
func toArray<T>(ofType: T.Type) -> [T] { // func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]() // var array = [T]()
for i in 0 ..< count { // for i in 0 ..< count {
if let result = self[i] as? T { // if let result = self[i] as? T {
array.append(result) // array.append(result)
} // }
} // }
//
return array // return array
} // }
} //}
//
//
//
//
//
//
//
//
//
extension List { //extension List {
func add(object: Element) { // func add(object: Element) {
try! DB.shared.realm.write { // try! DB.shared.realm.write {
_rlmArray.add(object as AnyObject) // _rlmArray.add(object as AnyObject)
} // }
} // }
} //}
......
...@@ -41,7 +41,7 @@ class API { ...@@ -41,7 +41,7 @@ class API {
static let RECOMEND_PRODUCTS = "/rest/V1/seller/recommendedproducts?page=" static let RECOMEND_PRODUCTS = "/rest/V1/seller/recommendedproducts?page="
static let UPDATE_RESULT = "/rest/V1/service/saveResult" static let UPDATE_RESULT = "/rest/V1/service/saveResult"
static let UPDATE_ORDER = "rest/V1/service/updateorder" static let UPDATE_ORDER = "rest/V1/service/updateorder"
static let VIDEO_CALLING_STATUS = "rest/V1/callingstatus/"
// Notification // Notification
static let NOTIFICATION = "mobikulhttp/extra/notificationList" static let NOTIFICATION = "mobikulhttp/extra/notificationList"
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -9,15 +9,14 @@ target 'Bhagyashree' do ...@@ -9,15 +9,14 @@ target 'Bhagyashree' do
pod 'BufferSlider', '0.1.6' pod 'BufferSlider', '0.1.6'
pod 'EasyToast', '2.0' pod 'EasyToast', '2.0'
pod 'TimeAgoInWords', '3.0' pod 'TimeAgoInWords', '3.0'
pod 'RealmSwift', '3.3.0'
pod 'MJRefresh', '3.1.14.1' pod 'MJRefresh', '3.1.14.1'
pod 'RealmSwift'
pod 'SVProgressHUD', '2.0.3' pod 'SVProgressHUD', '2.0.3'
pod 'SwiftDate', '4.4.1' pod 'SwiftDate', '4.4.1'
pod 'Kingfisher', '4.7.0' pod 'Kingfisher', '4.7.0'
pod 'Fabric' pod 'Fabric'
pod 'Crashlytics' pod 'Crashlytics'
pod 'ImageSlideshow' pod 'ImageSlideshow'
pod 'ImageSlideshow/Kingfisher'
pod 'Firebase/Core' pod 'Firebase/Core'
pod 'Firebase/Storage' pod 'Firebase/Storage'
pod 'Firebase/Auth' pod 'Firebase/Auth'
...@@ -25,4 +24,5 @@ target 'Bhagyashree' do ...@@ -25,4 +24,5 @@ target 'Bhagyashree' do
pod 'Firebase/Messaging' pod 'Firebase/Messaging'
pod 'AgoraRtcEngine_iOS', '2.2.0' pod 'AgoraRtcEngine_iOS', '2.2.0'
pod 'INSPhotoGallery', '1.2.5' pod 'INSPhotoGallery', '1.2.5'
pod 'ImageSlideshow/SDWebImage'
end end
...@@ -51,12 +51,12 @@ PODS: ...@@ -51,12 +51,12 @@ PODS:
- "GoogleToolboxForMac/NSData+zlib (2.1.4)": - "GoogleToolboxForMac/NSData+zlib (2.1.4)":
- GoogleToolboxForMac/Defines (= 2.1.4) - GoogleToolboxForMac/Defines (= 2.1.4)
- GTMSessionFetcher/Core (1.1.15) - GTMSessionFetcher/Core (1.1.15)
- ImageSlideshow (1.5.3): - ImageSlideshow (1.7.0):
- ImageSlideshow/Core (= 1.5.3) - ImageSlideshow/Core (= 1.7.0)
- ImageSlideshow/Core (1.5.3) - ImageSlideshow/Core (1.7.0)
- ImageSlideshow/Kingfisher (1.5.3): - ImageSlideshow/SDWebImage (1.7.0):
- ImageSlideshow/Core - ImageSlideshow/Core
- Kingfisher (> 3.0) - SDWebImage (< 5.0, >= 3.7)
- INSPhotoGallery (1.2.5) - INSPhotoGallery (1.2.5)
- IQKeyboardManagerSwift (5.0.8) - IQKeyboardManagerSwift (5.0.8)
- Kingfisher (4.7.0) - Kingfisher (4.7.0)
...@@ -69,11 +69,14 @@ PODS: ...@@ -69,11 +69,14 @@ PODS:
- nanopb/encode (0.3.8) - nanopb/encode (0.3.8)
- Pastel (0.3.0) - Pastel (0.3.0)
- Protobuf (3.5.0) - Protobuf (3.5.0)
- Realm (3.3.0): - Realm (3.11.0):
- Realm/Headers (= 3.3.0) - Realm/Headers (= 3.11.0)
- Realm/Headers (3.3.0) - Realm/Headers (3.11.0)
- RealmSwift (3.3.0): - RealmSwift (3.11.0):
- Realm (= 3.3.0) - Realm (= 3.11.0)
- SDWebImage (4.4.2):
- SDWebImage/Core (= 4.4.2)
- SDWebImage/Core (4.4.2)
- SVProgressHUD (2.0.3) - SVProgressHUD (2.0.3)
- SwiftDate (4.4.1) - SwiftDate (4.4.1)
- TimeAgoInWords (3.0.0) - TimeAgoInWords (3.0.0)
...@@ -91,13 +94,13 @@ DEPENDENCIES: ...@@ -91,13 +94,13 @@ DEPENDENCIES:
- Firebase/Messaging - Firebase/Messaging
- Firebase/Storage - Firebase/Storage
- ImageSlideshow - ImageSlideshow
- ImageSlideshow/Kingfisher - ImageSlideshow/SDWebImage
- INSPhotoGallery (= 1.2.5) - INSPhotoGallery (= 1.2.5)
- IQKeyboardManagerSwift (= 5.0.8) - IQKeyboardManagerSwift (= 5.0.8)
- Kingfisher (= 4.7.0) - Kingfisher (= 4.7.0)
- MJRefresh (= 3.1.14.1) - MJRefresh (= 3.1.14.1)
- Pastel - Pastel
- RealmSwift (= 3.3.0) - RealmSwift
- SVProgressHUD (= 2.0.3) - SVProgressHUD (= 2.0.3)
- SwiftDate (= 4.4.1) - SwiftDate (= 4.4.1)
- TimeAgoInWords (= 3.0) - TimeAgoInWords (= 3.0)
...@@ -131,6 +134,7 @@ SPEC REPOS: ...@@ -131,6 +134,7 @@ SPEC REPOS:
- Protobuf - Protobuf
- Realm - Realm
- RealmSwift - RealmSwift
- SDWebImage
- SVProgressHUD - SVProgressHUD
- SwiftDate - SwiftDate
- TimeAgoInWords - TimeAgoInWords
...@@ -152,7 +156,7 @@ SPEC CHECKSUMS: ...@@ -152,7 +156,7 @@ SPEC CHECKSUMS:
FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b
GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f
GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2 GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2
ImageSlideshow: 24a1184909f589379ba2527ebcc77996881bb1f2 ImageSlideshow: f8eec5e37a980f60923b585ff23b0e140fd24018
INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b
IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97 IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97
Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6 Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6
...@@ -161,13 +165,14 @@ SPEC CHECKSUMS: ...@@ -161,13 +165,14 @@ SPEC CHECKSUMS:
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262 Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262
Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03 Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03
Realm: 7d74ad6c5020432f58fe5e1df90bb6d97b2c7fef Realm: 92f09a102692b96a9a10e9617f214f15c5ab85fc
RealmSwift: b2fa31a09c22e246026766557405505eeaad2b01 RealmSwift: 5f0481cd658bb751c509314b964a35eaa264d2cf
SDWebImage: 624d6e296c69b244bcede364c72ae0430ac14681
SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4 SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4
SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d
TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f
WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2 WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2
PODFILE CHECKSUM: c0ec16ebb21736417bd47618790d9417fe8f19e1 PODFILE CHECKSUM: b6f207ed2b3bdfffa120ec5a7ace2cc3ad6fb769
COCOAPODS: 1.5.3 COCOAPODS: 1.5.3
...@@ -31,11 +31,11 @@ extension UIActivityIndicatorView: ActivityIndicatorView { ...@@ -31,11 +31,11 @@ extension UIActivityIndicatorView: ActivityIndicatorView {
} }
public func show() { public func show() {
self.startAnimating() startAnimating()
} }
public func hide() { public func hide() {
self.stopAnimating() stopAnimating()
} }
} }
...@@ -43,7 +43,8 @@ extension UIActivityIndicatorView: ActivityIndicatorView { ...@@ -43,7 +43,8 @@ extension UIActivityIndicatorView: ActivityIndicatorView {
@objcMembers @objcMembers
open class DefaultActivityIndicator: ActivityIndicatorFactory { open class DefaultActivityIndicator: ActivityIndicatorFactory {
/// activity indicator style /// activity indicator style
open var style: UIActivityIndicatorViewStyle open var style: UIActivityIndicatorView.Style
/// activity indicator color /// activity indicator color
open var color: UIColor? open var color: UIColor?
...@@ -51,14 +52,18 @@ open class DefaultActivityIndicator: ActivityIndicatorFactory { ...@@ -51,14 +52,18 @@ open class DefaultActivityIndicator: ActivityIndicatorFactory {
/// ///
/// - style: activity indicator style /// - style: activity indicator style
/// - color: activity indicator color /// - color: activity indicator color
public init(style: UIActivityIndicatorViewStyle = .gray, color: UIColor? = nil) { public init(style: UIActivityIndicatorView.Style = .gray, color: UIColor? = nil) {
self.style = style self.style = style
self.color = color self.color = color
} }
/// create ActivityIndicatorView instance /// create ActivityIndicatorView instance
open func create() -> ActivityIndicatorView { open func create() -> ActivityIndicatorView {
#if swift(>=4.2)
let activityIndicator = UIActivityIndicatorView(style: style)
#else
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: style) let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: style)
#endif
activityIndicator.color = color activityIndicator.color = color
activityIndicator.hidesWhenStopped = true activityIndicator.hidesWhenStopped = true
......
...@@ -14,7 +14,7 @@ open class FullScreenSlideshowViewController: UIViewController { ...@@ -14,7 +14,7 @@ open class FullScreenSlideshowViewController: UIViewController {
let slideshow = ImageSlideshow() let slideshow = ImageSlideshow()
slideshow.zoomEnabled = true slideshow.zoomEnabled = true
slideshow.contentScaleMode = UIViewContentMode.scaleAspectFit slideshow.contentScaleMode = UIViewContentMode.scaleAspectFit
slideshow.pageControlPosition = PageControlPosition.insideScrollView slideshow.pageIndicatorPosition = PageIndicatorPosition(horizontal: .center, vertical: .bottom)
// turns off the timer // turns off the timer
slideshow.slideshowInterval = 0 slideshow.slideshowInterval = 0
slideshow.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] slideshow.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
...@@ -62,7 +62,7 @@ open class FullScreenSlideshowViewController: UIViewController { ...@@ -62,7 +62,7 @@ open class FullScreenSlideshowViewController: UIViewController {
view.addSubview(slideshow) view.addSubview(slideshow)
// close button configuration // close button configuration
closeButton.setImage(UIImage(named: "Frameworks/ImageSlideshow.framework/ImageSlideshow.bundle/ic_cross_white@2x"), for: UIControlState()) closeButton.setImage(UIImage(named: "ic_cross_white", in: Bundle(for: type(of: self)), compatibleWith: nil), for: UIControlState())
closeButton.addTarget(self, action: #selector(FullScreenSlideshowViewController.close), for: UIControlEvents.touchUpInside) closeButton.addTarget(self, action: #selector(FullScreenSlideshowViewController.close), for: UIControlEvents.touchUpInside)
view.addSubview(closeButton) view.addSubview(closeButton)
} }
......
...@@ -12,19 +12,19 @@ import UIKit ...@@ -12,19 +12,19 @@ import UIKit
open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate {
/// Image view to hold the image /// Image view to hold the image
open let imageView = UIImageView() public let imageView = UIImageView()
/// Activity indicator shown during image loading, when nil there won't be shown any /// Activity indicator shown during image loading, when nil there won't be shown any
open let activityIndicator: ActivityIndicatorView? public let activityIndicator: ActivityIndicatorView?
/// Input Source for the item /// Input Source for the item
open let image: InputSource public let image: InputSource
/// Guesture recognizer to detect double tap to zoom /// Guesture recognizer to detect double tap to zoom
open var gestureRecognizer: UITapGestureRecognizer? open var gestureRecognizer: UITapGestureRecognizer?
/// Holds if the zoom feature is enabled /// Holds if the zoom feature is enabled
open let zoomEnabled: Bool public let zoomEnabled: Bool
/// If set to true image is initially zoomed in /// If set to true image is initially zoomed in
open var zoomInInitially = false open var zoomInInitially = false
...@@ -125,12 +125,16 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { ...@@ -125,12 +125,16 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate {
isLoading = true isLoading = true
imageReleased = false imageReleased = false
activityIndicator?.show() activityIndicator?.show()
image.load(to: self.imageView) { image in image.load(to: self.imageView) {[weak self] image in
// set image to nil if there was a release request during the image load // set image to nil if there was a release request during the image load
self.imageView.image = self.imageReleased ? nil : image if let imageRelease = self?.imageReleased, imageRelease {
self.activityIndicator?.hide() self?.imageView.image = nil
self.loadFailed = image == nil }else{
self.isLoading = false self?.imageView.image = image
}
self?.activityIndicator?.hide()
self?.loadFailed = image == nil
self?.isLoading = false
} }
} }
} }
......
//
// PageIndicator.swift
// ImageSlideshow
//
// Created by Petr Zvoníček on 27.05.18.
//
import UIKit
/// Cusotm Page Indicator can be used by implementing this protocol
public protocol PageIndicatorView: class {
/// View of the page indicator
var view: UIView { get }
/// Current page of the page indicator
var page: Int { get set }
/// Total number of pages of the page indicator
var numberOfPages: Int { get set}
}
extension UIPageControl: PageIndicatorView {
public var view: UIView {
return self
}
public var page: Int {
get {
return currentPage
}
set {
currentPage = newValue
}
}
open override func sizeToFit() {
var frame = self.frame
frame.size = size(forNumberOfPages: numberOfPages)
frame.size.height = 30
self.frame = frame
}
}
/// Page indicator that shows page in numeric style, eg. "5/21"
public class LabelPageIndicator: UILabel, PageIndicatorView {
public var view: UIView {
return self
}
public var numberOfPages: Int = 0 {
didSet {
updateLabel()
}
}
public var page: Int = 0 {
didSet {
updateLabel()
}
}
public override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
private func initialize() {
self.textAlignment = .center
}
private func updateLabel() {
text = "\(page+1)/\(numberOfPages)"
}
public override func sizeToFit() {
let maximumString = String(repeating: "8", count: numberOfPages) as NSString
self.frame.size = maximumString.size(withAttributes: [.font: font])
}
}
//
// PageIndicator.swift
// ImageSlideshow
//
// Created by Petr Zvoníček on 04.02.18.
//
import UIKit
/// Describes the configuration of the page indicator position
public struct PageIndicatorPosition {
public enum Horizontal {
case left(padding: CGFloat), center, right(padding: CGFloat)
}
public enum Vertical {
case top, bottom, under, customTop(padding: CGFloat), customBottom(padding: CGFloat), customUnder(padding: CGFloat)
}
/// Horizontal position of the page indicator
var horizontal: Horizontal
/// Vertical position of the page indicator
var vertical: Vertical
/// Creates a new PageIndicatorPosition struct
///
/// - Parameters:
/// - horizontal: horizontal position of the page indicator
/// - vertical: vertical position of the page indicator
public init(horizontal: Horizontal = .center, vertical: Vertical = .bottom) {
self.horizontal = horizontal
self.vertical = vertical
}
/// Computes the additional padding needed for the page indicator under the ImageSlideshow
///
/// - Parameter indicatorSize: size of the page indicator
/// - Returns: padding needed under the ImageSlideshow
func underPadding(for indicatorSize: CGSize) -> CGFloat {
switch vertical {
case .under:
return indicatorSize.height
case .customUnder(let padding):
return indicatorSize.height + padding
default:
return 0
}
}
/// Computes the page indicator frame
///
/// - Parameters:
/// - parentFrame: frame of the parent view – ImageSlideshow
/// - indicatorSize: size of the page indicator
/// - edgeInsets: edge insets of the parent view – ImageSlideshow (used for SafeAreaInsets adjustment)
/// - Returns: frame of the indicator by computing the origin and using `indicatorSize` as size
func indicatorFrame(for parentFrame: CGRect, indicatorSize: CGSize, edgeInsets: UIEdgeInsets) -> CGRect {
var xSize: CGFloat = 0
var ySize: CGFloat = 0
switch horizontal {
case .center:
xSize = parentFrame.size.width / 2 - indicatorSize.width / 2
case .left(let padding):
xSize = padding + edgeInsets.left
case .right(let padding):
xSize = parentFrame.size.width - indicatorSize.width - padding - edgeInsets.right
}
switch vertical {
case .bottom, .under, .customUnder:
ySize = parentFrame.size.height - indicatorSize.height - edgeInsets.bottom
case .customBottom(let padding):
ySize = parentFrame.size.height - indicatorSize.height - padding - edgeInsets.bottom
case .top:
ySize = edgeInsets.top
case .customTop(let padding):
ySize = padding + edgeInsets.top
}
return CGRect(x: xSize, y: ySize, width: indicatorSize.width, height: indicatorSize.height)
}
}
//
// SwiftSupport.swift
// ImageSlideshow
//
// Created by Pierluigi Cifani on 30/07/2018.
//
import UIKit
#if swift(>=4.2)
typealias UIViewContentMode = UIView.ContentMode
typealias UIActivityIndicatorViewStyle = UIActivityIndicatorView.Style
typealias UIControlState = UIControl.State
typealias UIViewAnimationOptions = UIView.AnimationOptions
typealias UIControlEvents = UIControl.Event
typealias UIViewAutoresizing = UIView.AutoresizingMask
#else
#endif
...@@ -66,7 +66,7 @@ open class ZoomAnimatedTransitioningDelegate: NSObject, UIViewControllerTransiti ...@@ -66,7 +66,7 @@ open class ZoomAnimatedTransitioningDelegate: NSObject, UIViewControllerTransiti
return return
} }
let percent = min(max(fabs(gesture.translation(in: gesture.view!).y) / 200.0, 0.0), 1.0) let percent = min(max(abs(gesture.translation(in: gesture.view!).y) / 200.0, 0.0), 1.0)
if gesture.state == .began { if gesture.state == .began {
interactionController = UIPercentDrivenInteractiveTransition() interactionController = UIPercentDrivenInteractiveTransition()
...@@ -76,7 +76,7 @@ open class ZoomAnimatedTransitioningDelegate: NSObject, UIViewControllerTransiti ...@@ -76,7 +76,7 @@ open class ZoomAnimatedTransitioningDelegate: NSObject, UIViewControllerTransiti
} else if gesture.state == .ended || gesture.state == .cancelled || gesture.state == .failed { } else if gesture.state == .ended || gesture.state == .cancelled || gesture.state == .failed {
let velocity = gesture.velocity(in: referenceSlideshowView) let velocity = gesture.velocity(in: referenceSlideshowView)
if fabs(velocity.y) > 500 { if abs(velocity.y) > 500 {
if let pageSelected = referenceSlideshowController.pageSelected { if let pageSelected = referenceSlideshowController.pageSelected {
pageSelected(referenceSlideshowController.slideshow.currentPage) pageSelected(referenceSlideshowController.slideshow.currentPage)
} }
...@@ -141,7 +141,7 @@ extension ZoomAnimatedTransitioningDelegate: UIGestureRecognizerDelegate { ...@@ -141,7 +141,7 @@ extension ZoomAnimatedTransitioningDelegate: UIGestureRecognizerDelegate {
if let view = gestureRecognizer.view { if let view = gestureRecognizer.view {
let velocity = gestureRecognizer.velocity(in: view) let velocity = gestureRecognizer.velocity(in: view)
return fabs(velocity.x) < fabs(velocity.y) return abs(velocity.x) < abs(velocity.y)
} }
return true return true
...@@ -192,8 +192,14 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning { ...@@ -192,8 +192,14 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
let transitionBackgroundView = UIView(frame: containerView.frame) let transitionBackgroundView = UIView(frame: containerView.frame)
transitionBackgroundView.backgroundColor = toViewController.backgroundColor transitionBackgroundView.backgroundColor = toViewController.backgroundColor
containerView.addSubview(transitionBackgroundView) containerView.addSubview(transitionBackgroundView)
#if swift(>=4.2)
containerView.sendSubviewToBack(transitionBackgroundView)
#else
containerView.sendSubview(toBack: transitionBackgroundView) containerView.sendSubview(toBack: transitionBackgroundView)
#endif
let finalFrame = toViewController.view.frame let finalFrame = toViewController.view.frame
var transitionView: UIImageView? var transitionView: UIImageView?
...@@ -223,9 +229,9 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning { ...@@ -223,9 +229,9 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
fromViewController.view.alpha = 0 fromViewController.view.alpha = 0
transitionView?.frame = transitionViewFinalFrame transitionView?.frame = transitionViewFinalFrame
transitionView?.center = CGPoint(x: finalFrame.midX, y: finalFrame.midY) transitionView?.center = CGPoint(x: finalFrame.midX, y: finalFrame.midY)
}, completion: {(_) in }, completion: {[ref = self.referenceImageView] _ in
fromViewController.view.alpha = 1 fromViewController.view.alpha = 1
self.referenceImageView?.alpha = 1 ref?.alpha = 1
transitionView?.removeFromSuperview() transitionView?.removeFromSuperview()
transitionBackgroundView.removeFromSuperview() transitionBackgroundView.removeFromSuperview()
containerView.addSubview(toViewController.view) containerView.addSubview(toViewController.view)
...@@ -270,8 +276,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning { ...@@ -270,8 +276,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
toViewController.view.frame = transitionContext.finalFrame(for: toViewController) toViewController.view.frame = transitionContext.finalFrame(for: toViewController)
toViewController.view.alpha = 0 toViewController.view.alpha = 0
containerView.addSubview(toViewController.view) containerView.addSubview(toViewController.view)
#if swift(>=4.2)
containerView.sendSubviewToBack(toViewController.view)
#else
containerView.sendSubview(toBack: toViewController.view) containerView.sendSubview(toBack: toViewController.view)
#endif
var transitionViewInitialFrame: CGRect var transitionViewInitialFrame: CGRect
if let currentSlideshowItem = fromViewController.slideshow.currentSlideshowItem { if let currentSlideshowItem = fromViewController.slideshow.currentSlideshowItem {
if let image = currentSlideshowItem.imageView.image { if let image = currentSlideshowItem.imageView.image {
...@@ -307,7 +316,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning { ...@@ -307,7 +316,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
let transitionBackgroundView = UIView(frame: containerView.frame) let transitionBackgroundView = UIView(frame: containerView.frame)
transitionBackgroundView.backgroundColor = fromViewController.backgroundColor transitionBackgroundView.backgroundColor = fromViewController.backgroundColor
containerView.addSubview(transitionBackgroundView) containerView.addSubview(transitionBackgroundView)
#if swift(>=4.2)
containerView.sendSubviewToBack(transitionBackgroundView)
#else
containerView.sendSubview(toBack: transitionBackgroundView) containerView.sendSubview(toBack: transitionBackgroundView)
#endif
let transitionView: UIImageView = UIImageView(image: fromViewController.slideshow.currentSlideshowItem?.imageView.image) let transitionView: UIImageView = UIImageView(image: fromViewController.slideshow.currentSlideshowItem?.imageView.image)
transitionView.contentMode = UIViewContentMode.scaleAspectFill transitionView.contentMode = UIViewContentMode.scaleAspectFill
......
// //
// KingfisherSource.swift // SDWebImageSource.swift
// ImageSlideshow // ImageSlideshow
// //
// Created by feiin // Created by Nik Kov on 06.07.16.
// //
// //
import Kingfisher import SDWebImage
/// Input Source to image using Kingfisher /// Input Source to image using SDWebImage
public class KingfisherSource: NSObject, InputSource { @objcMembers
public class SDWebImageSource: NSObject, InputSource {
/// url to load /// url to load
public var url: URL public var url: URL
/// placeholder used before image is loaded /// placeholder used before image is loaded
public var placeholder: UIImage? public var placeholder: UIImage?
/// options for displaying, ie. [.transition(.fade(0.2))]
public var options: KingfisherOptionsInfo?
/// Initializes a new source with a URL /// Initializes a new source with a URL
/// - parameter url: a url to be loaded /// - parameter url: a url to be loaded
/// - parameter placeholder: a placeholder used before image is loaded /// - parameter placeholder: a placeholder used before image is loaded
/// - parameter options: options for displaying public init(url: URL, placeholder: UIImage? = nil) {
public init(url: URL, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil) {
self.url = url self.url = url
self.placeholder = placeholder self.placeholder = placeholder
self.options = options
super.init() super.init()
} }
/// Initializes a new source with a URL string /// Initializes a new source with a URL string
/// - parameter urlString: a string url to load /// - parameter urlString: a string url to load
/// - parameter placeholder: a placeholder used before image is loaded /// - parameter placeholder: a placeholder used before image is loaded
/// - parameter options: options for displaying public init?(urlString: String, placeholder: UIImage? = nil) {
public init?(urlString: String, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil) {
if let validUrl = URL(string: urlString) { if let validUrl = URL(string: urlString) {
self.url = validUrl self.url = validUrl
self.placeholder = placeholder self.placeholder = placeholder
self.options = options
super.init() super.init()
} else { } else {
return nil return nil
} }
} }
@objc public func load(to imageView: UIImageView, with callback: @escaping (UIImage?) -> Void) { public func load(to imageView: UIImageView, with callback: @escaping (UIImage?) -> Void) {
imageView.kf.setImage(with: self.url, placeholder: self.placeholder, options: self.options, progressBlock: nil) { (image, _, _, _) in imageView.sd_setImage(with: self.url, placeholderImage: self.placeholder, options: [], completed: { (image, _, _, _) in
callback(image) callback(image)
} })
} }
public func cancelLoad(on imageView: UIImageView) { public func cancelLoad(on imageView: UIImageView) {
imageView.kf.cancelDownloadTask() imageView.sd_cancelCurrentImageLoad()
} }
} }
# 🖼 ImageSlideshow # 🖼 ImageSlideshow
**Swift image slideshow with circular scrolling, timer and full screen viewer** **Customizable Swift image slideshow with circular scrolling, timer and full screen viewer**
[![Build Status](https://www.bitrise.io/app/9aaf3e552f3a575c.svg?token=AjiVckTN9ItQtJs873mYMw&branch=master)](https://www.bitrise.io/app/9aaf3e552f3a575c) [![Build Status](https://www.bitrise.io/app/9aaf3e552f3a575c.svg?token=AjiVckTN9ItQtJs873mYMw&branch=master)](https://www.bitrise.io/app/9aaf3e552f3a575c)
[![Version](https://img.shields.io/cocoapods/v/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow) [![Version](https://img.shields.io/cocoapods/v/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow)
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
[![License](https://img.shields.io/cocoapods/l/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow) [![License](https://img.shields.io/cocoapods/l/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow)
[![Platform](https://img.shields.io/cocoapods/p/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow) [![Platform](https://img.shields.io/cocoapods/p/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow)
![](http://cl.ly/image/2v193I0G0h0Z/ImageSlideshow2.gif)
![](https://dzwonsemrish7.cloudfront.net/items/2R06283n040V3P3p0i42/ezgif.com-optimize.gif)
## 📱 Example ## 📱 Example
...@@ -21,14 +23,14 @@ ImageSlideshow is available through [CocoaPods](http://cocoapods.org). To instal ...@@ -21,14 +23,14 @@ ImageSlideshow is available through [CocoaPods](http://cocoapods.org). To instal
it, simply add the following line to your Podfile: it, simply add the following line to your Podfile:
```ruby ```ruby
pod 'ImageSlideshow', '~> 1.5' pod 'ImageSlideshow', '~> 1.6'
``` ```
### Carthage ### Carthage
To integrate ImageSlideshow into your Xcode project using Carthage, specify it in your Cartfile: To integrate ImageSlideshow into your Xcode project using Carthage, specify it in your Cartfile:
```ruby ```ruby
github "zvonicek/ImageSlideshow" ~> 1.5 github "zvonicek/ImageSlideshow" ~> 1.6
``` ```
Carthage does not include InputSources for external providers (due to dependency on those providers) so you need to grab the one you need from `ImageSlideshow/Classes/InputSources` manually. Carthage does not include InputSources for external providers (due to dependency on those providers) so you need to grab the one you need from `ImageSlideshow/Classes/InputSources` manually.
...@@ -77,7 +79,9 @@ Behaviour is configurable by those properties: ...@@ -77,7 +79,9 @@ Behaviour is configurable by those properties:
- ```slideshowInterval``` - slideshow interval in seconds (default `0` – disabled) - ```slideshowInterval``` - slideshow interval in seconds (default `0` – disabled)
- ```zoomEnabled``` - enables zooming (default `false`) - ```zoomEnabled``` - enables zooming (default `false`)
- ```circular``` - enables circular scrolling (default `true`) - ```circular``` - enables circular scrolling (default `true`)
- ```pageControlPosition``` - configures position of UIPageControl (default `insideScrollView`, also `hidden`, `underScrollView` or `custom`) - ```activityIndicator``` – allows to set custom activity indicator, see *Activity indicator* section
- ```pageIndicator``` – allows to set custom page indicator, see *Page indicator* section; assign `nil` to hide page indicator
- ```pageIndicatorPosition``` - configures position of the page indicator
- ```contentScaleMode``` - configures the scaling (default `ScaleAspectFit`) - ```contentScaleMode``` - configures the scaling (default `ScaleAspectFit`)
- ```draggingEnabled``` - enables dragging (default `true`) - ```draggingEnabled``` - enables dragging (default `true`)
- ```currentPageChanged``` - closure called on page change - ```currentPageChanged``` - closure called on page change
...@@ -85,6 +89,37 @@ Behaviour is configurable by those properties: ...@@ -85,6 +89,37 @@ Behaviour is configurable by those properties:
- ```didEndDecelerating``` - closure called on scrollViewDidEndDecelerating - ```didEndDecelerating``` - closure called on scrollViewDidEndDecelerating
- ```preload``` - image preloading configuration (default `all` preloading, also `fixed`) - ```preload``` - image preloading configuration (default `all` preloading, also `fixed`)
### Page Indicator
Page indicator can be customized using the `pageIndicator` property on ImageSlideshow. By defualt, a plain UIPageControl is used. If needed, page control can be customized:
```swift
let pageIndicator = UIPageControl()
pageIndicator.currentPageIndicatorTintColor = UIColor.lightGray
pageIndicator.pageIndicatorTintColor = UIColor.black
slideshow.pageIndicator = pageIndicator
```
Also, a simple label page indicator that shows pages in style "5/21" (fifth page from twenty one) is provided:
```swift
slideshow.pageIndicator = LabelPageIndicator()
```
You can also use your own page indicator by adopting the `PageIndicatorView` protocol.
Position of the page indicator can be configured by assigning a `PageIndicatorPosition` value to the `pageIndicatorPosition` property on ImageSlideshow. You may specify the horizontal and vertical positioning separately.
**Horizontal** positioning options are: `.left(padding: Int)`, `.center`, `.right(padding: Int)`
**Vertical** positioning options are: `.top`, `.bottom`, `.under`, `customTop(padding: Int)`, `customBottom(padding: Int)`, `customUnder(padding: Int)`
Example:
```swift
slideshow.pageIndicatorPosition = PageIndicatorPosition(horizontal: .left(padding: 20), vertical: .bottom)
```
### Activity Indicator ### Activity Indicator
By default activity indicator is not shown, but you can enable it by setting `DefaultActivityIndicator` instance to Image Slideshow: By default activity indicator is not shown, but you can enable it by setting `DefaultActivityIndicator` instance to Image Slideshow:
......
...@@ -51,12 +51,12 @@ PODS: ...@@ -51,12 +51,12 @@ PODS:
- "GoogleToolboxForMac/NSData+zlib (2.1.4)": - "GoogleToolboxForMac/NSData+zlib (2.1.4)":
- GoogleToolboxForMac/Defines (= 2.1.4) - GoogleToolboxForMac/Defines (= 2.1.4)
- GTMSessionFetcher/Core (1.1.15) - GTMSessionFetcher/Core (1.1.15)
- ImageSlideshow (1.5.3): - ImageSlideshow (1.7.0):
- ImageSlideshow/Core (= 1.5.3) - ImageSlideshow/Core (= 1.7.0)
- ImageSlideshow/Core (1.5.3) - ImageSlideshow/Core (1.7.0)
- ImageSlideshow/Kingfisher (1.5.3): - ImageSlideshow/SDWebImage (1.7.0):
- ImageSlideshow/Core - ImageSlideshow/Core
- Kingfisher (> 3.0) - SDWebImage (< 5.0, >= 3.7)
- INSPhotoGallery (1.2.5) - INSPhotoGallery (1.2.5)
- IQKeyboardManagerSwift (5.0.8) - IQKeyboardManagerSwift (5.0.8)
- Kingfisher (4.7.0) - Kingfisher (4.7.0)
...@@ -69,11 +69,14 @@ PODS: ...@@ -69,11 +69,14 @@ PODS:
- nanopb/encode (0.3.8) - nanopb/encode (0.3.8)
- Pastel (0.3.0) - Pastel (0.3.0)
- Protobuf (3.5.0) - Protobuf (3.5.0)
- Realm (3.3.0): - Realm (3.11.0):
- Realm/Headers (= 3.3.0) - Realm/Headers (= 3.11.0)
- Realm/Headers (3.3.0) - Realm/Headers (3.11.0)
- RealmSwift (3.3.0): - RealmSwift (3.11.0):
- Realm (= 3.3.0) - Realm (= 3.11.0)
- SDWebImage (4.4.2):
- SDWebImage/Core (= 4.4.2)
- SDWebImage/Core (4.4.2)
- SVProgressHUD (2.0.3) - SVProgressHUD (2.0.3)
- SwiftDate (4.4.1) - SwiftDate (4.4.1)
- TimeAgoInWords (3.0.0) - TimeAgoInWords (3.0.0)
...@@ -91,13 +94,13 @@ DEPENDENCIES: ...@@ -91,13 +94,13 @@ DEPENDENCIES:
- Firebase/Messaging - Firebase/Messaging
- Firebase/Storage - Firebase/Storage
- ImageSlideshow - ImageSlideshow
- ImageSlideshow/Kingfisher - ImageSlideshow/SDWebImage
- INSPhotoGallery (= 1.2.5) - INSPhotoGallery (= 1.2.5)
- IQKeyboardManagerSwift (= 5.0.8) - IQKeyboardManagerSwift (= 5.0.8)
- Kingfisher (= 4.7.0) - Kingfisher (= 4.7.0)
- MJRefresh (= 3.1.14.1) - MJRefresh (= 3.1.14.1)
- Pastel - Pastel
- RealmSwift (= 3.3.0) - RealmSwift
- SVProgressHUD (= 2.0.3) - SVProgressHUD (= 2.0.3)
- SwiftDate (= 4.4.1) - SwiftDate (= 4.4.1)
- TimeAgoInWords (= 3.0) - TimeAgoInWords (= 3.0)
...@@ -131,6 +134,7 @@ SPEC REPOS: ...@@ -131,6 +134,7 @@ SPEC REPOS:
- Protobuf - Protobuf
- Realm - Realm
- RealmSwift - RealmSwift
- SDWebImage
- SVProgressHUD - SVProgressHUD
- SwiftDate - SwiftDate
- TimeAgoInWords - TimeAgoInWords
...@@ -152,7 +156,7 @@ SPEC CHECKSUMS: ...@@ -152,7 +156,7 @@ SPEC CHECKSUMS:
FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b
GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f
GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2 GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2
ImageSlideshow: 24a1184909f589379ba2527ebcc77996881bb1f2 ImageSlideshow: f8eec5e37a980f60923b585ff23b0e140fd24018
INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b
IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97 IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97
Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6 Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6
...@@ -161,13 +165,14 @@ SPEC CHECKSUMS: ...@@ -161,13 +165,14 @@ SPEC CHECKSUMS:
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262 Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262
Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03 Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03
Realm: 7d74ad6c5020432f58fe5e1df90bb6d97b2c7fef Realm: 92f09a102692b96a9a10e9617f214f15c5ab85fc
RealmSwift: b2fa31a09c22e246026766557405505eeaad2b01 RealmSwift: 5f0481cd658bb751c509314b964a35eaa264d2cf
SDWebImage: 624d6e296c69b244bcede364c72ae0430ac14681
SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4 SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4
SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d
TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f
WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2 WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2
PODFILE CHECKSUM: c0ec16ebb21736417bd47618790d9417fe8f19e1 PODFILE CHECKSUM: b6f207ed2b3bdfffa120ec5a7ace2cc3ad6fb769
COCOAPODS: 1.5.3 COCOAPODS: 1.5.3
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "81253E4988F79CC2BABE9762EFF7AFC5"
BlueprintName = "BufferSlider"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "BufferSlider.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8F04BFE019EBE37DE6BAD0260CDE529C"
BlueprintName = "EasyToast"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "EasyToast.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F4053FF0B66FA8985A37A25C0610E132"
BlueprintName = "FirebaseAuth"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "FirebaseAuth.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5E85ADE55180906BD16B50AD30E63E92"
BlueprintName = "FirebaseCore"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "FirebaseCore.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7EACE9EB449E329153E8A985A340E537"
BlueprintName = "FirebaseDatabase"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "FirebaseDatabase.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7CFD8C73F0D5C9047AAC633077739DA4"
BlueprintName = "FirebaseMessaging"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "FirebaseMessaging.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E4DD1E11297017930AFBAE839DD28591"
BlueprintName = "FirebaseStorage"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "FirebaseStorage.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "9AD0B5EAA947C40BFAFF2C97C7FD4094"
BlueprintName = "GTMSessionFetcher"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "GTMSessionFetcher.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D8F72D44F8CDBAD714E93BC56BF8707"
BlueprintName = "GoogleToolboxForMac"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "GoogleToolboxForMac.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "9FB26439C46101C637E927BC50978C09"
BuildableName = "INSPhotoGallery.bundle"
BlueprintName = "INSPhotoGallery-INSPhotoGallery"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "9FB26439C46101C637E927BC50978C09"
BuildableName = "INSPhotoGallery.bundle"
BlueprintName = "INSPhotoGallery-INSPhotoGallery"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "0DAF91D989E553D57956BD215B34555B"
BlueprintName = "INSPhotoGallery"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "INSPhotoGallery.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C7A242603ED7333794F270586FA2B22D"
BlueprintName = "IQKeyboardManagerSwift"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "IQKeyboardManagerSwift.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "64497E66D96A364F588D8C1876566C53"
BlueprintName = "ImageSlideshow"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "ImageSlideshow.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A15CD3220CB655EF65975142EDBD8C6E"
BlueprintName = "Kingfisher"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "Kingfisher.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "546B747B9DB0515E059EEBA0B9E98B42"
BlueprintName = "MJRefresh"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "MJRefresh.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6C62CDA4B123CE11AC4088A350F32426"
BlueprintName = "Pastel"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "Pastel.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F97FDCB797E5DF04953162D3549D7A26"
BuildableName = "Pods_Bhagyashree.framework"
BlueprintName = "Pods-Bhagyashree"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F97FDCB797E5DF04953162D3549D7A26"
BuildableName = "Pods_Bhagyashree.framework"
BlueprintName = "Pods-Bhagyashree"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "80FC6EF3B00AB23060F3F7560AF1B340"
BlueprintName = "Protobuf"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "Protobuf.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "83BE6FE87B4D802C8F0DAEE1D665FE73"
BlueprintName = "Realm"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "Realm.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CCB222015D8AD40EA4520975998D2D94"
BlueprintName = "RealmSwift"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "RealmSwift.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2E07C16B760AF46E91B3D867A59A4952"
BlueprintName = "SDWebImage"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "SDWebImage.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "9A80142F01AD5BDE62ACBE659A7138FA"
BlueprintName = "SVProgressHUD"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "SVProgressHUD.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CEEB951BC2E80A17E94058BA642E2C1D"
BlueprintName = "SwiftDate"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "SwiftDate.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "94117655CE92C34C54AE3BF2F2BC4C75"
BuildableName = "TimeAgoInWords.bundle"
BlueprintName = "TimeAgoInWords-TimeAgoInWords"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "94117655CE92C34C54AE3BF2F2BC4C75"
BuildableName = "TimeAgoInWords.bundle"
BlueprintName = "TimeAgoInWords-TimeAgoInWords"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6A941B34A34B60A2E7B5503595AA5513"
BlueprintName = "TimeAgoInWords"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "TimeAgoInWords.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4B2DFBB12EB129420E2BD007B65B6321"
BlueprintName = "WMPageController"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "WMPageController.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "34371692C0577426FE7C41894182EEA5"
BuildableName = "leveldb.framework"
BlueprintName = "leveldb-library"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "34371692C0577426FE7C41894182EEA5"
BuildableName = "leveldb.framework"
BlueprintName = "leveldb-library"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8364BB258018143B83798DE31C13546D"
BlueprintName = "nanopb"
ReferencedContainer = "container:Pods.xcodeproj"
BuildableName = "nanopb.framework">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
...@@ -6,144 +6,202 @@ ...@@ -6,144 +6,202 @@
<dict> <dict>
<key>BufferSlider.xcscheme</key> <key>BufferSlider.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>7</integer> <integer>6</integer>
</dict> </dict>
<key>EasyToast.xcscheme</key> <key>EasyToast.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>8</integer> <integer>7</integer>
</dict> </dict>
<key>FirebaseAuth.xcscheme</key> <key>FirebaseAuth.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>9</integer> <integer>8</integer>
</dict> </dict>
<key>FirebaseCore.xcscheme</key> <key>FirebaseCore.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>10</integer> <integer>9</integer>
</dict> </dict>
<key>FirebaseDatabase.xcscheme</key> <key>FirebaseDatabase.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>11</integer> <integer>10</integer>
</dict> </dict>
<key>FirebaseMessaging.xcscheme</key> <key>FirebaseMessaging.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>12</integer> <integer>11</integer>
</dict> </dict>
<key>FirebaseStorage.xcscheme</key> <key>FirebaseStorage.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>13</integer> <integer>12</integer>
</dict> </dict>
<key>GTMSessionFetcher.xcscheme</key> <key>GTMSessionFetcher.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>15</integer> <integer>14</integer>
</dict> </dict>
<key>GoogleToolboxForMac.xcscheme</key> <key>GoogleToolboxForMac.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>14</integer> <integer>13</integer>
</dict> </dict>
<key>INSPhotoGallery-INSPhotoGallery.xcscheme</key> <key>INSPhotoGallery-INSPhotoGallery.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>19</integer> <integer>17</integer>
</dict> </dict>
<key>INSPhotoGallery.xcscheme</key> <key>INSPhotoGallery.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>18</integer> <integer>16</integer>
</dict> </dict>
<key>IQKeyboardManagerSwift.xcscheme</key> <key>IQKeyboardManagerSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>20</integer> <integer>18</integer>
</dict>
<key>ImageSlideshow-ImageSlideshow.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>17</integer>
</dict> </dict>
<key>ImageSlideshow.xcscheme</key> <key>ImageSlideshow.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>16</integer> <integer>15</integer>
</dict> </dict>
<key>Kingfisher.xcscheme</key> <key>Kingfisher.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>21</integer> <integer>19</integer>
</dict> </dict>
<key>MJRefresh.xcscheme</key> <key>MJRefresh.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>23</integer> <integer>21</integer>
</dict> </dict>
<key>Pastel.xcscheme</key> <key>Pastel.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>25</integer> <integer>23</integer>
</dict> </dict>
<key>Pods-Bhagyashree.xcscheme</key> <key>Pods-Bhagyashree.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>26</integer> <integer>24</integer>
</dict> </dict>
<key>Protobuf.xcscheme</key> <key>Protobuf.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>27</integer> <integer>25</integer>
</dict> </dict>
<key>Realm.xcscheme</key> <key>Realm.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>28</integer> <integer>26</integer>
</dict> </dict>
<key>RealmSwift.xcscheme</key> <key>RealmSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>29</integer> <integer>27</integer>
</dict>
<key>SDWebImage.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>28</integer>
</dict> </dict>
<key>SVProgressHUD.xcscheme</key> <key>SVProgressHUD.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>30</integer> <integer>29</integer>
</dict> </dict>
<key>SwiftDate.xcscheme</key> <key>SwiftDate.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>31</integer> <integer>30</integer>
</dict> </dict>
<key>TimeAgoInWords-TimeAgoInWords.xcscheme</key> <key>TimeAgoInWords-TimeAgoInWords.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>33</integer> <integer>32</integer>
</dict> </dict>
<key>TimeAgoInWords.xcscheme</key> <key>TimeAgoInWords.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>32</integer> <integer>31</integer>
</dict> </dict>
<key>WMPageController.xcscheme</key> <key>WMPageController.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>34</integer> <integer>33</integer>
</dict> </dict>
<key>leveldb-library.xcscheme</key> <key>leveldb-library.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>22</integer> <integer>20</integer>
</dict> </dict>
<key>nanopb.xcscheme</key> <key>nanopb.xcscheme</key>
<dict> <dict>
<key>isShown</key>
<false/>
<key>orderHint</key> <key>orderHint</key>
<integer>24</integer> <integer>22</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key>
<dict/>
</dict> </dict>
</plist> </plist>
...@@ -117,7 +117,7 @@ bool ResultsNotifier::need_to_run() ...@@ -117,7 +117,7 @@ bool ResultsNotifier::need_to_run()
void ResultsNotifier::calculate_changes() void ResultsNotifier::calculate_changes()
{ {
size_t table_ndx = m_query->get_table()->get_index_in_group(); size_t table_ndx = m_query->get_table()->get_index_in_group();
if (has_run()) { if (has_run() && have_callbacks()) {
CollectionChangeBuilder* changes = nullptr; CollectionChangeBuilder* changes = nullptr;
if (table_ndx == npos) if (table_ndx == npos)
changes = &m_changes; changes = &m_changes;
......
...@@ -133,7 +133,7 @@ size_t Results::size() ...@@ -133,7 +133,7 @@ size_t Results::size()
case Mode::Query: case Mode::Query:
m_query.sync_view_if_needed(); m_query.sync_view_if_needed();
if (!m_descriptor_ordering.will_apply_distinct()) if (!m_descriptor_ordering.will_apply_distinct())
return m_query.count(); return m_query.count(m_descriptor_ordering);
REALM_FALLTHROUGH; REALM_FALLTHROUGH;
case Mode::TableView: case Mode::TableView:
evaluate_query_if_needed(); evaluate_query_if_needed();
...@@ -259,17 +259,12 @@ void Results::evaluate_query_if_needed(bool wants_notifications) ...@@ -259,17 +259,12 @@ void Results::evaluate_query_if_needed(bool wants_notifications)
return; return;
case Mode::Query: case Mode::Query:
m_query.sync_view_if_needed(); m_query.sync_view_if_needed();
m_table_view = m_query.find_all(); m_table_view = m_query.find_all(m_descriptor_ordering);
if (!m_descriptor_ordering.is_empty()) {
m_table_view.apply_descriptor_ordering(m_descriptor_ordering);
}
m_mode = Mode::TableView; m_mode = Mode::TableView;
REALM_FALLTHROUGH; REALM_FALLTHROUGH;
case Mode::TableView: case Mode::TableView:
if (wants_notifications && !m_notifier && !m_realm->is_in_transaction() && m_realm->can_deliver_notifications()) { if (wants_notifications)
m_notifier = std::make_shared<_impl::ResultsNotifier>(*this); prepare_async(ForCallback{false});
_impl::RealmCoordinator::register_notifier(m_notifier);
}
m_has_used_table_view = true; m_has_used_table_view = true;
m_table_view.sync_if_needed(); m_table_view.sync_if_needed();
break; break;
...@@ -612,23 +607,31 @@ Results Results::sort(SortDescriptor&& sort) const ...@@ -612,23 +607,31 @@ Results Results::sort(SortDescriptor&& sort) const
Results Results::filter(Query&& q) const Results Results::filter(Query&& q) const
{ {
if (m_descriptor_ordering.will_apply_limit())
throw UnimplementedOperationException("Filtering a Results with a limit is not yet implemented");
return Results(m_realm, get_query().and_query(std::move(q)), m_descriptor_ordering); return Results(m_realm, get_query().and_query(std::move(q)), m_descriptor_ordering);
} }
Results Results::limit(size_t max_count) const
{
auto new_order = m_descriptor_ordering;
new_order.append_limit(max_count);
return Results(m_realm, get_query(), std::move(new_order));
}
Results Results::apply_ordering(DescriptorOrdering&& ordering) Results Results::apply_ordering(DescriptorOrdering&& ordering)
{ {
DescriptorOrdering new_order = m_descriptor_ordering; DescriptorOrdering new_order = m_descriptor_ordering;
for (size_t i = 0; i < ordering.size(); ++i) { for (size_t i = 0; i < ordering.size(); ++i) {
const CommonDescriptor* desc = ordering[i]; auto desc = ordering[i];
if (const SortDescriptor* sort = dynamic_cast<const SortDescriptor*>(desc)) { if (auto sort = dynamic_cast<const SortDescriptor*>(desc))
new_order.append_sort(std::move(*sort)); new_order.append_sort(std::move(*sort));
continue; else if (auto distinct = dynamic_cast<const DistinctDescriptor*>(desc))
}
if (const DistinctDescriptor* distinct = dynamic_cast<const DistinctDescriptor*>(desc)) {
new_order.append_distinct(std::move(*distinct)); new_order.append_distinct(std::move(*distinct));
continue; else if (auto limit = dynamic_cast<const LimitDescriptor*>(desc))
} new_order.append_limit(std::move(*limit));
REALM_COMPILER_HINT_UNREACHABLE(); else
REALM_COMPILER_HINT_UNREACHABLE();
} }
return Results(m_realm, get_query(), std::move(new_order)); return Results(m_realm, get_query(), std::move(new_order));
} }
...@@ -691,19 +694,34 @@ Results Results::snapshot() && ...@@ -691,19 +694,34 @@ Results Results::snapshot() &&
REALM_COMPILER_HINT_UNREACHABLE(); REALM_COMPILER_HINT_UNREACHABLE();
} }
void Results::prepare_async() void Results::prepare_async(ForCallback force)
{ {
if (m_notifier) { if (m_notifier) {
return; return;
} }
if (m_realm->config().immutable()) { if (m_realm->config().immutable()) {
throw InvalidTransactionException("Cannot create asynchronous query for immutable Realms"); if (force)
throw InvalidTransactionException("Cannot create asynchronous query for immutable Realms");
return;
} }
if (m_realm->is_in_transaction()) { if (m_realm->is_in_transaction()) {
throw InvalidTransactionException("Cannot create asynchronous query while in a write transaction"); if (force)
throw InvalidTransactionException("Cannot create asynchronous query while in a write transaction");
return;
} }
if (m_update_policy == UpdatePolicy::Never) { if (m_update_policy == UpdatePolicy::Never) {
throw std::logic_error("Cannot create asynchronous query for snapshotted Results."); if (force)
throw std::logic_error("Cannot create asynchronous query for snapshotted Results.");
return;
}
if (!force) {
// Don't do implicit background updates if we can't actually deliver them
if (!m_realm->can_deliver_notifications())
return;
// Don't do implicit background updates if there isn't actually anything
// that needs to be run.
if (!m_query.get_table() && m_descriptor_ordering.is_empty())
return;
} }
m_wants_background_updates = true; m_wants_background_updates = true;
...@@ -713,7 +731,7 @@ void Results::prepare_async() ...@@ -713,7 +731,7 @@ void Results::prepare_async()
NotificationToken Results::add_notification_callback(CollectionChangeCallback cb) & NotificationToken Results::add_notification_callback(CollectionChangeCallback cb) &
{ {
prepare_async(); prepare_async(ForCallback{true});
return {m_notifier, m_notifier->add_callback(std::move(cb))}; return {m_notifier, m_notifier->add_callback(std::move(cb))};
} }
...@@ -795,4 +813,8 @@ Results::UnsupportedColumnTypeException::UnsupportedColumnTypeException(size_t c ...@@ -795,4 +813,8 @@ Results::UnsupportedColumnTypeException::UnsupportedColumnTypeException(size_t c
{ {
} }
Results::UnimplementedOperationException::UnimplementedOperationException(const char* msg)
: std::logic_error(msg)
{ }
} // namespace realm } // namespace realm
...@@ -727,11 +727,11 @@ bool Realm::compact() ...@@ -727,11 +727,11 @@ bool Realm::compact()
throw InvalidTransactionException("Can't compact a Realm within a write transaction"); throw InvalidTransactionException("Can't compact a Realm within a write transaction");
} }
Group& group = read_group(); verify_open();
for (auto &object_schema : m_schema) { // FIXME: when enum columns are ready, optimise all tables in a write transaction
ObjectStore::table_for_object_type(group, object_schema.name)->optimize(); if (m_group) {
m_shared_group->end_read();
} }
m_shared_group->end_read();
m_group = nullptr; m_group = nullptr;
return m_shared_group->compact(); return m_shared_group->compact();
...@@ -961,6 +961,7 @@ T Realm::resolve_thread_safe_reference(ThreadSafeReference<T> reference) ...@@ -961,6 +961,7 @@ T Realm::resolve_thread_safe_reference(ThreadSafeReference<T> reference)
if (reference_version < current_version) { if (reference_version < current_version) {
// Duplicate config for uncached Realm so we don't advance the user's Realm // Duplicate config for uncached Realm so we don't advance the user's Realm
Realm::Config config = m_coordinator->get_config(); Realm::Config config = m_coordinator->get_config();
config.automatic_change_notifications = false;
config.cache = false; config.cache = false;
config.schema = util::none; config.schema = util::none;
SharedRealm temporary_realm = m_coordinator->get_realm(config); SharedRealm temporary_realm = m_coordinator->get_realm(config);
...@@ -1096,3 +1097,8 @@ Group& RealmFriend::read_group_to(Realm& realm, VersionID version) ...@@ -1096,3 +1097,8 @@ Group& RealmFriend::read_group_to(Realm& realm, VersionID version)
realm.begin_read(version); realm.begin_read(version);
return *realm.m_group; return *realm.m_group;
} }
std::size_t Realm::compute_size() {
Group& group = read_group();
return group.compute_aggregated_byte_size();
}
...@@ -18,9 +18,8 @@ ...@@ -18,9 +18,8 @@
#include "sync/impl/sync_file.hpp" #include "sync/impl/sync_file.hpp"
#include "util/time.hpp"
#include <realm/util/file.hpp> #include <realm/util/file.hpp>
#include <realm/util/time.hpp>
#include <realm/util/scope_exit.hpp> #include <realm/util/scope_exit.hpp>
#include <iomanip> #include <iomanip>
...@@ -175,7 +174,7 @@ std::string create_timestamped_template(const std::string& prefix, int wildcard_ ...@@ -175,7 +174,7 @@ std::string create_timestamped_template(const std::string& prefix, int wildcard_
wildcard_count = std::min(WILDCARD_MAX, std::max(WILDCARD_MIN, wildcard_count)); wildcard_count = std::min(WILDCARD_MAX, std::max(WILDCARD_MIN, wildcard_count));
std::time_t time = std::time(nullptr); std::time_t time = std::time(nullptr);
std::stringstream stream; std::stringstream stream;
stream << prefix << "-" << util::put_time(time, "%Y%m%d-%H%M%S") << "-" << std::string(wildcard_count, 'X'); stream << prefix << "-" << util::format_local_time(time, "%Y%m%d-%H%M%S") << "-" << std::string(wildcard_count, 'X');
return stream.str(); return stream.str();
} }
...@@ -206,7 +205,6 @@ constexpr const char SyncFileManager::c_utility_directory[]; ...@@ -206,7 +205,6 @@ constexpr const char SyncFileManager::c_utility_directory[];
constexpr const char SyncFileManager::c_recovery_directory[]; constexpr const char SyncFileManager::c_recovery_directory[];
constexpr const char SyncFileManager::c_metadata_directory[]; constexpr const char SyncFileManager::c_metadata_directory[];
constexpr const char SyncFileManager::c_metadata_realm[]; constexpr const char SyncFileManager::c_metadata_realm[];
constexpr const char SyncFileManager::c_user_info_file[];
std::string SyncFileManager::get_special_directory(std::string directory_name) const std::string SyncFileManager::get_special_directory(std::string directory_name) const
{ {
...@@ -226,8 +224,7 @@ std::string SyncFileManager::get_base_sync_directory() const ...@@ -226,8 +224,7 @@ std::string SyncFileManager::get_base_sync_directory() const
return sync_path; return sync_path;
} }
std::string SyncFileManager::user_directory(const std::string& local_identity, std::string SyncFileManager::user_directory(const std::string& local_identity) const
util::Optional<SyncUserIdentifier> user_info) const
{ {
REALM_ASSERT(local_identity.length() > 0); REALM_ASSERT(local_identity.length() > 0);
std::string escaped = util::make_percent_encoded_string(local_identity); std::string escaped = util::make_percent_encoded_string(local_identity);
...@@ -237,18 +234,7 @@ std::string SyncFileManager::user_directory(const std::string& local_identity, ...@@ -237,18 +234,7 @@ std::string SyncFileManager::user_directory(const std::string& local_identity,
auto user_path = file_path_by_appending_component(get_base_sync_directory(), auto user_path = file_path_by_appending_component(get_base_sync_directory(),
escaped, escaped,
util::FilePathType::Directory); util::FilePathType::Directory);
bool dir_created = util::try_make_dir(user_path); util::try_make_dir(user_path);
if (dir_created && user_info) {
// Add a text file in the user directory containing the user identity, for backup purposes.
// Only do this the first time the directory is created.
auto info_path = util::file_path_by_appending_component(user_path, c_user_info_file);
std::ofstream info_file;
info_file.open(info_path.c_str());
if (info_file.is_open()) {
info_file << user_info->user_id << "\n" << user_info->auth_server_url << "\n";
info_file.close();
}
}
return user_path; return user_path;
} }
...@@ -335,8 +321,7 @@ bool SyncFileManager::remove_realm(const std::string& local_identity, const std: ...@@ -335,8 +321,7 @@ bool SyncFileManager::remove_realm(const std::string& local_identity, const std:
return remove_realm(realm_path); return remove_realm(realm_path);
} }
std::string SyncFileManager::path(const std::string& local_identity, const std::string& raw_realm_path, std::string SyncFileManager::path(const std::string& local_identity, const std::string& raw_realm_path) const
util::Optional<SyncUserIdentifier> user_info) const
{ {
REALM_ASSERT(local_identity.length() > 0); REALM_ASSERT(local_identity.length() > 0);
REALM_ASSERT(raw_realm_path.length() > 0); REALM_ASSERT(raw_realm_path.length() > 0);
...@@ -344,8 +329,7 @@ std::string SyncFileManager::path(const std::string& local_identity, const std:: ...@@ -344,8 +329,7 @@ std::string SyncFileManager::path(const std::string& local_identity, const std::
throw std::invalid_argument("A user or Realm can't have an identifier reserved by the filesystem."); throw std::invalid_argument("A user or Realm can't have an identifier reserved by the filesystem.");
auto escaped = util::make_percent_encoded_string(raw_realm_path); auto escaped = util::make_percent_encoded_string(raw_realm_path);
auto realm_path = util::file_path_by_appending_component(user_directory(local_identity, user_info), escaped); return util::file_path_by_appending_component(user_directory(local_identity), escaped);
return realm_path;
} }
std::string SyncFileManager::metadata_path() const std::string SyncFileManager::metadata_path() const
......
...@@ -157,6 +157,23 @@ SyncMetadataManager::SyncMetadataManager(std::string path, ...@@ -157,6 +157,23 @@ SyncMetadataManager::SyncMetadataManager(std::string path,
}; };
m_metadata_config = std::move(config); m_metadata_config = std::move(config);
m_client_uuid = [&]() -> std::string {
TableRef table = ObjectStore::table_for_object_type(realm->read_group(), c_sync_clientMetadata);
if (table->is_empty()) {
realm->begin_transaction();
if (table->is_empty()) {
size_t idx = table->add_empty_row();
REALM_ASSERT_DEBUG(idx == 0);
auto uuid = uuid_string();
table->set_string(m_client_schema.idx_uuid, idx, uuid);
realm->commit_transaction();
return uuid;
}
realm->cancel_transaction();
}
return table->get_string(m_client_schema.idx_uuid, 0);
}();
} }
SyncUserMetadataResults SyncMetadataManager::all_unmarked_users() const SyncUserMetadataResults SyncMetadataManager::all_unmarked_users() const
...@@ -309,26 +326,6 @@ util::Optional<SyncFileActionMetadata> SyncMetadataManager::get_file_action_meta ...@@ -309,26 +326,6 @@ util::Optional<SyncFileActionMetadata> SyncMetadataManager::get_file_action_meta
return SyncFileActionMetadata(std::move(schema), std::move(realm), table->get(row_idx)); return SyncFileActionMetadata(std::move(schema), std::move(realm), table->get(row_idx));
} }
std::string SyncMetadataManager::client_uuid() const
{
auto realm = Realm::get_shared_realm(m_metadata_config);
TableRef table = ObjectStore::table_for_object_type(realm->read_group(), c_sync_clientMetadata);
if (table->is_empty()) {
realm->begin_transaction();
if (table->is_empty()) {
size_t idx = table->add_empty_row();
REALM_ASSERT_DEBUG(idx == 0);
auto uuid = uuid_string();
table->set_string(m_client_schema.idx_uuid, idx, uuid);
realm->commit_transaction();
return uuid;
}
realm->cancel_transaction();
}
return table->get_string(m_client_schema.idx_uuid, 0);
}
// MARK: - Sync user metadata // MARK: - Sync user metadata
SyncUserMetadata::SyncUserMetadata(Schema schema, SharedRealm realm, RowExpr row) SyncUserMetadata::SyncUserMetadata(Schema schema, SharedRealm realm, RowExpr row)
......
...@@ -27,8 +27,16 @@ namespace realm { ...@@ -27,8 +27,16 @@ namespace realm {
std::string SyncConfig::partial_sync_identifier(const SyncUser& user) std::string SyncConfig::partial_sync_identifier(const SyncUser& user)
{ {
std::string raw_identifier = SyncManager::shared().client_uuid() + "/" + user.local_identity(); std::string raw_identifier = SyncManager::shared().client_uuid() + "/" + user.local_identity();
// The type of the argument to sha1() changed in sync 3.11.1. Implicitly
// convert to either char or unsigned char so that both signatures work.
struct cast {
uint8_t* value;
operator uint8_t*() { return value; }
operator char*() { return reinterpret_cast<char*>(value); }
};
uint8_t identifier[20]; uint8_t identifier[20];
sync::crypto::sha1(raw_identifier.data(), raw_identifier.size(), (char *)&identifier[0]); sync::crypto::sha1(raw_identifier.data(), raw_identifier.size(), cast{&identifier[0]});
std::stringstream ss; std::stringstream ss;
ss << std::hex << std::setfill('0'); ss << std::hex << std::setfill('0');
......
...@@ -403,12 +403,7 @@ std::string SyncManager::path_for_realm(const SyncUser& user, const std::string& ...@@ -403,12 +403,7 @@ std::string SyncManager::path_for_realm(const SyncUser& user, const std::string&
{ {
std::lock_guard<std::mutex> lock(m_file_system_mutex); std::lock_guard<std::mutex> lock(m_file_system_mutex);
REALM_ASSERT(m_file_manager); REALM_ASSERT(m_file_manager);
const auto& user_local_identity = user.local_identity(); return m_file_manager->path(user.local_identity(), raw_realm_url);
util::Optional<SyncUserIdentifier> user_info;
if (user.token_type() == SyncUser::TokenType::Normal)
user_info = SyncUserIdentifier{ user.identity(), user.server_url() };
return m_file_manager->path(user_local_identity, raw_realm_url, std::move(user_info));
} }
std::string SyncManager::recovery_directory_path() const std::string SyncManager::recovery_directory_path() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment