176 lines
6.0 KiB
Objective-C
176 lines
6.0 KiB
Objective-C
//
|
|
// EQNUser.m
|
|
// Earthquake Network
|
|
//
|
|
// Created by Luca Beretta on 20/09/18.
|
|
// Copyright © 2018 Luca Beretta. All rights reserved.
|
|
//
|
|
|
|
#import "EQNUser.h"
|
|
#import "Costanti.h"
|
|
#import "EQNAccelerometroManager.h"
|
|
#import "ServerRequest.h"
|
|
#import "EQNGeneratoreURLServer.h"
|
|
#import "EQNUtility.h"
|
|
#import "EQNManager.h"
|
|
|
|
|
|
@implementation EQNUser
|
|
|
|
#pragma mark - Singleton
|
|
|
|
+ (instancetype)defaultUser
|
|
{
|
|
static EQNUser *sharedInstance = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
sharedInstance = [[self alloc] init];
|
|
});
|
|
return sharedInstance;
|
|
}
|
|
|
|
#pragma mark - Init
|
|
|
|
- (instancetype)init
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
_tokenUser = [[NSUserDefaults standardUserDefaults] objectForKey:EQNUserDefaultUserFirebaseToken];
|
|
id savedUserId = [[NSUserDefaults standardUserDefaults] objectForKey:EQNUserDefaultUserId];
|
|
_user_ID = [self convertUserIdIntoString:savedUserId];
|
|
|
|
NSArray *lastPosArray = [EQNUtility loadArrayOfClass:[CLLocation class] fromUserDefaultsForKey:EQNUserDefaultLastLocation];
|
|
if (lastPosArray.count > 0) {
|
|
_lastPosition = [lastPosArray lastObject];
|
|
}
|
|
|
|
_registrato = NO;
|
|
if (_user_ID) {
|
|
_registrato = YES;
|
|
}
|
|
|
|
[[EQNAccelerometroManager sharedInstance] addObserver:(id)self
|
|
forKeyPath:@"currentLocation"
|
|
options:NSKeyValueObservingOptionNew
|
|
context:nil];
|
|
|
|
[[EQNAccelerometroManager sharedInstance] startUpdatingLocationBackground];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - Accessories
|
|
|
|
- (void)setTokenUser:(NSString *)tokenUser
|
|
{
|
|
// token could be retrieved after some times
|
|
// thanks to this, we force the server registration when the token is received
|
|
_tokenUser = tokenUser;
|
|
[[NSUserDefaults standardUserDefaults] setObject:tokenUser forKey:EQNUserDefaultUserFirebaseToken];
|
|
[self verificaRegistrazione];
|
|
}
|
|
|
|
#pragma mark - Public
|
|
|
|
- (void)saveUserInfo
|
|
{
|
|
[[NSUserDefaults standardUserDefaults] setObject:self.tokenUser forKey:EQNUserDefaultUserFirebaseToken];
|
|
[[NSUserDefaults standardUserDefaults] setObject:self.user_ID forKey:EQNUserDefaultUserId];
|
|
if (self.lastPosition) {
|
|
NSArray *lastPosiArray = @[self.lastPosition];
|
|
[EQNUtility storeArray:lastPosiArray toUserDefaultForKey:EQNUserDefaultLastLocation];
|
|
}
|
|
}
|
|
|
|
- (void)removeUser
|
|
{
|
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey:EQNUserDefaultUserFirebaseToken];
|
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey:EQNUserDefaultUserId];
|
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey:EQNUserDefaultLastLocation];
|
|
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
self.tokenUser = nil;
|
|
}
|
|
|
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
|
|
{
|
|
if ([keyPath isEqualToString:@"currentLocation"]) {
|
|
// do some stuff
|
|
if (self.lastPosition) {
|
|
self.distanza = [self.lastPosition distanceFromLocation:[EQNAccelerometroManager sharedInstance].currentLocation];
|
|
}
|
|
self.lastPosition = [EQNAccelerometroManager sharedInstance].currentLocation;
|
|
[self verificaRegistrazione];
|
|
|
|
if (![EQNManager defaultManager].isBackground)
|
|
[[EQNAccelerometroManager sharedInstance] stopUpdatingLocation];
|
|
}
|
|
}
|
|
|
|
- (void)verificaRegistrazione
|
|
{
|
|
if (!self.user_ID && self.tokenUser) {
|
|
[self inviaregistrazioneServer:self.tokenUser withPosition:self.lastPosition];
|
|
} else {
|
|
[self inviaPosizioneServer];
|
|
}
|
|
}
|
|
|
|
- (void)inviaregistrazioneServer:(NSString *)token withPosition:(CLLocation *)location
|
|
{
|
|
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlRegistrazione] richiesta:EQNTipoChiamataRegistrazione success:^(id result) {
|
|
|
|
self.user_ID = [self convertUserIdIntoString:result];
|
|
[self saveUserInfo];
|
|
|
|
} failure:^(NSError *errore) {
|
|
NSLog(@"USER_ID Error %@", errore);
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:EQNServerRegistrationDidFailNotification object:nil];
|
|
}];
|
|
}
|
|
|
|
- (void)inviaPosizioneServer
|
|
{
|
|
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlPosizione] richiesta:EQNTipoChiamataPosizione success:^(id result) {
|
|
NSLog(@"[EQNUtility] Position saved on server");
|
|
[self saveUserInfo];
|
|
} failure:^(NSError *error) {
|
|
NSLog(@"[EQNUtility] Unable to save position. Error: %@", error.localizedDescription);
|
|
}];
|
|
}
|
|
|
|
- (void)downloadOfferTimeRemainingWithCompletion:(_Nonnull timeRemainingCompletion)completionHandler
|
|
{
|
|
NSURL *url = [EQNGeneratoreURLServer urlDownloadOfferTimeRemaining];
|
|
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataOfferTimeRemaining success:^(id result) {
|
|
NSInteger timeRemaining = 0;
|
|
if ([result isKindOfClass:[NSNumber class]]) {
|
|
NSNumber *timeRemainingNumber = (NSNumber *)result;
|
|
timeRemaining = [timeRemainingNumber integerValue];
|
|
} else if ([result isKindOfClass:[NSString class]]) {
|
|
NSString *timeRemainingString = (NSString *)result;
|
|
timeRemaining = [timeRemainingString integerValue];
|
|
}
|
|
|
|
completionHandler(timeRemaining);
|
|
} failure:^(NSError *error) {
|
|
completionHandler(0);
|
|
}];
|
|
}
|
|
|
|
#pragma mark - Private
|
|
|
|
/// user_id saved as a Number, but is used as a NSString
|
|
- (NSString *)convertUserIdIntoString:(id)userId
|
|
{
|
|
if ([userId isKindOfClass:[NSString class]]) {
|
|
return (NSString *)userId;
|
|
} else if ([userId isKindOfClass:[NSNumber class]]) {
|
|
NSNumber *userIdNumber = (NSNumber *)userId;
|
|
return [userIdNumber stringValue];
|
|
} else {
|
|
return userId;
|
|
}
|
|
}
|
|
|
|
@end
|