better usage of synchronized in some places
This commit is contained in:
parent
090e6ecf09
commit
018a0c7978
|
@ -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();
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue