FacilitiesListViewController.swift 9.54 KB
Newer Older
1
2
3
4
5
//
//  LocationsListViewController.swift
//  WhatsOpen
//
//  Created by Zach Knox on 4/5/17.
Zach Knox's avatar
Zach Knox committed
6
//  Copyright © 2017 SRCT. Some rights reserved.
7
8
9
//

import UIKit
Zach Knox's avatar
Zach Knox committed
10
import DeckTransition
11

12
class FacilitiesListViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UIViewControllerPreviewingDelegate {
13

14
	var facilitiesArray = Array<Facility>()
Zach Knox's avatar
Zach Knox committed
15
	var filters = Filters()
16
	
17
	@IBOutlet var LeftButton: UIBarButtonItem!
18
		
19
20
21
22
	@IBAction func RightButton(_ sender: Any) {
	}
	@IBOutlet var RightButton: UIBarButtonItem!
	
23
24
	@IBOutlet var settingsButton: UIBarButtonItem!
	
25
26
	@IBOutlet var LocationsList: UICollectionView!
	
27
	@IBOutlet var LocationsListLayout: UICollectionViewFlowLayout!
28
	
29
	@IBOutlet var favoritesControl: UISegmentedControl!
Zach Knox's avatar
Zach Knox committed
30
31
	var showFavorites = false

32
33
	@IBOutlet var LastUpdatedLabel: UIBarButtonItem!
	
Zach Knox's avatar
Zach Knox committed
34
35
36
37
38
39
40
41
42
43
44
45
	@IBAction func favoritesControlChanges(_ sender: Any) {
		switch (self.favoritesControl.selectedSegmentIndex)
		{
		case 0:
			showFavorites = false
		case 1:
			showFavorites = true
		default:
			showFavorites = false
		}
		self.LocationsList.reloadData()
	}
46
	
Zach Knox's avatar
Zach Knox committed
47
48
	let refreshControl = UIRefreshControl()
	
49
	override func viewWillLayoutSubviews() {
Zach Knox's avatar
Zach Knox committed
50
51
52
53
54
55
		LocationsListLayout.itemSize.width = getCellWidth()
		LocationsListLayout.invalidateLayout()

	}
	
	func getCellWidth() -> CGFloat {
56
57
		let windowWidth = self.view.frame.size.width
		
Zach Knox's avatar
Zach Knox committed
58
59
		if(windowWidth < 640) {
			return windowWidth - 20
60
61
		}
		else if(windowWidth >= 640 && windowWidth < 1024) {
Zach Knox's avatar
Zach Knox committed
62
			return (windowWidth / 2) - 15
63
64
		}
		else if(windowWidth >= 1024) {
Zach Knox's avatar
Zach Knox committed
65
			return (windowWidth / 3) - 15
66
67
		}
		
Zach Knox's avatar
Zach Knox committed
68
		return 0
69
70
	}
	
71
72
73
74
75
76
	@IBAction func RefreshButton(_ sender: Any) {
		refresh(sender)
	}
	
	override func viewWillAppear(_ animated: Bool) {
		LastUpdatedLabel.isEnabled = false
Zach Knox's avatar
Zach Knox committed
77
78
79
80
		
		navigationItem.title = "What's Open?"


81
82
	}
	
Zach Knox's avatar
Zach Knox committed
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
	@IBAction func tapRecognizer(_ sender: UITapGestureRecognizer) {
		
		let tapLocation = sender.location(in: LocationsList)
		let indexPath = LocationsList.indexPathForItem(at: tapLocation)
		if((indexPath) != nil) {
			let destination = storyboard?.instantiateViewController(withIdentifier: "detailView") as? FacilityDetailViewController
			let tapped = LocationsList.cellForItem(at: indexPath!) as! FacilityCollectionViewCell
			destination!.facility = tapped.facility
			presentDetailView(destination!)
		}
	}
	
	func presentDetailView(_ destination: FacilityDetailViewController) {
		if(self.view.traitCollection.horizontalSizeClass == .regular && self.view.traitCollection.verticalSizeClass == .regular) {
			//do a popover here for the iPad
			//iPads are cool right?
		}
		else {
			let destDelegate = DeckTransitioningDelegate()
			destination.modalPresentationStyle = .custom
			destination.transitioningDelegate = destDelegate
			present(destination, animated: true, completion: nil)
		}
	}
	
