//IOS 10 @interface NCNotificationDateLabel @property (assign,nonatomic) NSString *text; -(void)sizeToFit; @end //IOS 10 @interface NCLookHeaderContentView -(void)_updateDateLabelFontForShortLook; @end //IOS 11 & 12 And Above @interface BSUIRelativeDateLabel @property (assign,nonatomic) NSString *text; -(void)sizeToFit; @end //IOS 11 @interface MTPlatterHeaderContentView -(void)_updateTextAttributesForDateLabel; @end //IOS 12 And Above @interface PLPlatterHeaderContentView -(void)_updateTextAttributesForDateLabel; @end static bool is24h; static NSString *settingsPath = @"/var/mobile/Library/Preferences/com.gilshahar7.exacttimeprefs.plist"; %group iOS10 %hook NCLookHeaderContentView -(void)_updateDateLabelFontForShortLook{ %orig; NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:settingsPath]; bool enabled = [[prefs objectForKey:@"notifications"] boolValue]; if(enabled){ NSDate *date = MSHookIvar(self, "_date"); NSInteger format = MSHookIvar(self, "_dateFormatStyle"); CGFloat affectTime = [[prefs objectForKey:@"affectTime"] floatValue]; if((date != nil) && (format == 1)){ NCNotificationDateLabel *dateLabel = MSHookIvar(self, "_dateLabel"); int timeSinceNow = (int)[date timeIntervalSinceNow]; bool isFuture = false; if (timeSinceNow > 0){ isFuture = true; }else{ timeSinceNow = timeSinceNow*-1; } bool addMinutes = [[prefs objectForKey:@"addMinutes"] boolValue]; bool addToCurrent = [[prefs objectForKey:@"addToCurrent"] boolValue]; int hours = timeSinceNow / 3600; int minutes = (timeSinceNow % 3600) / 60; if(addMinutes){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(minutes == 0){ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih %im", hours, minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih %im ago", hours, minutes]; } } } }else if(addToCurrent){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } } if((timeSinceNow/60) >= affectTime){ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; if(is24h){ [dateFormatter setDateFormat:@"HH:mm"]; }else{ [dateFormatter setDateFormat:@"h:mm a"]; } if(addToCurrent && !([dateLabel.text isEqualToString:[dateFormatter stringFromDate:date]])){ dateLabel.text = [[dateLabel.text stringByAppendingString:@" • "] stringByAppendingString:[dateFormatter stringFromDate:date]]; }else{ dateLabel.text =[dateFormatter stringFromDate:date]; } [dateLabel sizeToFit]; [dateFormatter release]; } } } } -(void)dateLabelDidChange:(id)arg1{ %orig(arg1); [self _updateDateLabelFontForShortLook]; } %end %end %group iOS11 %hook MTPlatterHeaderContentView -(void)_updateTextAttributesForDateLabel{ %orig; NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:settingsPath]; bool enabled = [[prefs objectForKey:@"notifications"] boolValue]; if(enabled){ NSDate *date = MSHookIvar(self, "_date"); NSInteger format = MSHookIvar(self, "_dateFormatStyle"); CGFloat affectTime = [[prefs objectForKey:@"affectTime"] floatValue]; if((date != nil) && (format == 1)){ BSUIRelativeDateLabel *dateLabel = MSHookIvar(self, "_dateLabel"); int timeSinceNow = (int)[date timeIntervalSinceNow]; bool isFuture = false; if (timeSinceNow > 0){ isFuture = true; }else{ timeSinceNow = timeSinceNow*-1; } bool addMinutes = [[prefs objectForKey:@"addMinutes"] boolValue]; bool addToCurrent = [[prefs objectForKey:@"addToCurrent"] boolValue]; int hours = timeSinceNow / 3600; int minutes = (timeSinceNow % 3600) / 60; if(addMinutes){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(minutes == 0){ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih %im", hours, minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih %im ago", hours, minutes]; } } } }else if(addToCurrent){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } } if((timeSinceNow/60) >= affectTime){ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; if(is24h){ [dateFormatter setDateFormat:@"HH:mm"]; }else{ [dateFormatter setDateFormat:@"h:mm a"]; } if(addToCurrent && !([dateLabel.text isEqualToString:[dateFormatter stringFromDate:date]])){ dateLabel.text = [[dateLabel.text stringByAppendingString:@" • "] stringByAppendingString:[dateFormatter stringFromDate:date]]; }else{ dateLabel.text =[dateFormatter stringFromDate:date]; } [dateLabel sizeToFit]; [dateFormatter release]; } } } } -(void)dateLabelDidChange:(id)arg1{ %orig(arg1); [self _updateTextAttributesForDateLabel]; } %end %end %group iOS12AndAbove %hook PLPlatterHeaderContentView -(void)_updateTextAttributesForDateLabel{ %orig; NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:settingsPath]; bool enabled = [[prefs objectForKey:@"notifications"] boolValue]; if(enabled){ NSDate *date = MSHookIvar(self, "_date"); NSInteger format = MSHookIvar(self, "_dateFormatStyle"); CGFloat affectTime = [[prefs objectForKey:@"affectTime"] floatValue]; if((date != nil) && (format == 1)){ BSUIRelativeDateLabel *dateLabel = MSHookIvar(self, "_dateLabel"); int timeSinceNow = (int)[date timeIntervalSinceNow]; bool isFuture = false; if (timeSinceNow > 0){ isFuture = true; }else{ timeSinceNow = timeSinceNow*-1; } bool addMinutes = [[prefs objectForKey:@"addMinutes"] boolValue]; bool addToCurrent = [[prefs objectForKey:@"addToCurrent"] boolValue]; int hours = timeSinceNow / 3600; int minutes = (timeSinceNow % 3600) / 60; if(addMinutes){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(minutes == 0){ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih %im", hours, minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih %im ago", hours, minutes]; } } } }else if(addToCurrent){ if(hours == 0){ if(minutes == 0){ }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %im", minutes]; }else{ dateLabel.text = [NSString stringWithFormat:@"%im ago", minutes]; } } }else{ if(isFuture){ dateLabel.text = [NSString stringWithFormat:@"in %ih", hours]; }else{ dateLabel.text = [NSString stringWithFormat:@"%ih ago", hours]; } } } if((timeSinceNow/60) >= affectTime){ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; if(is24h){ [dateFormatter setDateFormat:@"HH:mm"]; }else{ [dateFormatter setDateFormat:@"h:mm a"]; } if(addToCurrent && !([dateLabel.text isEqualToString:[dateFormatter stringFromDate:date]])){ dateLabel.text = [[dateLabel.text stringByAppendingString:@" • "] stringByAppendingString:[dateFormatter stringFromDate:date]]; }else{ dateLabel.text =[dateFormatter stringFromDate:date]; } [dateLabel sizeToFit]; [dateFormatter release]; } } } } -(void)dateLabelDidChange:(id)arg1{ %orig(arg1); [self _updateTextAttributesForDateLabel]; } %end %end %ctor{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setLocale:[NSLocale currentLocale]]; [formatter setDateStyle:NSDateFormatterNoStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; NSString *dateString = [formatter stringFromDate:[NSDate date]]; NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound); [formatter release]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0 && [[[UIDevice currentDevice] systemVersion] floatValue] < 11.0) { %init(iOS10); } else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0 && [[[UIDevice currentDevice] systemVersion] floatValue] < 12.0) { %init(iOS11); }else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.0) { %init(iOS12AndAbove); } }