Files
eqn.ios/Sources/Earthquake Network/Models/EQNUser.m
T
2021-02-28 10:21:32 +01:00

179 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
{
NSLog(@"URLPosizione %@", [EQNGeneratoreURLServer urlPosizione]);
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlPosizione] richiesta:EQNTipoChiamataPosizione success:^(id result) {
NSLog(@"inviato");
} failure:^(NSError *errore) {
}];
}
- (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