From 035fb2ca9a37f37ebad1301b8446dcf114868b0e Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 11 Mar 2013 15:58:22 +0000 Subject: [PATCH] Make final copies of non-volatile fields when passing to other threads. --- .../android/contact/ContactListActivity.java | 2 + .../invitation/AddContactActivity.java | 1 + .../messages/ConversationActivity.java | 1 + .../messages/ConversationListActivity.java | 3 + .../android/messages/ReadMessageActivity.java | 84 ++++++++----------- .../messages/WriteMessageActivity.java | 65 +++++++------- 6 files changed, 78 insertions(+), 78 deletions(-) diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java index 64b0ba2318..ffc43fe53b 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java @@ -88,6 +88,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener { // Add some fake contacts to the database in a background thread // FIXME: Remove this + final DatabaseComponent db = this.db; dbExecutor.execute(new Runnable() { public void run() { try { @@ -137,6 +138,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener { } private void reloadContactList() { + final DatabaseComponent db = this.db; dbExecutor.execute(new Runnable() { public void run() { try { diff --git a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java index 6c8192adb0..4c246c4913 100644 --- a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java +++ b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java @@ -217,6 +217,7 @@ implements InvitationListener { } void addContactAndFinish(final String nickname) { + final DatabaseComponent db = this.db; dbExecutor.execute(new Runnable() { public void run() { try { diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java index ec063dfba0..666f5159d7 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java @@ -121,6 +121,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { } private void reloadMessageHeaders() { + final DatabaseComponent db = this.db; final ContactId contactId = this.contactId; dbExecutor.execute(new Runnable() { public void run() { diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java index 296d7f95a1..0ddffc9b7b 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java @@ -93,6 +93,8 @@ implements OnClickListener, DatabaseListener { // Add some fake messages to the database in a background thread // FIXME: Remove this + final DatabaseComponent db = this.db; + final MessageFactory messageFactory = this.messageFactory; dbExecutor.execute(new Runnable() { public void run() { try { @@ -183,6 +185,7 @@ implements OnClickListener, DatabaseListener { } private void reloadMessageHeaders() { + final DatabaseComponent db = this.db; dbExecutor.execute(new Runnable() { public void run() { try { diff --git a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java index 00adfb06e6..70e1357ca7 100644 --- a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java @@ -89,27 +89,7 @@ implements OnClickListener { } else { starred = i.getBooleanExtra("net.sf.briar.STARRED", false); read = false; - final MessageId id = messageId; - dbExecutor.execute(new Runnable() { - public void run() { - try { - serviceConnection.waitForStartup(); - db.setReadFlag(id, true); - runOnUiThread(new Runnable() { - public void run() { - setRead(true); - } - }); - } catch(DbException e) { - if(LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } catch(InterruptedException e) { - if(LOG.isLoggable(INFO)) - LOG.info("Interrupted while waiting for service"); - Thread.currentThread().interrupt(); - } - } - }); + setReadInDatabase(true); } LinearLayout layout = new LinearLayout(this); @@ -204,9 +184,40 @@ implements OnClickListener { serviceConnection, 0); } + private void setReadInDatabase(final boolean read) { + final DatabaseComponent db = this.db; + final MessageId messageId = this.messageId; + dbExecutor.execute(new Runnable() { + public void run() { + try { + serviceConnection.waitForStartup(); + db.setReadFlag(messageId, read); + setReadInUi(read); + } catch(DbException e) { + if(LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } catch(InterruptedException e) { + if(LOG.isLoggable(INFO)) + LOG.info("Interrupted while waiting for service"); + Thread.currentThread().interrupt(); + } + } + }); + } + + private void setReadInUi(final boolean read) { + runOnUiThread(new Runnable() { + public void run() { + ReadMessageActivity.this.read = read; + if(read) readButton.setImageResource(R.drawable.content_unread); + else readButton.setImageResource(R.drawable.content_read); + } + }); + } + private void loadMessageBody() { + final DatabaseComponent db = this.db; final MessageId messageId = this.messageId; - final TextView content = this.content; dbExecutor.execute(new Runnable() { public void run() { try { @@ -247,28 +258,7 @@ implements OnClickListener { public void onClick(View view) { if(view == readButton) { - final MessageId messageId = this.messageId; - final boolean read = !this.read; - dbExecutor.execute(new Runnable() { - public void run() { - try { - serviceConnection.waitForStartup(); - db.setReadFlag(messageId, read); - runOnUiThread(new Runnable() { - public void run() { - setRead(read); - } - }); - } catch(DbException e) { - if(LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } catch(InterruptedException e) { - if(LOG.isLoggable(INFO)) - LOG.info("Interrupted while waiting for service"); - Thread.currentThread().interrupt(); - } - } - }); + setReadInDatabase(!read); } else if(view == prevButton) { setResult(RESULT_PREV); finish(); @@ -284,10 +274,4 @@ implements OnClickListener { finish(); } } - - private void setRead(boolean read) { - this.read = read; - if(read) readButton.setImageResource(R.drawable.content_unread); - else readButton.setImageResource(R.drawable.content_read); - } } diff --git a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java index fc54d5fb4b..4673d8180e 100644 --- a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java @@ -59,6 +59,7 @@ implements OnClickListener, OnItemSelectedListener { private ContactId contactId = null; private MessageId parentId = null; private ContactNameSpinnerAdapter adapter = null; + private Spinner spinner = null; private ImageButton sendButton = null; private EditText content = null; @@ -88,32 +89,10 @@ implements OnClickListener, OnItemSelectedListener { actionBar.addView(to); adapter = new ContactNameSpinnerAdapter(this); - final Spinner spinner = new Spinner(this); + spinner = new Spinner(this); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); - dbExecutor.execute(new Runnable() { - public void run() { - try { - serviceConnection.waitForStartup(); - final Collection<Contact> contacts = db.getContacts(); - runOnUiThread(new Runnable() { - public void run() { - for(Contact c : contacts) { - if(c.getId().equals(contactId)) - spinner.setSelection(adapter.getCount()); - adapter.add(c); - } - } - }); - } catch(DbException e) { - if(LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } catch(InterruptedException e) { - LOG.info("Interrupted while waiting for service"); - Thread.currentThread().interrupt(); - } - } - }); + loadContactNames(); actionBar.addView(spinner); actionBar.addView(new HorizontalSpace(this)); @@ -141,6 +120,33 @@ implements OnClickListener, OnItemSelectedListener { serviceConnection, 0); } + private void loadContactNames() { + final DatabaseComponent db = this.db; + dbExecutor.execute(new Runnable() { + public void run() { + try { + serviceConnection.waitForStartup(); + final Collection<Contact> contacts = db.getContacts(); + runOnUiThread(new Runnable() { + public void run() { + for(Contact c : contacts) { + if(c.getId().equals(contactId)) + spinner.setSelection(adapter.getCount()); + adapter.add(c); + } + } + }); + } catch(DbException e) { + if(LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } catch(InterruptedException e) { + LOG.info("Interrupted while waiting for service"); + Thread.currentThread().interrupt(); + } + } + }); + } + @Override public void onSaveInstanceState(Bundle state) { Parcelable p = content.onSaveInstanceState(); @@ -156,16 +162,20 @@ implements OnClickListener, OnItemSelectedListener { public void onClick(View view) { if(contactId == null) throw new IllegalStateException(); - final Message m; try { byte[] body = content.getText().toString().getBytes("UTF-8"); - m = messageFactory.createPrivateMessage(parentId, "text/plain", - body); + storeMessage(messageFactory.createPrivateMessage(parentId, + "text/plain", body)); } catch(IOException e) { throw new RuntimeException(e); } catch(GeneralSecurityException e) { throw new RuntimeException(e); } + finish(); + } + + private void storeMessage(final Message m) { + final DatabaseComponent db = this.db; final ContactId contactId = this.contactId; dbExecutor.execute(new Runnable() { public void run() { @@ -182,7 +192,6 @@ implements OnClickListener, OnItemSelectedListener { } } }); - finish(); } public void onItemSelected(AdapterView<?> parent, View view, int position, -- GitLab