// // NotificationViewController.m // EQNNotificationContent // // Refactored by Andrea Busi on 14/10/2020. // Copyright © 2020 Earthquake Network. All rights reserved. // #import "NotificationViewController.h" #import "EQNUtility.h" #import "EQNNotificationContent-Swift.h" @import UserNotifications; @import UserNotificationsUI; @import MapKit; @interface NotificationViewController () @property (weak, nonatomic) IBOutlet UILabel *titleLabel; @property (weak, nonatomic) IBOutlet UILabel *descriptionLabel; @property (weak, nonatomic) IBOutlet UILabel *waveLabel; @property (weak, nonatomic) IBOutlet MKMapView *mapView; @property (weak, nonatomic) IBOutlet UIButton *tapToOpenButton; /// This will be calculated as seismic date + warning time @property (strong, nonatomic) NSDate *userSeismicTimestamp; @property (strong, nonatomic) NSTimer *countdownTimer; @end @implementation NotificationViewController - (void)setMapView:(MKMapView *)mapView { _mapView = mapView; _mapView.scrollEnabled = NO; _mapView.zoomEnabled = NO; _mapView.showsUserLocation = YES; } #pragma mark - View Lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self.mapView registerClass:[EQNCustomAnnotationView class] forAnnotationViewWithReuseIdentifier:EQNCustomAnnotationView.SingleLineIdentifier]; [self.mapView registerClass:[EQNCustomAnnotationView class] forAnnotationViewWithReuseIdentifier:EQNCustomAnnotationView.SmallIdentifier]; [self.tapToOpenButton setTitle:@"Tocca per aprire" forState:UIControlStateNormal]; } - (void)didReceiveNotification:(UNNotification *)notification { UNNotificationContent *content = notification.request.content; NSDictionary *userInfo = content.userInfo; // set title and description self.titleLabel.text = content.title; self.descriptionLabel.text = content.body; // add annotation onthe map CLLocation *coordinate = [[CLLocation alloc] initWithLatitude:[userInfo[@"latitude"] doubleValue] longitude:[userInfo[@"longitude"] doubleValue]]; MKCoordinateSpan span = MKCoordinateSpanMake(6, 6); MKCoordinateRegion region = MKCoordinateRegionMake(coordinate.coordinate, span); [self.mapView setCenterCoordinate:coordinate.coordinate animated:NO]; [self.mapView setRegion:region animated:YES]; if ([userInfo[@"type"] isEqualToString:@"eqn"]) { EQNMapAnnotationPastquake *annotation = [[EQNMapAnnotationPastquake alloc] initWithTitle:@"" coordinate:coordinate.coordinate intensity:[userInfo[@"intensity"] intValue]]; [self.mapView addAnnotation:annotation]; } else if ([userInfo[@"type"] isEqualToString:@"manual"]){ EQNMapAnnotationUserReport *annotation = [[EQNMapAnnotationUserReport alloc] initWithMagnitude:[userInfo[@"magnitude"] intValue] coordinate:coordinate.coordinate]; [self.mapView addAnnotation:annotation]; } self.userSeismicTimestamp = [EQNUtility calculateUserSeismicTimestampFromUserInfo:userInfo]; if (self.userSeismicTimestamp) { // start the countdown self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countdownFired:) userInfo:nil repeats:YES]; [self.countdownTimer fire]; } } #pragma mark - Private - (void)countdownFired:(id)sender { NSDate *now = [NSDate date]; NSTimeInterval difference = MAX([self.userSeismicTimestamp timeIntervalSinceDate:now], 0); NSInteger seconds = (int)lround(difference); self.waveLabel.text = [NSString localizedStringWithFormat:NSLocalizedString(@"alert_wave", @""), seconds]; if (difference <= 0) { // stop the countdown [self.countdownTimer invalidate]; self.countdownTimer = nil; } } #pragma mark - Actions - (IBAction)openAppTapped:(id)sender { [self.extensionContext performNotificationDefaultAction]; } #pragma mark - MKMapViewDelegate - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation { if ([annotation isKindOfClass:[EQNMapAnnotationPastquake class]]) { EQNMapAnnotationPastquake *pastquake = (EQNMapAnnotationPastquake *)annotation; EQNCustomAnnotationView *annotationView = (EQNCustomAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:EQNCustomAnnotationView.SingleLineIdentifier]; annotationView.image = pastquake.image; annotationView.title = pastquake.title; return annotationView; } else if ([annotation isKindOfClass:[EQNMapAnnotationUserReport class]]) { EQNMapAnnotationUserReport *report = (EQNMapAnnotationUserReport *)annotation; EQNCustomAnnotationView *annotationView = (EQNCustomAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:EQNCustomAnnotationView.SmallIdentifier]; annotationView.image = [report imageWithHeight:EQNCustomAnnotationView.SmallViewImageHeight]; annotationView.title = report.timeDifference; return annotationView; } return nil; } @end