Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
1
1weather
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dmitriy Stepanets
1weather
Commits
a8f9810e
Commit
a8f9810e
authored
Oct 06, 2021
by
Dmitry Stepanets
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Working on adding rainfall dimension
parent
9432979a
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
72 additions
and
9 deletions
+72
-9
1Weather/Resources/en.lproj/Localizable.strings
+1
-0
1Weather/UI/SharedCells/PrecipCell/PrecipitationCell.swift
+2
-0
1Weather/UI/SharedViews/MinutelyForecastView/MinutelyForecastView.swift
+9
-1
1Weather/UI/View controllers/Forecast/Cells/ForecastCellFactory.swift
+15
-7
1Weather/UI/View controllers/Forecast/Cells/ForecastHourlyCell.swift
+18
-0
1Weather/UI/View controllers/Forecast/ForecastViewController.swift
+16
-0
1Weather/UI/View controllers/Settings/Cells/SettingsCellFactory.swift
+7
-1
1Weather/UI/View controllers/Today/Cells/TodayForecastTimePeriodCell.swift
+3
-0
OneWeatherAnalytics/OneWeatherAnalytics/AnalyticsEvent.swift
+1
-0
No files found.
1Weather/Resources/en.lproj/Localizable.strings
View file @
a8f9810e
...
...
@@ -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";
...
...
1Weather/UI/SharedCells/PrecipCell/PrecipitationCell.swift
View file @
a8f9810e
...
...
@@ -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
)
}
}
}
...
...
1Weather/UI/SharedViews/MinutelyForecastView/MinutelyForecastView.swift
View file @
a8f9810e
...
...
@@ -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
()
...
...
1Weather/UI/View controllers/Forecast/Cells/ForecastCellFactory.swift
View file @
a8f9810e
...
...
@@ -149,10 +149,20 @@ class ForecastCellFactory: CellFactory {
return
cell
case
.
forecastHourly
:
let
cell
=
dequeueReusableCell
(
type
:
ForecastHourlyCell
.
self
,
tableView
:
tableView
,
indexPath
:
indexPath
)
if
let
hourly
=
forecastViewModel
.
location
?
.
hourly
{
if
cellsToUpdate
.
contains
(
.
forecastHourly
)
{
cell
.
configure
(
hourly
:
hourly
)
cellsToUpdate
.
remove
(
.
forecastHourly
)
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
...
...
@@ -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
}
}
...
...
1Weather/UI/View controllers/Forecast/Cells/ForecastHourlyCell.swift
View file @
a8f9810e
...
...
@@ -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
...
...
1Weather/UI/View controllers/Forecast/ForecastViewController.swift
View file @
a8f9810e
...
...
@@ -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
()
...
...
1Weather/UI/View controllers/Settings/Cells/SettingsCellFactory.swift
View file @
a8f9810e
...
...
@@ -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
}
...
...
1Weather/UI/View controllers/Today/Cells/TodayForecastTimePeriodCell.swift
View file @
a8f9810e
...
...
@@ -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
}
...
...
OneWeatherAnalytics/OneWeatherAnalytics/AnalyticsEvent.swift
View file @
a8f9810e
...
...
@@ -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"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment