Added loading progress bars to all ListViews that load from the DB.

Fixes issue #3611923.
This commit is contained in:
akwizgran
2013-05-01 16:49:35 +01:00
parent fae67ca32b
commit c008340587
11 changed files with 142 additions and 14 deletions

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.blogs; package net.sf.briar.android.blogs;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -18,6 +20,7 @@ import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.Author; import net.sf.briar.api.Author;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
@@ -57,6 +60,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private boolean postable = false; private boolean postable = false;
private BlogAdapter adapter = null; private BlogAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -89,6 +93,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
ImageButton composeButton = new ImageButton(this); ImageButton composeButton = new ImageButton(this);
@@ -145,6 +154,8 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private void displayHeaders(final Collection<GroupMessageHeader> headers) { private void displayHeaders(final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear(); adapter.clear();
for(GroupMessageHeader h : headers) adapter.add(h); for(GroupMessageHeader h : headers) adapter.add(h);
adapter.sort(AscendingHeaderComparator.INSTANCE); adapter.sort(AscendingHeaderComparator.INSTANCE);

View File

@@ -2,6 +2,8 @@ package net.sf.briar.android.blogs;
import static android.view.Gravity.CENTER; import static android.view.Gravity.CENTER;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
@@ -23,6 +25,7 @@ import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -63,6 +66,7 @@ OnItemClickListener {
private BlogListAdapter adapter = null; private BlogListAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton newBlogButton = null, composeButton = null; private ImageButton newBlogButton = null, composeButton = null;
private ImageButton manageBlogsButton = null; private ImageButton manageBlogsButton = null;
@@ -86,6 +90,11 @@ OnItemClickListener {
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
LinearLayout footer = new LinearLayout(this); LinearLayout footer = new LinearLayout(this);
@@ -176,6 +185,8 @@ OnItemClickListener {
private void clearHeaders() { private void clearHeaders() {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear(); adapter.clear();
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
@@ -186,6 +197,8 @@ OnItemClickListener {
final Collection<GroupMessageHeader> headers) { final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any // Remove the old item, if any
BlogListItem item = findGroup(g.getId()); BlogListItem item = findGroup(g.getId());
if(item != null) adapter.remove(item); if(item != null) adapter.remove(item);
@@ -201,6 +214,8 @@ OnItemClickListener {
private void displayAvailable(final int available) { private void displayAvailable(final int available) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.setAvailable(available); adapter.setAvailable(available);
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }

View File

@@ -15,6 +15,7 @@ import java.util.logging.Logger;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -46,6 +47,7 @@ implements DatabaseListener, OnItemClickListener {
private ManageBlogsAdapter adapter = null; private ManageBlogsAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -60,7 +62,10 @@ implements DatabaseListener, OnItemClickListener {
list.setLayoutParams(MATCH_MATCH); list.setLayoutParams(MATCH_MATCH);
list.setAdapter(adapter); list.setAdapter(adapter);
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
setContentView(list);
// Show a progress bar while the list is loading
loading = new ListLoadingProgressBar(this);
setContentView(loading);
// Bind to the service so we can wait for it to start // Bind to the service so we can wait for it to start
bindService(new Intent(BriarService.class.getName()), bindService(new Intent(BriarService.class.getName()),
@@ -104,6 +109,7 @@ implements DatabaseListener, OnItemClickListener {
final Collection<GroupStatus> available) { final Collection<GroupStatus> available) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
setContentView(list);
adapter.clear(); adapter.clear();
for(GroupStatus g : available) for(GroupStatus g : available)
adapter.add(new ManageBlogsItem(g)); adapter.add(new ManageBlogsItem(g));

View File

@@ -5,6 +5,7 @@ import static android.content.Intent.EXTRA_STREAM;
import static android.view.Gravity.CENTER; import static android.view.Gravity.CENTER;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
@@ -26,6 +27,7 @@ import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.invitation.AddContactActivity; import net.sf.briar.android.invitation.AddContactActivity;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.Contact; import net.sf.briar.api.Contact;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -43,6 +45,8 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
@@ -50,7 +54,8 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ContactListActivity extends RoboActivity public class ContactListActivity extends RoboActivity
implements OnClickListener, DatabaseListener, ConnectionListener { implements OnClickListener, OnItemClickListener, DatabaseListener,
ConnectionListener {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(ContactListActivity.class.getName()); Logger.getLogger(ContactListActivity.class.getName());
@@ -61,6 +66,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
@Inject private ConnectionRegistry connectionRegistry; @Inject private ConnectionRegistry connectionRegistry;
private ContactListAdapter adapter = null; private ContactListAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton addContactButton = null, shareButton = null; private ImageButton addContactButton = null, shareButton = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@@ -80,10 +86,14 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
// Give me all the width and all the unused height // Give me all the width and all the unused height
list.setLayoutParams(MATCH_WRAP_1); list.setLayoutParams(MATCH_WRAP_1);
list.setAdapter(adapter); list.setAdapter(adapter);
list.setOnItemClickListener(adapter); list.setOnItemClickListener(this);
list.setVisibility(GONE);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
LinearLayout footer = new LinearLayout(this); LinearLayout footer = new LinearLayout(this);
@@ -150,6 +160,8 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
final Map<ContactId, Long> times) { final Map<ContactId, Long> times) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear(); adapter.clear();
for(Contact c : contacts) { for(Contact c : contacts) {
boolean now = connectionRegistry.isConnected(c.getId()); boolean now = connectionRegistry.isConnected(c.getId());
@@ -189,6 +201,11 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
} }
} }
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// FIXME: Hook this up to an activity
}
public void eventOccurred(DatabaseEvent e) { public void eventOccurred(DatabaseEvent e) {
if(e instanceof ContactAddedEvent) loadContacts(); if(e instanceof ContactAddedEvent) loadContacts();
else if(e instanceof ContactRemovedEvent) loadContacts(); else if(e instanceof ContactRemovedEvent) loadContacts();

View File

@@ -13,15 +13,12 @@ import android.text.Html;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
class ContactListAdapter extends ArrayAdapter<ContactListItem> class ContactListAdapter extends ArrayAdapter<ContactListItem> {
implements OnItemClickListener {
ContactListAdapter(Context ctx) { ContactListAdapter(Context ctx) {
super(ctx, android.R.layout.simple_expandable_list_item_1, super(ctx, android.R.layout.simple_expandable_list_item_1,
@@ -68,9 +65,4 @@ implements OnItemClickListener {
return layout; return layout;
} }
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// FIXME: Hook this up to an activity
}
} }

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.groups; package net.sf.briar.android.groups;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -18,6 +20,7 @@ import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.Author; import net.sf.briar.api.Author;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
@@ -56,6 +59,7 @@ OnClickListener, OnItemClickListener {
private String groupName = null; private String groupName = null;
private GroupAdapter adapter = null; private GroupAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -87,6 +91,11 @@ OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
ImageButton composeButton = new ImageButton(this); ImageButton composeButton = new ImageButton(this);
@@ -143,6 +152,8 @@ OnClickListener, OnItemClickListener {
private void displayHeaders(final Collection<GroupMessageHeader> headers) { private void displayHeaders(final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear(); adapter.clear();
for(GroupMessageHeader h : headers) adapter.add(h); for(GroupMessageHeader h : headers) adapter.add(h);
adapter.sort(AscendingHeaderComparator.INSTANCE); adapter.sort(AscendingHeaderComparator.INSTANCE);

View File

@@ -2,6 +2,8 @@ package net.sf.briar.android.groups;
import static android.view.Gravity.CENTER; import static android.view.Gravity.CENTER;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
@@ -21,6 +23,7 @@ import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -61,6 +64,7 @@ OnItemClickListener {
private GroupListAdapter adapter = null; private GroupListAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton newGroupButton = null, composeButton = null; private ImageButton newGroupButton = null, composeButton = null;
private ImageButton manageGroupsButton = null; private ImageButton manageGroupsButton = null;
@@ -84,6 +88,11 @@ OnItemClickListener {
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
LinearLayout footer = new LinearLayout(this); LinearLayout footer = new LinearLayout(this);
@@ -171,6 +180,8 @@ OnItemClickListener {
private void clearHeaders() { private void clearHeaders() {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear(); adapter.clear();
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
@@ -181,6 +192,8 @@ OnItemClickListener {
final Collection<GroupMessageHeader> headers) { final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any // Remove the old item, if any
GroupListItem item = findGroup(g.getId()); GroupListItem item = findGroup(g.getId());
if(item != null) adapter.remove(item); if(item != null) adapter.remove(item);
@@ -196,6 +209,8 @@ OnItemClickListener {
private void displayAvailable(final int available) { private void displayAvailable(final int available) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.setAvailable(available); adapter.setAvailable(available);
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }

View File

@@ -15,6 +15,7 @@ import java.util.logging.Logger;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -46,6 +47,7 @@ implements DatabaseListener, OnItemClickListener {
private ManageGroupsAdapter adapter = null; private ManageGroupsAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -60,7 +62,10 @@ implements DatabaseListener, OnItemClickListener {
list.setLayoutParams(MATCH_MATCH); list.setLayoutParams(MATCH_MATCH);
list.setAdapter(adapter); list.setAdapter(adapter);
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
setContentView(list);
// Show a progress bar while the list is loading
loading = new ListLoadingProgressBar(this);
setContentView(loading);
// Bind to the service so we can wait for it to start // Bind to the service so we can wait for it to start
bindService(new Intent(BriarService.class.getName()), bindService(new Intent(BriarService.class.getName()),
@@ -104,6 +109,7 @@ implements DatabaseListener, OnItemClickListener {
final Collection<GroupStatus> available) { final Collection<GroupStatus> available) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
setContentView(list);
adapter.clear(); adapter.clear();
for(GroupStatus g : available) for(GroupStatus g : available)
adapter.add(new ManageGroupsItem(g)); adapter.add(new ManageGroupsItem(g));

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.messages; package net.sf.briar.android.messages;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -16,6 +18,7 @@ import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -53,6 +56,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private String contactName = null; private String contactName = null;
private ConversationAdapter adapter = null; private ConversationAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -88,6 +92,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this); list.setOnItemClickListener(this);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
ImageButton composeButton = new ImageButton(this); ImageButton composeButton = new ImageButton(this);
@@ -145,6 +154,8 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
final Collection<PrivateMessageHeader> headers) { final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear(); adapter.clear();
for(PrivateMessageHeader h : headers) adapter.add(h); for(PrivateMessageHeader h : headers) adapter.add(h);
adapter.sort(AscendingHeaderComparator.INSTANCE); adapter.sort(AscendingHeaderComparator.INSTANCE);

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.messages; package net.sf.briar.android.messages;
import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.VERTICAL; import static android.widget.LinearLayout.VERTICAL;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -17,6 +19,7 @@ import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.invitation.AddContactActivity; import net.sf.briar.android.invitation.AddContactActivity;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.Contact; import net.sf.briar.api.Contact;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -51,6 +54,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
private ConversationListAdapter adapter = null; private ConversationListAdapter adapter = null;
private ListView list = null; private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
@@ -72,6 +76,11 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
list.setOnItemClickListener(adapter); list.setOnItemClickListener(adapter);
layout.addView(list); layout.addView(list);
// Show a progress bar while the list is loading
list.setVisibility(GONE);
loading = new ListLoadingProgressBar(this);
layout.addView(loading);
layout.addView(new HorizontalBorder(this)); layout.addView(new HorizontalBorder(this));
ImageButton composeButton = new ImageButton(this); ImageButton composeButton = new ImageButton(this);
@@ -95,6 +104,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
} }
private void loadHeaders() { private void loadHeaders() {
clearHeaders();
dbUiExecutor.execute(new Runnable() { dbUiExecutor.execute(new Runnable() {
public void run() { public void run() {
try { try {
@@ -125,10 +135,23 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
}); });
} }
private void clearHeaders() {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear();
adapter.notifyDataSetChanged();
}
});
}
private void displayHeaders(final Contact c, private void displayHeaders(final Contact c,
final Collection<PrivateMessageHeader> headers) { final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any // Remove the old item, if any
ConversationListItem item = findConversation(c.getId()); ConversationListItem item = findConversation(c.getId());
if(item != null) adapter.remove(item); if(item != null) adapter.remove(item);

View File

@@ -0,0 +1,21 @@
package net.sf.briar.android.widgets;
import static android.view.Gravity.CENTER;
import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP_1;
import static net.sf.briar.android.widgets.CommonLayoutParams.WRAP_WRAP;
import android.content.Context;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
public class ListLoadingProgressBar extends LinearLayout {
public ListLoadingProgressBar(Context ctx) {
super(ctx);
setLayoutParams(MATCH_WRAP_1);
setGravity(CENTER);
ProgressBar progress = new ProgressBar(ctx);
progress.setLayoutParams(WRAP_WRAP);
progress.setIndeterminate(true);
addView(progress);
}
}