From 4d368af1cd21fec7b65b36fe3dd21eaaca183975 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Sun, 15 Apr 2018 15:04:48 -0400 Subject: [PATCH] Allow normalized search when filtering contacts --- .../java/util/extensions/StringExtensions.kt | 27 +++++++++++++++++++ .../java/common/util/filter/ContactFilter.kt | 3 ++- .../java/feature/compose/ComposeViewModel.kt | 8 +++++- .../main/java/feature/main/MainViewModel.kt | 2 ++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 data/src/main/java/util/extensions/StringExtensions.kt diff --git a/data/src/main/java/util/extensions/StringExtensions.kt b/data/src/main/java/util/extensions/StringExtensions.kt new file mode 100644 index 00000000..bb1f8699 --- /dev/null +++ b/data/src/main/java/util/extensions/StringExtensions.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2017 Moez Bhatti + * + * This file is part of QKSMS. + * + * QKSMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QKSMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QKSMS. If not, see . + */ +package util.extensions + +import java.text.Normalizer + +/** + * Strip the accents from a string + */ +fun CharSequence.removeAccents() = Normalizer.normalize(this, Normalizer.Form.NFD) + .replace(Regex("[^\\p{ASCII}]"), "") \ No newline at end of file diff --git a/presentation/src/main/java/common/util/filter/ContactFilter.kt b/presentation/src/main/java/common/util/filter/ContactFilter.kt index 122311c4..f108ad6e 100644 --- a/presentation/src/main/java/common/util/filter/ContactFilter.kt +++ b/presentation/src/main/java/common/util/filter/ContactFilter.kt @@ -19,12 +19,13 @@ package common.util.filter import model.Contact +import util.extensions.removeAccents import javax.inject.Inject class ContactFilter @Inject constructor(private val phoneNumberFilter: PhoneNumberFilter) : Filter() { override fun filter(item: Contact, query: CharSequence): Boolean { - return item.name.contains(query, true) || // Name + return item.name.removeAccents().contains(query, true) || // Name item.numbers.map { it.address }.any { address -> phoneNumberFilter.filter(address, query) } // Number } diff --git a/presentation/src/main/java/feature/compose/ComposeViewModel.kt b/presentation/src/main/java/feature/compose/ComposeViewModel.kt index 802e76d3..066627d4 100644 --- a/presentation/src/main/java/feature/compose/ComposeViewModel.kt +++ b/presentation/src/main/java/feature/compose/ComposeViewModel.kt @@ -61,6 +61,7 @@ import repository.MessageRepository import util.extensions.asObservable import util.extensions.isImage import util.extensions.mapNotNull +import util.extensions.removeAccents import java.net.URLDecoder import java.util.* import java.util.concurrent.TimeUnit @@ -206,9 +207,14 @@ class ComposeViewModel(intent: Intent) : QkViewModel( // that have already been selected Observables .combineLatest(view.queryChangedIntent, contacts, selectedContacts, { query, contacts, selectedContacts -> + + // Strip the accents from the query. This can be an expensive operation, so + // cache the result instead of doing it for each contact + val normalizedQuery = query.removeAccents() + var filteredContacts = contacts .filterNot { contact -> selectedContacts.contains(contact) } - .filter { contact -> contactFilter.filter(contact, query) } + .filter { contact -> contactFilter.filter(contact, normalizedQuery) } // If the entry is a valid destination, allow it as a recipient if (PhoneNumberUtils.isWellFormedSmsAddress(query.toString())) { diff --git a/presentation/src/main/java/feature/main/MainViewModel.kt b/presentation/src/main/java/feature/main/MainViewModel.kt index cad7e42f..043d9db1 100644 --- a/presentation/src/main/java/feature/main/MainViewModel.kt +++ b/presentation/src/main/java/feature/main/MainViewModel.kt @@ -45,6 +45,7 @@ import io.realm.Realm import model.SyncLog import repository.MessageRepository import util.Preferences +import util.extensions.removeAccents import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -117,6 +118,7 @@ class MainViewModel : QkViewModel(MainState()) { view.queryChangedIntent .debounce(200, TimeUnit.MILLISECONDS) + .map { query -> query.removeAccents() } .withLatestFrom(state, { query, state -> if (state.page is Inbox) { val filteredConversations = if (query.isEmpty()) conversations