1345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/* 2345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Copyright (C) 2011 The Android Open Source Project 3345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 4345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 5345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * you may not use this file except in compliance with the License. 6345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * You may obtain a copy of the License at 7345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 8345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 9345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 10345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software 11345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 12345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * See the License for the specific language governing permissions and 14345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * limitations under the License. 15345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 16345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 17345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpackage com.android.emailcommon.service; 18345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 19345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport android.os.Parcel; 20345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport android.os.Parcelable; 21874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantlerimport android.util.SparseArray; 22345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 23345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.google.common.base.Objects; 24345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 25874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantlerimport java.util.Date; 26874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler 27345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpublic class SearchParams implements Parcelable { 28345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 29345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein private static final int DEFAULT_LIMIT = 10; // Need input on what this number should be 30345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein private static final int DEFAULT_OFFSET = 0; 31345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 32345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // The id of the mailbox to be searched; if -1, all mailboxes MUST be searched 33345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public final long mMailboxId; 34345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // If true, all subfolders of the specified mailbox MUST be searched 35345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public boolean mIncludeChildren = true; 36345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // The search terms (the search MUST only select messages whose contents include all of the 37345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // search terms in the query) 38345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public final String mFilter; 39874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler // The start date (GreaterThan) for date-windowing results 40874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler public final Date mStartDate; 41874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler // The end date (LessThan) for date-windowing results 42874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler public final Date mEndDate; 43345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // The maximum number of results to be created by this search 44345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public int mLimit = DEFAULT_LIMIT; 45345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // If zero, specifies a "new" search; otherwise, asks for a continuation of the previous 46345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // query(ies) starting with the mOffset'th match (0 based) 47345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public int mOffset = DEFAULT_OFFSET; 48345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein // The id of the "search" mailbox being used 49345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public long mSearchMailboxId; 50345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 51345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein /** 52345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Error codes returned by the searchMessages API 53345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 54345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public static class SearchParamsError { 55345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public static final int CANT_SEARCH_ALL_MAILBOXES = -1; 56345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public static final int CANT_SEARCH_CHILDREN = -2; 57345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 58345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 59345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public SearchParams(long mailboxId, String filter) { 60345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mMailboxId = mailboxId; 61345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFilter = filter; 62874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mStartDate = null; 63874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mEndDate = null; 64345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 65345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 66345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public SearchParams(long mailboxId, String filter, long searchMailboxId) { 67345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mMailboxId = mailboxId; 68345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFilter = filter; 69874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mStartDate = null; 70874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mEndDate = null; 71874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mSearchMailboxId = searchMailboxId; 72874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } 73874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler 74874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler public SearchParams(long mailboxId, String filter, long searchMailboxId, Date startDate, 75874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler Date endDate) { 76874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mMailboxId = mailboxId; 77874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mFilter = filter; 78345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mSearchMailboxId = searchMailboxId; 79874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mStartDate = startDate; 80874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mEndDate = endDate; 81345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 82345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 83345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 84345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public boolean equals(Object o) { 85345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein if (o == this) { 86345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return true; 87345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 88345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein if ((o == null) || !(o instanceof SearchParams)) { 89345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return false; 90345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 91345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 92345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein SearchParams os = (SearchParams) o; 93345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return mMailboxId == os.mMailboxId 94345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein && mIncludeChildren == os.mIncludeChildren 95345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein && mFilter.equals(os.mFilter) 96874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler && Objects.equal(mStartDate, os.mStartDate) 97874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler && Objects.equal(mEndDate, os.mEndDate) 98345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein && mLimit == os.mLimit 99345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein && mOffset == os.mOffset; 100345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 101345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 102345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 103345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public int hashCode() { 104874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler return Objects.hashCode(mMailboxId, mFilter, mStartDate, mEndDate, mLimit, mOffset); 105345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 106345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 107345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 108345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public String toString() { 109874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler return "[SearchParams " 110874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler + mMailboxId + ":" + mFilter 111874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler + " (" + mOffset + ", " + mLimit + ")" 112874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler + " {" + mStartDate + ", " + mEndDate + "}" 113874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler + "]"; 114345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 115345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 116345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 117345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public int describeContents() { 118345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return 0; 119345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 120345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 121345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein /** 122345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Supports Parcelable 123345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 124345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public static final Parcelable.Creator<SearchParams> CREATOR 125345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein = new Parcelable.Creator<SearchParams>() { 126345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 127345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public SearchParams createFromParcel(Parcel in) { 128345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return new SearchParams(in); 129345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 130345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 131345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 132345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public SearchParams[] newArray(int size) { 133345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return new SearchParams[size]; 134345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 135345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein }; 136345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 137345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein /** 138345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Supports Parcelable 139345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 140345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 141345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public void writeToParcel(Parcel dest, int flags) { 142345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein dest.writeLong(mMailboxId); 143345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein dest.writeInt(mIncludeChildren ? 1 : 0); 144345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein dest.writeString(mFilter); 145345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein dest.writeInt(mLimit); 146345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein dest.writeInt(mOffset); 147874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler SparseArray<Object> dateWindow = new SparseArray<Object>(2); 148874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler if (mStartDate != null) { 149874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler dateWindow.put(0, mStartDate.getTime()); 150874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } 151874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler if (mEndDate != null) { 152874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler dateWindow.put(1, mEndDate.getTime()); 153874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } 154874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler dest.writeSparseArray(dateWindow); 155345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 156345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 157345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein /** 158345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Supports Parcelable 159345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 160345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public SearchParams(Parcel in) { 161345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mMailboxId = in.readLong(); 162345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mIncludeChildren = in.readInt() == 1; 163345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFilter = in.readString(); 164345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mLimit = in.readInt(); 165345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mOffset = in.readInt(); 166874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler SparseArray dateWindow = in.readSparseArray(this.getClass().getClassLoader()); 167874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler if (dateWindow.get(0) != null) { 168874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mStartDate = new Date((Long)dateWindow.get(0)); 169874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } else { 170874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mStartDate = null; 171874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } 172874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler if (dateWindow.get(1) != null) { 173874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mEndDate = new Date((Long)dateWindow.get(1)); 174874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } else { 175874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler mEndDate = null; 176874c5661c6d8554b03a4498c6d1c13d67969ffc9Tony Mantler } 177345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 178345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein} 179