Added saved searches

This commit is contained in:
M66B
2021-09-24 13:36:06 +02:00
parent be1865387d
commit c15943144b
13 changed files with 3284 additions and 92 deletions

View File

@@ -58,6 +58,44 @@ import java.util.List;
import io.requery.android.database.sqlite.SQLiteDatabase;
public class FragmentDialogSearch extends FragmentDialogBase {
private TextViewAutoCompleteAction etQuery;
private TextView tvSearch1;
private TextView tvSearch2;
private TextView tvSearch3;
private ImageButton ibResetSearches;
private ImageButton ibInfo;
private ImageButton ibFlagged;
private ImageButton ibUnseen;
private ImageButton ibInvite;
private ImageButton ibAttachment;
private ImageButton ibNotes;
private ImageButton ibMore;
private TextView tvMore;
private CheckBox cbSearchIndex;
private CheckBox cbSenders;
private CheckBox cbRecipients;
private CheckBox cbSubject;
private CheckBox cbKeywords;
private CheckBox cbMessage;
private TextView tvSearchTextUnsupported;
private CheckBox cbNotes;
private CheckBox cbHeaders;
private CheckBox cbHtml;
private CheckBox cbSearchTrash;
private CheckBox cbSearchJunk;
private CheckBox cbUnseen;
private CheckBox cbFlagged;
private CheckBox cbHidden;
private CheckBox cbEncrypted;
private CheckBox cbAttachments;
private Spinner spMessageSize;
private Button btnBefore;
private Button btnAfter;
private TextView tvBefore;
private TextView tvAfter;
private Group grpMore;
private static final int MAX_SUGGESTIONS = 3;
@NonNull
@@ -82,43 +120,43 @@ public class FragmentDialogSearch extends FragmentDialogBase {
View dview = LayoutInflater.from(context).inflate(R.layout.dialog_search, null);
final TextViewAutoCompleteAction etQuery = dview.findViewById(R.id.etQuery);
final TextView tvSearch1 = dview.findViewById(R.id.tvSearch1);
final TextView tvSearch2 = dview.findViewById(R.id.tvSearch2);
final TextView tvSearch3 = dview.findViewById(R.id.tvSearch3);
final ImageButton ibResetSearches = dview.findViewById(R.id.ibResetSearches);
etQuery = dview.findViewById(R.id.etQuery);
tvSearch1 = dview.findViewById(R.id.tvSearch1);
tvSearch2 = dview.findViewById(R.id.tvSearch2);
tvSearch3 = dview.findViewById(R.id.tvSearch3);
ibResetSearches = dview.findViewById(R.id.ibResetSearches);
final ImageButton ibInfo = dview.findViewById(R.id.ibInfo);
final ImageButton ibFlagged = dview.findViewById(R.id.ibFlagged);
final ImageButton ibUnseen = dview.findViewById(R.id.ibUnseen);
final ImageButton ibInvite = dview.findViewById(R.id.ibInvite);
final ImageButton ibAttachment = dview.findViewById(R.id.ibAttachment);
final ImageButton ibNotes = dview.findViewById(R.id.ibNotes);
final ImageButton ibMore = dview.findViewById(R.id.ibMore);
final TextView tvMore = dview.findViewById(R.id.tvMore);
final CheckBox cbSearchIndex = dview.findViewById(R.id.cbSearchIndex);
final CheckBox cbSenders = dview.findViewById(R.id.cbSenders);
final CheckBox cbRecipients = dview.findViewById(R.id.cbRecipients);
final CheckBox cbSubject = dview.findViewById(R.id.cbSubject);
final CheckBox cbKeywords = dview.findViewById(R.id.cbKeywords);
final CheckBox cbMessage = dview.findViewById(R.id.cbMessage);
final TextView tvSearchTextUnsupported = dview.findViewById(R.id.tvSearchTextUnsupported);
final CheckBox cbNotes = dview.findViewById(R.id.cbNotes);
final CheckBox cbHeaders = dview.findViewById(R.id.cbHeaders);
final CheckBox cbHtml = dview.findViewById(R.id.cbHtml);
final CheckBox cbSearchTrash = dview.findViewById(R.id.cbSearchTrash);
final CheckBox cbSearchJunk = dview.findViewById(R.id.cbSearchJunk);
final CheckBox cbUnseen = dview.findViewById(R.id.cbUnseen);
final CheckBox cbFlagged = dview.findViewById(R.id.cbFlagged);
final CheckBox cbHidden = dview.findViewById(R.id.cbHidden);
final CheckBox cbEncrypted = dview.findViewById(R.id.cbEncrypted);
final CheckBox cbAttachments = dview.findViewById(R.id.cbAttachments);
final Spinner spMessageSize = dview.findViewById(R.id.spMessageSize);
final Button btnBefore = dview.findViewById(R.id.btnBefore);
final Button btnAfter = dview.findViewById(R.id.btnAfter);
final TextView tvBefore = dview.findViewById(R.id.tvBefore);
final TextView tvAfter = dview.findViewById(R.id.tvAfter);
final Group grpMore = dview.findViewById(R.id.grpMore);
ibInfo = dview.findViewById(R.id.ibInfo);
ibFlagged = dview.findViewById(R.id.ibFlagged);
ibUnseen = dview.findViewById(R.id.ibUnseen);
ibInvite = dview.findViewById(R.id.ibInvite);
ibAttachment = dview.findViewById(R.id.ibAttachment);
ibNotes = dview.findViewById(R.id.ibNotes);
ibMore = dview.findViewById(R.id.ibMore);
tvMore = dview.findViewById(R.id.tvMore);
cbSearchIndex = dview.findViewById(R.id.cbSearchIndex);
cbSenders = dview.findViewById(R.id.cbSenders);
cbRecipients = dview.findViewById(R.id.cbRecipients);
cbSubject = dview.findViewById(R.id.cbSubject);
cbKeywords = dview.findViewById(R.id.cbKeywords);
cbMessage = dview.findViewById(R.id.cbMessage);
tvSearchTextUnsupported = dview.findViewById(R.id.tvSearchTextUnsupported);
cbNotes = dview.findViewById(R.id.cbNotes);
cbHeaders = dview.findViewById(R.id.cbHeaders);
cbHtml = dview.findViewById(R.id.cbHtml);
cbSearchTrash = dview.findViewById(R.id.cbSearchTrash);
cbSearchJunk = dview.findViewById(R.id.cbSearchJunk);
cbUnseen = dview.findViewById(R.id.cbUnseen);
cbFlagged = dview.findViewById(R.id.cbFlagged);
cbHidden = dview.findViewById(R.id.cbHidden);
cbEncrypted = dview.findViewById(R.id.cbEncrypted);
cbAttachments = dview.findViewById(R.id.cbAttachments);
spMessageSize = dview.findViewById(R.id.spMessageSize);
btnBefore = dview.findViewById(R.id.btnBefore);
btnAfter = dview.findViewById(R.id.btnAfter);
tvBefore = dview.findViewById(R.id.tvBefore);
tvAfter = dview.findViewById(R.id.tvAfter);
grpMore = dview.findViewById(R.id.grpMore);
ibInfo.setOnClickListener(new View.OnClickListener() {
@Override
@@ -374,11 +412,9 @@ public class FragmentDialogSearch extends FragmentDialogBase {
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BoundaryCallbackMessages.SearchCriteria criteria = new BoundaryCallbackMessages.SearchCriteria();
BoundaryCallbackMessages.SearchCriteria criteria = getSearchCriteria();
criteria.query = etQuery.getText().toString().trim();
if (!TextUtils.isEmpty(criteria.query)) {
if (criteria.query != null) {
List<String> searches = new ArrayList<>();
for (int i = 1; i <= 3; i++)
if (prefs.contains("last_search" + i)) {
@@ -395,43 +431,6 @@ public class FragmentDialogSearch extends FragmentDialogBase {
editor.apply();
}
if (TextUtils.isEmpty(criteria.query))
criteria.query = null;
criteria.fts = cbSearchIndex.isChecked();
if (!criteria.fts) {
criteria.in_senders = cbSenders.isChecked();
criteria.in_recipients = cbRecipients.isChecked();
criteria.in_subject = cbSubject.isChecked();
criteria.in_keywords = cbKeywords.isChecked();
criteria.in_message = cbMessage.isChecked();
criteria.in_notes = cbNotes.isChecked();
criteria.in_headers = cbHeaders.isChecked();
criteria.in_html = cbHtml.isChecked();
criteria.with_unseen = cbUnseen.isChecked();
criteria.with_flagged = cbFlagged.isChecked();
criteria.with_hidden = cbHidden.isChecked();
criteria.with_encrypted = cbEncrypted.isChecked();
criteria.with_attachments = cbAttachments.isChecked();
int pos = spMessageSize.getSelectedItemPosition();
if (pos > 0) {
int[] sizes = getResources().getIntArray(R.array.sizeValues);
criteria.with_size = sizes[pos];
}
}
criteria.in_trash = cbSearchTrash.isChecked();
criteria.in_junk = cbSearchJunk.isChecked();
Object after = tvAfter.getTag();
Object before = tvBefore.getTag();
if (after != null)
criteria.after = ((Calendar) after).getTimeInMillis();
if (before != null)
criteria.before = ((Calendar) before).getTimeInMillis();
Helper.hideKeyboard(etQuery);
if (criteria.query != null && criteria.query.startsWith("raw:"))
@@ -482,6 +481,38 @@ public class FragmentDialogSearch extends FragmentDialogBase {
account, folder, false, criteria);
}
})
.setNeutralButton(R.string.title_save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
BoundaryCallbackMessages.SearchCriteria criteria = getSearchCriteria();
Bundle args = new Bundle();
args.putString("name", criteria.getTitle(context));
args.putString("data", criteria.toJson().toString());
new SimpleTask<Void>() {
@Override
protected Void onExecute(Context context, Bundle args) {
EntitySearch search = new EntitySearch();
search.name = args.getString("name");
search.data = args.getString("data");
DB db = DB.getInstance(context);
db.search().insertSearch(search);
return null;
}
@Override
protected void onException(Bundle args, Throwable ex) {
Log.unexpectedError(getParentFragmentManager(), ex);
}
}.execute(FragmentDialogSearch.this, args, "search:save");
} catch (Throwable ex) {
Log.e(ex);
}
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@@ -547,6 +578,50 @@ public class FragmentDialogSearch extends FragmentDialogBase {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
private BoundaryCallbackMessages.SearchCriteria getSearchCriteria() {
BoundaryCallbackMessages.SearchCriteria criteria = new BoundaryCallbackMessages.SearchCriteria();
criteria.query = etQuery.getText().toString().trim();
if (TextUtils.isEmpty(criteria.query))
criteria.query = null;
criteria.fts = cbSearchIndex.isChecked();
if (!criteria.fts) {
criteria.in_senders = cbSenders.isChecked();
criteria.in_recipients = cbRecipients.isChecked();
criteria.in_subject = cbSubject.isChecked();
criteria.in_keywords = cbKeywords.isChecked();
criteria.in_message = cbMessage.isChecked();
criteria.in_notes = cbNotes.isChecked();
criteria.in_headers = cbHeaders.isChecked();
criteria.in_html = cbHtml.isChecked();
criteria.with_unseen = cbUnseen.isChecked();
criteria.with_flagged = cbFlagged.isChecked();
criteria.with_hidden = cbHidden.isChecked();
criteria.with_encrypted = cbEncrypted.isChecked();
criteria.with_attachments = cbAttachments.isChecked();
int pos = spMessageSize.getSelectedItemPosition();
if (pos > 0) {
int[] sizes = getResources().getIntArray(R.array.sizeValues);
criteria.with_size = sizes[pos];
}
}
criteria.in_trash = cbSearchTrash.isChecked();
criteria.in_junk = cbSearchJunk.isChecked();
Object after = tvAfter.getTag();
Object before = tvBefore.getTag();
if (after != null)
criteria.after = ((Calendar) after).getTimeInMillis();
if (before != null)
criteria.before = ((Calendar) before).getTimeInMillis();
return criteria;
}
private void pickDate(TextView tv) {
Object tag = tv.getTag();
final Calendar cal = (tag == null ? Calendar.getInstance() : (Calendar) tag);