Better search results

This commit is contained in:
Yishi Lin 2020-02-23 18:05:10 +08:00
parent 0eb4b01fb7
commit 6bf4716366
6 changed files with 160 additions and 136 deletions

View file

@ -10,19 +10,6 @@ import Foundation
import MobileCoreServices
import passKit
fileprivate class PasswordsTableEntry : NSObject {
var title: String
var categoryText: String
var categoryArray: [String]
var passwordEntity: PasswordEntity?
init(_ entity: PasswordEntity) {
self.title = entity.name!
self.categoryText = entity.getCategoryText()
self.categoryArray = entity.getCategoryArray()
self.passwordEntity = entity
}
}
class ExtensionViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UINavigationBarDelegate {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
@ -31,8 +18,8 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
private let keychain = AppKeychain.shared
private var searchActive = false
private var passwordsTableEntries: [PasswordsTableEntry] = []
private var filteredPasswordsTableEntries: [PasswordsTableEntry] = []
private var passwordsTableEntries: [PasswordTableEntry] = []
private var filteredPasswordsTableEntries: [PasswordTableEntry] = []
enum Action {
case findLogin, fillBrowser, unknown
@ -46,12 +33,11 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
}()
private func initPasswordsTableEntries() {
passwordsTableEntries.removeAll()
filteredPasswordsTableEntries.removeAll()
var passwordEntities = [PasswordEntity]()
passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(withDir: false)
let passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(withDir: false)
passwordsTableEntries = passwordEntities.map {
PasswordsTableEntry($0)
PasswordTableEntry($0)
}
}
@ -139,7 +125,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "passwordTableViewCell", for: indexPath)
let entry = getPasswordEntry(by: indexPath)
if entry.passwordEntity!.synced {
if entry.synced {
cell.textLabel?.text = entry.title
} else {
cell.textLabel?.text = "\(entry.title)"
@ -159,7 +145,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
return
}
let passwordEntity = entry.passwordEntity!
let passwordEntity = entry.passwordEntity
UIImpactFeedbackGenerator(style: .medium).impactOccurred()
DispatchQueue.global(qos: .userInteractive).async {
var decryptedPassword: Password?
@ -243,16 +229,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
if let searchText = searchBar.text, searchText.isEmpty == false {
filteredPasswordsTableEntries = passwordsTableEntries.filter { entry in
var matched = false
matched = matched || entry.title.range(of: searchText, options: .caseInsensitive) != nil
matched = matched || searchText.range(of: entry.title, options: .caseInsensitive) != nil
entry.categoryArray.forEach({ (category) in
matched = matched || category.range(of: searchText, options: .caseInsensitive) != nil
matched = matched || searchText.range(of: category, options: .caseInsensitive) != nil
})
return matched
}
filteredPasswordsTableEntries = passwordsTableEntries.filter {$0.match(searchText)}
searchActive = true
} else {
searchActive = false
@ -264,7 +241,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
searchBarSearchButtonClicked(searchBar)
}
private func getPasswordEntry(by indexPath: IndexPath) -> PasswordsTableEntry {
private func getPasswordEntry(by indexPath: IndexPath) -> PasswordTableEntry {
if searchActive {
return filteredPasswordsTableEntries[indexPath.row]
} else {