From ef37602ee1d8a2295795db69997385a3532cc2ce Mon Sep 17 00:00:00 2001 From: David Sinclair Date: Tue, 21 Jul 2020 21:17:29 -0700 Subject: [PATCH 1/5] #1341 (back button color) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - I can’t get it to fail, but I noticed that the back button tint color is only set in the feed detail. It shouldn’t need to be set at all, so I’ve commented that out; let’s see if that makes it better or worse. --- clients/ios/Classes/FeedDetailViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/ios/Classes/FeedDetailViewController.m b/clients/ios/Classes/FeedDetailViewController.m index c17719274..fdbbddf9c 100644 --- a/clients/ios/Classes/FeedDetailViewController.m +++ b/clients/ios/Classes/FeedDetailViewController.m @@ -2737,7 +2737,7 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state [super updateTheme]; self.navigationController.navigationBar.tintColor = [UINavigationBar appearance].tintColor; - self.navigationController.navigationBar.backItem.backBarButtonItem.tintColor = UIColorFromRGB(0x8F918B); +// self.navigationController.navigationBar.backItem.backBarButtonItem.tintColor = UIColorFromRGB(0x8F918B); self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor; self.navigationController.toolbar.barTintColor = [UINavigationBar appearance].barTintColor; From 4df24a0d6d4543f867f5fc18eec3622aeb7189b6 Mon Sep 17 00:00:00 2001 From: David Sinclair Date: Wed, 22 Jul 2020 20:17:17 -0700 Subject: [PATCH 2/5] #1342 (story selection fade) - Fixed selection being reset. --- clients/ios/Classes/FeedDetailViewController.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clients/ios/Classes/FeedDetailViewController.m b/clients/ios/Classes/FeedDetailViewController.m index fdbbddf9c..12bda4988 100644 --- a/clients/ios/Classes/FeedDetailViewController.m +++ b/clients/ios/Classes/FeedDetailViewController.m @@ -402,10 +402,6 @@ } else { feedMarkReadButton.enabled = YES; } - - if (self.isPhoneOrCompact) { - [self fadeSelectedCell:NO]; - } [self.notifier setNeedsLayout]; [appDelegate hideShareView:YES]; @@ -439,6 +435,10 @@ [self updateTheme]; + if (self.isPhoneOrCompact) { + [self fadeSelectedCell:NO]; + } + if (storiesCollection.activeFeed != nil) { [appDelegate donateFeed]; } else if (storiesCollection.activeFolder != nil) { From 9aaa39f0d0be196b86aa6bd8584bbd89ac982269 Mon Sep 17 00:00:00 2001 From: David Sinclair Date: Fri, 31 Jul 2020 16:10:09 -0700 Subject: [PATCH 3/5] #1350 (fullscreen vertical scrolling) & #1338 (fullscreen improvements) - Several changes to improve the fullscreen experience, especially in vertical paging mode. --- .../ios/Classes/StoryDetailViewController.m | 46 ++++---------- clients/ios/Classes/StoryPageControl.h | 3 + clients/ios/Classes/StoryPageControl.m | 60 +++++++++++++++---- clients/ios/Classes/StoryPageControl.xib | 5 +- .../ios/NewsBlur.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/NewsBlur.xcscheme | 2 +- .../xcschemes/Share Extension.xcscheme | 2 +- ...ry Notification Service Extension.xcscheme | 2 +- .../xcschemes/Widget Extension.xcscheme | 2 +- 9 files changed, 70 insertions(+), 54 deletions(-) diff --git a/clients/ios/Classes/StoryDetailViewController.m b/clients/ios/Classes/StoryDetailViewController.m index 9204b1bbe..61090904b 100644 --- a/clients/ios/Classes/StoryDetailViewController.m +++ b/clients/ios/Classes/StoryDetailViewController.m @@ -33,7 +33,6 @@ @interface StoryDetailViewController () @property (nonatomic, strong) NSString *fullStoryHTML; -@property (nonatomic) BOOL isBarHideSwiping; @end @@ -297,8 +296,6 @@ - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; - [self.navigationController.barHideOnSwipeGestureRecognizer removeTarget:self action:@selector(barHideSwipe:)]; - if (!appDelegate.showingSafariViewController && appDelegate.navigationController.visibleViewController != (UIViewController *)appDelegate.shareViewController && appDelegate.navigationController.visibleViewController != (UIViewController *)appDelegate.trainerViewController && @@ -320,8 +317,6 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [self.navigationController.barHideOnSwipeGestureRecognizer addTarget:self action:@selector(barHideSwipe:)]; - if (!self.isPhoneOrCompact) { [appDelegate.feedDetailViewController.view endEditing:YES]; } @@ -628,23 +623,17 @@ } - (void)drawFeedGradient { - NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; - BOOL navigationBarHidden = self.navigationController.navigationBarHidden; - BOOL shouldHideStatusBar = [preferences boolForKey:@"story_hide_status_bar"]; - UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; - BOOL shouldOffsetFeedGradient = !self.isBarHideSwiping && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && !UIInterfaceOrientationIsLandscape(orientation) && navigationBarHidden && !shouldHideStatusBar; - CGFloat offset = 0; - - if (shouldOffsetFeedGradient) { - offset = appDelegate.storyPageControl.statusBarBackgroundView.bounds.size.height; - } - - CGFloat yOffset = offset - 1; + BOOL shouldHideStatusBar = appDelegate.storyPageControl.shouldHideStatusBar; + CGFloat yOffset = -1; NSString *feedIdStr = [NSString stringWithFormat:@"%@", [self.activeStory objectForKey:@"story_feed_id"]]; NSDictionary *feed = [appDelegate getFeed:feedIdStr]; + if (appDelegate.storyPageControl.currentlyTogglingNavigationBar && !appDelegate.storyPageControl.isNavigationBarHidden) { + yOffset -= 25; + } + if (self.feedTitleGradient) { [self.feedTitleGradient removeFromSuperview]; self.feedTitleGradient = nil; @@ -673,11 +662,11 @@ [self.webView insertSubview:feedTitleGradient aboveSubview:self.webView.scrollView]; if (@available(iOS 11.0, *)) { - if (self.view.safeAreaInsets.top > 0.0 && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && shouldHideStatusBar) { - feedTitleGradient.alpha = self.navigationController.navigationBarHidden ? 1 : 0; + if (appDelegate.storyPageControl.view.safeAreaInsets.top > 0.0 && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && shouldHideStatusBar) { + feedTitleGradient.alpha = appDelegate.storyPageControl.isNavigationBarHidden ? 1 : 0; [UIView animateWithDuration:0.3 animations:^{ - feedTitleGradient.alpha = self.navigationController.navigationBarHidden ? 0 : 1; + feedTitleGradient.alpha = appDelegate.storyPageControl.isNavigationBarHidden ? 0 : 1; }]; } } @@ -1339,7 +1328,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqual:@"contentOffset"]) { BOOL isHorizontal = appDelegate.storyPageControl.isHorizontal; - BOOL isNavBarHidden = self.navigationController.navigationBarHidden; + BOOL isNavBarHidden = appDelegate.storyPageControl.isNavigationBarHidden; if (self.webView.scrollView.contentOffset.y < (-1 * self.feedTitleGradient.frame.size.height + 1 + self.webView.scrollView.scrollIndicatorInsets.top)) { // Pulling @@ -2237,21 +2226,6 @@ return [super canPerformAction:action withSender:sender]; } -- (void)barHideSwipe:(UISwipeGestureRecognizer *)recognizer { - if (recognizer.state == UIGestureRecognizerStateEnded) { - self.isBarHideSwiping = NO; - - NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; - BOOL shouldHideStatusBar = [preferences boolForKey:@"story_hide_status_bar"]; - - if (!shouldHideStatusBar) { - [self drawFeedGradient]; - } - } else { - self.isBarHideSwiping = YES; - } -} - # pragma mark - # pragma mark Subscribing to blurblog diff --git a/clients/ios/Classes/StoryPageControl.h b/clients/ios/Classes/StoryPageControl.h index ad773092a..a2244d23e 100644 --- a/clients/ios/Classes/StoryPageControl.h +++ b/clients/ios/Classes/StoryPageControl.h @@ -40,6 +40,7 @@ @property (nonatomic) StoryDetailViewController *previousPage; @property (nonatomic, strong) IBOutlet UIScrollView *scrollView; @property (nonatomic, strong) IBOutlet UIPageControl *pageControl; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewTopConstraint; @property (weak, nonatomic) IBOutlet UIView *autoscrollView; @property (weak, nonatomic) IBOutlet UIImageView *autoscrollBackgroundImageView; @@ -88,6 +89,8 @@ @property (nonatomic, strong) NBNotifier *notifier; @property (nonatomic) NSInteger scrollingToPage; @property (nonatomic, strong) id standardInteractivePopGestureDelegate; +@property (nonatomic, readonly) BOOL shouldHideStatusBar; +@property (nonatomic, readonly) BOOL isNavigationBarHidden; @property (nonatomic, readonly) BOOL allowFullscreen; @property (nonatomic) BOOL forceNavigationBarShown; @property (nonatomic) BOOL currentlyTogglingNavigationBar; diff --git a/clients/ios/Classes/StoryPageControl.m b/clients/ios/Classes/StoryPageControl.m index 6f8976734..cbce6208c 100644 --- a/clients/ios/Classes/StoryPageControl.m +++ b/clients/ios/Classes/StoryPageControl.m @@ -28,6 +28,7 @@ @interface StoryPageControl () @property (nonatomic) CGFloat statusBarHeight; +@property (nonatomic) BOOL wasNavigationBarHidden; @property (nonatomic, strong) NSTimer *autoscrollTimer; @property (nonatomic, strong) NSTimer *autoscrollViewTimer; @property (nonatomic, strong) NSString *restoringStoryId; @@ -284,6 +285,8 @@ BOOL swipeEnabled = [[userPreferences stringForKey:@"story_detail_swipe_left_edge"] isEqualToString:@"pop_to_story_list"];; self.navigationController.hidesBarsOnSwipe = self.allowFullscreen; + [self.navigationController.barHideOnSwipeGestureRecognizer addTarget:self action:@selector(barHideSwipe:)]; + self.navigationController.interactivePopGestureRecognizer.enabled = swipeEnabled; self.navigationController.interactivePopGestureRecognizer.delegate = self; @@ -398,6 +401,8 @@ [super viewDidDisappear:animated]; self.navigationItem.leftBarButtonItem = nil; + + [self.navigationController.barHideOnSwipeGestureRecognizer removeTarget:self action:@selector(barHideSwipe:)]; } - (void)viewWillDisappear:(BOOL)animated { @@ -468,27 +473,38 @@ - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; + + if (self.isNavigationBarHidden && !self.shouldHideStatusBar) { + self.scrollViewTopConstraint.constant = self.statusBarHeight; + } else { + self.scrollViewTopConstraint.constant = 0; + } + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; [self layoutForInterfaceOrientation:orientation]; [self adjustDragBar:orientation]; } -- (void)updateStatusBarState { +- (BOOL)shouldHideStatusBar { NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; - BOOL shouldHideStatusBar = [preferences boolForKey:@"story_hide_status_bar"]; - BOOL isNavBarHidden = self.navigationController.navigationBarHidden; - self.statusBarBackgroundView.hidden = shouldHideStatusBar || !isNavBarHidden || !appDelegate.isPortrait; + return [preferences boolForKey:@"story_hide_status_bar"]; +} + +- (BOOL)isNavigationBarHidden { + return self.navigationController.navigationBarHidden; +} + +- (void)updateStatusBarState { + BOOL isNavBarHidden = self.isNavigationBarHidden; + + self.statusBarBackgroundView.hidden = self.shouldHideStatusBar || !isNavBarHidden || !appDelegate.isPortrait; } - (BOOL)prefersStatusBarHidden { - NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; - BOOL shouldHideStatusBar = [preferences boolForKey:@"story_hide_status_bar"]; - BOOL isNavBarHidden = self.navigationController.navigationBarHidden; - [self updateStatusBarState]; - return shouldHideStatusBar && isNavBarHidden; + return self.shouldHideStatusBar && self.isNavigationBarHidden; } - (BOOL)allowFullscreen { @@ -511,6 +527,7 @@ } self.currentlyTogglingNavigationBar = YES; + self.wasNavigationBarHidden = hide; [self.navigationController setNavigationBarHidden:hide animated:YES]; @@ -640,6 +657,22 @@ return [[[NSUserDefaults standardUserDefaults] objectForKey:@"scroll_stories_horizontally"] boolValue]; } +- (void)barHideSwipe:(UIPanGestureRecognizer *)recognizer { + BOOL isBarHidden = self.isNavigationBarHidden; + + if (recognizer.state == UIGestureRecognizerStateEnded && isBarHidden != self.wasNavigationBarHidden) { + self.wasNavigationBarHidden = isBarHidden; + + if (!appDelegate.storyPageControl.shouldHideStatusBar) { + [currentPage drawFeedGradient]; + } + + if (!self.isHorizontal) { + [self reorientPages]; + } + } +} + - (void)resetPages { self.navigationItem.titleView = nil; @@ -890,6 +923,11 @@ } pageFrame.size.height = CGRectGetHeight(self.scrollView.bounds); pageFrame.size.width = CGRectGetWidth(self.scrollView.bounds); + + if (self.currentlyTogglingNavigationBar && !self.isNavigationBarHidden) { + pageFrame.size.height -= 20.0; + } + pageController.view.hidden = NO; pageController.view.frame = pageFrame; } else { @@ -1697,8 +1735,8 @@ - (void)tappedStory { if (self.autoscrollAvailable) { [self showAutoscrollBriefly:YES]; - } else { - [self setNavigationBarHidden: !self.navigationController.navigationBarHidden]; + } else if (self.allowFullscreen) { + [self setNavigationBarHidden: !self.isNavigationBarHidden]; } } diff --git a/clients/ios/Classes/StoryPageControl.xib b/clients/ios/Classes/StoryPageControl.xib index 94ec203f3..c1c0bed2a 100644 --- a/clients/ios/Classes/StoryPageControl.xib +++ b/clients/ios/Classes/StoryPageControl.xib @@ -1,9 +1,9 @@ - + - + @@ -28,6 +28,7 @@ + diff --git a/clients/ios/NewsBlur.xcodeproj/project.pbxproj b/clients/ios/NewsBlur.xcodeproj/project.pbxproj index b8ff04f57..934968d50 100755 --- a/clients/ios/NewsBlur.xcodeproj/project.pbxproj +++ b/clients/ios/NewsBlur.xcodeproj/project.pbxproj @@ -2799,7 +2799,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1120; - LastUpgradeCheck = 1150; + LastUpgradeCheck = 1160; ORGANIZATIONNAME = NewsBlur; TargetAttributes = { 1749390F1C251BFE003D98AA = { diff --git a/clients/ios/NewsBlur.xcodeproj/xcshareddata/xcschemes/NewsBlur.xcscheme b/clients/ios/NewsBlur.xcodeproj/xcshareddata/xcschemes/NewsBlur.xcscheme index 826621cbc..6efffa81c 100644 --- a/clients/ios/NewsBlur.xcodeproj/xcshareddata/xcschemes/NewsBlur.xcscheme +++ b/clients/ios/NewsBlur.xcodeproj/xcshareddata/xcschemes/NewsBlur.xcscheme @@ -1,6 +1,6 @@ Date: Mon, 24 Aug 2020 21:40:31 -0700 Subject: [PATCH 4/5] #1357 (pull-to-refresh in feed detail) - For feeds, not folders. --- .../ios/Classes/FeedDetailViewController.h | 1 + .../ios/Classes/FeedDetailViewController.m | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/clients/ios/Classes/FeedDetailViewController.h b/clients/ios/Classes/FeedDetailViewController.h index b35bfe712..202998307 100644 --- a/clients/ios/Classes/FeedDetailViewController.h +++ b/clients/ios/Classes/FeedDetailViewController.h @@ -50,6 +50,7 @@ @property (nonatomic) IBOutlet UIBarButtonItem * titleImageBarButton; @property (nonatomic, retain) NBNotifier *notifier; @property (nonatomic, retain) StoriesCollection *storiesCollection; +@property (nonatomic) UIRefreshControl *refreshControl; @property (nonatomic) UISearchBar *searchBar; @property (nonatomic) IBOutlet UIView *messageView; @property (nonatomic) IBOutlet UILabel *messageLabel; diff --git a/clients/ios/Classes/FeedDetailViewController.m b/clients/ios/Classes/FeedDetailViewController.m index 12bda4988..994a7e968 100644 --- a/clients/ios/Classes/FeedDetailViewController.m +++ b/clients/ios/Classes/FeedDetailViewController.m @@ -44,6 +44,8 @@ @property (nonatomic) NSUInteger scrollingMarkReadRow; @property (nonatomic, readonly) BOOL isMarkReadOnScroll; +@property (nonatomic, readonly) BOOL canPullToRefresh; +@property (readwrite) BOOL inPullToRefresh_; @property (nonatomic, strong) NSString *restoringFolder; @property (nonatomic, strong) NSString *restoringFeedID; @@ -104,6 +106,11 @@ initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; spacer2BarButton.width = 0; + self.refreshControl = [UIRefreshControl new]; + self.refreshControl.tintColor = UIColorFromLightDarkRGB(0x0, 0xffffff); + self.refreshControl.backgroundColor = UIColorFromRGB(0xE3E6E0); + [self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; + self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.storyTitlesTable.frame), 44.)]; self.searchBar.delegate = self; @@ -433,6 +440,12 @@ [self.searchBar setShowsCancelButton:NO animated:YES]; } + if (self.canPullToRefresh) { + self.storyTitlesTable.refreshControl = self.refreshControl; + } else { + self.storyTitlesTable.refreshControl = nil; + } + [self updateTheme]; if (self.isPhoneOrCompact) { @@ -2741,6 +2754,9 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor; self.navigationController.toolbar.barTintColor = [UINavigationBar appearance].barTintColor; + self.refreshControl.tintColor = UIColorFromLightDarkRGB(0x0, 0xffffff); + self.refreshControl.backgroundColor = UIColorFromRGB(0xE3E6E0); + self.searchBar.backgroundColor = UIColorFromRGB(0xE3E6E0); self.searchBar.tintColor = UIColorFromRGB(0xffffff); self.searchBar.nb_searchField.textColor = UIColorFromRGB(NEWSBLUR_BLACK_COLOR); @@ -2806,10 +2822,12 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state // [self cancelRequests]; [appDelegate GET:urlString parameters:nil success:^(NSURLSessionTask *task, id responseObject) { [self renderStories:[responseObject objectForKey:@"stories"]]; + [self finishRefresh]; } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Fail: %@", error); [self informError:[operation error]]; [self fetchFeedDetail:1 withCallback:nil]; + [self finishRefresh]; }]; [storiesCollection setStories:nil]; @@ -2819,6 +2837,32 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state [storyTitlesTable scrollRectToVisible:CGRectMake(0, CGRectGetHeight(self.searchBar.frame), 1, 1) animated:YES]; } +#pragma mark - +#pragma mark PullToRefresh + +- (BOOL)canPullToRefresh { + BOOL river = appDelegate.storiesCollection.isRiverView; + BOOL infrequent = [self isInfrequent]; + BOOL read = appDelegate.storiesCollection.isReadView; + BOOL saved = appDelegate.storiesCollection.isSavedView; + + return appDelegate.storiesCollection.activeFeed != nil && !river && !infrequent && !saved && !read; +} + +- (void)refresh:(UIRefreshControl *)refreshControl { + if (self.canPullToRefresh) { + self.inPullToRefresh_ = YES; + [self instafetchFeed]; + } else { + [self finishRefresh]; + } +} + +- (void)finishRefresh { + self.inPullToRefresh_ = NO; + [self.refreshControl endRefreshing]; +} + #pragma mark - #pragma mark loadSocial Feeds From 6d1b89040f2b630af42ee37125edc5d426610b68 Mon Sep 17 00:00:00 2001 From: David Sinclair Date: Tue, 25 Aug 2020 15:56:29 -0700 Subject: [PATCH 5/5] #1340 (Open in Edge) - Confirmed that the code already added to open in Edge works. - Added an option to open in Brave while I was there. --- clients/ios/Classes/NewsBlurAppDelegate.m | 4 ++++ clients/ios/Resources/Settings.bundle/Root.plist | 2 ++ clients/ios/Resources/Settings.bundle/Root~ipad.plist | 2 ++ 3 files changed, 8 insertions(+) diff --git a/clients/ios/Classes/NewsBlurAppDelegate.m b/clients/ios/Classes/NewsBlurAppDelegate.m index ec9f59285..9580a4ad9 100644 --- a/clients/ios/Classes/NewsBlurAppDelegate.m +++ b/clients/ios/Classes/NewsBlurAppDelegate.m @@ -2124,6 +2124,10 @@ } [[UIApplication sharedApplication] openURL:[NSURL URLWithString:edgeURL] options:@{} completionHandler:nil]; + } else if ([storyBrowser isEqualToString:@"brave"]){ + NSString *encodedURL = [url.absoluteString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; + NSString *braveURL = [NSString stringWithFormat:@"%@%@", @"brave://open-url?url=", encodedURL]; + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:braveURL] options:@{} completionHandler:nil]; } else if ([storyBrowser isEqualToString:@"inappsafari"]) { [self showSafariViewControllerWithURL:url useReader:NO]; } else if ([storyBrowser isEqualToString:@"inappsafarireader"]) { diff --git a/clients/ios/Resources/Settings.bundle/Root.plist b/clients/ios/Resources/Settings.bundle/Root.plist index eb271fc8a..d9a9c6e27 100644 --- a/clients/ios/Resources/Settings.bundle/Root.plist +++ b/clients/ios/Resources/Settings.bundle/Root.plist @@ -737,6 +737,7 @@ Opera Mini Firefox Edge + Brave DefaultValue inappsafari @@ -750,6 +751,7 @@ opera_mini firefox edge + brave Key story_browser diff --git a/clients/ios/Resources/Settings.bundle/Root~ipad.plist b/clients/ios/Resources/Settings.bundle/Root~ipad.plist index abc3b8ebb..ec0ca8470 100644 --- a/clients/ios/Resources/Settings.bundle/Root~ipad.plist +++ b/clients/ios/Resources/Settings.bundle/Root~ipad.plist @@ -757,6 +757,7 @@ Opera Mini Firefox Edge + Brave DefaultValue inappsafari @@ -770,6 +771,7 @@ opera_mini firefox edge + brave Key story_browser