Commit a8f9810e by Dmitry Stepanets

Working on adding rainfall dimension

parent 9432979a
......@@ -268,6 +268,7 @@
"settings.unit.wind" = "Wind";
"settings.unit.pressure" = "Pressure";
"settings.unit.distance" = "Distance";
"settings.unit.rainfall" = "Rainfall";
"settings.language" = "Language";
"settings.manageNotifications" = "Manage Notifications";
"settings.locationAccess" = "Locations Access";
......
......@@ -7,6 +7,7 @@
import UIKit
import OneWeatherCore
import OneWeatherAnalytics
class PrecipitationCell: UITableViewCell {
//Private
......@@ -176,6 +177,7 @@ class PrecipitationCell: UITableViewCell {
else {
scrollView.isHidden = true
minutelyForecastView.isHidden = false
AppAnalytics.shared.log(event: .ANALYTICS_MINUTELY_PRECIP_TODAY_SEEN)
}
}
}
......
......@@ -8,6 +8,7 @@
import UIKit
import OneWeatherCore
import Accelerate
import OneWeatherAnalytics
enum MinutelyForecastType {
case temperature
......@@ -126,6 +127,7 @@ class MinutelyForecastView: UIView {
private var lastSelectedLevelIndex = 0
private var minutelyForecast = [MinutelyItem]()
private var timer: Timer?
private var trackUserSwipe = false
private var forecastType = MinutelyForecastType.temperature
private lazy var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
......@@ -503,8 +505,14 @@ private extension MinutelyForecastView {
//MARK:- UIScrollView Delegate
extension MinutelyForecastView: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
self.trackUserSwipe = false
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.panGestureRecognizer.state == .began {
self.trackUserSwipe = true
AppAnalytics.shared.log(event: .ANALYTICS_MINUTELY_SWIPE)
timer?.invalidate()
timer = nil
......@@ -526,7 +534,7 @@ extension MinutelyForecastView: UIScrollViewDelegate {
self.updateDetailsView(minutelyItem: minutelyForecast[cachedValue.key])
if lastSelectedLevelIndex != cachedValue.key {
if trackUserSwipe && lastSelectedLevelIndex != cachedValue.key {
lastSelectedLevelIndex = cachedValue.key
feedbackGenerator.prepare()
feedbackGenerator.selectionChanged()
......
......@@ -149,12 +149,22 @@ class ForecastCellFactory: CellFactory {
return cell
case .forecastHourly:
let cell = dequeueReusableCell(type: ForecastHourlyCell.self, tableView: tableView, indexPath: indexPath)
if timePeriod == .minutely {
if let location = forecastViewModel.location {
if cellsToUpdate.contains(.forecastHourly) {
cell.configure(withMinutelyLocation: location)
cellsToUpdate.remove(.forecastHourly)
}
}
}
else {
if let hourly = forecastViewModel.location?.hourly {
if cellsToUpdate.contains(.forecastHourly) {
cell.configure(hourly: hourly)
cellsToUpdate.remove(.forecastHourly)
}
}
}
return cell
case .precipitation:
let cell = dequeueReusableCell(type: PrecipitationCell.self, tableView: tableView, indexPath: indexPath)
......@@ -187,10 +197,8 @@ class ForecastCellFactory: CellFactory {
switch timePeriod {
case .daily:
return self.dailySection.rows[indexPath.row]
case .hourly:
case .hourly, .minutely:
return self.hourlySection.rows[indexPath.row]
default:
return .minutely
}
}
......
......@@ -11,6 +11,7 @@ import OneWeatherCore
class ForecastHourlyCell: UITableViewCell {
//Private
private let tempLabel = UILabel()
private let minutelyForecastView = MinutelyForecastView()
private let forecastTimePeriodView = ForecastTimePeriodView()
private let descriptionView = ForecastDescriptionView(lightStyleBackgroundColor: UIColor(hex: 0xfaedda).withAlphaComponent(0.5),
gradientColors: [UIColor(hex: 0xe81e15).withAlphaComponent(0.33).cgColor,
......@@ -22,6 +23,7 @@ class ForecastHourlyCell: UITableViewCell {
prepareCell()
prepareTempLabel()
prepareTimePeriodView()
prepareMinutelyView()
prepareDescriptionView()
updateUI()
}
......@@ -45,6 +47,14 @@ class ForecastHourlyCell: UITableViewCell {
public func configure(hourly:[HourlyWeather]) {
self.forecastTimePeriodView.set(daily: nil, hourly: hourly)
self.forecastTimePeriodView.set(forecastType: .hourly, buttonType: ForecastPeriodButton.self)
self.forecastTimePeriodView.isHidden = false
self.minutelyForecastView.isHidden = true
}
public func configure(withMinutelyLocation location: Location) {
self.minutelyForecastView.configure(with: location, forecastType: .temperature)
self.minutelyForecastView.isHidden = false
self.forecastTimePeriodView.isHidden = true
}
}
......@@ -74,6 +84,14 @@ private extension ForecastHourlyCell {
}
}
func prepareMinutelyView() {
contentView.addSubview(minutelyForecastView)
minutelyForecastView.snp.makeConstraints { make in
make.edges.equalTo(forecastTimePeriodView)
}
}
func prepareDescriptionView() {
//TODO: Hide the description for now
descriptionView.isHidden = true
......
......@@ -7,6 +7,7 @@
import UIKit
import OneWeatherAnalytics
import OneWeatherCore
class ForecastViewController: UIViewController {
//Private
......@@ -19,6 +20,7 @@ class ForecastViewController: UIViewController {
private let tableView = UITableView()
private let viewModel:ForecastViewModel
private var timePeriodCellFrame = CGRect.zero
private let featureAvailability = FeatureAvailabilityManager.shared
private var localizationObserver:Any?
private var timePeriod:TimePeriod {
return TimePeriod(rawValue: timePeriodControl.selectedSegmentIndex) ?? .daily
......@@ -57,6 +59,7 @@ class ForecastViewController: UIViewController {
super.viewDidAppear(animated)
analytics(log: .ANALYTICS_VIEW_FORECAST)
analyticsLogCurrentTimePeriod()
refreshTimePeriodControl()
}
override func viewDidLayoutSubviews() {
......@@ -89,6 +92,18 @@ class ForecastViewController: UIViewController {
}
}
private func refreshTimePeriodControl() {
if featureAvailability?.isAvailable(feature: .minutelyForecast) == true {
self.timePeriodControl.set(items: ["forecast.timePeriod.daily".localized(),
"forecast.timePeriod.hourly".localized(),
"forecast.timePeriod.minutely".localized()])
}
else {
self.timePeriodControl.set(items: ["forecast.timePeriod.daily".localized(),
"forecast.timePeriod.hourly".localized()])
}
}
public func switchTo(timePeriod: TimePeriod) {
if self.timePeriodControl.selectedSegmentIndex != timePeriod.rawValue {
self.timePeriodControl.selectedSegmentIndex = timePeriod.rawValue
......@@ -260,6 +275,7 @@ extension ForecastViewController: UITableViewDataSource {
extension ForecastViewController: ForecastViewModelDelegate {
func viewModelDidChange<P>(model: P) where P : ViewModelProtocol {
refreshCityButton()
refreshTimePeriodControl()
forecastCellFactory.setNeedsUpdate()
tableView.reloadData()
refreshDayButtons()
......
......@@ -16,6 +16,7 @@ public enum SettingsRow {
case wind
case pressure
case distance
case rainfall
case language
case manageNotifications
case locationAccess
......@@ -26,7 +27,7 @@ public enum SettingsRow {
return [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner, .layerMaxXMinYCorner]
case .temperature:
return [.layerMinXMinYCorner, .layerMaxXMinYCorner]
case .distance:
case .rainfall:
return [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
case .language:
return [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner, .layerMaxXMinYCorner]
......@@ -51,6 +52,8 @@ public enum SettingsRow {
return "settings.unit.pressure".localized()
case .distance:
return "settings.unit.distance".localized()
case .rainfall:
return "settings.unit.rainfall".localized()
case .language:
return "settings.language".localized()
case .manageNotifications:
......@@ -149,6 +152,9 @@ class SettingsCellFactory: CellFactory {
case .distance:
name = viewModel.settings.distanceType.name
symbol = viewModel.settings.distanceType.symbol
case .rainfall:
name = "mm"
symbol = "mm/h"
default:
break
}
......
......@@ -7,6 +7,7 @@
import UIKit
import OneWeatherCore
import OneWeatherAnalytics
class TodayForecastTimePeriodCell: UITableViewCell {
//Private
......@@ -67,6 +68,8 @@ class TodayForecastTimePeriodCell: UITableViewCell {
let forecastType = timePeriod == .daily ? ForecastType.daily : ForecastType.hourly
self.forecastTimePeriodView.set(forecastType: forecastType, buttonType: ForecastPeriodButton.self)
case .minutely:
AppAnalytics.shared.log(event: .ANALYTICS_VIEW_FORECAST_MINUTELY)
AppAnalytics.shared.log(event: .ANALYTICS_MINUTELY_TEMP_TODAY_SEEN)
forecastTimePeriodView.isHidden = true
minutelyForecastView.isHidden = false
}
......
......@@ -151,6 +151,7 @@ public enum AnalyticsEvent: String {
// MARK: Minutely
case ANALYTICS_MINUTELY_PRECIP_TODAY_SEEN = "MINUTELY_PRECIP_TODAY_SEEN"
case ANALYTICS_MINUTELY_PRECIP_TODAY_TAP = "MINUTELY_PRECIP_TODAY_TAP"
case ANALYTICS_MINUTELY_SWIPE = "MINUTELY_SWIPE"
/// When the user taps on the title of the minutely precipitation graph
case ANALYTICS_MINUTELY_PRECIP_TODAY_TITLE = "MINUTELY_PRECIP_TODAY_TITLE"
case ANALYTICS_MINUTELY_TEMP_TODAY_SEEN = "MINUTELY_TEMP_TODAY_SEEN"
......
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