	override func viewDidLoad() {
109
110
        super.viewDidLoad()
		
111
112
113
114
		if( traitCollection.forceTouchCapability == .available){
			registerForPreviewing(with: self, sourceView: self.LocationsList!)
		}
		
Zach Knox's avatar
Zach Knox committed
115
116
117
118
		let searchController = UISearchController(searchResultsController: nil) //TODO: ADD SEARCH
		if #available(iOS 11, *) {
			navigationController?.navigationBar.prefersLargeTitles = true
			navigationItem.searchController = searchController
Zach Knox's avatar
Zach Knox committed
119
			navigationItem.hidesSearchBarWhenScrolling = true
Zach Knox's avatar
Zach Knox committed
120
121
122
123
			navigationItem.searchController?.searchBar.barTintColor = UIColor.white
			navigationItem.searchController?.searchBar.barStyle = .default
		}
		
124
		LocationsListLayout.invalidateLayout()
Zach Knox's avatar
Zach Knox committed
125
		
126
127
128
		settingsButton.accessibilityLabel = "Settings"
		LastUpdatedLabel.accessibilityHint = ""
		
129
130
		LocationsListLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10)
		
Zach Knox's avatar
Zach Knox committed
131
132
133
134
		refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
		LocationsList.addSubview(refreshControl)
		LocationsList.alwaysBounceVertical = true
		
135
		
136
137
138
139
140
		SRCTNetworkController.performDownload { (facilities) in
			self.facilitiesArray = facilities
			//            print(self.facilitiesArray)
			DispatchQueue.main.async {
				self.LocationsList.reloadData()
141
142
				let date = Date()
				self.LastUpdatedLabel.title = "Updated: " + self.shortDateFormat(date)
143
144
			}
		}
145
146
		
	}
Zach Knox's avatar
Zach Knox committed
147
148
149
150
	
	func refresh(_ sender: Any) {
		refreshControl.beginRefreshing()
		LocationsList.reloadData()
151
152
		let date = Date()
		LastUpdatedLabel.title = "Updated: " + shortDateFormat(date)
Zach Knox's avatar
Zach Knox committed
153
154
		refreshControl.endRefreshing()
	}
155
156
157
158
159
160
161
162
163
	func shortDateFormat(_ date: Date) -> String {
		let dateFormatter = DateFormatter()
		dateFormatter.dateStyle = .short
		dateFormatter.timeStyle = .short

		// US English Locale (en_US)
		dateFormatter.locale = Locale(identifier: "en_US")
		return dateFormatter.string(from: date)
	}
Zach Knox's avatar
Zach Knox committed
164
	
165
166
167
168
169
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
	
170
171
172
173
174
	func numberOfSections(in collectionView: UICollectionView) -> Int {
		return 2
	}
	
	func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
Zach Knox's avatar
Zach Knox committed
175
		let count = countForOpenAndClosedFacilities(getLocationArray(facilitiesArray)) //TODO could be better optimized
Zach Knox's avatar
Zach Knox committed
176
		
177
178
179
180
181
182
183
184
185
186
187
		if(section == 1) {
			return count.open
		}
		else {
			return count.closed
		}
	}
	
	
	
	func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
188
		let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! FacilityCollectionViewCell
Zach Knox's avatar
Zach Knox committed
189
190
191
192
193
194
195
		/*
		let windowRect = self.view.window!.frame
		let windowWidth = windowRect.size.width
		if(windowWidth <= 320) {
			cell.frame.size.width = 280
		}
		*/
196
197
198
		
		let dataArray = placeOpenFacilitiesFirstInArray(facilitiesArray)
		let facility = dataArray[indexPath.row]
199
		cell.facility = facility
200
		cell.nameLabel.text = facility.name
