make avatars persisent / available even without internet

This commit is contained in:
iNPUTmice 2014-08-21 12:32:50 +02:00
parent 301477c764
commit 4875b52f09
6 changed files with 65 additions and 19 deletions

View File

@ -31,6 +31,7 @@ public class Account extends AbstractEntity {
public static final String OPTIONS = "options"; public static final String OPTIONS = "options";
public static final String ROSTERVERSION = "rosterversion"; public static final String ROSTERVERSION = "rosterversion";
public static final String KEYS = "keys"; public static final String KEYS = "keys";
public static final String AVATAR = "avatar";
public static final int OPTION_USETLS = 0; public static final int OPTION_USETLS = 0;
public static final int OPTION_DISABLED = 1; public static final int OPTION_DISABLED = 1;
@ -81,11 +82,11 @@ public class Account extends AbstractEntity {
public Account(String username, String server, String password) { public Account(String username, String server, String password) {
this(java.util.UUID.randomUUID().toString(), username, server, this(java.util.UUID.randomUUID().toString(), username, server,
password, 0, null, ""); password, 0, null, "",null);
} }
public Account(String uuid, String username, String server, public Account(String uuid, String username, String server,
String password, int options, String rosterVersion, String keys) { String password, int options, String rosterVersion, String keys, String avatar) {
this.uuid = uuid; this.uuid = uuid;
this.username = username; this.username = username;
this.server = server; this.server = server;
@ -97,6 +98,7 @@ public class Account extends AbstractEntity {
} catch (JSONException e) { } catch (JSONException e) {
} }
this.avatar = avatar;
} }
public boolean isOptionSet(int option) { public boolean isOptionSet(int option) {
@ -209,6 +211,7 @@ public class Account extends AbstractEntity {
values.put(OPTIONS, options); values.put(OPTIONS, options);
values.put(KEYS, this.keys.toString()); values.put(KEYS, this.keys.toString());
values.put(ROSTERVERSION, rosterVersion); values.put(ROSTERVERSION, rosterVersion);
values.put(AVATAR, avatar);
return values; return values;
} }
@ -219,7 +222,8 @@ public class Account extends AbstractEntity {
cursor.getString(cursor.getColumnIndex(PASSWORD)), cursor.getString(cursor.getColumnIndex(PASSWORD)),
cursor.getInt(cursor.getColumnIndex(OPTIONS)), cursor.getInt(cursor.getColumnIndex(OPTIONS)),
cursor.getString(cursor.getColumnIndex(ROSTERVERSION)), cursor.getString(cursor.getColumnIndex(ROSTERVERSION)),
cursor.getString(cursor.getColumnIndex(KEYS))); cursor.getString(cursor.getColumnIndex(KEYS)),
cursor.getString(cursor.getColumnIndex(AVATAR)));
} }
public OtrEngine getOtrEngine(Context context) { public OtrEngine getOtrEngine(Context context) {
@ -346,8 +350,13 @@ public class Account extends AbstractEntity {
} }
} }
public void setAvatar(String filename) { public boolean setAvatar(String filename) {
this.avatar = filename; if (this.avatar != null && this.avatar.equals(filename)) {
return false;
} else {
this.avatar = filename;
return true;
}
} }
public String getAvatar() { public String getAvatar() {

View File

@ -15,7 +15,6 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class Contact implements ListItem { public class Contact implements ListItem {
public static final String TABLENAME = "contacts"; public static final String TABLENAME = "contacts";
@ -28,6 +27,7 @@ public class Contact implements ListItem {
public static final String PHOTOURI = "photouri"; public static final String PHOTOURI = "photouri";
public static final String KEYS = "pgpkey"; public static final String KEYS = "pgpkey";
public static final String ACCOUNT = "accountUuid"; public static final String ACCOUNT = "accountUuid";
public static final String AVATAR = "avatar";
protected String accountUuid; protected String accountUuid;
protected String systemName; protected String systemName;
@ -48,7 +48,7 @@ public class Contact implements ListItem {
public Contact(String account, String systemName, String serverName, public Contact(String account, String systemName, String serverName,
String jid, int subscription, String photoUri, String jid, int subscription, String photoUri,
String systemAccount, String keys) { String systemAccount, String keys, String avatar) {
this.accountUuid = account; this.accountUuid = account;
this.systemName = systemName; this.systemName = systemName;
this.serverName = serverName; this.serverName = serverName;
@ -64,6 +64,7 @@ public class Contact implements ListItem {
} catch (JSONException e) { } catch (JSONException e) {
this.keys = new JSONObject(); this.keys = new JSONObject();
} }
this.avatar = avatar;
} }
public Contact(String jid) { public Contact(String jid) {
@ -105,6 +106,7 @@ public class Contact implements ListItem {
values.put(SYSTEMACCOUNT, systemAccount); values.put(SYSTEMACCOUNT, systemAccount);
values.put(PHOTOURI, photoUri); values.put(PHOTOURI, photoUri);
values.put(KEYS, keys.toString()); values.put(KEYS, keys.toString());
values.put(AVATAR,avatar);
return values; return values;
} }
@ -116,7 +118,8 @@ public class Contact implements ListItem {
cursor.getInt(cursor.getColumnIndex(OPTIONS)), cursor.getInt(cursor.getColumnIndex(OPTIONS)),
cursor.getString(cursor.getColumnIndex(PHOTOURI)), cursor.getString(cursor.getColumnIndex(PHOTOURI)),
cursor.getString(cursor.getColumnIndex(SYSTEMACCOUNT)), cursor.getString(cursor.getColumnIndex(SYSTEMACCOUNT)),
cursor.getString(cursor.getColumnIndex(KEYS))); cursor.getString(cursor.getColumnIndex(KEYS)),
cursor.getString(cursor.getColumnIndex(AVATAR)));
} }
public int getSubscription() { public int getSubscription() {
@ -332,7 +335,12 @@ public class Contact implements ListItem {
} }
} }
public void setAvatar(String filename) { public boolean setAvatar(String filename) {
this.avatar = filename; if (this.avatar != null && this.avatar.equals(filename)) {
return false;
} else {
this.avatar = filename;
return true;
}
} }
} }

