package com.zulip.android.filters; import android.os.Parcel; import com.j256.ormlite.stmt.SelectArg; import com.j256.ormlite.stmt.Where; import com.zulip.android.database.DatabaseHelper; import com.zulip.android.models.Message; import com.zulip.android.models.Stream; import org.json.JSONArray; import org.json.JSONException; import java.sql.SQLException; import java.util.Arrays; /** * Narrow based on search terms * {@link NarrowFilterSearch#query} is the search query * {@link NarrowFilterSearch#filter} indicates the current narrow filter */ public class NarrowFilterSearch implements NarrowFilter { public static final Creator<NarrowFilterSearch> CREATOR = new Creator<NarrowFilterSearch>() { @Override public NarrowFilterSearch createFromParcel(Parcel parcel) { return new NarrowFilterSearch(parcel.readString(), null); } @Override public NarrowFilterSearch[] newArray(int i) { return new NarrowFilterSearch[i]; } }; private String query; private NarrowFilter filter; public NarrowFilterSearch(String query, NarrowFilter filter) { this.query = query; this.filter = filter; } @Override public Where<Message, Object> modWhere(Where<Message, Object> where) throws SQLException { where.raw( Message.CONTENT_FIELD + " LIKE ? COLLATE NOCASE", new SelectArg(Message.CONTENT_FIELD, "%" + DatabaseHelper.likeEscape(query) + "%")); return where; } @Override public boolean matches(Message msg) { // api gives a list of messages matching the search query // when in home view, we want to show all the matching results // when narrowed, we want to show messages which match the current narrow of user return filter == null || filter.matches(msg); } @Override public String getTitle() { return "Searching '" + query + "'"; } @Override public String getSubtitle() { return null; } @Override public Stream getComposeStream() { return null; } @Override public String getComposePMRecipient() { return null; } @Override public String getJsonFilter() throws JSONException { JSONArray filter = new JSONArray(); filter.put(new JSONArray(Arrays.asList("search", query))); return filter.toString(); } @Override public boolean equals(NarrowFilter filter) { if (filter instanceof NarrowFilterSearch) { NarrowFilterSearch filterSearch = (NarrowFilterSearch) filter; return this.getTitle().equals(filterSearch.getTitle()); } else { return false; } } @Override public String toString() { try { return getJsonFilter(); } catch (JSONException e) { return null; } } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(query); } }