Fixes search.

It now works the same as iOS. It case insensitive matches the entire search text in any of name, size, type, subtype, or alignment.
This commit is contained in:
Tom Hicks
2021-06-25 23:34:33 -07:00
parent d14b09dd91
commit 01750bd772
2 changed files with 47 additions and 1 deletions

View File

@@ -3,8 +3,10 @@ package com.majinnaibu.monstercards.data;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.majinnaibu.monstercards.AppDatabase; import com.majinnaibu.monstercards.AppDatabase;
import com.majinnaibu.monstercards.helpers.StringHelper;
import com.majinnaibu.monstercards.models.Monster; import com.majinnaibu.monstercards.models.Monster;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@@ -31,7 +33,16 @@ public class MonsterRepository {
public Flowable<List<Monster>> searchMonsters(String searchText) { public Flowable<List<Monster>> searchMonsters(String searchText) {
return m_db.monsterDAO() return m_db.monsterDAO()
.search(searchText) .getAll()
.map(monsters -> {
ArrayList<Monster> filteredMonsters = new ArrayList<>();
for (Monster monster : monsters) {
if (Helpers.monsterMatchesSearch(monster, searchText)) {
filteredMonsters.add(monster);
}
}
return (List<Monster>) filteredMonsters;
})
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()); .observeOn(AndroidSchedulers.mainThread());
} }
@@ -68,4 +79,34 @@ public class MonsterRepository {
result.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); result.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
return result; return result;
} }
private static class Helpers {
static boolean monsterMatchesSearch(Monster monster, String searchText) {
if (StringHelper.isNullOrEmpty(searchText)) {
return true;
}
if (StringHelper.containsCaseInsensitive(monster.name, searchText)) {
return true;
}
if (StringHelper.containsCaseInsensitive(monster.size, searchText)) {
return true;
}
if (StringHelper.containsCaseInsensitive(monster.type, searchText)) {
return true;
}
if (StringHelper.containsCaseInsensitive(monster.subtype, searchText)) {
return true;
}
if (StringHelper.containsCaseInsensitive(monster.alignment, searchText)) {
return true;
}
return false;
}
}
} }

View File

@@ -66,4 +66,9 @@ public final class StringHelper {
return null; return null;
} }
} }
public static boolean containsCaseInsensitive(String text, String search) {
// TODO: find a locale independent way to do this
return text.toLowerCase().contains(search.toLowerCase());
}
} }