k-9/k9mail/src/main/java/com/fsck/k9/search/SearchSpecification.java

178 lines
4.7 KiB
Java

package com.fsck.k9.search;
import android.os.Parcel;
import android.os.Parcelable;
public interface SearchSpecification extends Parcelable {
/**
* Get all the uuids of accounts this search acts on.
* @return Array of uuids.
*/
public String[] getAccountUuids();
/**
* Returns the search's name if it was named.
* @return Name of the search.
*/
public String getName();
/**
* Returns the root node of the condition tree accompanying
* the search.
*
* @return Root node of conditions tree.
*/
public ConditionsTreeNode getConditions();
/*
* Some meta names for certain conditions.
*/
public static final String ALL_ACCOUNTS = "allAccounts";
///////////////////////////////////////////////////////////////
// ATTRIBUTE enum
///////////////////////////////////////////////////////////////
public enum Attribute {
CONTAINS,
NOT_CONTAINS,
EQUALS,
NOT_EQUALS,
STARTSWITH,
NOT_STARTSWITH,
ENDSWITH,
NOT_ENDSWITH
}
///////////////////////////////////////////////////////////////
// SEARCHFIELD enum
///////////////////////////////////////////////////////////////
/*
* Using an enum in order to have more robust code. Users ( & coders )
* are prevented from passing illegal fields. No database overhead
* when invalid fields passed.
*
* By result, only the fields in here are searchable.
*
* Fields not in here at this moment ( and by effect not searchable ):
* id, html_content, internal_date, message_id,
* preview, mime_type
*
*/
public enum SearchField {
SUBJECT,
DATE,
UID,
FLAG,
SENDER,
TO,
CC,
FOLDER,
BCC,
REPLY_TO,
MESSAGE_CONTENTS,
ATTACHMENT_COUNT,
DELETED,
THREAD_ID,
ID,
INTEGRATE,
READ,
FLAGGED,
DISPLAY_CLASS,
SEARCHABLE
}
///////////////////////////////////////////////////////////////
// SearchCondition class
///////////////////////////////////////////////////////////////
/**
* This class represents 1 value for a certain search field. One
* value consists of three things:
* an attribute: equals, starts with, contains,...
* a searchfield: date, flags, sender, subject,...
* a value: "apple", "jesse",..
*
* @author dzan
*/
public class SearchCondition implements Parcelable {
public final String value;
public final Attribute attribute;
public final SearchField field;
public SearchCondition(SearchField field, Attribute attribute, String value) {
this.value = value;
this.attribute = attribute;
this.field = field;
}
private SearchCondition(Parcel in) {
this.value = in.readString();
this.attribute = Attribute.values()[in.readInt()];
this.field = SearchField.values()[in.readInt()];
}
@Override
public SearchCondition clone() {
return new SearchCondition(field, attribute, value);
}
public String toHumanString() {
return field.toString() + attribute.toString();
}
@Override
public boolean equals(Object o) {
if (o instanceof SearchCondition) {
SearchCondition tmp = (SearchCondition) o;
if (tmp.attribute == attribute &&
tmp.field == field &&
tmp.value.equals(value)) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
int result = 1;
result = 31 * result + attribute.hashCode();
result = 31 * result + field.hashCode();
result = 31 * result + value.hashCode();
return result;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(value);
dest.writeInt(attribute.ordinal());
dest.writeInt(field.ordinal());
}
public static final Parcelable.Creator<SearchCondition> CREATOR =
new Parcelable.Creator<SearchCondition>() {
@Override
public SearchCondition createFromParcel(Parcel in) {
return new SearchCondition(in);
}
@Override
public SearchCondition[] newArray(int size) {
return new SearchCondition[size];
}
};
}
}