// // AletaSismiTableViewController.m // Earthquake Network // // Refactored by Andrea Busi 25/08/2020. // Copyright © 2020 Earthquake Network. All rights reserved. // #import "SettingsRealTimeAlertsViewController.h" #import "EQNAllertaSismica.h" @interface SettingsRealTimeAlertsViewController () @property (nonatomic, strong) NSArray *settings; @property (strong, nonatomic) NSArray *dataSourceSismi; @property (nonatomic, strong) NSArray *dataSourceRaggioSisma; @property (nonatomic, strong) EQNGenericValue *currentSeismicToNotify; @property (strong, nonatomic) EQNGenericValue *currentLowSeismicRadius; @property (strong, nonatomic) EQNGenericValue *currentStrongSeismicRadius; @property (strong, nonatomic) NSDate *currentStartTime; @property (nonatomic) BOOL isStartTimeExpanded; @property (strong, nonatomic) NSDate *currentEndTime; @property (nonatomic) BOOL isEndTimeExpanded; @property (nonatomic, strong) NSDateFormatter *dateFormatter; @property (nonatomic, assign) BOOL notificationEnabled; @property (nonatomic, assign) BOOL notificationNoEnergySeismicEnabled; @property (nonatomic, assign) BOOL doNotDisturbEnabled; @end @implementation SettingsRealTimeAlertsViewController typedef NS_ENUM(NSInteger, RowIdentifier) { RowIdentifierAbilitaNotifiche = 0, RowIdentifierSismiDaNotificare, RowIdentifierAbilitaSismiSenzaIntensita, RowIdentifierRaggioSismiLievi, RowIndntifierRaggioSismiForti, RowIdentifierNonDisturbare, RowIdentifierNonDisturbareOraInizio, RowIdentifierNonDisturbareOraFine }; #pragma mark - Accessories - (NSDateFormatter *)dateFormatter { if (!_dateFormatter) { _dateFormatter = [[NSDateFormatter alloc] init]; [_dateFormatter setDateFormat:@"HH:mm"]; } return _dateFormatter; } #pragma mark - View Lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; self.settings = @[ [[SettingItem alloc] initWithType:SettingTypeEnable title:NSLocalizedString(@"Suona un allarme quando un sisma è rilevato dalla rete smartphone", @"")], [[SettingItem alloc] initWithType:SettingTypeSegmented title:NSLocalizedString(@"Sismi da notificare", @"") subtitle:NSLocalizedString(@"", @"")], [[SettingItem alloc] initWithType:SettingTypeEnable title:NSLocalizedString(@"Sismi senza intensità", @"") subtitle:NSLocalizedString(@"Attiva l'allerta anche su i sismi per i quali non è possibile stimare l'intensità", @"")], [[SettingItem alloc] initWithType:SettingTypeSlider title:NSLocalizedString(@"Raggio sismi lievi", @"")], [[SettingItem alloc] initWithType:SettingTypeSlider title:NSLocalizedString(@"Raggio sismi forti o intensità non disponibile", @"")] ]; // these settings are disabled because on iOS app are not handled /* [[SettingItem alloc] initWithType:SettingTypeEnable title:NSLocalizedString(@"Intervallo allarme", @"") subtitle:NSLocalizedString(@"Non attivare allarmi o notifiche in questo lasso di tempo", @"") icon:nil segue:nil], [[SettingItem alloc] initWithType:SettingTypeDate title:NSLocalizedString(@"Ora di inizio", @"") subtitle:nil icon:nil segue:nil], [[SettingItem alloc] initWithType:SettingTypeDate title:NSLocalizedString(@"Ora di fine", @"") subtitle:nil icon:nil segue:nil] */ self.dataSourceSismi = [EQNData seismicToNotify]; self.dataSourceRaggioSisma = [EQNData raggioSismi]; [self updateUI]; } #pragma mark - Private - (void)setupUI { self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; self.tableView.estimatedRowHeight = 200.0; self.tableView.rowHeight = UITableViewAutomaticDimension; [self.tableView registerClass:[SettingSectionHeaderView class] forHeaderFooterViewReuseIdentifier:SettingSectionHeaderView.Identifier]; [self.tableView registerClass:[SettingEnableTableViewCell class] forCellReuseIdentifier:SettingEnableTableViewCell.Identifier]; [self.tableView registerClass:[SettingSliderTableViewCell class] forCellReuseIdentifier:SettingSliderTableViewCell.Identifier]; [self.tableView registerClass:[SettingMultivaluesTableViewCell class] forCellReuseIdentifier:SettingMultivaluesTableViewCell.Identifier]; [self.tableView registerClass:[SettingSegmentedTableViewCell class] forCellReuseIdentifier:SettingSegmentedTableViewCell.Identifier]; [self.tableView registerClass:[SettingDateTableViewCell class] forCellReuseIdentifier:SettingDateTableViewCell.Identifier]; } - (void)updateUI { self.notificationEnabled = [EQNAllertaSismica center].isAbilitato; self.notificationNoEnergySeismicEnabled = [EQNAllertaSismica center].isSimiSenzaIntensita; self.doNotDisturbEnabled = [EQNAllertaSismica center].isintervalloAllarme; // sismi da notificare EQNGenericValue *sismiDaNotificare = [EQNData seismicToNotifyFor:[EQNAllertaSismica center].sismiDaNotificare]; self.currentSeismicToNotify = sismiDaNotificare; // raggio sismi lievi EQNGenericValue *raggioSismiLievi = [EQNData raggioSismaFor:[EQNAllertaSismica center].raggioSismiLievi]; self.currentLowSeismicRadius = raggioSismiLievi; // raggio sismi forti EQNGenericValue *raggioSismiForti = [EQNData raggioSismaFor:[EQNAllertaSismica center].raggioSismiForti]; self.currentStrongSeismicRadius = raggioSismiForti; // non disturbare, orari NSDate *startTime = [EQNData doNotDisturbEndDateFrom:[EQNAllertaSismica center].oraioInizio]; self.currentStartTime = startTime; NSDate *endTime = [EQNData doNotDisturbEndDateFrom:[EQNAllertaSismica center].orarioFine]; self.currentEndTime = endTime; [[EQNAllertaSismica center] saveUserInfo]; [self.tableView reloadData]; } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.settings.count; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { SettingSectionHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:SettingSectionHeaderView.Identifier]; headerView.titleLabel.text = NSLocalizedString(@"Alerta sismica", @"titolo impostazioni notifiche"); return headerView; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return SettingSectionHeaderView.Height; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { SettingItem *setting = self.settings[indexPath.row]; if (setting.type == SettingTypeEnable) { SettingEnableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SettingEnableTableViewCell.Identifier forIndexPath:indexPath]; cell.titleLabel.text = setting.displayTitle; cell.descriptionLabel.text = setting.subtitle; if (indexPath.row == RowIdentifierAbilitaNotifiche) { cell.toggleSwitch.on = self.notificationEnabled; cell.valueChanged = ^(BOOL enabled) { self.notificationEnabled = enabled; [EQNAllertaSismica center].isAbilitato = self.notificationEnabled; [[EQNAllertaSismica center] saveUserInfo]; [self.tableView reloadData]; }; } else if (indexPath.row == RowIdentifierAbilitaSismiSenzaIntensita) { cell.toggleSwitch.on = self.notificationNoEnergySeismicEnabled; cell.isDisabled = !self.notificationEnabled; cell.valueChanged = ^(BOOL enabled) { self.notificationNoEnergySeismicEnabled = enabled; [EQNAllertaSismica center].isSimiSenzaIntensita = self.notificationNoEnergySeismicEnabled; [[EQNAllertaSismica center] saveUserInfo]; [self.tableView reloadData]; }; } else if (indexPath.row == RowIdentifierNonDisturbare) { cell.toggleSwitch.on = self.doNotDisturbEnabled; cell.isDisabled = !self.notificationEnabled; cell.valueChanged = ^(BOOL enabled) { self.doNotDisturbEnabled = enabled; [EQNAllertaSismica center].isintervalloAllarme = self.doNotDisturbEnabled; [[EQNAllertaSismica center] saveUserInfo]; [self.tableView reloadData]; }; } return cell; } else if (setting.type == SettingTypeSegmented) { SettingSegmentedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SettingSegmentedTableViewCell.Identifier forIndexPath:indexPath]; cell.titleLabel.text = setting.displayTitle; if (indexPath.row == RowIdentifierSismiDaNotificare) { cell.isDisabled = !self.notificationEnabled; [cell configureControlWith:self.dataSourceSismi current:self.currentSeismicToNotify]; cell.valueChanged = ^(EQNGenericValue *item) { [self updateSismicToNotify:item]; }; } return cell; } else if (setting.type == SettingTypeSlider) { SettingSliderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SettingSliderTableViewCell.Identifier forIndexPath:indexPath]; cell.titleLabel.text = setting.displayTitle; if (indexPath.row == RowIdentifierRaggioSismiLievi) { cell.isDisabled = !self.notificationEnabled; [cell configureSliderWith:self.dataSourceRaggioSisma current:self.currentLowSeismicRadius]; cell.valueChanged = ^(EQNGenericValue *item) { [self updateLowSeismicRadius:item]; }; } else if (indexPath.row == RowIndntifierRaggioSismiForti) { cell.isDisabled = !self.notificationEnabled; [cell configureSliderWith:self.dataSourceRaggioSisma current:self.currentStrongSeismicRadius]; cell.valueChanged = ^(EQNGenericValue *item) { [self updateStrongSeismicRadius:item]; }; } return cell; } else if (setting.type == SettingTypeDate) { SettingDateTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SettingDateTableViewCell.Identifier forIndexPath:indexPath]; cell.isDisabled = !self.doNotDisturbEnabled || !self.notificationEnabled; cell.userInteractionEnabled = self.doNotDisturbEnabled && self.notificationEnabled; cell.titleLabel.text = setting.title; if (indexPath.row == RowIdentifierNonDisturbareOraInizio) { cell.isPickerVisible = self.isStartTimeExpanded; [cell updateDate:self.currentStartTime]; cell.valuesLabel.text = [self.dateFormatter stringFromDate:self.currentStartTime]; cell.valueChanged = ^(NSDate *date) { [self updateStartTime:date]; }; } else if (indexPath.row == RowIdentifierNonDisturbareOraFine) { cell.isPickerVisible = self.isEndTimeExpanded; [cell updateDate:self.currentEndTime]; cell.valuesLabel.text = [self.dateFormatter stringFromDate:self.currentEndTime]; cell.valueChanged = ^(NSDate *date) { [self updateEndTime:date]; }; } return cell; } return nil; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == RowIdentifierNonDisturbareOraInizio) { self.isStartTimeExpanded = !self.isStartTimeExpanded; } else if (indexPath.row == RowIdentifierNonDisturbareOraFine) { self.isEndTimeExpanded = !self.isEndTimeExpanded; } [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } #pragma mark - Private - (void)updateSismicToNotify:(EQNGenericValue *)seismic { [EQNAllertaSismica center].sismiDaNotificare = seismic.value; [[EQNAllertaSismica center] saveUserInfo]; [self updateUI]; } - (void)updateLowSeismicRadius:(EQNGenericValue *)radius { [EQNAllertaSismica center].raggioSismiLievi = radius.value; [[EQNAllertaSismica center] saveUserInfo]; [self updateUI]; } - (void)updateStrongSeismicRadius:(EQNGenericValue *)radius { [EQNAllertaSismica center].raggioSismiForti = radius.value; [[EQNAllertaSismica center] saveUserInfo]; [self updateUI]; } - (void)updateStartTime:(NSDate *)date { [EQNAllertaSismica center].oraioInizio = date; [[EQNAllertaSismica center] saveUserInfo]; [self updateUI]; } - (void)updateEndTime:(NSDate *)date { [EQNAllertaSismica center].orarioFine = date; [[EQNAllertaSismica center] saveUserInfo]; [self updateUI]; } @end