diff --git a/CHANGES.rst b/CHANGES.rst index 2630aa2d3..e2a7b5a12 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,7 @@ Changes to be released in next version * 🙌 Improvements + * MasterTabBarController: Show/Hide Home Screen tabs (#4234). * RoomVC: Enable / Disable VoIP feature in Rooms (#4236). 🐛 Bugfix diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index c4eb24495..e884bd349 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -214,6 +214,13 @@ final class BuildSettings: NSObject { /// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false` static let logOutUserWhenBiometricsFailuresExceeded: Bool = false + // MARK: - Main Tabs + + static let homeScreenShowFavouritesTab: Bool = true + static let homeScreenShowPeopleTab: Bool = true + static let homeScreenShowRoomsTab: Bool = true + static let homeScreenShowCommunitiesTab: Bool = true + // MARK: - General Settings Screen static let settingsScreenShowUserFirstName: Bool = false diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index a22864a88..04bae3392 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -52,6 +52,10 @@ final class RiotSettings: NSObject { static let roomCreationScreenAllowRoomTypeConfiguration = "roomCreationScreenAllowRoomTypeConfiguration" static let roomCreationScreenRoomIsPublic = "roomCreationScreenRoomIsPublic" static let allowInviteExernalUsers = "allowInviteExernalUsers" + static let homeScreenShowFavouritesTab = "homeScreenShowFavouritesTab" + static let homeScreenShowPeopleTab = "homeScreenShowPeopleTab" + static let homeScreenShowRoomsTab = "homeScreenShowRoomsTab" + static let homeScreenShowCommunitiesTab = "homeScreenShowCommunitiesTab" static let roomScreenAllowVoIPForDirectRoom = "roomScreenAllowVoIPForDirectRoom" static let roomScreenAllowVoIPForNonDirectRoom = "roomScreenAllowVoIPForNonDirectRoom" } @@ -322,6 +326,49 @@ final class RiotSettings: NSObject { defaults.set(newValue, forKey: UserDefaultsKeys.allowInviteExernalUsers) } } + + // MARK: - Main Tabs + + var homeScreenShowFavouritesTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) != nil else { + return BuildSettings.homeScreenShowFavouritesTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) + } + } + var homeScreenShowPeopleTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowPeopleTab) != nil else { + return BuildSettings.homeScreenShowPeopleTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowPeopleTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowPeopleTab) + } + } + var homeScreenShowRoomsTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowRoomsTab) != nil else { + return BuildSettings.homeScreenShowRoomsTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowRoomsTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowRoomsTab) + } + } + var homeScreenShowCommunitiesTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) != nil else { + return BuildSettings.homeScreenShowCommunitiesTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) + } + } // MARK: General Settings diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index d532bfdca..dd7a3e9f2 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -130,6 +130,8 @@ }]; [self userInterfaceThemeDidChange]; + + [self updateTabs]; } - (void)userInterfaceThemeDidChange @@ -880,38 +882,75 @@ #pragma mark - +- (void)updateTabs +{ + if (RiotSettings.shared.homeScreenShowCommunitiesTab && RiotSettings.shared.homeScreenShowRoomsTab + && RiotSettings.shared.homeScreenShowPeopleTab && RiotSettings.shared.homeScreenShowFavouritesTab) + { + return; + } + + NSMutableArray *newTabs = [NSMutableArray arrayWithArray:self.viewControllers]; + if (!RiotSettings.shared.homeScreenShowCommunitiesTab) + { + [newTabs removeObjectAtIndex:TABBAR_GROUPS_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowRoomsTab) + { + [newTabs removeObjectAtIndex:TABBAR_ROOMS_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowPeopleTab) + { + [newTabs removeObjectAtIndex:TABBAR_PEOPLE_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowFavouritesTab) + { + [newTabs removeObjectAtIndex:TABBAR_FAVOURITES_INDEX]; + } + self.viewControllers = newTabs; +} + - (void)refreshTabBarBadges { // Use a middle dot to signal missed notif in favourites - [self setMissedDiscussionsMark:(recentsDataSource.missedFavouriteDiscussionsCount? @"\u00B7": nil) - onTabBarItem:TABBAR_FAVOURITES_INDEX - withBadgeColor:(recentsDataSource.missedHighlightFavouriteDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (RiotSettings.shared.homeScreenShowFavouritesTab) + { + [self setMissedDiscussionsMark:(recentsDataSource.missedFavouriteDiscussionsCount? @"\u00B7": nil) + onTabBarItem:TABBAR_FAVOURITES_INDEX + withBadgeColor:(recentsDataSource.missedHighlightFavouriteDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } // Update the badge on People and Rooms tabs - if (recentsDataSource.unsentMessagesDirectDiscussionsCount) + if (RiotSettings.shared.homeScreenShowPeopleTab) { - [self setBadgeValue:@"!" - onTabBarItem:TABBAR_PEOPLE_INDEX - withBadgeColor:ThemeService.shared.theme.noticeColor]; - } - else - { - [self setMissedDiscussionsCount:recentsDataSource.missedDirectDiscussionsCount - onTabBarItem:TABBAR_PEOPLE_INDEX - withBadgeColor:(recentsDataSource.missedHighlightDirectDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (recentsDataSource.unsentMessagesDirectDiscussionsCount) + { + [self setBadgeValue:@"!" + onTabBarItem:TABBAR_PEOPLE_INDEX + withBadgeColor:ThemeService.shared.theme.noticeColor]; + } + else + { + [self setMissedDiscussionsCount:recentsDataSource.missedDirectDiscussionsCount + onTabBarItem:TABBAR_PEOPLE_INDEX + withBadgeColor:(recentsDataSource.missedHighlightDirectDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } } - if (recentsDataSource.unsentMessagesGroupDiscussionsCount) + if (RiotSettings.shared.homeScreenShowRoomsTab) { - [self setMissedDiscussionsCount:recentsDataSource.unsentMessagesGroupDiscussionsCount - onTabBarItem:TABBAR_ROOMS_INDEX - withBadgeColor:ThemeService.shared.theme.noticeColor]; - } - else - { - [self setMissedDiscussionsCount:recentsDataSource.missedGroupDiscussionsCount - onTabBarItem:TABBAR_ROOMS_INDEX - withBadgeColor:(recentsDataSource.missedHighlightGroupDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (recentsDataSource.unsentMessagesGroupDiscussionsCount) + { + [self setMissedDiscussionsCount:recentsDataSource.unsentMessagesGroupDiscussionsCount + onTabBarItem:TABBAR_ROOMS_INDEX + withBadgeColor:ThemeService.shared.theme.noticeColor]; + } + else + { + [self setMissedDiscussionsCount:recentsDataSource.missedGroupDiscussionsCount + onTabBarItem:TABBAR_ROOMS_INDEX + withBadgeColor:(recentsDataSource.missedHighlightGroupDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } } } @@ -922,39 +961,47 @@ - (void)setBadgeValue:(NSString *)value onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor { - if (value) + NSInteger itemIndex = [self indexOfTabItemWithTag:index]; + if (itemIndex != NSNotFound) { - self.tabBar.items[index].badgeValue = value; - - self.tabBar.items[index].badgeColor = badgeColor; - - [self.tabBar.items[index] setBadgeTextAttributes:@{ - NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor - } - forState:UIControlStateNormal]; - } - else - { - self.tabBar.items[index].badgeValue = nil; + if (value) + { + self.tabBar.items[itemIndex].badgeValue = value; + + self.tabBar.items[itemIndex].badgeColor = badgeColor; + + [self.tabBar.items[itemIndex] setBadgeTextAttributes:@{ + NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor + } + forState:UIControlStateNormal]; + } + else + { + self.tabBar.items[itemIndex].badgeValue = nil; + } } } - (void)setMissedDiscussionsMark:(NSString*)mark onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor { - if (mark) + NSInteger itemIndex = [self indexOfTabItemWithTag:index]; + if (itemIndex != NSNotFound) { - self.tabBar.items[index].badgeValue = mark; - - self.tabBar.items[index].badgeColor = badgeColor; - - [self.tabBar.items[index] setBadgeTextAttributes:@{ - NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor - } - forState:UIControlStateNormal]; - } - else - { - self.tabBar.items[index].badgeValue = nil; + if (mark) + { + self.tabBar.items[itemIndex].badgeValue = mark; + + self.tabBar.items[itemIndex].badgeColor = badgeColor; + + [self.tabBar.items[itemIndex] setBadgeTextAttributes:@{ + NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor + } + forState:UIControlStateNormal]; + } + else + { + self.tabBar.items[itemIndex].badgeValue = nil; + } } } @@ -975,6 +1022,19 @@ return badgeValue; } +- (NSInteger)indexOfTabItemWithTag:(NSUInteger)tag +{ + for (int i = 0 ; i < self.tabBar.items.count ; i++) + { + if (self.tabBar.items[i].tag == tag) + { + return i; + } + } + + return NSNotFound; +} + #pragma mark - - (void)promptUserBeforeUsingAnalytics