better usage of synchronized in some places

This commit is contained in:
iNPUTmice 2014-11-18 03:10:59 +01:00
parent 090e6ecf09
commit 018a0c7978
3 changed files with 82 additions and 84 deletions

View file

@ -57,7 +57,7 @@ public class Conversation extends AbstractEntity {
private Jid nextCounterpart; private Jid nextCounterpart;
protected ArrayList<Message> messages = new ArrayList<>(); protected final ArrayList<Message> messages = new ArrayList<>();
protected Account account = null; protected Account account = null;
private transient SessionImpl otrSession; private transient SessionImpl otrSession;
@ -148,10 +148,6 @@ public class Conversation extends AbstractEntity {
} }
} }
public void setMessages(ArrayList<Message> msgs) {
this.messages = msgs;
}
public String getName() { public String getName() {
if (getMode() == MODE_MULTI && getMucOptions().getSubject() != null) { if (getMode() == MODE_MULTI && getMucOptions().getSubject() != null) {
return getMucOptions().getSubject(); return getMucOptions().getSubject();

View file

@ -139,7 +139,7 @@ public class XmppConnectionService extends Service {
private MessageGenerator mMessageGenerator = new MessageGenerator(this); private MessageGenerator mMessageGenerator = new MessageGenerator(this);
private PresenceGenerator mPresenceGenerator = new PresenceGenerator(this); private PresenceGenerator mPresenceGenerator = new PresenceGenerator(this);
private List<Account> accounts; private List<Account> accounts;
private CopyOnWriteArrayList<Conversation> conversations = null; private final CopyOnWriteArrayList<Conversation> conversations = new CopyOnWriteArrayList<Conversation>();
private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager( private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager(
this); this);
private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager( private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(
@ -486,27 +486,23 @@ public class XmppConnectionService extends Service {
} }
}; };
this.databaseBackend = DatabaseBackend this.databaseBackend = DatabaseBackend.getInstance(getApplicationContext());
.getInstance(getApplicationContext());
this.accounts = databaseBackend.getAccounts(); this.accounts = databaseBackend.getAccounts();
for (Account account : this.accounts) { for (Account account : this.accounts) {
account.initOtrEngine(this); account.initOtrEngine(this);
this.databaseBackend.readRoster(account.getRoster()); this.databaseBackend.readRoster(account.getRoster());
} }
initConversations();
this.mergePhoneContactsWithRoster(); this.mergePhoneContactsWithRoster();
this.getConversations();
getContentResolver().registerContentObserver( getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
this.fileObserver.startWatching(); this.fileObserver.startWatching();
this.pgpServiceConnection = new OpenPgpServiceConnection( this.pgpServiceConnection = new OpenPgpServiceConnection(getApplicationContext(), "org.sufficientlysecure.keychain");
getApplicationContext(), "org.sufficientlysecure.keychain");
this.pgpServiceConnection.bindToService(); this.pgpServiceConnection.bindToService();
this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE); this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"XmppConnectionService");
"XmppConnectionService");
toggleForegroundService(); toggleForegroundService();
} }
@ -878,21 +874,23 @@ public class XmppConnectionService extends Service {
}); });
} }
public List<Conversation> getConversations() { private void initConversations() {
if (this.conversations == null) { synchronized (this.conversations) {
Hashtable<String, Account> accountLookupTable = new Hashtable<>(); Hashtable<String, Account> accountLookupTable = new Hashtable<>();
for (Account account : this.accounts) { for (Account account : this.accounts) {
accountLookupTable.put(account.getUuid(), account); accountLookupTable.put(account.getUuid(), account);
} }
this.conversations = databaseBackend this.conversations.addAll(databaseBackend.getConversations(Conversation.STATUS_AVAILABLE));
.getConversations(Conversation.STATUS_AVAILABLE);
for (Conversation conv : this.conversations) { for (Conversation conv : this.conversations) {
Account account = accountLookupTable.get(conv.getAccountUuid()); Account account = accountLookupTable.get(conv.getAccountUuid());
conv.setAccount(account); conv.setAccount(account);
conv.setMessages(databaseBackend.getMessages(conv, 50)); conv.addAll(0, databaseBackend.getMessages(conv, 50));
checkDeletedFiles(conv); checkDeletedFiles(conv);
} }
} }
}
public List<Conversation> getConversations() {
return this.conversations; return this.conversations;
} }
@ -923,12 +921,11 @@ public class XmppConnectionService extends Service {
} }
} }
public void populateWithOrderedConversations(List<Conversation> list) { public void populateWithOrderedConversations(final List<Conversation> list) {
populateWithOrderedConversations(list, true); populateWithOrderedConversations(list, true);
} }
public void populateWithOrderedConversations(List<Conversation> list, public void populateWithOrderedConversations(final List<Conversation> list, boolean includeConferences) {
boolean includeConferences) {
list.clear(); list.clear();
if (includeConferences) { if (includeConferences) {
list.addAll(getConversations()); list.addAll(getConversations());
@ -992,60 +989,63 @@ public class XmppConnectionService extends Service {
public Conversation findOrCreateConversation(final Account account, final Jid jid, public Conversation findOrCreateConversation(final Account account, final Jid jid,
final boolean muc) { final boolean muc) {
Conversation conversation = find(account, jid); synchronized (this.conversations) {
if (conversation != null) { Conversation conversation = find(account, jid);
if (conversation != null) {
return conversation;
}
conversation = databaseBackend.findConversation(account, jid);
if (conversation != null) {
conversation.setStatus(Conversation.STATUS_AVAILABLE);
conversation.setAccount(account);
if (muc) {
conversation.setMode(Conversation.MODE_MULTI);
} else {
conversation.setMode(Conversation.MODE_SINGLE);
}
conversation.addAll(0, databaseBackend.getMessages(conversation, 50));
this.databaseBackend.updateConversation(conversation);
} else {
String conversationName;
Contact contact = account.getRoster().getContact(jid);
if (contact != null) {
conversationName = contact.getDisplayName();
} else {
conversationName = jid.getLocalpart();
}
if (muc) {
conversation = new Conversation(conversationName, account, jid,
Conversation.MODE_MULTI);
} else {
conversation = new Conversation(conversationName, account, jid,
Conversation.MODE_SINGLE);
}
this.databaseBackend.createConversation(conversation);
}
this.conversations.add(conversation);
updateConversationUi();
return conversation; return conversation;
} }
conversation = databaseBackend.findConversation(account, jid);
if (conversation != null) {
conversation.setStatus(Conversation.STATUS_AVAILABLE);
conversation.setAccount(account);
if (muc) {
conversation.setMode(Conversation.MODE_MULTI);
} else {
conversation.setMode(Conversation.MODE_SINGLE);
}
conversation.setMessages(databaseBackend.getMessages(conversation,
50));
this.databaseBackend.updateConversation(conversation);
} else {
String conversationName;
Contact contact = account.getRoster().getContact(jid);
if (contact != null) {
conversationName = contact.getDisplayName();
} else {
conversationName = jid.getLocalpart();
}
if (muc) {
conversation = new Conversation(conversationName, account, jid,
Conversation.MODE_MULTI);
} else {
conversation = new Conversation(conversationName, account, jid,
Conversation.MODE_SINGLE);
}
this.databaseBackend.createConversation(conversation);
}
this.conversations.add(conversation);
updateConversationUi();
return conversation;
} }
public void archiveConversation(Conversation conversation) { public void archiveConversation(Conversation conversation) {
if (conversation.getMode() == Conversation.MODE_MULTI) { synchronized (this.conversations) {
if (conversation.getAccount().getStatus() == Account.State.ONLINE) { if (conversation.getMode() == Conversation.MODE_MULTI) {
Bookmark bookmark = conversation.getBookmark(); if (conversation.getAccount().getStatus() == Account.State.ONLINE) {
if (bookmark != null && bookmark.autojoin()) { Bookmark bookmark = conversation.getBookmark();
bookmark.setAutojoin(false); if (bookmark != null && bookmark.autojoin()) {
pushBookmarks(bookmark.getAccount()); bookmark.setAutojoin(false);
pushBookmarks(bookmark.getAccount());
}
} }
leaveMuc(conversation);
} else {
conversation.endOtrIfNeeded();
} }
leaveMuc(conversation); this.databaseBackend.updateConversation(conversation);
} else { this.conversations.remove(conversation);
conversation.endOtrIfNeeded(); updateConversationUi();
} }
this.databaseBackend.updateConversation(conversation);
this.conversations.remove(conversation);
updateConversationUi();
} }
public void clearConversationHistory(Conversation conversation) { public void clearConversationHistory(Conversation conversation) {
@ -1075,23 +1075,25 @@ public class XmppConnectionService extends Service {
} }
public void deleteAccount(Account account) { public void deleteAccount(Account account) {
for (Conversation conversation : conversations) { synchronized (this.conversations) {
if (conversation.getAccount() == account) { for (Conversation conversation : conversations) {
if (conversation.getMode() == Conversation.MODE_MULTI) { if (conversation.getAccount() == account) {
leaveMuc(conversation); if (conversation.getMode() == Conversation.MODE_MULTI) {
} else if (conversation.getMode() == Conversation.MODE_SINGLE) { leaveMuc(conversation);
conversation.endOtrIfNeeded(); } else if (conversation.getMode() == Conversation.MODE_SINGLE) {
conversation.endOtrIfNeeded();
}
conversations.remove(conversation);
} }
conversations.remove(conversation);
} }
if (account.getXmppConnection() != null) {
this.disconnect(account, true);
}
databaseBackend.deleteAccount(account);
this.accounts.remove(account);
updateAccountUi();
UIHelper.showErrorNotification(getApplicationContext(), getAccounts());
} }
if (account.getXmppConnection() != null) {
this.disconnect(account, true);
}
databaseBackend.deleteAccount(account);
this.accounts.remove(account);
updateAccountUi();
UIHelper.showErrorNotification(getApplicationContext(), getAccounts());
} }
private void removeStaleListeners() { private void removeStaleListeners() {

View file

@ -94,7 +94,7 @@ public class ConversationFragment extends Fragment {
} }
}; };
protected ListView messagesView; protected ListView messagesView;
protected List<Message> messageList = new ArrayList<>(); final protected List<Message> messageList = new ArrayList<>();
protected MessageAdapter messageListAdapter; protected MessageAdapter messageListAdapter;
protected Contact contact; protected Contact contact;
private EditMessage mEditMessage; private EditMessage mEditMessage;