made tags searchable

This commit is contained in:
iNPUTmice 2014-11-16 23:58:30 +01:00
parent 8c4236b01b
commit 2036c58cd7
2 changed files with 180 additions and 157 deletions

View File

@ -2,8 +2,8 @@ package eu.siacs.conversations.entities;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
@ -39,30 +39,11 @@ public class Bookmark extends Element implements ListItem {
}
}
public void setName(String name) {
this.name = name;
}
public void setNick(String nick) {
Element element = this.findChild("nick");
if (element == null) {
element = this.addChild("nick");
}
element.setContent(nick);
}
public void setPassword(String password) {
Element element = this.findChild("password");
if (element != null) {
element.setContent(password);
}
}
@Override
public int compareTo(final ListItem another) {
return this.getDisplayName().compareToIgnoreCase(
another.getDisplayName());
}
return this.getDisplayName().compareToIgnoreCase(
another.getDisplayName());
}
@Override
public String getDisplayName() {
@ -80,19 +61,26 @@ public class Bookmark extends Element implements ListItem {
public Jid getJid() {
final String jid = this.getAttribute("jid");
if (jid != null) {
try {
return Jid.fromString(jid);
} catch (final InvalidJidException e) {
return null;
}
} else {
try {
return Jid.fromString(jid);
} catch (final InvalidJidException e) {
return null;
}
} else {
return null;
}
}
@Override
public List<Tag> getTags() {
return new ArrayList<Tag>();
ArrayList<Tag> tags = new ArrayList<Tag>();
for (Element element : getChildren()) {
if (element.getName().equals("group") && element.getContent() != null) {
String group = element.getContent();
tags.add(new Tag(group, UIHelper.getColorForName(group)));
}
}
return tags;
}
public String getNick() {
@ -104,6 +92,14 @@ public class Bookmark extends Element implements ListItem {
}
}
public void setNick(String nick) {
Element element = this.findChild("nick");
if (element == null) {
element = this.addChild("nick");
}
element.setContent(nick);
}
public boolean autojoin() {
String autojoin = this.getAttribute("autojoin");
return (autojoin != null && (autojoin.equalsIgnoreCase("true") || autojoin
@ -119,29 +115,50 @@ public class Bookmark extends Element implements ListItem {
}
}
public void setPassword(String password) {
Element element = this.findChild("password");
if (element != null) {
element.setContent(password);
}
}
public boolean match(String needle) {
return needle == null
|| getJid().toString().toLowerCase(Locale.US).contains(needle.toLowerCase(Locale.US))
|| getDisplayName().toLowerCase(Locale.US).contains(
needle.toLowerCase(Locale.US));
if (needle == null) {
return true;
}
needle = needle.toLowerCase();
return getJid().toString().contains(needle) || getDisplayName().toLowerCase().contains(needle) || matchInTag(needle);
}
private boolean matchInTag(String needle) {
for (Tag tag : getTags()) {
if (tag.getName().toLowerCase().contains(needle)) {
return true;
}
}
return false;
}
public Account getAccount() {
return this.account;
}
public void setConversation(Conversation conversation) {
this.mJoinedConversation = conversation;
}
public Conversation getConversation() {
return this.mJoinedConversation;
}
public void setConversation(Conversation conversation) {
this.mJoinedConversation = conversation;
}
public String getName() {
return this.getAttribute("name");
}
public void setName(String name) {
this.name = name;
}
public void unregisterConversation() {
if (this.mJoinedConversation != null) {
this.mJoinedConversation.deregisterWithBookmark();

View File

@ -8,9 +8,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xml.Element;
@ -29,10 +27,10 @@ public class Contact implements ListItem {
public static final String KEYS = "pgpkey";
public static final String ACCOUNT = "accountUuid";
public static final String AVATAR = "avatar";
public static final String LAST_PRESENCE = "last_presence";
public static final String LAST_TIME = "last_time";
public static final String LAST_PRESENCE = "last_presence";
public static final String LAST_TIME = "last_time";
public static final String GROUPS = "groups";
public Lastseen lastseen = new Lastseen();
protected String accountUuid;
protected String systemName;
protected String serverName;
@ -45,14 +43,11 @@ public class Contact implements ListItem {
protected JSONObject keys = new JSONObject();
protected JSONArray groups = new JSONArray();
protected Presences presences = new Presences();
protected Account account;
public Lastseen lastseen = new Lastseen();
public Contact(final String account, final String systemName, final String serverName,
final Jid jid, final int subscription, final String photoUri,
final String systemAccount, final String keys, final String avatar, final Lastseen lastseen, final String groups) {
final Jid jid, final int subscription, final String photoUri,
final String systemAccount, final String keys, final String avatar, final Lastseen lastseen, final String groups) {
this.accountUuid = account;
this.systemName = systemName;
this.serverName = serverName;
@ -78,18 +73,42 @@ public class Contact implements ListItem {
this.jid = jid;
}
public static Contact fromCursor(final Cursor cursor) {
final Lastseen lastseen = new Lastseen(
cursor.getString(cursor.getColumnIndex(LAST_PRESENCE)),
cursor.getLong(cursor.getColumnIndex(LAST_TIME)));
final Jid jid;
try {
jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(JID)));
} catch (final InvalidJidException e) {
// TODO: Borked DB... handle this somehow?
return null;
}
return new Contact(cursor.getString(cursor.getColumnIndex(ACCOUNT)),
cursor.getString(cursor.getColumnIndex(SYSTEMNAME)),
cursor.getString(cursor.getColumnIndex(SERVERNAME)),
jid,
cursor.getInt(cursor.getColumnIndex(OPTIONS)),
cursor.getString(cursor.getColumnIndex(PHOTOURI)),
cursor.getString(cursor.getColumnIndex(SYSTEMACCOUNT)),
cursor.getString(cursor.getColumnIndex(KEYS)),
cursor.getString(cursor.getColumnIndex(AVATAR)),
lastseen,
cursor.getString(cursor.getColumnIndex(GROUPS)));
}
public String getDisplayName() {
if (this.systemName != null) {
return this.systemName;
} else if (this.serverName != null) {
return this.serverName;
return this.systemName;
} else if (this.serverName != null) {
return this.serverName;
} else if (this.presenceName != null) {
return this.presenceName;
return this.presenceName;
} else if (jid.hasLocalpart()) {
return jid.getLocalpart();
return jid.getLocalpart();
} else {
return jid.getDomainpart();
}
return jid.getDomainpart();
}
}
public String getProfilePhoto() {
@ -103,33 +122,43 @@ public class Contact implements ListItem {
@Override
public List<Tag> getTags() {
ArrayList<Tag> tags = new ArrayList<Tag>();
for(String group : getGroups()) {
for (String group : getGroups()) {
tags.add(new Tag(group, UIHelper.getColorForName(group)));
}
int status = getMostAvailableStatus();
switch (getMostAvailableStatus()) {
case Presences.CHAT:
case Presences.ONLINE:
tags.add(new Tag("online",0xff259b24));
tags.add(new Tag("online", 0xff259b24));
break;
case Presences.AWAY:
tags.add(new Tag("away",0xffff9800));
tags.add(new Tag("away", 0xffff9800));
break;
case Presences.XA:
tags.add(new Tag("not available",0xffe51c23));
tags.add(new Tag("not available", 0xffe51c23));
break;
case Presences.DND:
tags.add(new Tag("dnd",0xffe51c23));
tags.add(new Tag("dnd", 0xffe51c23));
break;
}
return tags;
}
public boolean match(String needle) {
return needle == null
|| jid.toString().contains(needle.toLowerCase())
|| getDisplayName().toLowerCase()
.contains(needle.toLowerCase());
if (needle == null) {
return true;
}
needle = needle.toLowerCase();
return jid.toString().contains(needle) || getDisplayName().toLowerCase().contains(needle) || matchInTag(needle);
}
private boolean matchInTag(String needle) {
for (Tag tag : getTags()) {
if (tag.getName().toLowerCase().contains(needle)) {
return true;
}
}
return false;
}
public ContentValues getContentValues() {
@ -145,40 +174,16 @@ public class Contact implements ListItem {
values.put(AVATAR, avatar);
values.put(LAST_PRESENCE, lastseen.presence);
values.put(LAST_TIME, lastseen.time);
values.put(GROUPS,groups.toString());
values.put(GROUPS, groups.toString());
return values;
}
public static Contact fromCursor(final Cursor cursor) {
final Lastseen lastseen = new Lastseen(
cursor.getString(cursor.getColumnIndex(LAST_PRESENCE)),
cursor.getLong(cursor.getColumnIndex(LAST_TIME)));
final Jid jid;
try {
jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(JID)));
} catch (final InvalidJidException e) {
// TODO: Borked DB... handle this somehow?
return null;
}
return new Contact(cursor.getString(cursor.getColumnIndex(ACCOUNT)),
cursor.getString(cursor.getColumnIndex(SYSTEMNAME)),
cursor.getString(cursor.getColumnIndex(SERVERNAME)),
jid,
cursor.getInt(cursor.getColumnIndex(OPTIONS)),
cursor.getString(cursor.getColumnIndex(PHOTOURI)),
cursor.getString(cursor.getColumnIndex(SYSTEMACCOUNT)),
cursor.getString(cursor.getColumnIndex(KEYS)),
cursor.getString(cursor.getColumnIndex(AVATAR)),
lastseen,
cursor.getString(cursor.getColumnIndex(GROUPS)));
}
public int getSubscription() {
return this.subscription;
}
public void setSystemAccount(String account) {
this.systemAccount = account;
public Account getAccount() {
return this.account;
}
public void setAccount(Account account) {
@ -186,14 +191,14 @@ public class Contact implements ListItem {
this.accountUuid = account.getUuid();
}
public Account getAccount() {
return this.account;
}
public Presences getPresences() {
return this.presences;
}
public void setPresences(Presences pres) {
this.presences = pres;
}
public void updatePresence(String resource, int status) {
this.presences.updatePresence(resource, status);
}
@ -211,10 +216,6 @@ public class Contact implements ListItem {
return this.presences.getMostAvailableStatus();
}
public void setPresences(Presences pres) {
this.presences = pres;
}
public void setPhotoUri(String uri) {
this.photoUri = uri;
}
@ -235,9 +236,13 @@ public class Contact implements ListItem {
return systemAccount;
}
public void setSystemAccount(String account) {
this.systemAccount = account;
}
public List<String> getGroups() {
ArrayList<String> groups = new ArrayList<String>();
for(int i = 0; i < this.groups.length(); ++i) {
for (int i = 0; i < this.groups.length(); ++i) {
try {
groups.add(this.groups.getString(i));
} catch (final JSONException ignored) {
@ -282,14 +287,6 @@ public class Contact implements ListItem {
}
}
public void setPgpKeyId(long keyId) {
try {
this.keys.put("pgp_keyid", keyId);
} catch (final JSONException ignored) {
}
}
public long getPgpKeyId() {
if (this.keys.has("pgp_keyid")) {
try {
@ -302,6 +299,14 @@ public class Contact implements ListItem {
}
}
public void setPgpKeyId(long keyId) {
try {
this.keys.put("pgp_keyid", keyId);
} catch (final JSONException ignored) {
}
}
public void setOption(int option) {
this.subscription |= 1 << option;
}
@ -325,26 +330,26 @@ public class Contact implements ListItem {
String subscription = item.getAttribute("subscription");
if (subscription != null) {
switch (subscription) {
case "to":
this.resetOption(Options.FROM);
this.setOption(Options.TO);
break;
case "from":
this.resetOption(Options.TO);
this.setOption(Options.FROM);
this.resetOption(Options.PREEMPTIVE_GRANT);
break;
case "both":
this.setOption(Options.TO);
this.setOption(Options.FROM);
this.resetOption(Options.PREEMPTIVE_GRANT);
break;
case "none":
this.resetOption(Options.FROM);
this.resetOption(Options.TO);
break;
}
switch (subscription) {
case "to":
this.resetOption(Options.FROM);
this.setOption(Options.TO);
break;
case "from":
this.resetOption(Options.TO);
this.setOption(Options.FROM);
this.resetOption(Options.PREEMPTIVE_GRANT);
break;
case "both":
this.setOption(Options.TO);
this.setOption(Options.FROM);
this.resetOption(Options.PREEMPTIVE_GRANT);
break;
case "none":
this.resetOption(Options.FROM);
this.resetOption(Options.TO);
break;
}
}
// do NOT override asking if pending push request
@ -359,7 +364,7 @@ public class Contact implements ListItem {
public void parseGroupsFromElement(Element item) {
this.groups = new JSONArray();
for(Element element : item.getChildren()) {
for (Element element : item.getChildren()) {
if (element.getName().equals("group") && element.getContent() != null) {
this.groups.put(element.getContent());
}
@ -372,37 +377,12 @@ public class Contact implements ListItem {
if (this.serverName != null) {
item.setAttribute("name", this.serverName);
}
for(String group : getGroups()) {
for (String group : getGroups()) {
item.addChild("group").setContent(group);
}
return item;
}
public class Options {
public static final int TO = 0;
public static final int FROM = 1;
public static final int ASKING = 2;
public static final int PREEMPTIVE_GRANT = 3;
public static final int IN_ROSTER = 4;
public static final int PENDING_SUBSCRIPTION_REQUEST = 5;
public static final int DIRTY_PUSH = 6;
public static final int DIRTY_DELETE = 7;
}
public static class Lastseen {
public long time;
public String presence;
public Lastseen() {
time = 0;
presence = null;
}
public Lastseen(final String presence, final long time) {
this.time = time;
this.presence = presence;
}
}
@Override
public int compareTo(final ListItem another) {
return this.getDisplayName().compareToIgnoreCase(
@ -455,9 +435,35 @@ public class Contact implements ListItem {
public String getShareableUri() {
if (getOtrFingerprints().size() >= 1) {
String otr = getOtrFingerprints().get(0);
return "xmpp:"+getJid().toBareJid().toString()+"?otr-fingerprint="+otr.replace(" ","");
return "xmpp:" + getJid().toBareJid().toString() + "?otr-fingerprint=" + otr.replace(" ", "");
} else {
return "xmpp:"+getJid().toBareJid().toString();
return "xmpp:" + getJid().toBareJid().toString();
}
}
public static class Lastseen {
public long time;
public String presence;
public Lastseen() {
time = 0;
presence = null;
}
public Lastseen(final String presence, final long time) {
this.time = time;
this.presence = presence;
}
}
public class Options {
public static final int TO = 0;
public static final int FROM = 1;
public static final int ASKING = 2;
public static final int PREEMPTIVE_GRANT = 3;
public static final int IN_ROSTER = 4;
public static final int PENDING_SUBSCRIPTION_REQUEST = 5;
public static final int DIRTY_PUSH = 6;
public static final int DIRTY_DELETE = 7;
}
}