mirror of https://github.com/M66B/FairEmail.git
Allow search in account
This commit is contained in:
parent
d261a6fba4
commit
3a93c070de
File diff suppressed because it is too large
Load Diff
|
@ -69,6 +69,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
|
|||
|
||||
public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMessageEx> {
|
||||
private Context context;
|
||||
private Long account;
|
||||
private Long folder;
|
||||
private boolean server;
|
||||
private String query;
|
||||
|
@ -91,8 +92,9 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
void onException(@NonNull Throwable ex);
|
||||
}
|
||||
|
||||
BoundaryCallbackMessages(Context context, long folder, boolean server, String query, int pageSize) {
|
||||
BoundaryCallbackMessages(Context context, long account, long folder, boolean server, String query, int pageSize) {
|
||||
this.context = context.getApplicationContext();
|
||||
this.account = (account < 0 ? null : account);
|
||||
this.folder = (folder < 0 ? null : folder);
|
||||
this.server = server;
|
||||
this.query = query;
|
||||
|
@ -191,7 +193,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
if (fts && pro && seen == null && flagged == null && snoozed == null && encrypted == null) {
|
||||
if (state.ids == null) {
|
||||
SQLiteDatabase sdb = FtsDbHelper.getInstance(context);
|
||||
state.ids = FtsDbHelper.match(sdb, folder, query);
|
||||
state.ids = FtsDbHelper.match(sdb, account, folder, query);
|
||||
}
|
||||
|
||||
try {
|
||||
|
@ -217,7 +219,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
if (state.matches == null ||
|
||||
(state.matches.size() > 0 && state.index >= state.matches.size())) {
|
||||
state.matches = db.message().matchMessages(
|
||||
folder,
|
||||
account, folder,
|
||||
"%" + find + "%",
|
||||
seen, flagged, snoozed, encrypted,
|
||||
SEARCH_LIMIT, state.offset);
|
||||
|
|
|
@ -60,7 +60,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
|
|||
// https://developer.android.com/topic/libraries/architecture/room.html
|
||||
|
||||
@Database(
|
||||
version = 138,
|
||||
version = 139,
|
||||
entities = {
|
||||
EntityIdentity.class,
|
||||
EntityAccount.class,
|
||||
|
@ -1342,6 +1342,13 @@ public abstract class DB extends RoomDatabase {
|
|||
Log.i("DB migration from version " + startVersion + " to " + endVersion);
|
||||
db.execSQL("ALTER TABLE `message` ADD COLUMN `importance` INTEGER");
|
||||
}
|
||||
})
|
||||
.addMigrations(new Migration(138, 139) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase db) {
|
||||
Log.i("DB migration from version " + startVersion + " to " + endVersion);
|
||||
db.execSQL("UPDATE `message` SET fts = 0");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -264,6 +264,7 @@ public interface DaoMessage {
|
|||
" OR `preview` LIKE :find COLLATE NOCASE) AS matched" +
|
||||
" FROM message" +
|
||||
" WHERE NOT ui_hide" +
|
||||
" AND (:account IS NULL OR account = :account)" +
|
||||
" AND (:folder IS NULL OR folder = :folder)" +
|
||||
" AND (:seen IS NULL OR ui_seen = :seen)" +
|
||||
" AND (:flagged IS NULL OR ui_flagged = :flagged)" +
|
||||
|
@ -272,7 +273,7 @@ public interface DaoMessage {
|
|||
" ORDER BY received DESC" +
|
||||
" LIMIT :limit OFFSET :offset")
|
||||
List<TupleMatch> matchMessages(
|
||||
Long folder, String find,
|
||||
Long account, Long folder, String find,
|
||||
Boolean seen, Boolean flagged, Boolean hidden, Boolean encrypted,
|
||||
int limit, int offset);
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ import io.requery.android.database.sqlite.SQLiteOpenHelper;
|
|||
public class FtsDbHelper extends SQLiteOpenHelper {
|
||||
private static FtsDbHelper instance = null;
|
||||
|
||||
private static final int DATABASE_VERSION = 1;
|
||||
private static final int DATABASE_VERSION = 2;
|
||||
private static final String DATABASE_NAME = "fts.db";
|
||||
|
||||
private FtsDbHelper(Context context) {
|
||||
|
@ -54,12 +54,14 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
public void onCreate(SQLiteDatabase db) {
|
||||
Log.i("FTS create");
|
||||
db.execSQL("CREATE VIRTUAL TABLE `message`" +
|
||||
" USING fts5 (`folder` UNINDEXED, `time` UNINDEXED, `address`, `subject`, `keyword`, `text`)");
|
||||
" USING fts5 (`account` UNINDEXED, `folder` UNINDEXED, `time` UNINDEXED, `address`, `subject`, `keyword`, `text`)");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
// Do nothing
|
||||
Log.i("FTS upgrade from " + oldVersion + " to " + newVersion);
|
||||
db.execSQL("DROP TABLE `message`");
|
||||
onCreate(db);
|
||||
}
|
||||
|
||||
static void insert(SQLiteDatabase db, EntityMessage message, String text) {
|
||||
|
@ -76,6 +78,7 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put("rowid", message.id);
|
||||
cv.put("account", message.account);
|
||||
cv.put("folder", message.folder);
|
||||
cv.put("time", message.received);
|
||||
cv.put("address", MessageHelper.formatAddresses(address.toArray(new Address[0]), true, false));
|
||||
|
@ -93,7 +96,7 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
db.delete("message", "rowid = ?", new Object[]{id});
|
||||
}
|
||||
|
||||
static List<Long> match(SQLiteDatabase db, Long folder, String query) {
|
||||
static List<Long> match(SQLiteDatabase db, Long account, Long folder, String query) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String or : query.split(",")) {
|
||||
if (sb.length() > 0)
|
||||
|
@ -117,12 +120,19 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
}
|
||||
|
||||
String search = sb.toString();
|
||||
Log.i("FTS folder=" + folder + " search=" + search);
|
||||
|
||||
String select = "";
|
||||
if (account != null)
|
||||
select += "account = " + account + " AND ";
|
||||
if (folder != null)
|
||||
select += "folder = " + folder + " AND ";
|
||||
|
||||
Log.i("FTS select=" + select + " search=" + search);
|
||||
List<Long> result = new ArrayList<>();
|
||||
try (Cursor cursor = db.query(
|
||||
"message", new String[]{"rowid"},
|
||||
folder == null ? "message MATCH ?" : "folder = ? AND message MATCH ?",
|
||||
folder == null ? new Object[]{search} : new Object[]{folder, search},
|
||||
select + "message MATCH ?",
|
||||
new Object[]{search},
|
||||
null, null, "time DESC", null)) {
|
||||
while (cursor != null && cursor.moveToNext())
|
||||
result.add(cursor.getLong(0));
|
||||
|
|
|
@ -79,10 +79,10 @@ public class ViewModelMessages extends ViewModel {
|
|||
BoundaryCallbackMessages boundary = null;
|
||||
if (viewType == AdapterMessage.ViewType.FOLDER)
|
||||
boundary = new BoundaryCallbackMessages(context,
|
||||
args.folder, true, args.query, REMOTE_PAGE_SIZE);
|
||||
args.account, args.folder, true, args.query, REMOTE_PAGE_SIZE);
|
||||
else if (viewType == AdapterMessage.ViewType.SEARCH)
|
||||
boundary = new BoundaryCallbackMessages(context,
|
||||
args.folder, args.server, args.query,
|
||||
args.account, args.folder, args.server, args.query,
|
||||
args.server ? REMOTE_PAGE_SIZE : SEARCH_PAGE_SIZE);
|
||||
|
||||
LivePagedListBuilder<Integer, TupleMessageEx> builder = null;
|
||||
|
|
Loading…
Reference in New Issue