forked from organicmaps/organicmaps
[ios] Synchronized recent track's UI and core logic.
This commit is contained in:
parent
2450645e0a
commit
ed62f99af8
2 changed files with 126 additions and 53 deletions
|
@ -1,7 +1,19 @@
|
|||
#import "MWMRecentTrackSettingsController.h"
|
||||
#import "SelectableCell.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
typedef NS_ENUM(NSUInteger, DurationInHours)
|
||||
{
|
||||
One = 1,
|
||||
Two = 2,
|
||||
Six = 6,
|
||||
Twelve = 12,
|
||||
Day = 24
|
||||
};
|
||||
|
||||
@interface MWMRecentTrackSettingsController ()
|
||||
|
||||
@property (weak, nonatomic) IBOutlet SelectableCell * none;
|
||||
@property (weak, nonatomic) IBOutlet SelectableCell * oneHour;
|
||||
@property (weak, nonatomic) IBOutlet SelectableCell * twoHours;
|
||||
|
@ -18,22 +30,74 @@
|
|||
{
|
||||
[super viewDidLoad];
|
||||
self.title = L(@"recent_track");
|
||||
self.none.accessoryType = UITableViewCellAccessoryCheckmark;
|
||||
self.selectedCell = self.none;
|
||||
auto & f = GetFramework();
|
||||
|
||||
if (!f.IsGpsTrackingEnabled())
|
||||
{
|
||||
_selectedCell = self.none;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (f.GetGpsTrackingDuration().count())
|
||||
{
|
||||
case One:
|
||||
_selectedCell = self.oneHour;
|
||||
break;
|
||||
case Two:
|
||||
_selectedCell = self.twoHours;
|
||||
break;
|
||||
case Six:
|
||||
_selectedCell = self.sixHours;
|
||||
break;
|
||||
case Twelve:
|
||||
_selectedCell = self.twelveHours;
|
||||
break;
|
||||
case Day:
|
||||
_selectedCell = self.oneDay;
|
||||
break;
|
||||
default:
|
||||
NSAssert(false, @"Incorrect hours value");
|
||||
break;
|
||||
}
|
||||
}
|
||||
self.selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
|
||||
}
|
||||
|
||||
- (void)setSelectedCell:(SelectableCell *)selectedCell
|
||||
{
|
||||
_selectedCell = selectedCell;
|
||||
auto & f = GetFramework();
|
||||
if ([selectedCell isEqual:self.none])
|
||||
f.EnableGpsTracking(false);
|
||||
else
|
||||
{
|
||||
if (!f.IsGpsTrackingEnabled())
|
||||
f.EnableGpsTracking(true);
|
||||
|
||||
if ([selectedCell isEqual:self.oneHour])
|
||||
f.SetGpsTrackingDuration(hours(One));
|
||||
else if ([selectedCell isEqual:self.twoHours])
|
||||
f.SetGpsTrackingDuration(hours(Two));
|
||||
else if ([selectedCell isEqual:self.sixHours])
|
||||
f.SetGpsTrackingDuration(hours(Six));
|
||||
else if ([selectedCell isEqual:self.twelveHours])
|
||||
f.SetGpsTrackingDuration(hours(Twelve));
|
||||
else
|
||||
f.SetGpsTrackingDuration(hours(Day));
|
||||
}
|
||||
selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
self.selectedCell.accessoryType = UITableViewCellAccessoryNone;
|
||||
self.selectedCell = [tableView cellForRowAtIndexPath:indexPath];
|
||||
self.selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
|
||||
self.selectedCell.selected = NO;
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
|
||||
{
|
||||
if (section != 0)
|
||||
NSAssert(false, @"Incorrect sections count");
|
||||
NSAssert(section == 0, @"Incorrect sections count");
|
||||
return L(@"recent_track_help_text");
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
|
||||
#import "3party/Alohalytics/src/alohalytics_objc.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
#include "map/gps_track.hpp"
|
||||
#include "platform/measurement_utils.hpp"
|
||||
#include "platform/settings.hpp"
|
||||
#include "base/math.hpp"
|
||||
|
@ -71,7 +74,8 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
|
||||
- (void)beforeTerminate
|
||||
{
|
||||
[m_locationManager startMonitoringSignificantLocationChanges];
|
||||
if (GetFramework().IsGpsTrackingEnabled())
|
||||
[m_locationManager startMonitoringSignificantLocationChanges];
|
||||
}
|
||||
|
||||
- (void)onForeground
|
||||
|
@ -121,9 +125,7 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
{
|
||||
// pass last location known location when new observer is attached
|
||||
// (default CLLocationManagerDelegate behaviour)
|
||||
location::GpsInfo newInfo;
|
||||
[self location:[self lastLocation] toGpsInfo:newInfo];
|
||||
[observer onLocationUpdate:newInfo];
|
||||
[observer onLocationUpdate:gpsInfoFromLocation(self.lastLocation)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -154,38 +156,6 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
return m_isStarted ? m_locationManager.heading : nil;
|
||||
}
|
||||
|
||||
- (void)location:(CLLocation *)location toGpsInfo:(location::GpsInfo &)info
|
||||
{
|
||||
info.m_source = location::EAppleNative;
|
||||
|
||||
info.m_latitude = location.coordinate.latitude;
|
||||
info.m_longitude = location.coordinate.longitude;
|
||||
info.m_timestamp = [location.timestamp timeIntervalSince1970];
|
||||
|
||||
if (location.horizontalAccuracy >= 0.0)
|
||||
info.m_horizontalAccuracy = location.horizontalAccuracy;
|
||||
|
||||
if (location.verticalAccuracy >= 0.0)
|
||||
{
|
||||
info.m_verticalAccuracy = location.verticalAccuracy;
|
||||
info.m_altitude = location.altitude;
|
||||
}
|
||||
|
||||
if (location.course >= 0.0)
|
||||
info.m_bearing = location.course;
|
||||
|
||||
if (location.speed >= 0.0)
|
||||
info.m_speed = location.speed;
|
||||
}
|
||||
|
||||
- (void)heading:(CLHeading *)heading toCompassInfo:(location::CompassInfo &)info
|
||||
{
|
||||
if (heading.trueHeading >= 0.0)
|
||||
info.m_bearing = my::DegToRad(heading.trueHeading);
|
||||
else if (heading.headingAccuracy >= 0.0)
|
||||
info.m_bearing = my::DegToRad(heading.magneticHeading);
|
||||
}
|
||||
|
||||
- (void)triggerCompass
|
||||
{
|
||||
[self locationManager:m_locationManager didUpdateHeading:m_locationManager.heading];
|
||||
|
@ -193,9 +163,7 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
|
||||
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading
|
||||
{
|
||||
location::CompassInfo info;
|
||||
[self heading:heading toCompassInfo:info];
|
||||
[self notifyCompassUpdate:info];
|
||||
[self notifyCompassUpdate:compasInfoFromHeading(heading)];
|
||||
}
|
||||
|
||||
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
|
||||
|
@ -205,22 +173,27 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
[m_locationManager allowDeferredLocationUpdatesUntilTraveled:300 timeout:15];
|
||||
}
|
||||
|
||||
- (void)processLocation:(CLLocation *)newLocation
|
||||
- (void)processLocation:(CLLocation *)location
|
||||
{
|
||||
// According to documentation, lat and lon are valid only if horz acc is non-negative.
|
||||
// So we filter out such events completely.
|
||||
if (newLocation.horizontalAccuracy < 0.)
|
||||
if (location.horizontalAccuracy < 0.)
|
||||
return;
|
||||
|
||||
// Save current device time for location.
|
||||
m_lastLocationTime = [NSDate date];
|
||||
|
||||
location::GpsInfo newInfo;
|
||||
[self location:newLocation toGpsInfo:newInfo];
|
||||
for (id observer in m_observers)
|
||||
[observer onLocationUpdate:newInfo];
|
||||
// TODO(AlexZ): Temporary, remove in the future.
|
||||
[[Statistics instance] logLocation:newLocation];
|
||||
[[Statistics instance] logLocation:location];
|
||||
auto const newInfo = gpsInfoFromLocation(location);
|
||||
if (self.isDaemonMode)
|
||||
{
|
||||
GetDefaultGpsTrack().AddPoint(newInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (id observer in m_observers)
|
||||
[observer onLocationUpdate:newInfo];
|
||||
// TODO(AlexZ): Temporary, remove in the future.
|
||||
}
|
||||
}
|
||||
|
||||
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
|
||||
|
@ -376,6 +349,42 @@ static NSString * const kAlohalyticsLocationRequestAlwaysFailed = @"$locationAlw
|
|||
[observer onLocationError:errorCode];
|
||||
}
|
||||
|
||||
location::GpsInfo gpsInfoFromLocation(CLLocation const * l)
|
||||
{
|
||||
location::GpsInfo info;
|
||||
info.m_source = location::EAppleNative;
|
||||
|
||||
info.m_latitude = l.coordinate.latitude;
|
||||
info.m_longitude = l.coordinate.longitude;
|
||||
info.m_timestamp = [l.timestamp timeIntervalSince1970];
|
||||
|
||||
if (l.horizontalAccuracy >= 0.0)
|
||||
info.m_horizontalAccuracy = l.horizontalAccuracy;
|
||||
|
||||
if (l.verticalAccuracy >= 0.0)
|
||||
{
|
||||
info.m_verticalAccuracy = l.verticalAccuracy;
|
||||
info.m_altitude = l.altitude;
|
||||
}
|
||||
|
||||
if (l.course >= 0.0)
|
||||
info.m_bearing = l.course;
|
||||
|
||||
if (l.speed >= 0.0)
|
||||
info.m_speed = l.speed;
|
||||
return info;
|
||||
}
|
||||
|
||||
location::CompassInfo compasInfoFromHeading(CLHeading const * h)
|
||||
{
|
||||
location::CompassInfo info;
|
||||
if (h.trueHeading >= 0.0)
|
||||
info.m_bearing = my::DegToRad(h.trueHeading);
|
||||
else if (h.headingAccuracy >= 0.0)
|
||||
info.m_bearing = my::DegToRad(h.magneticHeading);
|
||||
return info;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation CLLocation (Mercator)
|
||||
|
|
Loading…
Add table
Reference in a new issue