Skip to content
Snippets Groups Projects
Commit 7bfa9975 authored by lazarog98's avatar lazarog98
Browse files

#238 refactor ListViewController search

parent bf410e23
No related branches found
No related tags found
1 merge request!27Resolve "Improve searching"
...@@ -68,6 +68,9 @@ class ListViewController: UITableViewController { ...@@ -68,6 +68,9 @@ class ListViewController: UITableViewController {
} }
} }
var loading = false var loading = false
private let searchDelay = 0.5
private var searchTimer: Timer?
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
tableView.reloadData() tableView.reloadData()
...@@ -105,63 +108,53 @@ class ListViewController: UITableViewController { ...@@ -105,63 +108,53 @@ class ListViewController: UITableViewController {
deinit { deinit {
print("===============|| ListViewController deinitialized ||===============") print("===============|| ListViewController deinitialized ||===============")
} }
func filterContentForSearchText(_ searchText: String, scope: Int = 0) { func startSearch(searchText: String, scope: Int = 0) {
if #available(iOS 10.0, *) {
if let searchBarTimer: Timer = self.searchTimer {
searchBarTimer.invalidate()
}
self.searchTimer = Timer.scheduledTimer(withTimeInterval: searchDelay, repeats: false, block: { _ in
self.filterContentForSearchText(searchText, scope: scope)
})
}
}
/**
- parameters:
- searchText: user input string to look for
- scope : 0 = subject: 1 = body: 2 = cc + to: 3 = all
*/
private func filterContentForSearchText(_ searchText: String, scope: Int = 0) {
filteredMails = contact!.mails.filter { mail in filteredMails = contact!.mails.filter { mail in
var returnValue = false // a big string that we search through, contains everything from the scopes we are searching in
switch scope { var str = ""
case 0:
if let subject = mail.subject { if scope == 0 || scope == 3 {
returnValue = subject.lowercased().contains(searchText.lowercased()) str.append(mail.subject ?? "")
} }
case 1: if scope == 1 || scope == 3 {
if !returnValue && mail.decryptedBody != nil { if let decryptedBody = mail.decryptedBody {
returnValue = mail.decryptedBody!.lowercased().contains(searchText.lowercased()) str.append(decryptedBody)
} else if !returnValue && mail.body != nil { } else if let body = mail.body {
returnValue = mail.body!.lowercased().contains(searchText.lowercased()) str.append(body)
}
case 2:
if !returnValue && mail.cc?.count > 0 {
if let result = mail.cc?.contains(where: { cc -> Bool in
if let mail = cc as? MailAddress {
return mail.mailAddress.contains(searchText.lowercased())
}
return false
}) {
returnValue = result
}
}
if !returnValue && mail.getReceivers().count > 1 {
returnValue = mail.getReceivers().contains(where: { rec -> Bool in
return rec.mailAddress.contains(searchText.lowercased())
})
}
default:
if let subject = mail.subject {
returnValue = subject.lowercased().contains(searchText.lowercased())
}
if !returnValue && mail.decryptedBody != nil {
returnValue = mail.decryptedBody!.lowercased().contains(searchText.lowercased())
} else if !returnValue && mail.body != nil && !mail.isEncrypted {
returnValue = mail.body!.lowercased().contains(searchText.lowercased())
}
if !returnValue && mail.cc?.count > 0 {
if let res = mail.cc?.contains(where: { cc -> Bool in
if let mail = cc as? MailAddress {
return mail.mailAddress.contains(searchText.lowercased())
}
return false
}) {
returnValue = res
}
}
if !returnValue && mail.getReceivers().count > 1 {
returnValue = mail.getReceivers().contains(where: { rec -> Bool in
return rec.mailAddress.contains(searchText.lowercased())
})
} }
} }
return returnValue if scope == 2 || scope == 3 {
var receivers: [MailAddress] = []
receivers.append(contentsOf: mail.getReceivers())
receivers.append(contentsOf: mail.getCCs())
// build a string of all email addresses to input in the search function
receivers.map({ addr -> String in
return addr.mailAddress
}).forEach({ addr in
str.append(addr)
})
}
return containsSearchTerms(content: str, searchText: searchText)
} }
tableView.reloadData() tableView.reloadData()
...@@ -259,13 +252,12 @@ class ListViewController: UITableViewController { ...@@ -259,13 +252,12 @@ class ListViewController: UITableViewController {
extension ListViewController: UISearchResultsUpdating { extension ListViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) { func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar let searchBar = searchController.searchBar
let _ = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] startSearch(searchText: searchController.searchBar.text!, scope: searchBar.selectedScopeButtonIndex)
filterContentForSearchText(searchController.searchBar.text!, scope: searchBar.selectedScopeButtonIndex)
} }
} }
extension ListViewController: UISearchBarDelegate { extension ListViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchText(searchBar.text!, scope: selectedScope) startSearch(searchText: searchBar.text!, scope: selectedScope)
} }
} }
...@@ -7,6 +7,11 @@ ...@@ -7,6 +7,11 @@
// //
import Foundation import Foundation
/**
A collection of helper methods that are used for the different search bars
*/
/** /**
Function to be used to find mails that contain the search terms. All terms (separated by spaces) need to be contained in the search text. Function to be used to find mails that contain the search terms. All terms (separated by spaces) need to be contained in the search text.
- parameters: - parameters:
...@@ -23,7 +28,26 @@ func containsSearchTerms ( content : String?, searchText: String) -> Bool ...@@ -23,7 +28,26 @@ func containsSearchTerms ( content : String?, searchText: String) -> Bool
{ {
return false ///Case Mail has no body/subject return false ///Case Mail has no body/subject
} }
let terms = searchText.lowercased().components(separatedBy : " ")
var longterms : [String] = []
var terms : [String] = []
//Break String into substrings separated by quoatation marks
longterms = searchText.components(separatedBy: "\"")
var i = 0
//even elements will be outside the quotation marks and need to be separated again
while (i < longterms.count)
{
if i % 2 == 0
{
terms.append(contentsOf: longterms[i].lowercased().components(separatedBy: " "))
}
else
{
terms.append(longterms[i])
}
i+=1
}
var found = true var found = true
for t in terms for t in terms
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment