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;
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 java.util.logging.Level.INFO;
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.BriarServiceConnection;
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.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent;
@@ -57,6 +60,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private boolean postable = false;
private BlogAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -89,6 +93,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this);
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));
ImageButton composeButton = new ImageButton(this);
@@ -145,6 +154,8 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private void displayHeaders(final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear();
for(GroupMessageHeader h : headers) adapter.add(h);
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_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL;
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.widgets.HorizontalBorder;
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.db.DatabaseComponent;
import net.sf.briar.api.db.DbException;
@@ -63,6 +66,7 @@ OnItemClickListener {
private BlogListAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton newBlogButton = null, composeButton = null;
private ImageButton manageBlogsButton = null;
@@ -86,6 +90,11 @@ OnItemClickListener {
list.setOnItemClickListener(this);
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));
LinearLayout footer = new LinearLayout(this);
@@ -176,6 +185,8 @@ OnItemClickListener {
private void clearHeaders() {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear();
adapter.notifyDataSetChanged();
}
@@ -186,6 +197,8 @@ OnItemClickListener {
final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any
BlogListItem item = findGroup(g.getId());
if(item != null) adapter.remove(item);
@@ -201,6 +214,8 @@ OnItemClickListener {
private void displayAvailable(final int available) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.setAvailable(available);
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.BriarServiceConnection;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException;
@@ -46,6 +47,7 @@ implements DatabaseListener, OnItemClickListener {
private ManageBlogsAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -60,7 +62,10 @@ implements DatabaseListener, OnItemClickListener {
list.setLayoutParams(MATCH_MATCH);
list.setAdapter(adapter);
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
bindService(new Intent(BriarService.class.getName()),
@@ -104,6 +109,7 @@ implements DatabaseListener, OnItemClickListener {
final Collection<GroupStatus> available) {
runOnUiThread(new Runnable() {
public void run() {
setContentView(list);
adapter.clear();
for(GroupStatus g : available)
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_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL;
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.widgets.HorizontalBorder;
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.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -43,6 +45,8 @@ import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
@@ -50,7 +54,8 @@ import android.widget.ListView;
import com.google.inject.Inject;
public class ContactListActivity extends RoboActivity
implements OnClickListener, DatabaseListener, ConnectionListener {
implements OnClickListener, OnItemClickListener, DatabaseListener,
ConnectionListener {
private static final Logger LOG =
Logger.getLogger(ContactListActivity.class.getName());
@@ -61,6 +66,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
@Inject private ConnectionRegistry connectionRegistry;
private ContactListAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton addContactButton = null, shareButton = null;
// 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
list.setLayoutParams(MATCH_WRAP_1);
list.setAdapter(adapter);
list.setOnItemClickListener(adapter);
list.setVisibility(GONE);
list.setOnItemClickListener(this);
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));
LinearLayout footer = new LinearLayout(this);
@@ -150,6 +160,8 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
final Map<ContactId, Long> times) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear();
for(Contact c : contacts) {
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) {
if(e instanceof ContactAddedEvent) loadContacts();
else if(e instanceof ContactRemovedEvent) loadContacts();

View File

@@ -13,15 +13,12 @@ import android.text.Html;
import android.text.format.DateUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
class ContactListAdapter extends ArrayAdapter<ContactListItem>
implements OnItemClickListener {
class ContactListAdapter extends ArrayAdapter<ContactListItem> {
ContactListAdapter(Context ctx) {
super(ctx, android.R.layout.simple_expandable_list_item_1,
@@ -68,9 +65,4 @@ implements OnItemClickListener {
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;
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 java.util.logging.Level.INFO;
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.BriarServiceConnection;
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.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent;
@@ -56,6 +59,7 @@ OnClickListener, OnItemClickListener {
private String groupName = null;
private GroupAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -87,6 +91,11 @@ OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this);
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));
ImageButton composeButton = new ImageButton(this);
@@ -143,6 +152,8 @@ OnClickListener, OnItemClickListener {
private void displayHeaders(final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear();
for(GroupMessageHeader h : headers) adapter.add(h);
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_HORIZONTAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.LinearLayout.HORIZONTAL;
import static android.widget.LinearLayout.VERTICAL;
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.widgets.HorizontalBorder;
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.db.DatabaseComponent;
import net.sf.briar.api.db.DbException;
@@ -61,6 +64,7 @@ OnItemClickListener {
private GroupListAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
private ImageButton newGroupButton = null, composeButton = null;
private ImageButton manageGroupsButton = null;
@@ -84,6 +88,11 @@ OnItemClickListener {
list.setOnItemClickListener(this);
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));
LinearLayout footer = new LinearLayout(this);
@@ -171,6 +180,8 @@ OnItemClickListener {
private void clearHeaders() {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear();
adapter.notifyDataSetChanged();
}
@@ -181,6 +192,8 @@ OnItemClickListener {
final Collection<GroupMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any
GroupListItem item = findGroup(g.getId());
if(item != null) adapter.remove(item);
@@ -196,6 +209,8 @@ OnItemClickListener {
private void displayAvailable(final int available) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.setAvailable(available);
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.BriarServiceConnection;
import net.sf.briar.android.widgets.ListLoadingProgressBar;
import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException;
@@ -46,6 +47,7 @@ implements DatabaseListener, OnItemClickListener {
private ManageGroupsAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -60,7 +62,10 @@ implements DatabaseListener, OnItemClickListener {
list.setLayoutParams(MATCH_MATCH);
list.setAdapter(adapter);
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
bindService(new Intent(BriarService.class.getName()),
@@ -104,6 +109,7 @@ implements DatabaseListener, OnItemClickListener {
final Collection<GroupStatus> available) {
runOnUiThread(new Runnable() {
public void run() {
setContentView(list);
adapter.clear();
for(GroupStatus g : available)
adapter.add(new ManageGroupsItem(g));

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.messages;
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 java.util.logging.Level.INFO;
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.BriarServiceConnection;
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.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -53,6 +56,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
private String contactName = null;
private ConversationAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -88,6 +92,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
list.setOnItemClickListener(this);
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));
ImageButton composeButton = new ImageButton(this);
@@ -145,6 +154,8 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
adapter.clear();
for(PrivateMessageHeader h : headers) adapter.add(h);
adapter.sort(AscendingHeaderComparator.INSTANCE);

View File

@@ -1,6 +1,8 @@
package net.sf.briar.android.messages;
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 java.util.logging.Level.INFO;
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.invitation.AddContactActivity;
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.ContactId;
import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -51,6 +54,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
private ConversationListAdapter adapter = null;
private ListView list = null;
private ListLoadingProgressBar loading = null;
// Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db;
@@ -72,6 +76,11 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
list.setOnItemClickListener(adapter);
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));
ImageButton composeButton = new ImageButton(this);
@@ -95,6 +104,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
}
private void loadHeaders() {
clearHeaders();
dbUiExecutor.execute(new Runnable() {
public void run() {
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,
final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
list.setVisibility(VISIBLE);
loading.setVisibility(GONE);
// Remove the old item, if any
ConversationListItem item = findConversation(c.getId());
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);
}
}