// // AllerteViewController.m // Earthquake Network // // Refactored by Andrea Busi on 04/10/2020 // Copyright © 2020 Earthquake Network. All rights reserved. // #import "AllerteViewController.h" #import "Costanti.h" #import "ServerRequest.h" #import "EQNGeneratoreURLServer.h" #import "EQNManager.h" #import "PastquakesDettagliMappa.h" #import "PastquakesAnnotation.h" #import "EQNUser.h" #import "AppDelegate.h" #import "EQNAreaCheck.h" @import StoreKit; @import SafariServices; @import CoreLocation; @import GoogleMobileAds; @interface AllerteViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (strong, nonatomic) NSMutableArray *tableItems; @property (nonatomic) BOOL isNotificaAttiva; @end @implementation AllerteViewController static NSString * const SegueIdentifierProVersion = @"ShowProVersion"; static NSString * const SegueIdentifierPrioritySubscriptions = @"ShowPrioritySubscriptions"; static NSString * const SegueIdentifierMap = @"ShowMap"; /// Sections inside the app typedef NS_ENUM(NSInteger, AllerteTableRow) { AllerteTableRowLocationPermission = 0, AllerteTableRowSismiRilevati, AllerteTableRowAllertePassate, AllerteTableRowReteSmartphone, AllerteTableRowServizioPriorita, AllerteTableRowVersionePro, AllerteTableRowDatiPosizione }; #pragma mark - Accessories - (NSMutableArray *)tableItems { if (!_tableItems) { _tableItems = [[NSMutableArray alloc] init]; } return _tableItems; } #pragma mark - View Lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; [self refreshUI]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForegroundNotification:) name:UIApplicationWillEnterForegroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeAuthorizationStatusNotification:) name:EQNNotificationDidChangeAuthorizationStatus object:nil]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self refreshUI]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:SegueIdentifierMap]) { UINavigationController *controller = (UINavigationController *)segue.destinationViewController; PastquakesDettagliMappa *dettagliMappa = (PastquakesDettagliMappa *)controller.topViewController; dettagliMappa.tipoMappa = reteSmartphone; } } #pragma mark - Notification - (void)applicationWillEnterForegroundNotification:(NSNotification *)notification { [self refreshUI]; } - (void)didChangeAuthorizationStatusNotification:(NSNotification *)notification { [self refreshUI]; } #pragma mark - Public - (void)fetchNewDataWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { dispatch_async(dispatch_get_main_queue(), ^{ [self refreshUI]; }); completionHandler(UIBackgroundFetchResultNewData); } #pragma mark - Private - (void)setupUI { self.title = NSLocalizedString(@"tab_network", nil); self.tableView.estimatedRowHeight = 200.0; self.tableView.rowHeight = UITableViewAutomaticDimension; } - (void)refreshUI { [super refreshUI]; NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:NOTIFICHE_RETE_SMARTPHONE_DATA_NOTIFICA]; if (date) { if ([EQNUtility getDifferenceMinute:date] < TEMPO_VISUALIZZAZIONE_NOTIFICA) self.isNotificaAttiva = YES; else{ self.isNotificaAttiva = NO; [[NSUserDefaults standardUserDefaults] removeObjectForKey:NOTIFICHE_RETE_SMARTPHONE_DATA_NOTIFICA]; [[NSUserDefaults standardUserDefaults] synchronize]; } } [self.tableItems removeAllObjects]; // check if locations is enabled if (CLLocationManager.authorizationStatus != kCLAuthorizationStatusAuthorizedAlways) { [self.tableItems addObject:@(AllerteTableRowLocationPermission)]; } // always visible rows [self.tableItems addObjectsFromArray:@[ @(AllerteTableRowSismiRilevati), @(AllerteTableRowAllertePassate), @(AllerteTableRowReteSmartphone), @(AllerteTableRowServizioPriorita)]]; // pro cell visible only if user hasn't already bought the app if ([EQNPurchaseUtility isProVersionEnabled] == NO) { [self.tableItems addObject:@(AllerteTableRowVersionePro)]; } // location data visible only if last position is known if ([EQNUser defaultUser].lastPosition != nil) { [self.tableItems addObject:@(AllerteTableRowDatiPosizione)]; } [self.tableView reloadData]; } #pragma mark - Actions - (IBAction)refreshDataTapped:(id)sender { [[EQNManager defaultManager] sincronizza]; } - (void)actionCloseNotification { [[NSUserDefaults standardUserDefaults] removeObjectForKey:NOTIFICHE_RETE_SMARTPHONE_DATA_NOTIFICA]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:NOTIFICHE_RETE_SMARTPHONE_DIZIONARIO_NOTIFICA]; [[NSUserDefaults standardUserDefaults] synchronize]; self.isNotificaAttiva = NO; [self.tableView reloadData]; } - (void)actionShareApp { NSString *appName = [NSProcessInfo processInfo].processName; NSString *content = [NSString stringWithFormat:@"%@%@ %@",NSLocalizedString(@"Scarica ", @""), appName, EQNAppStoreUrl]; UIActivityViewController* activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[content] applicationActivities:nil]; [self presentViewController:activityViewController animated:YES completion:nil]; } - (void)actionRateApp { [SKStoreReviewController requestReview]; } - (void)actionOpenTwitter { NSURL *twitterUrl = [NSURL URLWithString:EQNTwitterProfileUrl]; SFSafariViewController *controller = [[SFSafariViewController alloc] initWithURL:twitterUrl]; [self presentViewController:controller animated:YES completion:nil]; } - (void)actionComingSoon { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Coming soon..." message:@"🚀" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; } - (void)actionHowItWorks { NSURL *youtubeUrl = [NSURL URLWithString:NSLocalizedString(@"youtube_video", nil)]; SFSafariViewController *controller = [[SFSafariViewController alloc] initWithURL:youtubeUrl]; [self presentViewController:controller animated:YES completion:nil]; } - (void)actionTestPush { CLAuthorizationStatus status = CLLocationManager.authorizationStatus; if (status != kCLAuthorizationStatusAuthorizedAlways && status != kCLAuthorizationStatusAuthorizedWhenInUse) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Attenzione", nil) message:NSLocalizedString(@"liveview_unknown_location", nil) preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; return; } NSURL *url = [EQNGeneratoreURLServer urlAlertPushTest]; [[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataAlertPushTest success:^(id result) { // nope } failure:^(NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Attenzione", @"") message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; }); }]; } #pragma table view - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.tableItems.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { AllerteTableRow tableRow = [self.tableItems[indexPath.row] integerValue]; if (tableRow == AllerteTableRowLocationPermission) { AlertsNoLocationTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NoLocationCell" forIndexPath:indexPath]; cell.status = CLLocationManager.authorizationStatus; return cell; } else if (tableRow == AllerteTableRowSismiRilevati) { if (self.isNotificaAttiva) { AlertsSeismicNotificationExpandedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SeismicNotificationExpandedCell" forIndexPath:indexPath]; NSDictionary *info = [EQNUtility loadDictionaryFromUserDefaultsForKey:NOTIFICHE_RETE_SMARTPHONE_DIZIONARIO_NOTIFICA]; cell.notification = info; __weak AllerteViewController *weakSelf = self; cell.onTapClose = ^{ [weakSelf actionCloseNotification]; }; cell.onTapShareApp = ^{ [weakSelf actionShareApp]; }; cell.onTapRateApp = ^{ [weakSelf actionRateApp]; }; cell.onTapOpenTwitter = ^{ [weakSelf actionOpenTwitter]; }; return cell; } AlertsSeismicNotificationCompactTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SeismicNotificationCell" forIndexPath:indexPath]; __weak AllerteViewController *weakSelf = self; cell.onTapAlertTest = ^{ [weakSelf actionTestPush]; }; cell.onTapSimulator = ^{ [weakSelf actionComingSoon]; }; cell.onTapHowItWorks = ^{ [weakSelf actionHowItWorks]; }; cell.onTapShareApp = ^{ [weakSelf actionShareApp]; }; return cell; } else if (tableRow == AllerteTableRowAllertePassate) { AlertsPastEartquakesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PastEarthquakesCell" forIndexPath:indexPath]; cell.smartphoneNetwork = [EQNManager defaultManager].rete_smartphone; cell.onTapMapButton = ^{ [self performSegueWithIdentifier:SegueIdentifierMap sender:nil]; }; return cell; } else if (tableRow == AllerteTableRowReteSmartphone) { AlertsSmartphoneNetworkTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SmartphoneNetworkCell" forIndexPath:indexPath]; cell.smartphoneNetwork = [EQNManager defaultManager].rete_smartphone; cell.onTapButton = ^{ [self visualizzaCopertura]; }; return cell; } else if (tableRow == AllerteTableRowServizioPriorita) { AlertsPriorityServiceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PriorityCell" forIndexPath:indexPath]; cell.smartphoneNetwork = [EQNManager defaultManager].rete_smartphone; return cell; } else if (tableRow == AllerteTableRowVersionePro) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ProVersionCell" forIndexPath:indexPath]; return cell; } else if (tableRow == AllerteTableRowDatiPosizione) { AlertsPositionDataTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PositionDataCell" forIndexPath:indexPath]; cell.position = [EQNUser defaultUser].lastPosition; return cell; } return nil; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; AllerteTableRow tableRow = [self.tableItems[indexPath.row] integerValue]; switch (tableRow) { case AllerteTableRowServizioPriorita: [self performSegueWithIdentifier:SegueIdentifierPrioritySubscriptions sender:nil]; break; case AllerteTableRowVersionePro: [self performSegueWithIdentifier:SegueIdentifierProVersion sender:nil]; break; default: break; } } - (void)visualizzaCopertura { [[EQNManager defaultManager] sincronizza]; EQNAreaCheck *areaCheck = [EQNManager defaultManager].area_check; UIAlertController * alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Copertura" , @"") message:[NSString stringWithFormat:@"%@ %@ %@", NSLocalizedString(@"Dispositivi totali", @""), areaCheck.total, NSLocalizedString(@"Dispositivi attivi", @"")] preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK" ,@"") style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alertController animated:YES completion:nil]; } @end