diff --git a/clients/ios/Classes/FontSettingsViewController.m b/clients/ios/Classes/FontSettingsViewController.m index 0c9663f6f..3e77984a7 100644 --- a/clients/ios/Classes/FontSettingsViewController.m +++ b/clients/ios/Classes/FontSettingsViewController.m @@ -117,12 +117,14 @@ } NSString *theme = [ThemeManager themeManager].theme; - if ([theme isEqualToString:@"sepia"]) { + if ([theme isEqualToString:@"light"]) { self.themeSegment.selectedSegmentIndex = 1; - } else if ([theme isEqualToString:@"medium"]) { + } else if ([theme isEqualToString:@"sepia"]) { self.themeSegment.selectedSegmentIndex = 2; - } else if ([theme isEqualToString:@"dark"]) { + } else if ([theme isEqualToString:@"medium"]) { self.themeSegment.selectedSegmentIndex = 3; + } else if ([theme isEqualToString:@"dark"]) { + self.themeSegment.selectedSegmentIndex = 4; } else { self.themeSegment.selectedSegmentIndex = 0; } @@ -241,15 +243,18 @@ - (IBAction)changeTheme:(id)sender { NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults]; - NSString *theme = ThemeStyleLight; + NSString *theme = ThemeStyleAuto; switch ([sender selectedSegmentIndex]) { case 1: - theme = ThemeStyleSepia; + theme = ThemeStyleLight; break; case 2: - theme = ThemeStyleMedium; + theme = ThemeStyleSepia; break; case 3: + theme = ThemeStyleMedium; + break; + case 4: theme = ThemeStyleDark; break; @@ -559,16 +564,17 @@ cell.separatorInset = UIEdgeInsetsZero; cell.backgroundColor = UIColorFromRGB(0xffffff); - UIImage *lightImage = [self themeImageWithName:@"theme_color_light" selected:self.themeSegment.selectedSegmentIndex == 0]; - UIImage *sepiaImage = [self themeImageWithName:@"theme_color_sepia" selected:self.themeSegment.selectedSegmentIndex == 1]; - UIImage *mediumImage = [self themeImageWithName:@"theme_color_medium" selected:self.themeSegment.selectedSegmentIndex == 2]; - UIImage *darkImage = [self themeImageWithName:@"theme_color_dark" selected:self.themeSegment.selectedSegmentIndex == 3]; + UIImage *lightImage = [self themeImageWithName:@"theme_color_light" selected:self.themeSegment.selectedSegmentIndex == 1]; + UIImage *sepiaImage = [self themeImageWithName:@"theme_color_sepia" selected:self.themeSegment.selectedSegmentIndex == 2]; + UIImage *mediumImage = [self themeImageWithName:@"theme_color_medium" selected:self.themeSegment.selectedSegmentIndex == 3]; + UIImage *darkImage = [self themeImageWithName:@"theme_color_dark" selected:self.themeSegment.selectedSegmentIndex == 4]; self.themeSegment.frame = CGRectMake(8, 4, cell.frame.size.width - 8*2, kMenuOptionHeight - 4*2); - [self.themeSegment setImage:lightImage forSegmentAtIndex:0]; - [self.themeSegment setImage:sepiaImage forSegmentAtIndex:1]; - [self.themeSegment setImage:mediumImage forSegmentAtIndex:2]; - [self.themeSegment setImage:darkImage forSegmentAtIndex:3]; + [self.themeSegment setTitle:@"Auto" forSegmentAtIndex:0]; + [self.themeSegment setImage:lightImage forSegmentAtIndex:1]; + [self.themeSegment setImage:sepiaImage forSegmentAtIndex:2]; + [self.themeSegment setImage:mediumImage forSegmentAtIndex:3]; + [self.themeSegment setImage:darkImage forSegmentAtIndex:4]; UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, self.themeSegment.frame.size.height), NO, 0.0); UIImage *blankImage = UIGraphicsGetImageFromCurrentImageContext(); diff --git a/clients/ios/Classes/FontSettingsViewController.xib b/clients/ios/Classes/FontSettingsViewController.xib index 993ce9018..3415c2768 100644 --- a/clients/ios/Classes/FontSettingsViewController.xib +++ b/clients/ios/Classes/FontSettingsViewController.xib @@ -1,9 +1,9 @@ - + - + @@ -85,10 +85,11 @@ - - + + + diff --git a/clients/ios/Classes/MenuViewController.m b/clients/ios/Classes/MenuViewController.m index c794858b5..053671df2 100644 --- a/clients/ios/Classes/MenuViewController.m +++ b/clients/ios/Classes/MenuViewController.m @@ -175,7 +175,7 @@ NSString * const MenuHandler = @"handler"; cell.backgroundColor = UIColorFromRGB(0xffffff); NSString *theme = [ThemeManager themeManager].theme; - NSArray *values = @[ThemeStyleLight, ThemeStyleSepia, ThemeStyleMedium, ThemeStyleDark]; + NSArray *values = @[ThemeStyleAuto, ThemeStyleLight, ThemeStyleSepia, ThemeStyleMedium, ThemeStyleDark]; NSUInteger valueIndex = [values indexOfObject:theme]; if (valueIndex < 0) { @@ -186,15 +186,18 @@ NSString * const MenuHandler = @"handler"; [segmentedControl addTarget:self action:@selector(changeTheme:) forControlEvents:UIControlEventValueChanged]; - UIImage *lightImage = [self themeImageWithName:@"theme_color_light" selected:valueIndex == 0]; - UIImage *sepiaImage = [self themeImageWithName:@"theme_color_sepia" selected:valueIndex == 1]; - UIImage *mediumImage = [self themeImageWithName:@"theme_color_medium" selected:valueIndex == 2]; - UIImage *darkImage = [self themeImageWithName:@"theme_color_dark" selected:valueIndex == 3]; + UIImage *lightImage = [self themeImageWithName:@"theme_color_light" selected:valueIndex == 1]; + UIImage *sepiaImage = [self themeImageWithName:@"theme_color_sepia" selected:valueIndex == 2]; + UIImage *mediumImage = [self themeImageWithName:@"theme_color_medium" selected:valueIndex == 3]; + UIImage *darkImage = [self themeImageWithName:@"theme_color_dark" selected:valueIndex == 4]; - [segmentedControl insertSegmentWithImage:lightImage atIndex:0 animated: NO]; - [segmentedControl insertSegmentWithImage:sepiaImage atIndex:1 animated: NO]; - [segmentedControl insertSegmentWithImage:mediumImage atIndex:2 animated: NO]; - [segmentedControl insertSegmentWithImage:darkImage atIndex:3 animated: NO]; + [segmentedControl insertSegmentWithTitle:@"Auto" atIndex:0 animated:NO]; + [segmentedControl insertSegmentWithImage:lightImage atIndex:1 animated: NO]; + [segmentedControl insertSegmentWithImage:sepiaImage atIndex:2 animated: NO]; + [segmentedControl insertSegmentWithImage:mediumImage atIndex:3 animated: NO]; + [segmentedControl insertSegmentWithImage:darkImage atIndex:4 animated: NO]; + + [segmentedControl setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"WhitneySSm-Medium" size:12.0]} forState:UIControlStateNormal]; [[ThemeManager themeManager] updateThemeSegmentedControl:segmentedControl]; @@ -216,7 +219,7 @@ NSString * const MenuHandler = @"handler"; } - (IBAction)changeTheme:(UISegmentedControl *)sender { - NSArray *values = @[ThemeStyleLight, ThemeStyleSepia, ThemeStyleMedium, ThemeStyleDark]; + NSArray *values = @[ThemeStyleAuto, ThemeStyleLight, ThemeStyleSepia, ThemeStyleMedium, ThemeStyleDark]; [ThemeManager themeManager].theme = [values objectAtIndex:sender.selectedSegmentIndex]; diff --git a/clients/ios/Classes/NewsBlurAppDelegate.m b/clients/ios/Classes/NewsBlurAppDelegate.m index 301dabf68..be1ae891a 100644 --- a/clients/ios/Classes/NewsBlurAppDelegate.m +++ b/clients/ios/Classes/NewsBlurAppDelegate.m @@ -964,11 +964,6 @@ if (system_font_enabled) { [hiddenSet addObjectsFromArray:@[@"feed_list_font_size"]]; } - BOOL theme_follow_system = [[NSUserDefaults standardUserDefaults] boolForKey:@"theme_follow_system"]; - if (theme_follow_system) { - [hiddenSet addObjectsFromArray:@[@"theme_auto_toggle", @"theme_auto_brightness", @"theme_style", @"theme_gesture"]]; - [[ThemeManager themeManager] updateForSystemAppearance]; - } BOOL theme_auto_toggle = [[NSUserDefaults standardUserDefaults] boolForKey:@"theme_auto_toggle"]; if (theme_auto_toggle) { [hiddenSet addObjectsFromArray:@[@"theme_style", @"theme_gesture"]]; diff --git a/clients/ios/Classes/ThemeManager.h b/clients/ios/Classes/ThemeManager.h index 801b64dd9..5d3b95d02 100644 --- a/clients/ios/Classes/ThemeManager.h +++ b/clients/ios/Classes/ThemeManager.h @@ -18,6 +18,7 @@ #define NEWSBLUR_WHITE_COLOR 0xffffff #define NEWSBLUR_BLACK_COLOR 0x0 +extern NSString * const ThemeStyleAuto; extern NSString * const ThemeStyleLight; extern NSString * const ThemeStyleSepia; extern NSString * const ThemeStyleMedium; @@ -30,6 +31,7 @@ extern NSString * const ThemeStyleDark; @property (nonatomic, strong) NSString *theme; @property (nonatomic, readonly) NSString *themeDisplayName; @property (nonatomic, readonly) NSString *themeCSSSuffix; +@property (nonatomic, readonly) BOOL isAutoTheme; @property (nonatomic, readonly) BOOL isDarkTheme; @property (nonatomic, readonly) BOOL isSystemDark; @property (nonatomic, readonly) BOOL isLikeSystem; diff --git a/clients/ios/Classes/ThemeManager.m b/clients/ios/Classes/ThemeManager.m index a890f863c..0e969e505 100644 --- a/clients/ios/Classes/ThemeManager.m +++ b/clients/ios/Classes/ThemeManager.m @@ -13,6 +13,7 @@ #import #import "NewsBlur-Swift.h" +NSString * const ThemeStyleAuto = @"auto"; NSString * const ThemeStyleLight = @"light"; NSString * const ThemeStyleSepia = @"sepia"; NSString * const ThemeStyleMedium = @"medium"; @@ -42,6 +43,7 @@ NSString * const ThemeStyleDark = @"dark"; @property (nonatomic, readonly) NewsBlurAppDelegate *appDelegate; @property (nonatomic) BOOL justToggledViaGesture; +@property (nonatomic) BOOL isAutoDark; @end @@ -66,16 +68,13 @@ NSString * const ThemeStyleDark = @"dark"; NSString *theme = [[NSUserDefaults standardUserDefaults] objectForKey:@"theme_style"]; if (![self isValidTheme:theme]) { - theme = ThemeStyleLight; + theme = ThemeStyleAuto; } return theme; } - (void)setTheme:(NSString *)theme { - // Automatically turn off following the system appearance when manually changing the theme. - [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"theme_follow_system"]; - [self reallySetTheme:theme]; NSLog(@"Manually changed to theme: %@", self.themeDisplayName); // log @@ -97,8 +96,10 @@ NSString * const ThemeStyleDark = @"dark"; return @"Sepia"; } else if ([theme isEqualToString:ThemeStyleMedium]) { return @"Medium"; - } else { + } else if ([theme isEqualToString:ThemeStyleLight]) { return @"Light"; + } else { + return @"Auto"; } } @@ -107,10 +108,14 @@ NSString * const ThemeStyleDark = @"dark"; if ([theme isEqualToString:ThemeStyleDark]) { return @"Dark"; - } else if ([theme isEqualToString:ThemeStyleSepia]) { - return @"Sepia"; } else if ([theme isEqualToString:ThemeStyleMedium]) { return @"Medium"; + } else if ([theme isEqualToString:ThemeStyleSepia]) { + return @"Sepia"; + } else if ([theme isEqualToString:ThemeStyleLight]) { + return @"Light"; + } else if (self.isSystemDark) { + return @"Dark"; } else { return @"Light"; } @@ -125,14 +130,24 @@ NSString * const ThemeStyleDark = @"dark"; return ThemeStyleDark; } else if ([theme isEqualToString:ThemeStyleSepia]) { return ThemeStyleLight; - } else { + } else if ([theme isEqualToString:ThemeStyleLight]) { return ThemeStyleSepia; + } else { + return ThemeStyleAuto; } } +- (BOOL)isAutoTheme { + return [self.theme isEqualToString:ThemeStyleAuto]; +} + - (BOOL)isDarkTheme { NSString *theme = self.theme; + if (self.isAutoTheme) { + return self.isSystemDark; + } + return [theme isEqualToString:ThemeStyleDark] || [theme isEqualToString:ThemeStyleMedium]; } @@ -145,7 +160,7 @@ NSString * const ThemeStyleDark = @"dark"; } - (BOOL)isValidTheme:(NSString *)theme { - return [theme isEqualToString:ThemeStyleLight] || [theme isEqualToString:ThemeStyleSepia] || [theme isEqualToString:ThemeStyleMedium] || [theme isEqualToString:ThemeStyleDark]; + return [theme isEqualToString:ThemeStyleAuto] || [theme isEqualToString:ThemeStyleLight] || [theme isEqualToString:ThemeStyleSepia] || [theme isEqualToString:ThemeStyleMedium] || [theme isEqualToString:ThemeStyleDark]; } - (NewsBlurAppDelegate *)appDelegate { @@ -173,7 +188,9 @@ NSString * const ThemeStyleDark = @"dark"; - (UIColor *)colorFromLightRGB:(NSInteger)lightRGBValue sepiaRGB:(NSUInteger)sepiaRGBValue mediumRGB:(NSUInteger)mediumRGBValue darkRGB:(NSUInteger)darkRGBValue { NSInteger rgbValue = lightRGBValue; - if ([self.theme isEqualToString:ThemeStyleSepia]) { + if (self.isAutoTheme) { + rgbValue = self.isSystemDark ? darkRGBValue : rgbValue; + } else if ([self.theme isEqualToString:ThemeStyleSepia]) { rgbValue = sepiaRGBValue; } else if ([self.theme isEqualToString:ThemeStyleMedium]) { rgbValue = mediumRGBValue; @@ -193,7 +210,13 @@ NSString * const ThemeStyleDark = @"dark"; // Debug method to log all of the unique colors; leave commented out // [self debugColor:rgbValue]; - if ([theme isEqualToString:ThemeStyleDark]) { + if (self.isAutoTheme) { + if (self.isSystemDark) { + return [UIColor colorWithRed:1.0 - red green:1.0 - green blue:1.0 - blue alpha:1.0]; + } else { + return [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; + } + } else if ([theme isEqualToString:ThemeStyleDark]) { return [UIColor colorWithRed:1.0 - red green:1.0 - green blue:1.0 - blue alpha:1.0]; } else if ([theme isEqualToString:ThemeStyleMedium]) { if (rgbValue == 0x8F918B) { @@ -284,6 +307,8 @@ NSString * const ThemeStyleDark = @"dark"; } - (void)updateThemeSegmentedControl:(UISegmentedControl *)segmentedControl { + [self updateSegmentedControl:segmentedControl]; + segmentedControl.tintColor = [UIColor clearColor]; #if !TARGET_OS_MACCATALYST segmentedControl.backgroundColor = [UIColor clearColor]; @@ -304,6 +329,14 @@ NSString * const ThemeStyleDark = @"dark"; } - (void)prepareForWindow:(UIWindow *)window { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + + // Can remove this once everyone has updated to version 13.1.2 or later. + if ([prefs boolForKey:@"theme_follow_system"]) { + self.theme = ThemeStyleAuto; + [prefs setBool:NO forKey:@"theme_follow_system"]; + } + [self autoChangeTheme]; [self setupTheme]; [self addThemeGestureRecognizerToView:window]; @@ -335,10 +368,14 @@ NSString * const ThemeStyleDark = @"dark"; NSString *theme = self.theme; NewsBlurAppDelegate *appDelegate = self.appDelegate; - if (self.isDarkTheme) { - [prefs setObject:theme forKey:@"theme_dark"]; + if (self.isAutoTheme) { + self.isAutoDark = self.isSystemDark; } else { - [prefs setObject:theme forKey:@"theme_light"]; + if (self.isDarkTheme) { + [prefs setObject:theme forKey:@"theme_dark"]; + } else { + [prefs setObject:theme forKey:@"theme_light"]; + } } [self setupTheme]; @@ -459,14 +496,24 @@ NSString * const ThemeStyleDark = @"dark"; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *wantTheme = nil; - if (![prefs boolForKey:@"theme_follow_system"]) { + if (!self.isAutoTheme) { return; } - if (isDark) { - wantTheme = [prefs objectForKey:@"theme_dark"]; + if (self.isAutoTheme) { + if (isDark != self.isAutoDark) { + [self updateTheme]; + + NSLog(@"System changed to %@ appearance", isDark ? @"dark" : @"light"); // log + } + + return; } else { - wantTheme = [prefs objectForKey:@"theme_light"]; + if (isDark) { + wantTheme = [prefs objectForKey:@"theme_dark"]; + } else { + wantTheme = [prefs objectForKey:@"theme_light"]; + } } if (self.theme != wantTheme) { diff --git a/clients/ios/Resources/MainInterface.storyboard b/clients/ios/Resources/MainInterface.storyboard index 91922efd0..b404ac37d 100644 --- a/clients/ios/Resources/MainInterface.storyboard +++ b/clients/ios/Resources/MainInterface.storyboard @@ -619,7 +619,12 @@ - + + + + + + @@ -785,7 +790,7 @@ - + diff --git a/clients/ios/Resources/Settings.bundle/Root.plist b/clients/ios/Resources/Settings.bundle/Root.plist index 365984d14..9fff2e85e 100644 --- a/clients/ios/Resources/Settings.bundle/Root.plist +++ b/clients/ios/Resources/Settings.bundle/Root.plist @@ -426,16 +426,6 @@ Type PSGroupSpecifier - - Type - PSToggleSwitchSpecifier - Title - Follow system appearance - Key - theme_follow_system - DefaultValue - - Type PSToggleSwitchSpecifier @@ -469,6 +459,7 @@ Current theme Titles + Auto Light Sepia Medium @@ -478,6 +469,7 @@ light Values + auto light sepia medium diff --git a/clients/ios/Resources/Settings.bundle/Root~ipad.plist b/clients/ios/Resources/Settings.bundle/Root~ipad.plist index c0ff3312f..3516ed15e 100644 --- a/clients/ios/Resources/Settings.bundle/Root~ipad.plist +++ b/clients/ios/Resources/Settings.bundle/Root~ipad.plist @@ -454,16 +454,6 @@ Type PSGroupSpecifier - - Type - PSToggleSwitchSpecifier - Title - Follow system appearance - Key - theme_follow_system - DefaultValue - - Type PSToggleSwitchSpecifier @@ -497,6 +487,7 @@ Current theme Titles + Auto Light Sepia Medium @@ -506,6 +497,7 @@ light Values + auto light sepia medium diff --git a/clients/ios/Resources/mac/Settings.bundle/Appearance.plist b/clients/ios/Resources/mac/Settings.bundle/Appearance.plist index a63078363..588c02357 100644 --- a/clients/ios/Resources/mac/Settings.bundle/Appearance.plist +++ b/clients/ios/Resources/mac/Settings.bundle/Appearance.plist @@ -72,46 +72,6 @@ Key story_font_size - - Title - Theme - Type - PSGroupSpecifier - - - Type - PSToggleSwitchSpecifier - Title - Follow system appearance - Key - theme_follow_system - DefaultValue - - - - Type - PSMultiValueSpecifier - Title - Current theme - Titles - - Light - Sepia - Medium - Dark - - DefaultValue - light - Values - - light - sepia - medium - dark - - Key - theme_style - Title App badge