View File

@ -43,6 +43,7 @@ public class Message extends AbstractEntity {
public static String ENCRYPTION = "encryption"; public static String ENCRYPTION = "encryption";
public static String STATUS = "status"; public static String STATUS = "status";
public static String TYPE = "type"; public static String TYPE = "type";
public static String REMOTE_MSG_ID = "remoteMsgId";
protected String conversationUuid; protected String conversationUuid;
protected String counterpart; protected String counterpart;
@ -54,6 +55,7 @@ public class Message extends AbstractEntity {
protected int status; protected int status;
protected int type; protected int type;
protected boolean read = true; protected boolean read = true;
protected String remoteMsgId = null;
protected transient Conversation conversation = null; protected transient Conversation conversation = null;
@ -66,17 +68,17 @@ public class Message extends AbstractEntity {
public Message(Conversation conversation, String body, int encryption) { public Message(Conversation conversation, String body, int encryption) {
this(java.util.UUID.randomUUID().toString(), conversation.getUuid(), this(java.util.UUID.randomUUID().toString(), conversation.getUuid(),
conversation.getContactJid(), null, body, System.currentTimeMillis(), encryption, conversation.getContactJid(), null, body, System.currentTimeMillis(), encryption,
Message.STATUS_UNSEND,TYPE_TEXT); Message.STATUS_UNSEND,TYPE_TEXT,null);
this.conversation = conversation; this.conversation = conversation;
} }
public Message(Conversation conversation, String counterpart, String body, int encryption, int status) { public Message(Conversation conversation, String counterpart, String body, int encryption, int status) {
this(java.util.UUID.randomUUID().toString(), conversation.getUuid(),counterpart, null, body, System.currentTimeMillis(), encryption,status,TYPE_TEXT); this(java.util.UUID.randomUUID().toString(), conversation.getUuid(),counterpart, null, body, System.currentTimeMillis(), encryption,status,TYPE_TEXT,null);
this.conversation = conversation; this.conversation = conversation;
} }
public Message(String uuid, String conversationUUid, String counterpart, String trueCounterpart, public Message(String uuid, String conversationUUid, String counterpart, String trueCounterpart,
String body, long timeSent, int encryption, int status, int type) { String body, long timeSent, int encryption, int status, int type, String remoteMsgId) {
this.uuid = uuid; this.uuid = uuid;
this.conversationUuid = conversationUUid; this.conversationUuid = conversationUUid;
this.counterpart = counterpart; this.counterpart = counterpart;
@ -86,6 +88,7 @@ public class Message extends AbstractEntity {
this.encryption = encryption; this.encryption = encryption;
this.status = status; this.status = status;
this.type = type; this.type = type;
this.remoteMsgId = remoteMsgId;
} }
@Override @Override
@ -100,6 +103,7 @@ public class Message extends AbstractEntity {
values.put(ENCRYPTION, encryption); values.put(ENCRYPTION, encryption);
values.put(STATUS, status); values.put(STATUS, status);
values.put(TYPE, type); values.put(TYPE, type);
values.put(REMOTE_MSG_ID,remoteMsgId);
return values; return values;
} }
@ -163,6 +167,14 @@ public class Message extends AbstractEntity {
return status; return status;
} }
public String getRemoteMsgId() {
return this.remoteMsgId;
}
public void setRemoteMsgId(String id) {
this.remoteMsgId = id;
}
public static Message fromCursor(Cursor cursor) { public static Message fromCursor(Cursor cursor) {
return new Message(cursor.getString(cursor.getColumnIndex(UUID)), return new Message(cursor.getString(cursor.getColumnIndex(UUID)),
cursor.getString(cursor.getColumnIndex(CONVERSATION)), cursor.getString(cursor.getColumnIndex(CONVERSATION)),
@ -172,7 +184,8 @@ public class Message extends AbstractEntity {
cursor.getLong(cursor.getColumnIndex(TIME_SENT)), cursor.getLong(cursor.getColumnIndex(TIME_SENT)),
cursor.getInt(cursor.getColumnIndex(ENCRYPTION)), cursor.getInt(cursor.getColumnIndex(ENCRYPTION)),
cursor.getInt(cursor.getColumnIndex(STATUS)), cursor.getInt(cursor.getColumnIndex(STATUS)),
cursor.getInt(cursor.getColumnIndex(TYPE))); cursor.getInt(cursor.getColumnIndex(TYPE)),
cursor.getString(cursor.getColumnIndex(REMOTE_MSG_ID)));
} }
public void setConversation(Conversation conv) { public void setConversation(Conversation conv) {

View File

@ -301,7 +301,9 @@ public class MessageParser extends AbstractParser implements
if (mXmppConnectionService.getFileBackend().isAvatarCached( if (mXmppConnectionService.getFileBackend().isAvatarCached(
avatar)) { avatar)) {
if (account.getJid().equals(from)) { if (account.getJid().equals(from)) {
account.setAvatar(avatar.getFilename()); if (account.setAvatar(avatar.getFilename())) {
mXmppConnectionService.databaseBackend.updateAccount(account);
}
} else { } else {
Contact contact = account.getRoster().getContact(from); Contact contact = account.getRoster().getContact(from);
contact.setAvatar(avatar.getFilename()); contact.setAvatar(avatar.getFilename());

View File

@ -20,7 +20,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
private static DatabaseBackend instance = null; private static DatabaseBackend instance = null;
private static final String DATABASE_NAME = "history"; private static final String DATABASE_NAME = "history";
private static final int DATABASE_VERSION = 6; private static final int DATABASE_VERSION = 7;
private static String CREATE_CONTATCS_STATEMENT = "create table " private static String CREATE_CONTATCS_STATEMENT = "create table "
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, " + Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
@ -86,6 +86,14 @@ public class DatabaseBackend extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN " db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "
+ Message.TRUE_COUNTERPART + " TEXT"); + Message.TRUE_COUNTERPART + " TEXT");
} }
if (oldVersion < 7 && newVersion >= 7) {
db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "
+ Message.REMOTE_MSG_ID + " TEXT");
db.execSQL("ALTER TABLE " + Contact.TABLENAME + " ADD COLUMN "
+ Contact.AVATAR + " TEXT");
db.execSQL("ALTER TABLE " + Account.TABLENAME + " ADD COLUMN "
+ Account.AVATAR + " TEXT");
}
} }
public static synchronized DatabaseBackend getInstance(Context context) { public static synchronized DatabaseBackend getInstance(Context context) {

View File

@ -1218,7 +1218,9 @@ public class XmppConnectionService extends Service {
@Override @Override
public void onIqPacketReceived(Account account, IqPacket result) { public void onIqPacketReceived(Account account, IqPacket result) {
if (result.getType() == IqPacket.TYPE_RESULT) { if (result.getType() == IqPacket.TYPE_RESULT) {
account.setAvatar(avatar.getFilename()); if (account.setAvatar(avatar.getFilename())) {
databaseBackend.updateAccount(account);
}
callback.success(avatar); callback.success(avatar);
} else { } else {
callback.error(R.string.error_publish_avatar_server_reject, avatar); callback.error(R.string.error_publish_avatar_server_reject, avatar);
@ -1250,7 +1252,9 @@ public class XmppConnectionService extends Service {
if (avatar.image!=null) { if (avatar.image!=null) {
if (getFileBackend().save(avatar)) { if (getFileBackend().save(avatar)) {
if (account.getJid().equals(avatar.owner)) { if (account.getJid().equals(avatar.owner)) {
account.setAvatar(avatar.getFilename()); if (account.setAvatar(avatar.getFilename())) {
databaseBackend.updateAccount(account);
}
} else { } else {
Contact contact = account.getRoster().getContact(avatar.owner); Contact contact = account.getRoster().getContact(avatar.owner);
contact.setAvatar(avatar.getFilename()); contact.setAvatar(avatar.getFilename());
@ -1283,7 +1287,9 @@ public class XmppConnectionService extends Service {
if (avatar!=null) { if (avatar!=null) {
avatar.owner = account.getJid(); avatar.owner = account.getJid();
if (fileBackend.isAvatarCached(avatar)) { if (fileBackend.isAvatarCached(avatar)) {
account.setAvatar(avatar.getFilename()); if (account.setAvatar(avatar.getFilename())) {
databaseBackend.updateAccount(account);
}
callback.success(avatar); callback.success(avatar);
} else { } else {
fetchAvatar(account, avatar,callback); fetchAvatar(account, avatar,callback);