Commit a6057915 by SunARcTech2

Fix issues

parent cb84b66a
No preview for this file type
......@@ -7,7 +7,7 @@
<key>Bhagyashree.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
<integer>34</integer>
</dict>
</dict>
</dict>
......
......@@ -9,13 +9,13 @@
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Appointment/AppointmentExt.swift"
timestampString = "559566819.66458"
filePath = "Bhagyashree/Sunarc/Controller/Appointment/CompletedServicesViewController.swift"
timestampString = "560762814.7603379"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "25"
endingLineNumber = "25"
landmarkName = "getAppointmentDetails(incrementId:success:failure:)"
startingLineNumber = "128"
endingLineNumber = "128"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
......@@ -25,13 +25,13 @@
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Appointment/Appointment.swift"
timestampString = "558792923.172263"
filePath = "Bhagyashree/Sunarc/Controller/Appointment/OnGoingServicesViewController.swift"
timestampString = "560762814.760757"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "38"
endingLineNumber = "38"
landmarkName = "initWithJSON(json:)"
startingLineNumber = "133"
endingLineNumber = "133"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
......@@ -41,13 +41,13 @@
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Model/Me/OrderDetailsExt.swift"
timestampString = "559480213.945861"
filePath = "Bhagyashree/Sunarc/Controller/Appointment/ServicesListViewController.swift"
timestampString = "560761689.705489"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "22"
endingLineNumber = "22"
landmarkName = "getOrderDetail(incrementId:success:failure:)"
startingLineNumber = "128"
endingLineNumber = "128"
landmarkName = "tableView(_:didSelectRowAt:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
......@@ -57,13 +57,93 @@
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Bhagyashree/Sunarc/Other/HTTP/HTTP.swift"
timestampString = "559213005.3192461"
filePath = "Bhagyashree/Sunarc/Controller/Appointment/ProcessingViewController.swift"
timestampString = "560762814.760976"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "326"
endingLineNumber = "326"
landmarkName = "uploadFileTmp(withThumbNail:api:filePath:type:result:)"
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/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">
</BreakpointContent>
</BreakpointProxy>
......
No preview for this file type
......@@ -15,8 +15,8 @@ var DEFAULT_WEBSITE_ID = "1"
var BASE_DOMAIN = "http://18.136.9.203" // test
//var BASE_DOMAIN = "http://54.251.144.17" // dev
//var BASE_DOMAIN = "http://18.136.9.203" // test
var BASE_DOMAIN = "http://54.251.144.17" // dev
//var BASE_DOMAIN = "http://13.251.93.24"
var HOST_NAME = BASE_DOMAIN+"/index.php/"
......
......@@ -25,7 +25,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
var window: UIWindow?
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
UIPasteboard.general.string = fcmToken
// UIPasteboard.general.string = fcmToken
print(fcmToken)
deviceTokenData = fcmToken
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 @@
<key>AD_UNIT_ID_FOR_INTERSTITIAL_TEST</key>
<string>ca-app-pub-3940256099942544/4411468910</string>
<key>CLIENT_ID</key>
<string>360669556539-gjg3t78lg0vnaqcis9o26vsrii77d9qn.apps.googleusercontent.com</string>
<string>360669556539-tr24dr2sh481mum3ijjkassug7p7l04p.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.360669556539-gjg3t78lg0vnaqcis9o26vsrii77d9qn</string>
<string>com.googleusercontent.apps.360669556539-tr24dr2sh481mum3ijjkassug7p7l04p</string>
<key>API_KEY</key>
<string>AIzaSyBbcoObffadmduuSAhDozLyWbyiqg7Mf9s</string>
<key>GCM_SENDER_ID</key>
......@@ -17,7 +17,7 @@
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.gdi.yuanzhongsiu-seller</string>
<string>com.gdi.yuanzhongsiuseller</string>
<key>PROJECT_ID</key>
<string>fengshui-customer</string>
<key>STORAGE_BUCKET</key>
......@@ -33,7 +33,7 @@
<key>IS_SIGNIN_ENABLED</key>
<true/>
<key>GOOGLE_APP_ID</key>
<string>1:360669556539:ios:84a8dd99e8502ac3</string>
<string>1:360669556539:ios:53c921650750ae37</string>
<key>DATABASE_URL</key>
<string>https://fengshui-customer.firebaseio.com</string>
</dict>
......
......@@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>16</string>
<string>1</string>
<key>Fabric</key>
<dict>
<key>APIKey</key>
......
......@@ -101,12 +101,17 @@ extension CompletedServicesViewController: UITableViewDelegate, UITableViewDataS
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
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]
if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .completed
appointmentdetails.orderStatus = .COMPLETE
// appointmentdetails.serviceStatus = .completed
appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
......@@ -101,12 +101,17 @@ extension InvalidServicesViewController: UITableViewDelegate, UITableViewDataSou
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
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]
if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .completed
appointmentdetails.orderStatus = .CLOSED
// appointmentdetails.serviceStatus = .completed
appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
......@@ -101,6 +101,10 @@ extension OnGoingServicesViewController: UITableViewDelegate, UITableViewDataSou
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
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]
......
......@@ -101,12 +101,17 @@ extension ProcessingViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
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]
if selectedService.serviceType == .BOOKING {
let appointmentdetails = Utils.viewController(storyboardName: "Appointment", ofType: ServiceDetailViewController.self)
appointmentdetails.serviceStatus = .tbc
appointmentdetails.orderStatus = .PROCESSING
// appointmentdetails.serviceStatus = .tbc
appointmentdetails.incrementId = selectedService.incrementId
appointmentdetails.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
......
......@@ -25,6 +25,12 @@ class VideoCallingViewController: UIViewController {
override func 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()
setupVideo()
setupLocalVideo()
......
......@@ -53,7 +53,7 @@ class BedSettingDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -49,7 +49,7 @@ class CompanyMovingDateSelectionViewController: BaseViewController {
self.txtShareholders.text = option.value
} else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -51,7 +51,7 @@ class GodSettingDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -47,7 +47,7 @@ class GroundbreakingDateSelectionViewController: BaseViewController {
self.btnMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Days" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -53,7 +53,7 @@ class HouseMovingDateSelectionViewController: BaseViewController {
} else if option.option == "Expected Month" {
self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -92,7 +92,7 @@ class MarriageDateSelectionViewController: BaseViewController {
} else if option.option == "Expected Month" {
self.btnMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Day" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -60,7 +60,7 @@ class RegsirationDateSelectionViewController: BaseViewController {
self.btnExpectedMonth.setTitle(option.value, for: .normal)
} else if option.option == "Expected Days" {
if option.value.lowercased() == "weekday" {
if option.value!.lowercased() == "weekday" {
self.imgWeekDay.image = UIImage(named: "radioOn")
} else {
self.imgWeekend.image = UIImage(named: "radioOn")
......
......@@ -62,12 +62,12 @@ class FloorPlanFengshuiViewController: UIViewController {
self.txtRemarks.text = option.value
} 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)
} 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)
......
//
// 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 {
} else if option.option == "Characters (do not want to be used)" {
self.txtCharectorsDoNotWantToUse.text = option.value
} else if option.option == "Owner Gender" {
if option.value.lowercased() == "male" {
if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn")
} else {
self.imgFemale.image = UIImage(named: "radioOn")
......
......@@ -57,7 +57,7 @@ class CompanyReNamingServiceViewController: BaseViewController {
self.txtCharectorsDoNotWantToUse.text = option.value
} else if option.option == "Owner Gender" {
if option.value.lowercased() == "male" {
if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn")
} else {
self.imgFemale.image = UIImage(named: "radioOff")
......
......@@ -61,7 +61,7 @@ class IndividualNamingServiceViewController: BaseViewController {
self.txtBOD.text = option.value
} else if option.option == "Gender" {
if option.value.lowercased() == "male" {
if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn")
} else {
self.imgFemale.image = UIImage(named: "radioOn")
......
......@@ -52,7 +52,7 @@ class IndividualReNamingServiceViewController: BaseViewController {
self.txtBOD.text = option.value
} else if option.option == "Gender" {
if option.value.lowercased() == "male" {
if option.value!.lowercased() == "male" {
self.imgMale.image = UIImage(named: "radioOn")
} else {
self.imgFemale.image = UIImage(named: "radioOff")
......
......@@ -101,6 +101,8 @@ extension CompleteEnquiryViewController: UITableViewDataSource, UITableViewDeleg
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = enquiry.enquiries[indexPath.row].incrementId!
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)
}
}
......
......@@ -16,6 +16,8 @@ class FAQDetailsViewController: UIViewController {
var orderId: String = ""
var incrementId: String = ""
let orderDetails = OrderDetails()
var customerName: String?
var customerImage: String?
override func viewDidLoad() {
super.viewDidLoad()
......@@ -43,8 +45,8 @@ class FAQDetailsViewController: UIViewController {
let chatVC = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self)
chatVC.orderId = orderId
chatVC.customerId = orderDetails.customerId ?? ""
chatVC.customerName = orderDetails.customerName ?? ""
chatVC.customerProfileImage = orderDetails.customerImage
chatVC.customerName = customerName ?? ""
chatVC.customerProfileImage = customerImage ?? ""
chatVC.isOrderCompleted = true
self.navigationController?.pushViewController(chatVC, animated: true)
}
......@@ -71,6 +73,8 @@ extension FAQDetailsViewController: UITableViewDelegate, UITableViewDataSource {
if indexPath.section == 0 {
let oderdetailCell = tableView.dequeueReusableCell(withIdentifier: "OrderdetailCell", for: indexPath) as! OrderdetailCell
oderdetailCell.customerName = customerName
oderdetailCell.customerImage = customerImage
oderdetailCell.orderDetilas = orderDetails
return oderdetailCell
} else if indexPath.section == 1 {
......@@ -116,18 +120,20 @@ class OrderdetailCell: UITableViewCell {
@IBOutlet var lblPrice: UILabel!
@IBOutlet var lblDateTime: UILabel!
@IBOutlet var imgSellerImage: UIImageView!
var customerName: String?
var customerImage: String?
var orderDetilas: OrderDetails? {
didSet {
if let orderDetilas = orderDetilas {
self.lblMasterName.text = orderDetilas.customerName
self.lblMasterName.text = customerName
self.lblPrice.text = orderDetilas.price
self.lblDateTime.text = orderDetilas.orderDate
if let image = orderDetilas.customerImage {
if let image = customerImage {
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)
}
......@@ -162,24 +168,25 @@ class FAQReviewCell: UITableViewCell {
if let rating = serviceReview.rating {
let ratingAsInt = Int(rating)
if ratingAsInt! > 0 {
imgRating1.image = UIImage(named: "star")
}
if ratingAsInt! > 1 {
imgRating2.image = UIImage(named: "star")
}
if ratingAsInt! > 2 {
imgRating3.image = UIImage(named: "star")
}
if ratingAsInt! > 3 {
imgRating4.image = UIImage(named: "star")
}
if ratingAsInt! > 4 {
imgRating5.image = UIImage(named: "star")
if let ratingAsInt = Int(rating) {
if ratingAsInt > 0 {
imgRating1.image = UIImage(named: "star")
}
if ratingAsInt > 1 {
imgRating2.image = UIImage(named: "star")
}
if ratingAsInt > 2 {
imgRating3.image = UIImage(named: "star")
}
if ratingAsInt > 3 {
imgRating4.image = UIImage(named: "star")
}
if ratingAsInt > 4 {
imgRating5.image = UIImage(named: "star")
}
}
}
}
......
......@@ -153,7 +153,7 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
self.navigationController?.pushViewController(videoCallVC, animated: true)
} else {
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.orderId = order.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
......@@ -172,22 +172,39 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = order.incrementId!
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)
}
} else if order.products.first?.serviceType == .FORM{
if order.status == .COMPLETE {
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.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)
}
let formVC = Utils.viewController(storyboardName: "Forms", ofType: FormViewController.self)
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 {
self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false)
......@@ -197,6 +214,8 @@ extension HomePageViewController: UITableViewDelegate, UITableViewDataSource {
}
extension HomePageViewController: SellerProfileCellDelegate{
func showToast(message: String) {
self.view.showToast(message, position: .bottom, popTime: 2.0, dismissOnTap: false)
......@@ -300,7 +319,6 @@ class RecentServicesCell: UITableViewCell {
case .ONGOING:
self.imgStatus.image = UIImage(named: "service_ongoing")
}
if let profileImage = recentOrder.customerDetail.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)
......
......@@ -10,28 +10,28 @@ import UIKit
import SVProgressHUD
import ImageSlideshow
import Kingfisher
import SDWebImage
import INSPhotoGallery
class CorporateCultureViewController: BaseViewController {
var videoPlayerViewController: VideoPlayerViewController!
class CorporateCultureViewController: BaseViewController {
@IBOutlet var tblCorporateCulture: UITableView!
var videoPlayerViewController: VideoPlayerViewController!
let corporateCulture = CorporateCulture()
var contentCellHeight: CGFloat = 0.0
@IBOutlet var slideshow: ImageSlideshow!
// var bannerImages = [Kingfishers]()
override func viewDidLoad() {
super.viewDidLoad()
SVProgressHUD.show()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
corporateCulture.getCorporateCulture(success: {
SVProgressHUD.dismiss()
self.tblCorporateCulture.reloadData()
......@@ -43,7 +43,7 @@ class CorporateCultureViewController: BaseViewController {
}
}
......@@ -63,14 +63,22 @@ extension CorporateCultureViewController: VideoPlayerViewControllerDelegate {
}
extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSource {
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 {
if indexPath.row == 0 {
return UITableViewCell()
let bannerCell = tableView.dequeueReusableCell(withIdentifier: "CorporateCultureBannerCell") as! CorporateCultureBannerCell
bannerCell.banners = corporateCulture.banners
bannerCell.addPlaybuttons()
return bannerCell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "corporateCultureContent", for: indexPath) as! CorporateCultureContentCell
cell.content = corporateCulture.content
......@@ -87,7 +95,7 @@ extension CorporateCultureViewController: UITableViewDelegate, UITableViewDataSo
return UITableViewAutomaticDimension
}
}
}
extension CorporateCultureViewController: CorporateCultureContentCellDelegate {
......@@ -132,9 +140,111 @@ class CorporateCultureContentCell: UITableViewCell, UIWebViewDelegate {
}
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
if selectedService.serviceType == .BOOKING {
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.orderId = selectedService.orderId
self.navigationController?.pushViewController(appointmentdetails, animated: true)
......@@ -136,21 +157,39 @@ extension MyAllServiceOrderViewController: UITableViewDelegate, UITableViewDataS
let chatViewController = Utils.viewController(storyboardName: "Home", ofType: OnlineEnquiryViewController.self)
if let orderId = selectedService.orderId {
chatViewController.orderId = orderId
chatViewController.customerId = selectedService.customerId!
self.navigationController?.pushViewController(chatViewController, animated: true)
if let customerId = selectedService.customerId {
chatViewController.customerId = customerId
self.navigationController?.pushViewController(chatViewController, animated: true)
}
}
} else {
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = selectedService.incrementId!
enquiryDetailsViewController.orderId = selectedService.orderId!
enquiryDetailsViewController.customerImage = service.services[indexPath.row].customerProfileImage
enquiryDetailsViewController.customerName = service.services[indexPath.row].customerName
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
}
} else if selectedService.serviceType == .FORM{
if let form = Form.VC(with: selectedService.incrementId!, orderId: selectedService.orderId!, categoryType: selectedService.categoryType) {
self.navigationController?.pushViewController(form, animated: true)
if selectedService.status == .COMPLETE {
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 {
self.view.showToast("Unknown service", position: .bottom, popTime: 2.0, dismissOnTap: false)
}
......
......@@ -121,6 +121,8 @@ extension MyCompletedOrdersViewController: UITableViewDelegate, UITableViewDataS
let enquiryDetailsViewController = Utils.viewController(storyboardName: "Home", ofType: FAQDetailsViewController.self)
enquiryDetailsViewController.incrementId = selectedService.incrementId!
enquiryDetailsViewController.orderId = selectedService.orderId!
enquiryDetailsViewController.customerImage = service.services[indexPath.row].customerProfileImage
enquiryDetailsViewController.customerName = service.services[indexPath.row].customerName
self.navigationController?.pushViewController(enquiryDetailsViewController, animated: true)
}
......
......@@ -35,8 +35,6 @@ class Appointment {
func initWithJSON(json: Any) {
print(json)
if let response = json as? [String: Any] {
self.customerId = response["customer_Id"] as? String
self.customerName = response["buyerName"] as? String
......@@ -102,6 +100,7 @@ class Appointment {
self.masterReply = masterReply
}
if let images = json["reply_image"] as? [String] {
self.images = ""
for image in images {
self.images = self.images + "," + image
......@@ -115,9 +114,11 @@ class Appointment {
for audio in audios {
self.audio = self.audio + "," + audio
}
if self.audio.count > 0 {
self.audio.removeLast()
self.audio.removeFirst()
}
}
if let products = json["products"] as? [[String: Any]] {
for productJSON in products {
......@@ -158,8 +159,9 @@ class Appointment {
bookingTillSlot = dateComponentsBookingTill![2]
}
let finalDateString = bookingDate + "," + bookingFromsSlot + " -" + bookingTillSlot
return bookingDate + "," + bookingFromsSlot + "-" + bookingTillSlot
return finalDateString
}
}
......
......@@ -69,15 +69,28 @@ class FormDetail {
enum CustomOptionValue: String {
case image
case text
}
class CustomOption {
var option: String
var value: String
var option: String?
var value: String?
var optionType: CustomOptionValue = .text
init(json: [String: Any]) {
self.option = json["label"] as! String
self.value = json["value"] as! String
self.option = json["label"] 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 {
}
private func corporateCultureContent(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) {
......@@ -42,9 +42,9 @@ extension CorporateCulture {
}, failure: { (errorMessage) in
failure(errorMessage)
})
}
private func corporateCultureBanners(success: @escaping () -> Void, failure: @escaping (_ error: String) -> Void ) {
......@@ -54,6 +54,8 @@ extension CorporateCulture {
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 validResponse.count > 0 {
......@@ -86,5 +88,5 @@ extension CorporateCulture {
}
}
}
......@@ -19,7 +19,6 @@ extension OrderDetails {
params["incrementId"] = incrementId
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 orderData = json["orderData"] as? [String: Any] {
if let itemList = orderData["itemList"] as? [[String: Any]] {
......@@ -28,6 +27,7 @@ extension OrderDetails {
}
}
}
if let orderDate = json["orderDate"] as? String {
self.orderDate = orderDate
}
......
......@@ -9,4 +9,5 @@
import Foundation
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
extension Object {
func save() {
try! DB.shared.realm.write {
DB.shared.realm.add(self, update: true)
}
}
func delete() {
try! DB.shared.realm.write {
DB.shared.realm.delete(self)
}
}
}
extension Realm {
class func deleteAll<Element: Object>(_ type: Element.Type) {
try! DB.shared.realm.write {
DB.shared.realm.delete(DB.shared.realm.objects(type))
}
}
}
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for i in 0 ..< count {
if let result = self[i] as? T {
array.append(result)
}
}
return array
}
}
extension List {
func add(object: Element) {
try! DB.shared.realm.write {
_rlmArray.add(object as AnyObject)
}
}
}
//extension Object {
//
// func save() {
// try! DB.shared.realm.write {
// DB.shared.realm.add(self, update: true)
// }
// }
//
// func delete() {
// try! DB.shared.realm.write {
// DB.shared.realm.delete(self)
// }
// }
//
//
//}
//
//
//
//
//
//
//
//
//extension Realm {
//
// class func deleteAll<Element: Object>(_ type: Element.Type) {
// try! DB.shared.realm.write {
// DB.shared.realm.delete(DB.shared.realm.objects(type))
// }
// }
//
//}
//
//
//
//
//
//
//
//
//extension Results {
// func toArray<T>(ofType: T.Type) -> [T] {
// var array = [T]()
// for i in 0 ..< count {
// if let result = self[i] as? T {
// array.append(result)
// }
// }
//
// return array
// }
//}
//
//
//
//
//
//
//
//
//
//extension List {
// func add(object: Element) {
// try! DB.shared.realm.write {
// _rlmArray.add(object as AnyObject)
// }
// }
//}
......
......@@ -41,7 +41,7 @@ class API {
static let RECOMEND_PRODUCTS = "/rest/V1/seller/recommendedproducts?page="
static let UPDATE_RESULT = "/rest/V1/service/saveResult"
static let UPDATE_ORDER = "rest/V1/service/updateorder"
static let VIDEO_CALLING_STATUS = "rest/V1/callingstatus/"
// Notification
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
pod 'BufferSlider', '0.1.6'
pod 'EasyToast', '2.0'
pod 'TimeAgoInWords', '3.0'
pod 'RealmSwift', '3.3.0'
pod 'MJRefresh', '3.1.14.1'
pod 'RealmSwift'
pod 'SVProgressHUD', '2.0.3'
pod 'SwiftDate', '4.4.1'
pod 'Kingfisher', '4.7.0'
pod 'Fabric'
pod 'Crashlytics'
pod 'ImageSlideshow'
pod 'ImageSlideshow/Kingfisher'
pod 'Firebase/Core'
pod 'Firebase/Storage'
pod 'Firebase/Auth'
......@@ -25,4 +24,5 @@ target 'Bhagyashree' do
pod 'Firebase/Messaging'
pod 'AgoraRtcEngine_iOS', '2.2.0'
pod 'INSPhotoGallery', '1.2.5'
pod 'ImageSlideshow/SDWebImage'
end
......@@ -51,12 +51,12 @@ PODS:
- "GoogleToolboxForMac/NSData+zlib (2.1.4)":
- GoogleToolboxForMac/Defines (= 2.1.4)
- GTMSessionFetcher/Core (1.1.15)
- ImageSlideshow (1.5.3):
- ImageSlideshow/Core (= 1.5.3)
- ImageSlideshow/Core (1.5.3)
- ImageSlideshow/Kingfisher (1.5.3):
- ImageSlideshow (1.7.0):
- ImageSlideshow/Core (= 1.7.0)
- ImageSlideshow/Core (1.7.0)
- ImageSlideshow/SDWebImage (1.7.0):
- ImageSlideshow/Core
- Kingfisher (> 3.0)
- SDWebImage (< 5.0, >= 3.7)
- INSPhotoGallery (1.2.5)
- IQKeyboardManagerSwift (5.0.8)
- Kingfisher (4.7.0)
......@@ -69,11 +69,14 @@ PODS:
- nanopb/encode (0.3.8)
- Pastel (0.3.0)
- Protobuf (3.5.0)
- Realm (3.3.0):
- Realm/Headers (= 3.3.0)
- Realm/Headers (3.3.0)
- RealmSwift (3.3.0):
- Realm (= 3.3.0)
- Realm (3.11.0):
- Realm/Headers (= 3.11.0)
- Realm/Headers (3.11.0)
- RealmSwift (3.11.0):
- Realm (= 3.11.0)
- SDWebImage (4.4.2):
- SDWebImage/Core (= 4.4.2)
- SDWebImage/Core (4.4.2)
- SVProgressHUD (2.0.3)
- SwiftDate (4.4.1)
- TimeAgoInWords (3.0.0)
......@@ -91,13 +94,13 @@ DEPENDENCIES:
- Firebase/Messaging
- Firebase/Storage
- ImageSlideshow
- ImageSlideshow/Kingfisher
- ImageSlideshow/SDWebImage
- INSPhotoGallery (= 1.2.5)
- IQKeyboardManagerSwift (= 5.0.8)
- Kingfisher (= 4.7.0)
- MJRefresh (= 3.1.14.1)
- Pastel
- RealmSwift (= 3.3.0)
- RealmSwift
- SVProgressHUD (= 2.0.3)
- SwiftDate (= 4.4.1)
- TimeAgoInWords (= 3.0)
......@@ -131,6 +134,7 @@ SPEC REPOS:
- Protobuf
- Realm
- RealmSwift
- SDWebImage
- SVProgressHUD
- SwiftDate
- TimeAgoInWords
......@@ -152,7 +156,7 @@ SPEC CHECKSUMS:
FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b
GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f
GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2
ImageSlideshow: 24a1184909f589379ba2527ebcc77996881bb1f2
ImageSlideshow: f8eec5e37a980f60923b585ff23b0e140fd24018
INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b
IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97
Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6
......@@ -161,13 +165,14 @@ SPEC CHECKSUMS:
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262
Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03
Realm: 7d74ad6c5020432f58fe5e1df90bb6d97b2c7fef
RealmSwift: b2fa31a09c22e246026766557405505eeaad2b01
Realm: 92f09a102692b96a9a10e9617f214f15c5ab85fc
RealmSwift: 5f0481cd658bb751c509314b964a35eaa264d2cf
SDWebImage: 624d6e296c69b244bcede364c72ae0430ac14681
SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4
SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d
TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f
WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2
PODFILE CHECKSUM: c0ec16ebb21736417bd47618790d9417fe8f19e1
PODFILE CHECKSUM: b6f207ed2b3bdfffa120ec5a7ace2cc3ad6fb769
COCOAPODS: 1.5.3
......@@ -31,11 +31,11 @@ extension UIActivityIndicatorView: ActivityIndicatorView {
}
public func show() {
self.startAnimating()
startAnimating()
}
public func hide() {
self.stopAnimating()
stopAnimating()
}
}
......@@ -43,7 +43,8 @@ extension UIActivityIndicatorView: ActivityIndicatorView {
@objcMembers
open class DefaultActivityIndicator: ActivityIndicatorFactory {
/// activity indicator style
open var style: UIActivityIndicatorViewStyle
open var style: UIActivityIndicatorView.Style
/// activity indicator color
open var color: UIColor?
......@@ -51,14 +52,18 @@ open class DefaultActivityIndicator: ActivityIndicatorFactory {
///
/// - style: activity indicator style
/// - 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.color = color
}
/// create ActivityIndicatorView instance
open func create() -> ActivityIndicatorView {
#if swift(>=4.2)
let activityIndicator = UIActivityIndicatorView(style: style)
#else
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: style)
#endif
activityIndicator.color = color
activityIndicator.hidesWhenStopped = true
......
......@@ -14,7 +14,7 @@ open class FullScreenSlideshowViewController: UIViewController {
let slideshow = ImageSlideshow()
slideshow.zoomEnabled = true
slideshow.contentScaleMode = UIViewContentMode.scaleAspectFit
slideshow.pageControlPosition = PageControlPosition.insideScrollView
slideshow.pageIndicatorPosition = PageIndicatorPosition(horizontal: .center, vertical: .bottom)
// turns off the timer
slideshow.slideshowInterval = 0
slideshow.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
......@@ -62,7 +62,7 @@ open class FullScreenSlideshowViewController: UIViewController {
view.addSubview(slideshow)
// 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)
view.addSubview(closeButton)
}
......
......@@ -12,19 +12,19 @@ import UIKit
open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate {
/// 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
open let activityIndicator: ActivityIndicatorView?
public let activityIndicator: ActivityIndicatorView?
/// Input Source for the item
open let image: InputSource
public let image: InputSource
/// Guesture recognizer to detect double tap to zoom
open var gestureRecognizer: UITapGestureRecognizer?
/// Holds if the zoom feature is enabled
open let zoomEnabled: Bool
public let zoomEnabled: Bool
/// If set to true image is initially zoomed in
open var zoomInInitially = false
......@@ -125,12 +125,16 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate {
isLoading = true
imageReleased = false
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
self.imageView.image = self.imageReleased ? nil : image
self.activityIndicator?.hide()
self.loadFailed = image == nil
self.isLoading = false
if let imageRelease = self?.imageReleased, imageRelease {
self?.imageView.image = nil
}else{
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
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 {
interactionController = UIPercentDrivenInteractiveTransition()
......@@ -76,7 +76,7 @@ open class ZoomAnimatedTransitioningDelegate: NSObject, UIViewControllerTransiti
} else if gesture.state == .ended || gesture.state == .cancelled || gesture.state == .failed {
let velocity = gesture.velocity(in: referenceSlideshowView)
if fabs(velocity.y) > 500 {
if abs(velocity.y) > 500 {
if let pageSelected = referenceSlideshowController.pageSelected {
pageSelected(referenceSlideshowController.slideshow.currentPage)
}
......@@ -141,7 +141,7 @@ extension ZoomAnimatedTransitioningDelegate: UIGestureRecognizerDelegate {
if let view = gestureRecognizer.view {
let velocity = gestureRecognizer.velocity(in: view)
return fabs(velocity.x) < fabs(velocity.y)
return abs(velocity.x) < abs(velocity.y)
}
return true
......@@ -192,8 +192,14 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
let transitionBackgroundView = UIView(frame: containerView.frame)
transitionBackgroundView.backgroundColor = toViewController.backgroundColor
containerView.addSubview(transitionBackgroundView)
#if swift(>=4.2)
containerView.sendSubviewToBack(transitionBackgroundView)
#else
containerView.sendSubview(toBack: transitionBackgroundView)
#endif
let finalFrame = toViewController.view.frame
var transitionView: UIImageView?
......@@ -223,9 +229,9 @@ class ZoomInAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
fromViewController.view.alpha = 0
transitionView?.frame = transitionViewFinalFrame
transitionView?.center = CGPoint(x: finalFrame.midX, y: finalFrame.midY)
}, completion: {(_) in
}, completion: {[ref = self.referenceImageView] _ in
fromViewController.view.alpha = 1
self.referenceImageView?.alpha = 1
ref?.alpha = 1
transitionView?.removeFromSuperview()
transitionBackgroundView.removeFromSuperview()
containerView.addSubview(toViewController.view)
......@@ -270,8 +276,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
toViewController.view.frame = transitionContext.finalFrame(for: toViewController)
toViewController.view.alpha = 0
containerView.addSubview(toViewController.view)
#if swift(>=4.2)
containerView.sendSubviewToBack(toViewController.view)
#else
containerView.sendSubview(toBack: toViewController.view)
#endif
var transitionViewInitialFrame: CGRect
if let currentSlideshowItem = fromViewController.slideshow.currentSlideshowItem {
if let image = currentSlideshowItem.imageView.image {
......@@ -307,7 +316,11 @@ class ZoomOutAnimator: ZoomAnimator, UIViewControllerAnimatedTransitioning {
let transitionBackgroundView = UIView(frame: containerView.frame)
transitionBackgroundView.backgroundColor = fromViewController.backgroundColor
containerView.addSubview(transitionBackgroundView)
#if swift(>=4.2)
containerView.sendSubviewToBack(transitionBackgroundView)
#else
containerView.sendSubview(toBack: transitionBackgroundView)
#endif
let transitionView: UIImageView = UIImageView(image: fromViewController.slideshow.currentSlideshowItem?.imageView.image)
transitionView.contentMode = UIViewContentMode.scaleAspectFill
......
//
// KingfisherSource.swift
// SDWebImageSource.swift
// ImageSlideshow
//
// Created by feiin
// Created by Nik Kov on 06.07.16.
//
//
import Kingfisher
import SDWebImage
/// Input Source to image using Kingfisher
public class KingfisherSource: NSObject, InputSource {
/// Input Source to image using SDWebImage
@objcMembers
public class SDWebImageSource: NSObject, InputSource {
/// url to load
public var url: URL
/// placeholder used before image is loaded
public var placeholder: UIImage?
/// options for displaying, ie. [.transition(.fade(0.2))]
public var options: KingfisherOptionsInfo?
/// Initializes a new source with a URL
/// - parameter url: a url to be loaded
/// - parameter placeholder: a placeholder used before image is loaded
/// - parameter options: options for displaying
public init(url: URL, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil) {
public init(url: URL, placeholder: UIImage? = nil) {
self.url = url
self.placeholder = placeholder
self.options = options
super.init()
}
/// Initializes a new source with a URL string
/// - parameter urlString: a string url to load
/// - parameter placeholder: a placeholder used before image is loaded
/// - parameter options: options for displaying
public init?(urlString: String, placeholder: UIImage? = nil, options: KingfisherOptionsInfo? = nil) {
public init?(urlString: String, placeholder: UIImage? = nil) {
if let validUrl = URL(string: urlString) {
self.url = validUrl
self.placeholder = placeholder
self.options = options
super.init()
} else {
return nil
}
}
@objc 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
public func load(to imageView: UIImageView, with callback: @escaping (UIImage?) -> Void) {
imageView.sd_setImage(with: self.url, placeholderImage: self.placeholder, options: [], completed: { (image, _, _, _) in
callback(image)
}
})
}
public func cancelLoad(on imageView: UIImageView) {
imageView.kf.cancelDownloadTask()
imageView.sd_cancelCurrentImageLoad()
}
}
# 🖼 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)
[![Version](https://img.shields.io/cocoapods/v/ImageSlideshow.svg?style=flat)](http://cocoapods.org/pods/ImageSlideshow)
......@@ -8,7 +8,9 @@
[![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)
![](http://cl.ly/image/2v193I0G0h0Z/ImageSlideshow2.gif)
![](https://dzwonsemrish7.cloudfront.net/items/2R06283n040V3P3p0i42/ezgif.com-optimize.gif)
## 📱 Example
......@@ -21,14 +23,14 @@ ImageSlideshow is available through [CocoaPods](http://cocoapods.org). To instal
it, simply add the following line to your Podfile:
```ruby
pod 'ImageSlideshow', '~> 1.5'
pod 'ImageSlideshow', '~> 1.6'
```
### Carthage
To integrate ImageSlideshow into your Xcode project using Carthage, specify it in your Cartfile:
```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.
......@@ -77,7 +79,9 @@ Behaviour is configurable by those properties:
- ```slideshowInterval``` - slideshow interval in seconds (default `0` – disabled)
- ```zoomEnabled``` - enables zooming (default `false`)
- ```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`)
- ```draggingEnabled``` - enables dragging (default `true`)
- ```currentPageChanged``` - closure called on page change
......@@ -85,6 +89,37 @@ Behaviour is configurable by those properties:
- ```didEndDecelerating``` - closure called on scrollViewDidEndDecelerating
- ```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
By default activity indicator is not shown, but you can enable it by setting `DefaultActivityIndicator` instance to Image Slideshow:
......
......@@ -51,12 +51,12 @@ PODS:
- "GoogleToolboxForMac/NSData+zlib (2.1.4)":
- GoogleToolboxForMac/Defines (= 2.1.4)
- GTMSessionFetcher/Core (1.1.15)
- ImageSlideshow (1.5.3):
- ImageSlideshow/Core (= 1.5.3)
- ImageSlideshow/Core (1.5.3)
- ImageSlideshow/Kingfisher (1.5.3):
- ImageSlideshow (1.7.0):
- ImageSlideshow/Core (= 1.7.0)
- ImageSlideshow/Core (1.7.0)
- ImageSlideshow/SDWebImage (1.7.0):
- ImageSlideshow/Core
- Kingfisher (> 3.0)
- SDWebImage (< 5.0, >= 3.7)
- INSPhotoGallery (1.2.5)
- IQKeyboardManagerSwift (5.0.8)
- Kingfisher (4.7.0)
......@@ -69,11 +69,14 @@ PODS:
- nanopb/encode (0.3.8)
- Pastel (0.3.0)
- Protobuf (3.5.0)
- Realm (3.3.0):
- Realm/Headers (= 3.3.0)
- Realm/Headers (3.3.0)
- RealmSwift (3.3.0):
- Realm (= 3.3.0)
- Realm (3.11.0):
- Realm/Headers (= 3.11.0)
- Realm/Headers (3.11.0)
- RealmSwift (3.11.0):
- Realm (= 3.11.0)
- SDWebImage (4.4.2):
- SDWebImage/Core (= 4.4.2)
- SDWebImage/Core (4.4.2)
- SVProgressHUD (2.0.3)
- SwiftDate (4.4.1)
- TimeAgoInWords (3.0.0)
......@@ -91,13 +94,13 @@ DEPENDENCIES:
- Firebase/Messaging
- Firebase/Storage
- ImageSlideshow
- ImageSlideshow/Kingfisher
- ImageSlideshow/SDWebImage
- INSPhotoGallery (= 1.2.5)
- IQKeyboardManagerSwift (= 5.0.8)
- Kingfisher (= 4.7.0)
- MJRefresh (= 3.1.14.1)
- Pastel
- RealmSwift (= 3.3.0)
- RealmSwift
- SVProgressHUD (= 2.0.3)
- SwiftDate (= 4.4.1)
- TimeAgoInWords (= 3.0)
......@@ -131,6 +134,7 @@ SPEC REPOS:
- Protobuf
- Realm
- RealmSwift
- SDWebImage
- SVProgressHUD
- SwiftDate
- TimeAgoInWords
......@@ -152,7 +156,7 @@ SPEC CHECKSUMS:
FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b
GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f
GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2
ImageSlideshow: 24a1184909f589379ba2527ebcc77996881bb1f2
ImageSlideshow: f8eec5e37a980f60923b585ff23b0e140fd24018
INSPhotoGallery: 8bd5b434e70d06dd698085f8e865f6602d82014b
IQKeyboardManagerSwift: 2e7dc7f98c111458c1ea2b373f893e8cf95e2b97
Kingfisher: da6b005aa96d37698e3e4f1ccfe96a5b9bbf27d6
......@@ -161,13 +165,14 @@ SPEC CHECKSUMS:
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
Pastel: 738740c84f2b15bbcd96ebe99c4e6c2f5dd42262
Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03
Realm: 7d74ad6c5020432f58fe5e1df90bb6d97b2c7fef
RealmSwift: b2fa31a09c22e246026766557405505eeaad2b01
Realm: 92f09a102692b96a9a10e9617f214f15c5ab85fc
RealmSwift: 5f0481cd658bb751c509314b964a35eaa264d2cf
SDWebImage: 624d6e296c69b244bcede364c72ae0430ac14681
SVProgressHUD: b0830714205bea1317ea1a2ebc71e5633af334d4
SwiftDate: a70a534d4feed03b2a2b575e36bef82dc2286a8d
TimeAgoInWords: 633dbb30810de855333dedd1d5033d28b1ecfd6f
WMPageController: 9f219bb8912a1a1f51af11fde61e2682a7b7e7f2
PODFILE CHECKSUM: c0ec16ebb21736417bd47618790d9417fe8f19e1
PODFILE CHECKSUM: b6f207ed2b3bdfffa120ec5a7ace2cc3ad6fb769
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 @@
<dict>
<key>BufferSlider.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
<integer>6</integer>
</dict>
<key>EasyToast.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
<integer>7</integer>
</dict>
<key>FirebaseAuth.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
<integer>8</integer>
</dict>
<key>FirebaseCore.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
<integer>9</integer>
</dict>
<key>FirebaseDatabase.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
<integer>10</integer>
</dict>
<key>FirebaseMessaging.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
<integer>11</integer>
</dict>
<key>FirebaseStorage.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>13</integer>
<integer>12</integer>
</dict>
<key>GTMSessionFetcher.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>15</integer>
<integer>14</integer>
</dict>
<key>GoogleToolboxForMac.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>14</integer>
<integer>13</integer>
</dict>
<key>INSPhotoGallery-INSPhotoGallery.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>19</integer>
<integer>17</integer>
</dict>
<key>INSPhotoGallery.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>18</integer>
<integer>16</integer>
</dict>
<key>IQKeyboardManagerSwift.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>20</integer>
</dict>
<key>ImageSlideshow-ImageSlideshow.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>17</integer>
<integer>18</integer>
</dict>
<key>ImageSlideshow.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>16</integer>
<integer>15</integer>
</dict>
<key>Kingfisher.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>21</integer>
<integer>19</integer>
</dict>
<key>MJRefresh.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>23</integer>
<integer>21</integer>
</dict>
<key>Pastel.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>25</integer>
<integer>23</integer>
</dict>
<key>Pods-Bhagyashree.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>26</integer>
<integer>24</integer>
</dict>
<key>Protobuf.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>27</integer>
<integer>25</integer>
</dict>
<key>Realm.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>28</integer>
<integer>26</integer>
</dict>
<key>RealmSwift.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<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>
<key>SVProgressHUD.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>30</integer>
<integer>29</integer>
</dict>
<key>SwiftDate.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>31</integer>
<integer>30</integer>
</dict>
<key>TimeAgoInWords-TimeAgoInWords.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>33</integer>
<integer>32</integer>
</dict>
<key>TimeAgoInWords.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>32</integer>
<integer>31</integer>
</dict>
<key>WMPageController.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>34</integer>
<integer>33</integer>
</dict>
<key>leveldb-library.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>22</integer>
<integer>20</integer>
</dict>
<key>nanopb.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>24</integer>
<integer>22</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict/>
</dict>
</plist>
......@@ -117,7 +117,7 @@ bool ResultsNotifier::need_to_run()
void ResultsNotifier::calculate_changes()
{
size_t table_ndx = m_query->get_table()->get_index_in_group();
if (has_run()) {
if (has_run() && have_callbacks()) {
CollectionChangeBuilder* changes = nullptr;
if (table_ndx == npos)
changes = &m_changes;
......
......@@ -133,7 +133,7 @@ size_t Results::size()
case Mode::Query:
m_query.sync_view_if_needed();
if (!m_descriptor_ordering.will_apply_distinct())
return m_query.count();
return m_query.count(m_descriptor_ordering);
REALM_FALLTHROUGH;
case Mode::TableView:
evaluate_query_if_needed();
......@@ -259,17 +259,12 @@ void Results::evaluate_query_if_needed(bool wants_notifications)
return;
case Mode::Query:
m_query.sync_view_if_needed();
m_table_view = m_query.find_all();
if (!m_descriptor_ordering.is_empty()) {
m_table_view.apply_descriptor_ordering(m_descriptor_ordering);
}
m_table_view = m_query.find_all(m_descriptor_ordering);
m_mode = Mode::TableView;
REALM_FALLTHROUGH;
case Mode::TableView:
if (wants_notifications && !m_notifier && !m_realm->is_in_transaction() && m_realm->can_deliver_notifications()) {
m_notifier = std::make_shared<_impl::ResultsNotifier>(*this);
_impl::RealmCoordinator::register_notifier(m_notifier);
}
if (wants_notifications)
prepare_async(ForCallback{false});
m_has_used_table_view = true;
m_table_view.sync_if_needed();
break;
......@@ -612,23 +607,31 @@ Results Results::sort(SortDescriptor&& sort) 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);
}
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)
{
DescriptorOrdering new_order = m_descriptor_ordering;
for (size_t i = 0; i < ordering.size(); ++i) {
const CommonDescriptor* desc = ordering[i];
if (const SortDescriptor* sort = dynamic_cast<const SortDescriptor*>(desc)) {
auto desc = ordering[i];
if (auto sort = dynamic_cast<const SortDescriptor*>(desc))
new_order.append_sort(std::move(*sort));
continue;
}
if (const DistinctDescriptor* distinct = dynamic_cast<const DistinctDescriptor*>(desc)) {
else if (auto distinct = dynamic_cast<const DistinctDescriptor*>(desc))
new_order.append_distinct(std::move(*distinct));
continue;
}
REALM_COMPILER_HINT_UNREACHABLE();
else if (auto limit = dynamic_cast<const LimitDescriptor*>(desc))
new_order.append_limit(std::move(*limit));
else
REALM_COMPILER_HINT_UNREACHABLE();
}
return Results(m_realm, get_query(), std::move(new_order));
}
......@@ -691,19 +694,34 @@ Results Results::snapshot() &&
REALM_COMPILER_HINT_UNREACHABLE();
}
void Results::prepare_async()
void Results::prepare_async(ForCallback force)
{
if (m_notifier) {
return;
}
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()) {
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) {
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;
......@@ -713,7 +731,7 @@ void Results::prepare_async()
NotificationToken Results::add_notification_callback(CollectionChangeCallback cb) &
{
prepare_async();
prepare_async(ForCallback{true});
return {m_notifier, m_notifier->add_callback(std::move(cb))};
}
......@@ -795,4 +813,8 @@ Results::UnsupportedColumnTypeException::UnsupportedColumnTypeException(size_t c
{
}
Results::UnimplementedOperationException::UnimplementedOperationException(const char* msg)
: std::logic_error(msg)
{ }
} // namespace realm
......@@ -727,11 +727,11 @@ bool Realm::compact()
throw InvalidTransactionException("Can't compact a Realm within a write transaction");
}
Group& group = read_group();
for (auto &object_schema : m_schema) {
ObjectStore::table_for_object_type(group, object_schema.name)->optimize();
verify_open();
// FIXME: when enum columns are ready, optimise all tables in a write transaction
if (m_group) {
m_shared_group->end_read();
}
m_shared_group->end_read();
m_group = nullptr;
return m_shared_group->compact();
......@@ -961,6 +961,7 @@ T Realm::resolve_thread_safe_reference(ThreadSafeReference<T> reference)
if (reference_version < current_version) {
// Duplicate config for uncached Realm so we don't advance the user's Realm
Realm::Config config = m_coordinator->get_config();
config.automatic_change_notifications = false;
config.cache = false;
config.schema = util::none;
SharedRealm temporary_realm = m_coordinator->get_realm(config);
......@@ -1096,3 +1097,8 @@ Group& RealmFriend::read_group_to(Realm& realm, VersionID version)
realm.begin_read(version);
return *realm.m_group;
}
std::size_t Realm::compute_size() {
Group& group = read_group();
return group.compute_aggregated_byte_size();
}
......@@ -18,9 +18,8 @@
#include "sync/impl/sync_file.hpp"
#include "util/time.hpp"
#include <realm/util/file.hpp>
#include <realm/util/time.hpp>
#include <realm/util/scope_exit.hpp>
#include <iomanip>
......@@ -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));
std::time_t time = std::time(nullptr);
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();
}
......@@ -206,7 +205,6 @@ constexpr const char SyncFileManager::c_utility_directory[];
constexpr const char SyncFileManager::c_recovery_directory[];
constexpr const char SyncFileManager::c_metadata_directory[];
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
{
......@@ -226,8 +224,7 @@ std::string SyncFileManager::get_base_sync_directory() const
return sync_path;
}
std::string SyncFileManager::user_directory(const std::string& local_identity,
util::Optional<SyncUserIdentifier> user_info) const
std::string SyncFileManager::user_directory(const std::string& local_identity) const
{
REALM_ASSERT(local_identity.length() > 0);
std::string escaped = util::make_percent_encoded_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(),
escaped,
util::FilePathType::Directory);
bool dir_created = 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();
}
}
util::try_make_dir(user_path);
return user_path;
}
......@@ -335,8 +321,7 @@ bool SyncFileManager::remove_realm(const std::string& local_identity, const std:
return remove_realm(realm_path);
}
std::string SyncFileManager::path(const std::string& local_identity, const std::string& raw_realm_path,
util::Optional<SyncUserIdentifier> user_info) const
std::string SyncFileManager::path(const std::string& local_identity, const std::string& raw_realm_path) const
{
REALM_ASSERT(local_identity.length() > 0);
REALM_ASSERT(raw_realm_path.length() > 0);
......@@ -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.");
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 realm_path;
return util::file_path_by_appending_component(user_directory(local_identity), escaped);
}
std::string SyncFileManager::metadata_path() const
......
......@@ -157,6 +157,23 @@ SyncMetadataManager::SyncMetadataManager(std::string path,
};
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
......@@ -309,26 +326,6 @@ util::Optional<SyncFileActionMetadata> SyncMetadataManager::get_file_action_meta
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
SyncUserMetadata::SyncUserMetadata(Schema schema, SharedRealm realm, RowExpr row)
......
......@@ -27,8 +27,16 @@ namespace realm {
std::string SyncConfig::partial_sync_identifier(const SyncUser& user)
{
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];
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;
ss << std::hex << std::setfill('0');
......
......@@ -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);
REALM_ASSERT(m_file_manager);
const auto& user_local_identity = user.local_identity();
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));
return m_file_manager->path(user.local_identity(), raw_realm_url);
}
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