diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 09fe11793709aa09d9d369b6192a1375568e10fc..3fda7ccda57bf9a2c69ef56971b4f9699595c82e 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -12,7 +12,7 @@ <string name="new_identity_item">New identity\u2026</string> <string name="contact_list_title">Contacts</string> <string name="contact_connected">Connected</string> - <string name="format_contact_last_connected">Last connected <br /> %1$s</string> + <string name="format_last_connected">Last connected <br /> %1$s</string> <string name="add_contact_title">Add a Contact</string> <string name="your_nickname">Your nickname: </string> <string name="wifi_not_available">Wi-Fi is NOT AVAILABLE</string> diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogAdapter.java b/briar-android/src/net/sf/briar/android/blogs/BlogAdapter.java index 0a9529a624c9c02dbe98e109cc0c900a7ce04651..3141bf4af60736195bb56b8138a06182a09ddd69 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogAdapter.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogAdapter.java @@ -54,7 +54,6 @@ class BlogAdapter extends ArrayAdapter<GroupMessageHeader> { authorLayout.setGravity(CENTER_VERTICAL); ImageView thumb = new ImageView(ctx); - thumb.setPadding(10, 10, 10, 10); Rating rating = item.getRating(); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); @@ -66,7 +65,7 @@ class BlogAdapter extends ArrayAdapter<GroupMessageHeader> { name.setLayoutParams(WRAP_WRAP_1); name.setTextSize(18); name.setMaxLines(1); - name.setPadding(0, 10, 10, 10); + name.setPadding(10, 10, 10, 10); Author author = item.getAuthor(); if(author == null) { name.setTextColor(res.getColor(R.color.anonymous_author)); @@ -90,7 +89,6 @@ class BlogAdapter extends ArrayAdapter<GroupMessageHeader> { LinearLayout attachmentLayout = new LinearLayout(ctx); attachmentLayout.setOrientation(HORIZONTAL); ImageView attachment = new ImageView(ctx); - attachment.setPadding(10, 0, 10, 10); attachment.setImageResource(R.drawable.content_attachment); attachmentLayout.addView(attachment); attachmentLayout.addView(new HorizontalSpace(ctx)); diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogListAdapter.java b/briar-android/src/net/sf/briar/android/blogs/BlogListAdapter.java index af935b7fa3cfce5803649a3d29db824d5227e6e4..7d177e9813da5dc6239db993525ace194dd90bc3 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogListAdapter.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogListAdapter.java @@ -78,7 +78,6 @@ implements OnItemClickListener { LinearLayout attachmentLayout = new LinearLayout(ctx); attachmentLayout.setOrientation(HORIZONTAL); ImageView attachment = new ImageView(ctx); - attachment.setPadding(10, 0, 10, 10); attachment.setImageResource(R.drawable.content_attachment); attachmentLayout.addView(attachment); attachmentLayout.addView(new HorizontalSpace(ctx)); diff --git a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java index f1cf62ac8f2ee80a044ef7ae11eca466f6fe2a1b..07c24e7454828a51eeaf0e3cd2b271270652cf7c 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java @@ -123,25 +123,24 @@ implements OnClickListener { header.setGravity(CENTER_VERTICAL); thumb = new ImageView(this); - thumb.setPadding(10, 10, 10, 10); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); else thumb.setImageResource(R.drawable.rating_unrated); header.addView(thumb); - TextView author = new TextView(this); + TextView name = new TextView(this); // Give me all the unused width - author.setLayoutParams(WRAP_WRAP_1); - author.setTextSize(18); - author.setMaxLines(1); - author.setPadding(0, 10, 10, 10); + name.setLayoutParams(WRAP_WRAP_1); + name.setTextSize(18); + name.setMaxLines(1); + name.setPadding(10, 10, 10, 10); if(authorName == null) { - author.setTextColor(res.getColor(R.color.anonymous_author)); - author.setText(R.string.anonymous); + name.setTextColor(res.getColor(R.color.anonymous_author)); + name.setText(R.string.anonymous); } else { - author.setText(authorName); + name.setText(authorName); } - header.addView(author); + header.addView(name); TextView date = new TextView(this); date.setTextSize(14); 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 b5f83046a151e5948efa4c07ad44709b7a05a364..b6efc8ea782d7c346a38c9a580ab256e38c6444a 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java @@ -12,6 +12,7 @@ import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP_1; import java.util.Collection; import java.util.Comparator; +import java.util.Map; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -114,10 +115,11 @@ implements OnClickListener, DatabaseListener, ConnectionListener { serviceConnection.waitForStartup(); long now = System.currentTimeMillis(); Collection<Contact> contacts = db.getContacts(); + Map<ContactId, Long> times = db.getLastConnected(); long duration = System.currentTimeMillis() - now; if(LOG.isLoggable(INFO)) LOG.info("Load took " + duration + " ms"); - displayContacts(contacts); + displayContacts(contacts, times); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -130,13 +132,16 @@ implements OnClickListener, DatabaseListener, ConnectionListener { }); } - private void displayContacts(final Collection<Contact> contacts) { + private void displayContacts(final Collection<Contact> contacts, + final Map<ContactId, Long> times) { runOnUiThread(new Runnable() { public void run() { adapter.clear(); for(Contact c : contacts) { - boolean conn = connectionRegistry.isConnected(c.getId()); - adapter.add(new ContactListItem(c, conn)); + boolean now = connectionRegistry.isConnected(c.getId()); + Long last = times.get(c.getId()); + if(last != null) + adapter.add(new ContactListItem(c, now, last)); } adapter.sort(ContactComparator.INSTANCE); adapter.notifyDataSetChanged(); @@ -181,8 +186,10 @@ implements OnClickListener, DatabaseListener, ConnectionListener { for(int i = 0; i < count; i++) { ContactListItem item = adapter.getItem(i); if(item.getContactId().equals(c)) { + if(LOG.isLoggable(INFO)) + LOG.info("Updating connection time"); item.setConnected(connected); - // FIXME: Item is not redrawn + item.setLastConnected(System.currentTimeMillis()); list.invalidate(); return; } diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListAdapter.java b/briar-android/src/net/sf/briar/android/contact/ContactListAdapter.java index 8e7a60d24f23f27faf36e4ad82b87d462d942311..52763e97cbd21aa4cbd3d32b9753c978b7a35955 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListAdapter.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListAdapter.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import net.sf.briar.R; import android.content.Context; +import android.content.res.Resources; import android.text.Html; import android.text.format.DateUtils; import android.view.View; @@ -36,7 +37,6 @@ implements OnItemClickListener { layout.setGravity(CENTER_VERTICAL); ImageView bulb = new ImageView(ctx); - bulb.setPadding(10, 10, 10, 10); if(item.isConnected()) bulb.setImageResource(R.drawable.contact_connected); else bulb.setImageResource(R.drawable.contact_disconnected); @@ -47,7 +47,7 @@ implements OnItemClickListener { name.setLayoutParams(WRAP_WRAP_1); name.setTextSize(18); name.setMaxLines(1); - name.setPadding(0, 10, 10, 10); + name.setPadding(10, 10, 10, 10); name.setText(item.getContactName()); layout.addView(name); @@ -57,8 +57,8 @@ implements OnItemClickListener { if(item.isConnected()) { connected.setText(R.string.contact_connected); } else { - String format = ctx.getResources().getString( - R.string.format_contact_last_connected); + Resources res = ctx.getResources(); + String format = res.getString(R.string.format_last_connected); long then = item.getLastConnected(); CharSequence ago = DateUtils.getRelativeTimeSpanString(then); connected.setText(Html.fromHtml(String.format(format, ago))); diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListItem.java b/briar-android/src/net/sf/briar/android/contact/ContactListItem.java index de867e7dcac0c21154225f4b6419a67ad2b98da1..72b9d17e679c1bb1fca9e072d24a021a5da0e969 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListItem.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListItem.java @@ -8,10 +8,12 @@ class ContactListItem { private final Contact contact; private boolean connected; + private long lastConnected; - ContactListItem(Contact contact, boolean connected) { + ContactListItem(Contact contact, boolean connected, long lastConnected) { this.contact = contact; this.connected = connected; + this.lastConnected = lastConnected; } ContactId getContactId() { @@ -23,7 +25,11 @@ class ContactListItem { } long getLastConnected() { - return contact.getLastConnected(); + return lastConnected; + } + + void setLastConnected(long lastConnected) { + this.lastConnected = lastConnected; } boolean isConnected() { diff --git a/briar-android/src/net/sf/briar/android/groups/GroupAdapter.java b/briar-android/src/net/sf/briar/android/groups/GroupAdapter.java index 8e13a48d67a51e62a1671707699f874cfbd9baea..bf3ca47397f25eac0f2244584d328a47eb7a0146 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupAdapter.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupAdapter.java @@ -54,7 +54,6 @@ class GroupAdapter extends ArrayAdapter<GroupMessageHeader> { authorLayout.setGravity(CENTER_VERTICAL); ImageView thumb = new ImageView(ctx); - thumb.setPadding(10, 10, 10, 10); Rating rating = item.getRating(); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); @@ -66,7 +65,7 @@ class GroupAdapter extends ArrayAdapter<GroupMessageHeader> { name.setLayoutParams(WRAP_WRAP_1); name.setTextSize(18); name.setMaxLines(1); - name.setPadding(0, 10, 10, 10); + name.setPadding(10, 10, 10, 10); Author author = item.getAuthor(); if(author == null) { name.setTextColor(res.getColor(R.color.anonymous_author)); @@ -90,7 +89,6 @@ class GroupAdapter extends ArrayAdapter<GroupMessageHeader> { LinearLayout attachmentLayout = new LinearLayout(ctx); attachmentLayout.setOrientation(HORIZONTAL); ImageView attachment = new ImageView(ctx); - attachment.setPadding(10, 0, 10, 10); attachment.setImageResource(R.drawable.content_attachment); attachmentLayout.addView(attachment); attachmentLayout.addView(new HorizontalSpace(ctx)); diff --git a/briar-android/src/net/sf/briar/android/groups/GroupListAdapter.java b/briar-android/src/net/sf/briar/android/groups/GroupListAdapter.java index 0d6478856f2a7009c764f745e631d59a89e0cc1c..56b9ef3691642d6a8b2adda729e43b03dbd76bc9 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupListAdapter.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupListAdapter.java @@ -78,7 +78,6 @@ implements OnItemClickListener { LinearLayout attachmentLayout = new LinearLayout(ctx); attachmentLayout.setOrientation(HORIZONTAL); ImageView attachment = new ImageView(ctx); - attachment.setPadding(10, 0, 10, 10); attachment.setImageResource(R.drawable.content_attachment); attachmentLayout.addView(attachment); attachmentLayout.addView(new HorizontalSpace(ctx)); diff --git a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java index de801ccb53da12988c76b7139bf0a558070ac495..42c45bbe5238b7ab22b3d7ab703241fbff3cac12 100644 --- a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java @@ -130,25 +130,24 @@ implements OnClickListener { header.setGravity(CENTER_VERTICAL); thumb = new ImageView(this); - thumb.setPadding(10, 10, 10, 10); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); else thumb.setImageResource(R.drawable.rating_unrated); header.addView(thumb); - TextView author = new TextView(this); + TextView name = new TextView(this); // Give me all the unused width - author.setLayoutParams(WRAP_WRAP_1); - author.setTextSize(18); - author.setMaxLines(1); - author.setPadding(0, 10, 10, 10); + name.setLayoutParams(WRAP_WRAP_1); + name.setTextSize(18); + name.setMaxLines(1); + name.setPadding(10, 10, 10, 10); if(authorName == null) { - author.setTextColor(res.getColor(R.color.anonymous_author)); - author.setText(R.string.anonymous); + name.setTextColor(res.getColor(R.color.anonymous_author)); + name.setText(R.string.anonymous); } else { - author.setText(authorName); + name.setText(authorName); } - header.addView(author); + header.addView(name); TextView date = new TextView(this); date.setTextSize(14); diff --git a/briar-android/src/net/sf/briar/android/invitation/BluetoothWidget.java b/briar-android/src/net/sf/briar/android/invitation/BluetoothWidget.java index 861e7f230ce68361325437c40690d14f4e37aa37..0b72d687158534c09951286b9bb90a59b63e200b 100644 --- a/briar-android/src/net/sf/briar/android/invitation/BluetoothWidget.java +++ b/briar-android/src/net/sf/briar/android/invitation/BluetoothWidget.java @@ -42,7 +42,6 @@ public class BluetoothWidget extends LinearLayout implements OnClickListener { listener.bluetoothStateChanged(false); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.bluetooth_not_available); addView(status); @@ -50,7 +49,6 @@ public class BluetoothWidget extends LinearLayout implements OnClickListener { listener.bluetoothStateChanged(true); ImageView ok = new ImageView(ctx); ok.setImageResource(R.drawable.navigation_accept); - ok.setPadding(10, 10, 10, 10); addView(ok); status.setText(R.string.bluetooth_enabled); addView(status); @@ -62,7 +60,6 @@ public class BluetoothWidget extends LinearLayout implements OnClickListener { listener.bluetoothStateChanged(true); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.bluetooth_not_discoverable); addView(status); @@ -74,7 +71,6 @@ public class BluetoothWidget extends LinearLayout implements OnClickListener { listener.bluetoothStateChanged(false); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.bluetooth_disabled); addView(status); diff --git a/briar-android/src/net/sf/briar/android/invitation/CodesDoNotMatchView.java b/briar-android/src/net/sf/briar/android/invitation/CodesDoNotMatchView.java index f74854b7a1583490c834117ad3911b3237943215..c3e1ffb4a0d7f2dcedd882a044f4fd068bceacbf 100644 --- a/briar-android/src/net/sf/briar/android/invitation/CodesDoNotMatchView.java +++ b/briar-android/src/net/sf/briar/android/invitation/CodesDoNotMatchView.java @@ -26,13 +26,12 @@ implements OnClickListener { innerLayout.setGravity(CENTER); ImageView icon = new ImageView(ctx); - icon.setPadding(10, 10, 10, 10); icon.setImageResource(R.drawable.alerts_and_states_error); innerLayout.addView(icon); TextView failed = new TextView(ctx); failed.setTextSize(22); - failed.setPadding(0, 10, 10, 10); + failed.setPadding(10, 10, 10, 10); failed.setText(R.string.codes_do_not_match); innerLayout.addView(failed); addView(innerLayout); diff --git a/briar-android/src/net/sf/briar/android/invitation/ConfirmationCodeView.java b/briar-android/src/net/sf/briar/android/invitation/ConfirmationCodeView.java index 2db6a5dbeec3e188fb52f48ac7567a6855407b2a..6d000b32f338edfdf647d3a96726e9eb134d71a1 100644 --- a/briar-android/src/net/sf/briar/android/invitation/ConfirmationCodeView.java +++ b/briar-android/src/net/sf/briar/android/invitation/ConfirmationCodeView.java @@ -24,13 +24,12 @@ implements CodeEntryListener { innerLayout.setGravity(CENTER); ImageView icon = new ImageView(ctx); - icon.setPadding(10, 10, 10, 10); icon.setImageResource(R.drawable.navigation_accept); innerLayout.addView(icon); TextView connected = new TextView(ctx); connected.setTextSize(22); - connected.setPadding(0, 10, 10, 10); + connected.setPadding(10, 10, 10, 10); connected.setText(R.string.connected_to_contact); innerLayout.addView(connected); addView(innerLayout); diff --git a/briar-android/src/net/sf/briar/android/invitation/ConnectionFailedView.java b/briar-android/src/net/sf/briar/android/invitation/ConnectionFailedView.java index 9eb401636c36bbe7e037521ad98131f8d489ecb0..6367173dd492cf27779148e77f79d856e5f2f5e8 100644 --- a/briar-android/src/net/sf/briar/android/invitation/ConnectionFailedView.java +++ b/briar-android/src/net/sf/briar/android/invitation/ConnectionFailedView.java @@ -28,13 +28,12 @@ implements WifiStateListener, BluetoothStateListener, OnClickListener { innerLayout.setGravity(CENTER); ImageView icon = new ImageView(ctx); - icon.setPadding(10, 10, 10, 10); icon.setImageResource(R.drawable.alerts_and_states_error); innerLayout.addView(icon); TextView failed = new TextView(ctx); failed.setTextSize(22); - failed.setPadding(0, 10, 10, 10); + failed.setPadding(10, 10, 10, 10); failed.setText(R.string.connection_failed); innerLayout.addView(failed); addView(innerLayout); diff --git a/briar-android/src/net/sf/briar/android/invitation/ContactAddedView.java b/briar-android/src/net/sf/briar/android/invitation/ContactAddedView.java index 2cafa41eff7e38901074555b3525245e34e3018b..09a74dabe5ae23bfab1ffad28560ee7aac309cab 100644 --- a/briar-android/src/net/sf/briar/android/invitation/ContactAddedView.java +++ b/briar-android/src/net/sf/briar/android/invitation/ContactAddedView.java @@ -26,13 +26,12 @@ implements OnClickListener { innerLayout.setGravity(CENTER); ImageView icon = new ImageView(ctx); - icon.setPadding(10, 10, 10, 10); icon.setImageResource(R.drawable.navigation_accept); innerLayout.addView(icon); TextView added = new TextView(ctx); added.setTextSize(22); - added.setPadding(0, 10, 10, 10); + added.setPadding(10, 10, 10, 10); added.setText(R.string.contact_added); innerLayout.addView(added); addView(innerLayout); diff --git a/briar-android/src/net/sf/briar/android/invitation/WaitForContactView.java b/briar-android/src/net/sf/briar/android/invitation/WaitForContactView.java index 6079150719a2d48725639d14e977baad55f0fe9e..c4df2de2317abaeb5a2c0b87bbba36a1aaad9d66 100644 --- a/briar-android/src/net/sf/briar/android/invitation/WaitForContactView.java +++ b/briar-android/src/net/sf/briar/android/invitation/WaitForContactView.java @@ -23,15 +23,14 @@ public class WaitForContactView extends AddContactView { innerLayout.setGravity(CENTER); ImageView icon = new ImageView(ctx); - icon.setPadding(10, 10, 10, 10); icon.setImageResource(R.drawable.navigation_accept); innerLayout.addView(icon); - TextView failed = new TextView(ctx); - failed.setTextSize(22); - failed.setPadding(0, 10, 10, 10); - failed.setText(R.string.connected_to_contact); - innerLayout.addView(failed); + TextView connected = new TextView(ctx); + connected.setTextSize(22); + connected.setPadding(10, 10, 10, 10); + connected.setText(R.string.connected_to_contact); + innerLayout.addView(connected); addView(innerLayout); TextView yourCode = new TextView(ctx); diff --git a/briar-android/src/net/sf/briar/android/invitation/WifiWidget.java b/briar-android/src/net/sf/briar/android/invitation/WifiWidget.java index 0f2820e9dae6455df1dbe7aaf444a5b6f21dc639..82b652386ac698163942d04d55559b9c04e64c78 100644 --- a/briar-android/src/net/sf/briar/android/invitation/WifiWidget.java +++ b/briar-android/src/net/sf/briar/android/invitation/WifiWidget.java @@ -43,7 +43,6 @@ public class WifiWidget extends LinearLayout implements OnClickListener { wifiStateChanged(null); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.wifi_not_available); addView(status); @@ -55,7 +54,6 @@ public class WifiWidget extends LinearLayout implements OnClickListener { wifiStateChanged(null); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.wifi_disconnected); addView(status); @@ -67,7 +65,6 @@ public class WifiWidget extends LinearLayout implements OnClickListener { wifiStateChanged(networkName); ImageView ok = new ImageView(ctx); ok.setImageResource(R.drawable.navigation_accept); - ok.setPadding(10, 10, 10, 10); addView(ok); String format = getResources().getString( R.string.format_wifi_connected); @@ -82,7 +79,6 @@ public class WifiWidget extends LinearLayout implements OnClickListener { wifiStateChanged(null); ImageView warning = new ImageView(ctx); warning.setImageResource(R.drawable.alerts_and_states_warning); - warning.setPadding(10, 10, 10, 10); addView(warning); status.setText(R.string.wifi_disabled); addView(status); diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java b/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java index efbce219bc63ebc96c766e40eca52b571f54a6c3..867593d40b2d304430da3a07dfbf0cf5118969bb 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationAdapter.java @@ -54,7 +54,6 @@ class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> { authorLayout.setGravity(CENTER_VERTICAL); ImageView thumb = new ImageView(ctx); - thumb.setPadding(10, 10, 10, 10); Rating rating = item.getRating(); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); @@ -66,7 +65,7 @@ class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> { name.setLayoutParams(WRAP_WRAP_1); name.setTextSize(18); name.setMaxLines(1); - name.setPadding(0, 10, 10, 10); + name.setPadding(10, 10, 10, 10); name.setText(item.getAuthor().getName()); authorLayout.addView(name); innerLayout.addView(authorLayout); @@ -84,7 +83,6 @@ class ConversationAdapter extends ArrayAdapter<PrivateMessageHeader> { LinearLayout attachmentLayout = new LinearLayout(ctx); attachmentLayout.setOrientation(HORIZONTAL); ImageView attachment = new ImageView(ctx); - attachment.setPadding(10, 0, 10, 10); attachment.setImageResource(R.drawable.content_attachment); attachmentLayout.addView(attachment); attachmentLayout.addView(new HorizontalSpace(ctx)); diff --git a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java index f90e9e57a26761a83deb885dc651b9fde91c77d2..b50870f38f4347326fe8890a51357872a90523df 100644 --- a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java @@ -122,20 +122,19 @@ implements OnClickListener { header.setGravity(CENTER_VERTICAL); ImageView thumb = new ImageView(this); - thumb.setPadding(10, 10, 10, 10); if(rating == GOOD) thumb.setImageResource(R.drawable.rating_good); else if(rating == BAD) thumb.setImageResource(R.drawable.rating_bad); else thumb.setImageResource(R.drawable.rating_unrated); header.addView(thumb); - TextView author = new TextView(this); + TextView name = new TextView(this); // Give me all the unused width - author.setLayoutParams(WRAP_WRAP_1); - author.setTextSize(18); - author.setMaxLines(1); - author.setPadding(0, 10, 10, 10); - author.setText(authorName); - header.addView(author); + name.setLayoutParams(WRAP_WRAP_1); + name.setTextSize(18); + name.setMaxLines(1); + name.setPadding(10, 10, 10, 10); + name.setText(authorName); + header.addView(name); TextView date = new TextView(this); date.setTextSize(14); diff --git a/briar-api/src/net/sf/briar/api/Contact.java b/briar-api/src/net/sf/briar/api/Contact.java index 4d9f558d6d37d1f041793b6dc9eab31171c734f5..99a3d3edacfab7c6b0141c6a13c8c69314eea8f4 100644 --- a/briar-api/src/net/sf/briar/api/Contact.java +++ b/briar-api/src/net/sf/briar/api/Contact.java @@ -5,14 +5,11 @@ public class Contact { private final ContactId id; private final Author author; private final AuthorId localAuthorId; - private final long lastConnected; - public Contact(ContactId id, Author author, AuthorId localAuthorId, - long lastConnected) { + public Contact(ContactId id, Author author, AuthorId localAuthorId) { this.id = id; this.author = author; this.localAuthorId = localAuthorId; - this.lastConnected = lastConnected; } public ContactId getId() { @@ -27,10 +24,6 @@ public class Contact { return localAuthorId; } - public long getLastConnected() { - return lastConnected; - } - @Override public int hashCode() { return id.hashCode(); diff --git a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java index bcd11a7e67570e47cb9ff8f54cc2504833ef3f36..96c48cc7a9cfc8bb4ba668e8b3e7efad80643515 100644 --- a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java +++ b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java @@ -184,6 +184,12 @@ public interface DatabaseComponent { Collection<GroupMessageHeader> getGroupMessageHeaders(GroupId g) throws DbException; + /** + * Returns the time at which a connection to each contact was last opened + * or closed. + */ + Map<ContactId, Long> getLastConnected() throws DbException; + /** Returns the pseudonym with the given ID. */ LocalAuthor getLocalAuthor(AuthorId a) throws DbException; diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java index 6d24c05584a6941e7aeb7a185a52eca28a9126b4..3af45362f3549f7360fb8b6bfc93311cadffbb30 100644 --- a/briar-core/src/net/sf/briar/db/Database.java +++ b/briar-core/src/net/sf/briar/db/Database.java @@ -237,7 +237,7 @@ interface Database<T> { /** * Returns the contact with the given ID. * <p> - * Locking: contact read, window read. + * Locking: contact read. */ Contact getContact(T txn, ContactId c) throws DbException; @@ -292,12 +292,12 @@ interface Database<T> { MessageId getGroupMessageParent(T txn, MessageId m) throws DbException; /** - * Returns the time at which a connection to the given contact was last - * made. + * Returns the time at which a connection to each contact was last opened + * or closed. * <p> * Locking: window read. */ - long getLastConnected(T txn, ContactId c) throws DbException; + Map<ContactId, Long> getLastConnected(T txn) throws DbException; /** * Returns the pseudonym with the given ID. diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java index 3432df3801cac25b3a8b175615b461ab8a816b24..70aa0adc9189b369d98169ed7a1e0a993cf49ed1 100644 --- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java +++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java @@ -926,21 +926,16 @@ DatabaseCleaner.Callback { public Contact getContact(ContactId c) throws DbException { contactLock.readLock().lock(); try { - windowLock.readLock().lock(); + T txn = db.startTransaction(); try { - T txn = db.startTransaction(); - try { - if(!db.containsContact(txn, c)) - throw new NoSuchContactException(); - Contact contact = db.getContact(txn, c); - db.commitTransaction(txn); - return contact; - } catch(DbException e) { - db.abortTransaction(txn); - throw e; - } - } finally { - windowLock.readLock().unlock(); + if(!db.containsContact(txn, c)) + throw new NoSuchContactException(); + Contact contact = db.getContact(txn, c); + db.commitTransaction(txn); + return contact; + } catch(DbException e) { + db.abortTransaction(txn); + throw e; } } finally { contactLock.readLock().unlock(); @@ -1019,6 +1014,23 @@ DatabaseCleaner.Callback { } } + public Map<ContactId, Long> getLastConnected() throws DbException { + windowLock.readLock().lock(); + try { + T txn = db.startTransaction(); + try { + Map<ContactId, Long> times = db.getLastConnected(txn); + db.commitTransaction(txn); + return times; + } catch(DbException e) { + db.abortTransaction(txn); + throw e; + } + } finally { + windowLock.readLock().unlock(); + } + } + public LocalAuthor getLocalAuthor(AuthorId a) throws DbException { identityLock.readLock().lock(); try { diff --git a/briar-core/src/net/sf/briar/db/JdbcDatabase.java b/briar-core/src/net/sf/briar/db/JdbcDatabase.java index 4bfaa978f3fa0b4d1939e5553faf562699847ae2..742cb6cdb14b89308192421be8543e977e449c51 100644 --- a/briar-core/src/net/sf/briar/db/JdbcDatabase.java +++ b/briar-core/src/net/sf/briar/db/JdbcDatabase.java @@ -1200,12 +1200,9 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT authorId, name, publicKey, localAuthorId," - + " lastConnected" - + " FROM contacts AS c" - + " JOIN connectionTimes AS ct" - + " ON c.contactId = ct.contactId" - + " WHERE c.contactId = ?"; + String sql = "SELECT authorId, name, publicKey, localAuthorId" + + " FROM contacts" + + " WHERE contactId = ?"; ps = txn.prepareStatement(sql); ps.setInt(1, c.getInt()); rs = ps.executeQuery(); @@ -1214,11 +1211,10 @@ abstract class JdbcDatabase implements Database<Connection> { String name = rs.getString(2); byte[] publicKey = rs.getBytes(3); AuthorId localAuthorId = new AuthorId(rs.getBytes(4)); - long lastConnected = rs.getLong(5); rs.close(); ps.close(); Author author = new Author(authorId, name, publicKey); - return new Contact(c, author, localAuthorId, lastConnected); + return new Contact(c, author, localAuthorId); } catch(SQLException e) { tryToClose(rs); tryToClose(ps); @@ -1251,11 +1247,9 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT c.contactId, authorId, name, publicKey," - + " localAuthorId, lastConnected" - + " FROM contacts AS c" - + " JOIN connectionTimes AS ct" - + " ON c.contactId = ct.contactId"; + String sql = "SELECT contactId, authorId, name, publicKey," + + " localAuthorId" + + " FROM contacts"; ps = txn.prepareStatement(sql); rs = ps.executeQuery(); List<Contact> contacts = new ArrayList<Contact>(); @@ -1264,11 +1258,9 @@ abstract class JdbcDatabase implements Database<Connection> { AuthorId authorId = new AuthorId(rs.getBytes(2)); String name = rs.getString(3); byte[] publicKey = rs.getBytes(4); - AuthorId localAuthorId = new AuthorId(rs.getBytes(5)); - long lastConnected = rs.getLong(6); Author author = new Author(authorId, name, publicKey); - contacts.add(new Contact(contactId, author, localAuthorId, - lastConnected)); + AuthorId localAuthorId = new AuthorId(rs.getBytes(5)); + contacts.add(new Contact(contactId, author, localAuthorId)); } rs.close(); ps.close(); @@ -1409,22 +1401,20 @@ abstract class JdbcDatabase implements Database<Connection> { } } - public long getLastConnected(Connection txn, ContactId c) + public Map<ContactId, Long> getLastConnected(Connection txn) throws DbException { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT lastConnected FROM connectionTimes" - + " WHERE contactId = ?"; + String sql = "SELECT contactId, lastConnected FROM connectionTimes"; ps = txn.prepareStatement(sql); - ps.setInt(1, c.getInt()); rs = ps.executeQuery(); - if(!rs.next()) throw new DbStateException(); - long lastConnected = rs.getLong(1); - if(rs.next()) throw new DbStateException(); + Map<ContactId, Long> times = new HashMap<ContactId, Long>(); + while(rs.next()) + times.put(new ContactId(rs.getInt(1)), rs.getLong(2)); rs.close(); ps.close(); - return lastConnected; + return Collections.unmodifiableMap(times); } catch(SQLException e) { tryToClose(rs); tryToClose(ps); diff --git a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java index a06a3c81ee25a5d91401452c67d8a13dc636616d..b1e8cfcf6b5479abb54b89b8f87f85608887b47e 100644 --- a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java +++ b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java @@ -106,7 +106,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase { transportProperties = new TransportProperties(Collections.singletonMap( "foo", "bar")); contactId = new ContactId(234); - contact = new Contact(contactId, author, localAuthorId, timestamp); + contact = new Contact(contactId, author, localAuthorId); endpoint = new Endpoint(contactId, transportId, 123, true); temporarySecret = new TemporarySecret(contactId, transportId, 123, false, 234, new byte[32], 345, 456, new byte[4]);