diff --git a/Config/BWIBuildSettings.swift b/Config/BWIBuildSettings.swift index 59c893fd9..30cd1b34e 100644 --- a/Config/BWIBuildSettings.swift +++ b/Config/BWIBuildSettings.swift @@ -663,6 +663,9 @@ class BWIBuildSettings: NSObject { // MARK: itunes var showAllChatsFilterMenu = false + + // MARK: itunes + var roomFiltersToggle = true // MARK: OIDC var isOIDCEnabled = true diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Contents.json b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Contents.json new file mode 100644 index 000000000..67ec47a7c --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Filter-dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Filter-dark.svg b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Filter-dark.svg new file mode 100644 index 000000000..c0e66be50 --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_off.imageset/Filter-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Contents.json b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Contents.json new file mode 100644 index 000000000..068ead335 --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Filter-pressed-dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Filter-pressed-dark.svg b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Filter-pressed-dark.svg new file mode 100644 index 000000000..37c1861f3 --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_dark_on.imageset/Filter-pressed-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Contents.json b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Contents.json new file mode 100644 index 000000000..aebe7c313 --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Filter-light.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Filter-light.svg b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Filter-light.svg new file mode 100644 index 000000000..bd03bf038 --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_off.imageset/Filter-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Contents.json b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Contents.json new file mode 100644 index 000000000..2f3d3968c --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Filter-pressed-light.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Filter-pressed-light.svg b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Filter-pressed-light.svg new file mode 100644 index 000000000..7ec32495e --- /dev/null +++ b/Riot/Assets/Images.xcassets/BWI/room_filter_toggle_light_on.imageset/Filter-pressed-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Riot/Assets/de.lproj/Bwi.strings b/Riot/Assets/de.lproj/Bwi.strings index 15b7d1b85..70313e8dc 100644 --- a/Riot/Assets/de.lproj/Bwi.strings +++ b/Riot/Assets/de.lproj/Bwi.strings @@ -584,6 +584,7 @@ // MARK: - New Layout "all_chats_edit_layout_show_personal_notes" = "Notizenraum anzeigen"; +"all_chats_searchbar_prompt" = "Suche"; // MARK: - Permalink Scan "room_recents_scan_qr_code" = "QR Code scannen"; diff --git a/Riot/Assets/en.lproj/Bwi.strings b/Riot/Assets/en.lproj/Bwi.strings index 828c1d18e..6ba2911a2 100644 --- a/Riot/Assets/en.lproj/Bwi.strings +++ b/Riot/Assets/en.lproj/Bwi.strings @@ -494,6 +494,7 @@ // MARK: - New Layout "all_chats_edit_layout_show_personal_notes" = "Show personal notes"; +"all_chats_searchbar_prompt" = "Suche"; // MARK: - Permalink Scan "room_recents_scan_qr_code" = "Scan QR Code"; diff --git a/Riot/Modules/Home/AllChats/AllChatsViewController.swift b/Riot/Modules/Home/AllChats/AllChatsViewController.swift index 4bfe90a31..b0fcfb848 100644 --- a/Riot/Modules/Home/AllChats/AllChatsViewController.swift +++ b/Riot/Modules/Home/AllChats/AllChatsViewController.swift @@ -117,6 +117,8 @@ class AllChatsViewController: HomeViewController { private var toolbarHeight: CGFloat = 0 + private weak var roomFilterButton: UIButton? + // MARK: - Lifecycle override func viewDidLoad() { @@ -135,9 +137,7 @@ class AllChatsViewController: HomeViewController { toolbarHeight = toolbar.frame.height emptyViewBottomAnchor = toolbar.topAnchor - - // bwi: 4179 - + if BWIBuildSettings.shared.useNewBumColors { // bwi: #4883 toolbar.tintColor = ThemeService.shared().theme.tintColor toolbar.barTintColor = ThemeService.shared().theme.backgroundColor @@ -145,15 +145,21 @@ class AllChatsViewController: HomeViewController { toolbar.tintColor = theme.colors.accent } + if BWIBuildSettings.shared.roomFiltersToggle { + updateNewFilterSearchAndToggleButton() + } + updateUI() navigationItem.largeTitleDisplayMode = .never navigationController?.navigationBar.prefersLargeTitles = false - searchController.obscuresBackgroundDuringPresentation = false - searchController.searchResultsUpdater = self - searchController.delegate = self - + if !BWIBuildSettings.shared.roomFiltersToggle { + searchController.obscuresBackgroundDuringPresentation = false + searchController.searchResultsUpdater = self + searchController.delegate = self + } + NotificationCenter.default.addObserver(self, selector: #selector(self.setupEditOptions), name: AllChatsLayoutSettingsManager.didUpdateSettings, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.updateBadgeButton), name: MXSpaceNotificationCounter.didUpdateNotificationCount, object: nil) @@ -161,6 +167,76 @@ class AllChatsViewController: HomeViewController { self.registerThemeServiceDidChangeThemeNotification() } + // bwi: 4806 + private func updateNewFilterSearchAndToggleButton() { + let customHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: recentsTableView.frame.width, height: 50)) + let searchBar = UISearchBar(frame: CGRect(x: 8, y: 0, width: customHeaderView.frame.width - 48, height: 50)) + let button = UIButton(frame: CGRect(x: customHeaderView.frame.width - 48 + 8, y: 0, width: 40, height: 50)) + + if ThemeService.shared().isCurrentThemeDark() { + button.setImage(Asset.Images.roomFilterToggleDarkOff.image, for: .normal) + button.setImage(Asset.Images.roomFilterToggleDarkOn.image, for: .selected) + } else { + button.setImage(Asset.Images.roomFilterToggleLightOff.image, for: .normal) + button.setImage(Asset.Images.roomFilterToggleLightOn.image, for: .selected) + } + let settings = AllChatsLayoutSettingsManager.shared.allChatLayoutSettings + let areFiltersVisible = !settings.filters.isEmpty + button.isSelected = !AllChatsLayoutSettingsManager.shared.allChatLayoutSettings.filters.isEmpty + button.addTarget(self, action: #selector(onFilterToggleTapped), for: .touchUpInside) + + roomFilterButton = button // keep a reference to handle theme changes + + searchBar.placeholder = BWIL10n.allChatsSearchbarPrompt + searchBar.backgroundImage = UIImage() // this hides the separator lines above and below + searchBar.delegate = self + + customHeaderView.addSubview(searchBar) + customHeaderView.addSubview(button) + + recentsTableView.tableHeaderView = customHeaderView + + // set some constraints for landscape and iPad + customHeaderView.translatesAutoresizingMaskIntoConstraints = false + let constraints = [ + searchBar.leadingAnchor.constraint(equalTo: customHeaderView.leadingAnchor), + searchBar.centerYAnchor.constraint(equalTo: button.centerYAnchor), + searchBar.widthAnchor.constraint(equalToConstant: 40), + searchBar.heightAnchor.constraint(equalToConstant: 40), + button.leadingAnchor.constraint(equalTo: searchBar.trailingAnchor), + button.trailingAnchor.constraint(equalTo: customHeaderView.trailingAnchor), + button.topAnchor.constraint(equalTo: customHeaderView.topAnchor), + button.bottomAnchor.constraint(equalTo: customHeaderView.bottomAnchor), + customHeaderView.centerXAnchor.constraint(equalTo: recentsTableView.centerXAnchor), + customHeaderView.widthAnchor.constraint(equalTo: recentsTableView.widthAnchor), + customHeaderView.topAnchor.constraint(equalTo: recentsTableView.topAnchor) + ] + NSLayoutConstraint.activate(constraints) + } + + @objc + func onSearchTextChanged(searchBar: UISearchBar) { + guard let searchText = searchBar.text, !searchText.isEmpty else { + self.dataSource?.search(withPatterns: nil) + return + } + + self.dataSource?.search(withPatterns: [searchText]) + } + + @objc + func onFilterToggleTapped() { + let settings = AllChatsLayoutSettingsManager.shared.allChatLayoutSettings + let areFiltersVisible = !settings.filters.isEmpty + let newSettings = AllChatsLayoutSettings(sections: settings.sections, + filters: areFiltersVisible ? [] : [.unreads, .favourites, .people], + sorting: settings.sorting) + AllChatsLayoutSettingsManager.shared.allChatLayoutSettings = newSettings + Analytics.shared.trackInteraction(areFiltersVisible ? .allChatsFiltersDisabled : .allChatsFiltersEnabled) + + roomFilterButton?.isSelected = !AllChatsLayoutSettingsManager.shared.allChatLayoutSettings.filters.isEmpty + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -172,8 +248,18 @@ class AllChatsViewController: HomeViewController { self.toolbar.tintColor = theme.colors.accent } - if self.navigationItem.searchController == nil { - self.navigationItem.searchController = searchController + if BWIBuildSettings.shared.roomFiltersToggle { + if ThemeService.shared().isCurrentThemeDark() { + roomFilterButton?.setImage(Asset.Images.roomFilterToggleDarkOff.image, for: .normal) + roomFilterButton?.setImage(Asset.Images.roomFilterToggleDarkOn.image, for: .selected) + } else { + roomFilterButton?.setImage(Asset.Images.roomFilterToggleLightOff.image, for: .normal) + roomFilterButton?.setImage(Asset.Images.roomFilterToggleLightOn.image, for: .selected) + } + } else { + if self.navigationItem.searchController == nil { + self.navigationItem.searchController = searchController + } } NotificationCenter.default.addObserver(self, selector: #selector(self.spaceListDidChange), name: MXSpaceService.didInitialise, object: nil) @@ -217,7 +303,7 @@ class AllChatsViewController: HomeViewController { coordinator.animate { context in self.recentsTableView?.tableHeaderView?.layoutIfNeeded() - self.recentsTableView?.tableHeaderView = self.recentsTableView?.tableHeaderView +// self.recentsTableView?.tableHeaderView = self.recentsTableView?.tableHeaderView } } @@ -541,14 +627,16 @@ class AllChatsViewController: HomeViewController { override func shouldShowEmptyView() -> Bool { let shouldShowEmptyView = super.shouldShowEmptyView() && !AllChatsLayoutSettingsManager.shared.hasAnActiveFilter - if shouldShowEmptyView { - self.navigationItem.searchController = nil - navigationItem.largeTitleDisplayMode = .never - } else { - self.navigationItem.searchController = searchController - navigationItem.largeTitleDisplayMode = .automatic + if !BWIBuildSettings.shared.roomFiltersToggle { + if shouldShowEmptyView { + self.navigationItem.searchController = nil + navigationItem.largeTitleDisplayMode = .never + } else { + self.navigationItem.searchController = searchController + navigationItem.largeTitleDisplayMode = .automatic + } } - + return shouldShowEmptyView } @@ -589,10 +677,10 @@ class AllChatsViewController: HomeViewController { return } - tableView.tableHeaderView = tableHeadeView - tableView.tableHeaderView?.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true - tableView.tableHeaderView?.layoutIfNeeded() - tableView.tableHeaderView = self.recentsTableView?.tableHeaderView +// tableView.tableHeaderView = tableHeadeView +// tableView.tableHeaderView?.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true +// tableView.tableHeaderView?.layoutIfNeeded() +// tableView.tableHeaderView = self.recentsTableView?.tableHeaderView } @objc private func setupEditOptions() { @@ -849,7 +937,7 @@ extension AllChatsViewController: UISearchResultsUpdating { self.dataSource?.search(withPatterns: nil) return } - + self.dataSource?.search(withPatterns: [searchText]) } } @@ -862,6 +950,17 @@ extension AllChatsViewController: UISearchControllerDelegate { } } +extension AllChatsViewController { + override func searchBar(_ searchBar: UISearchBar, textDidChange: String) { + guard let searchText = searchBar.text, !searchText.isEmpty else { + self.dataSource?.search(withPatterns: nil) + return + } + + self.dataSource?.search(withPatterns: [searchText]) + } +} + // MARK: - UIAdaptivePresentationControllerDelegate extension AllChatsViewController: UIAdaptivePresentationControllerDelegate {