201
202
203
		
		let open = Utilities.isOpen(facility: facility)
		if(open == true) {
204
			cell.openClosedLabel.text = "Open"
205
206
207
			cell.openClosedLabel.textColor = UIColor.black
			cell.openClosedLabel.backgroundColor = UIColor.white
			//cell.openClosedLabel.backgroundColor = UIColor(red:0.00, green:0.40, blue:0.20, alpha:1.0)
208
			cell.backgroundColor = UIColor(red:0.00, green:0.40, blue:0.20, alpha:1.0)
209
		} else {
210
			cell.openClosedLabel.text = "Closed"
211
212
213
			cell.openClosedLabel.textColor = UIColor.white
			cell.openClosedLabel.backgroundColor = UIColor.black
			//cell.openClosedLabel.backgroundColor = UIColor.red
214
215
			cell.backgroundColor = UIColor.red

216
217
218
219
		}
		
		cell.timeDescriptionLabel.text = Utilities.timeUntilFacility(facility)
		
220
221
222
223
		cell.accessibilityLabel = cell.nameLabel.text! + ", Currently " + cell.openClosedLabel.text! + "." + cell.timeDescriptionLabel.text!
		cell.accessibilityHint = "Double Tap to view details"

		
224
225
226
227
		self.reloadInputViews()
		return cell
	}
	
Zach Knox's avatar
Zach Knox committed
228
229
230
231
232
233
234
235
236
237
238
	func getLocationArray(_ facilitiesArray: [Facility]) -> [Facility] {
		if(!showFavorites) {
			return placeOpenFacilitiesFirstInArray(facilitiesArray)
		}
		else {
			return [] //TODO - INCOMPLETE
		}
		
		
	}
	
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
	//Returns an array which has the open locations listed first
	//Could be improved in the future because currently this means you're checking
	//open status twice per cell
	func placeOpenFacilitiesFirstInArray(_ facilitiesArray: Array<Facility>) -> [Facility] {
		var open = [Facility]()
		var closed = [Facility]()
		
		for i in facilitiesArray {
			if(Utilities.isOpen(facility: i)) {
				open.append(i)
			}
			else {
				closed.append(i)
			}
		}
		// Test
		return open + closed
	}
	
	func countForOpenAndClosedFacilities(_ facilitiesArray: Array<Facility>) -> (open: Int, closed: Int) {
		var open = 0
		var closed = 0
		
		for i in facilitiesArray {
			if(Utilities.isOpen(facility: i)) {
				open += 1
			}
			else {
				closed += 1
			}
		}
		
		return (open, closed)
	}
	
	
275
276
    // MARK: - Navigation

277
	//In a storyboard-based application, you will often want to do a little preparation before navigation
278
279
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
280
		if(segue.identifier == "toDetailView") {
281
			let destination = segue.destination as! FacilityDetailViewController
Zach Knox's avatar
Zach Knox committed
282
283
			let destDelegate = DeckTransitioningDelegate()
			destination.transitioningDelegate = destDelegate
284
			let tapped = sender as! FacilityCollectionViewCell //this is probably a bad idea just FYI future me
285
			destination.facility = tapped.facility
Zach Knox's avatar
Zach Knox committed
286
			present(destination, animated: true, completion: nil)
287
		}
288
		else if(segue.identifier == "toFilters") {
289
290
291
			let destination = segue.destination as! UINavigationController
			let filterView = destination.topViewController as! FiltersTableViewController
			filterView.filters = self.filters
292
		}
293
		
294
295
        // Pass the selected object to the new view controller.
    }
296
	
297
298
299
300
	// MARK: - Peek and Pop
	
	func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
		guard let indexPath = LocationsList?.indexPathForItem(at: location) else { return nil }
301
302
		let cell = LocationsList?.cellForItem(at: indexPath) as! FacilityCollectionViewCell
		guard let detailView = storyboard?.instantiateViewController(withIdentifier: "detailView") as? FacilityDetailViewController else { return nil }
303
304
		
		detailView.facility = cell.facility
Zach Knox's avatar
Zach Knox committed
305

306
307
308
309
		return detailView
	}
	
	func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
Zach Knox's avatar
Zach Knox committed
310
311
312
313
314
		let destDelegate = DeckTransitioningDelegate()
		viewControllerToCommit.modalPresentationStyle = .custom
		viewControllerToCommit.transitioningDelegate = destDelegate
		//If one day 3D touch comes to the iPad, this is no longer good.
		present(viewControllerToCommit, animated: true, completion: nil)
315
316
	}
	
317
}
318