Added anonymous and new identity items to local author spinner.

This commit is contained in:
akwizgran
2013-04-11 22:44:19 +01:00
parent 0f63b22b34
commit acb506b633
14 changed files with 151 additions and 46 deletions

View File

@@ -9,6 +9,7 @@
<string name="blogs_button">Blogs</string> <string name="blogs_button">Blogs</string>
<string name="synchronize_button">Synchronize</string> <string name="synchronize_button">Synchronize</string>
<string name="quit_button">Quit</string> <string name="quit_button">Quit</string>
<string name="new_identity_item">New identity\u2026</string>
<string name="contact_list_title">Contacts</string> <string name="contact_list_title">Contacts</string>
<string name="contact_connected">Connected</string> <string name="contact_connected">Connected</string>
<string name="format_contact_last_connected">Last connected &lt;br /&gt; %1$s</string> <string name="format_contact_last_connected">Last connected &lt;br /&gt; %1$s</string>

View File

@@ -1,16 +0,0 @@
package net.sf.briar.android;
import java.util.Comparator;
import net.sf.briar.api.Author;
public class AuthorNameComparator implements Comparator<Author> {
public static final AuthorNameComparator INSTANCE =
new AuthorNameComparator();
public int compare(Author a1, Author a2) {
return String.CASE_INSENSITIVE_ORDER.compare(a1.getName(),
a2.getName());
}
}

View File

@@ -0,0 +1,19 @@
package net.sf.briar.android;
import net.sf.briar.api.LocalAuthor;
public class LocalAuthorItem {
public static final LocalAuthorItem ANONYMOUS = new LocalAuthorItem(null);
public static final LocalAuthorItem NEW = new LocalAuthorItem(null);
private final LocalAuthor localAuthor;
public LocalAuthorItem(LocalAuthor localAuthor) {
this.localAuthor = localAuthor;
}
public LocalAuthor getLocalAuthor() {
return localAuthor;
}
}

View File

@@ -0,0 +1,21 @@
package net.sf.briar.android;
import static net.sf.briar.android.LocalAuthorItem.ANONYMOUS;
import static net.sf.briar.android.LocalAuthorItem.NEW;
import java.util.Comparator;
public class LocalAuthorItemComparator implements Comparator<LocalAuthorItem> {
public static final LocalAuthorItemComparator INSTANCE =
new LocalAuthorItemComparator();
public int compare(LocalAuthorItem a, LocalAuthorItem b) {
if(a == b) return 0;
if(a == ANONYMOUS || b == NEW) return -1;
if(a == NEW || b == ANONYMOUS) return 1;
String aName = a.getLocalAuthor().getName();
String bName = b.getLocalAuthor().getName();
return String.CASE_INSENSITIVE_ORDER.compare(aName, bName);
}
}

View File

@@ -1,35 +1,44 @@
package net.sf.briar.android; package net.sf.briar.android;
import static net.sf.briar.android.LocalAuthorItem.ANONYMOUS;
import static net.sf.briar.android.LocalAuthorItem.NEW;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.api.LocalAuthor;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter; import android.widget.SpinnerAdapter;
import android.widget.TextView; import android.widget.TextView;
public class LocalAuthorSpinnerAdapter extends ArrayAdapter<LocalAuthor> public class LocalAuthorSpinnerAdapter extends BaseAdapter
implements SpinnerAdapter { implements SpinnerAdapter {
public LocalAuthorSpinnerAdapter(Context ctx) { private final Context ctx;
super(ctx, android.R.layout.simple_spinner_item, private final boolean includeAnonymous;
new ArrayList<LocalAuthor>()); private final List<LocalAuthorItem> list = new ArrayList<LocalAuthorItem>();
public LocalAuthorSpinnerAdapter(Context ctx, boolean includeAnonymous) {
this.ctx = ctx;
this.includeAnonymous = includeAnonymous;
} }
@Override public void add(LocalAuthorItem item) {
public View getView(int position, View convertView, ViewGroup parent) { list.add(item);
TextView name = new TextView(getContext()); }
name.setTextSize(18);
name.setMaxLines(1); public void clear() {
Resources res = getContext().getResources(); list.clear();
int pad = res.getInteger(R.integer.spinner_padding); }
name.setPadding(pad, pad, pad, pad);
name.setText(getItem(position).getName()); public int getCount() {
return name; return includeAnonymous ? list.size() + 2 : list.size() + 1;
} }
@Override @Override
@@ -37,4 +46,42 @@ implements SpinnerAdapter {
ViewGroup parent) { ViewGroup parent) {
return getView(position, convertView, parent); return getView(position, convertView, parent);
} }
public LocalAuthorItem getItem(int position) {
if(includeAnonymous) {
if(position == 0) return ANONYMOUS;
if(position == list.size() + 1) return NEW;
return list.get(position - 1);
} else {
if(position == list.size()) return NEW;
return list.get(position);
}
}
public long getItemId(int position) {
return android.R.layout.simple_spinner_item;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView name = new TextView(ctx);
name.setTextSize(18);
name.setMaxLines(1);
Resources res = ctx.getResources();
int pad = res.getInteger(R.integer.spinner_padding);
name.setPadding(pad, pad, pad, pad);
LocalAuthorItem item = getItem(position);
if(item == ANONYMOUS) name.setText(R.string.anonymous);
else if(item == NEW) name.setText(R.string.new_identity_item);
else name.setText(item.getLocalAuthor().getName());
return name;
}
@Override
public boolean isEmpty() {
return getCount() == 0;
}
public void sort(Comparator<LocalAuthorItem> comparator) {
Collections.sort(list, comparator);
}
} }

View File

@@ -139,6 +139,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
adapter.add(new ContactListItem(c, conn)); adapter.add(new ContactListItem(c, conn));
} }
adapter.sort(ContactComparator.INSTANCE); adapter.sort(ContactComparator.INSTANCE);
adapter.notifyDataSetChanged();
} }
}); });
} }

View File

@@ -142,6 +142,7 @@ OnClickListener, OnItemClickListener {
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);
adapter.notifyDataSetChanged();
selectFirstUnread(); selectFirstUnread();
} }
}); });

View File

@@ -174,6 +174,7 @@ implements OnClickListener, DatabaseListener, NoGroupsDialog.Listener {
adapter.add(new GroupListItem(g, headerList)); adapter.add(new GroupListItem(g, headerList));
adapter.sort(GroupComparator.INSTANCE); adapter.sort(GroupComparator.INSTANCE);
} }
adapter.notifyDataSetChanged();
selectFirstUnread(); selectFirstUnread();
} }
}); });

View File

@@ -7,6 +7,8 @@ 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;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static net.sf.briar.android.LocalAuthorItem.ANONYMOUS;
import static net.sf.briar.android.LocalAuthorItem.NEW;
import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP; import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP;
import java.io.IOException; import java.io.IOException;
@@ -20,11 +22,13 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.AuthorNameComparator;
import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarActivity;
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.LocalAuthorItem;
import net.sf.briar.android.LocalAuthorItemComparator;
import net.sf.briar.android.LocalAuthorSpinnerAdapter; import net.sf.briar.android.LocalAuthorSpinnerAdapter;
import net.sf.briar.android.identity.CreateIdentityActivity;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.BundleEncrypter;
@@ -103,7 +107,7 @@ implements OnItemSelectedListener, OnClickListener {
from.setText(R.string.from); from.setText(R.string.from);
header.addView(from); header.addView(from);
fromAdapter = new LocalAuthorSpinnerAdapter(this); fromAdapter = new LocalAuthorSpinnerAdapter(this, true);
fromSpinner = new Spinner(this); fromSpinner = new Spinner(this);
fromSpinner.setAdapter(fromAdapter); fromSpinner.setAdapter(fromAdapter);
fromSpinner.setOnItemSelectedListener(this); fromSpinner.setOnItemSelectedListener(this);
@@ -126,7 +130,7 @@ implements OnItemSelectedListener, OnClickListener {
TextView to = new TextView(this); TextView to = new TextView(this);
to.setTextSize(18); to.setTextSize(18);
to.setPadding(10, 10, 10, 10); to.setPadding(10, 0, 0, 10);
to.setText(R.string.to); to.setText(R.string.to);
header.addView(to); header.addView(to);
@@ -188,8 +192,10 @@ implements OnItemSelectedListener, OnClickListener {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
fromAdapter.clear(); fromAdapter.clear();
for(LocalAuthor a : localAuthors) fromAdapter.add(a); for(LocalAuthor a : localAuthors)
fromAdapter.sort(AuthorNameComparator.INSTANCE); fromAdapter.add(new LocalAuthorItem(a));
fromAdapter.sort(LocalAuthorItemComparator.INSTANCE);
fromAdapter.notifyDataSetChanged();
} }
}); });
} }
@@ -256,7 +262,15 @@ implements OnItemSelectedListener, OnClickListener {
public void onItemSelected(AdapterView<?> parent, View view, int position, public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) { long id) {
if(parent == fromSpinner) { if(parent == fromSpinner) {
localAuthor = fromAdapter.getItem(position); LocalAuthorItem item = fromAdapter.getItem(position);
if(item == ANONYMOUS) {
localAuthor = null;
} else if(item == NEW) {
localAuthor = null;
startActivity(new Intent(this, CreateIdentityActivity.class));
} else {
localAuthor = item.getLocalAuthor();
}
} else if(parent == toSpinner) { } else if(parent == toSpinner) {
group = toAdapter.getItem(position); group = toAdapter.getItem(position);
groupId = group.getId(); groupId = group.getId();

View File

@@ -7,10 +7,11 @@ import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.android.AuthorNameComparator;
import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarActivity;
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.LocalAuthorItem;
import net.sf.briar.android.LocalAuthorItemComparator;
import net.sf.briar.android.LocalAuthorSpinnerAdapter; import net.sf.briar.android.LocalAuthorSpinnerAdapter;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
@@ -214,8 +215,10 @@ implements InvitationListener {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
adapter.clear(); adapter.clear();
for(LocalAuthor a : localAuthors) adapter.add(a); for(LocalAuthor a : localAuthors)
adapter.sort(AuthorNameComparator.INSTANCE); adapter.add(new LocalAuthorItem(a));
adapter.sort(LocalAuthorItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
} }
}); });
} }

View File

@@ -1,12 +1,16 @@
package net.sf.briar.android.invitation; package net.sf.briar.android.invitation;
import static android.view.Gravity.CENTER; import static android.view.Gravity.CENTER;
import static net.sf.briar.android.LocalAuthorItem.NEW;
import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP; import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP;
import static net.sf.briar.android.widgets.CommonLayoutParams.WRAP_WRAP; import static net.sf.briar.android.widgets.CommonLayoutParams.WRAP_WRAP;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.LocalAuthorItem;
import net.sf.briar.android.LocalAuthorSpinnerAdapter; import net.sf.briar.android.LocalAuthorSpinnerAdapter;
import net.sf.briar.android.identity.CreateIdentityActivity;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import android.content.Context; import android.content.Context;
import android.content.Intent;
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;
@@ -43,7 +47,7 @@ OnClickListener {
yourNickname.setText(R.string.your_nickname); yourNickname.setText(R.string.your_nickname);
innerLayout.addView(yourNickname); innerLayout.addView(yourNickname);
adapter = new LocalAuthorSpinnerAdapter(ctx); adapter = new LocalAuthorSpinnerAdapter(ctx, false);
spinner = new Spinner(ctx); spinner = new Spinner(ctx);
spinner.setAdapter(adapter); spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this); spinner.setOnItemSelectedListener(this);
@@ -90,13 +94,20 @@ OnClickListener {
AuthorId localAuthorId = container.getLocalAuthorId(); AuthorId localAuthorId = container.getLocalAuthorId();
boolean useBluetooth = container.getUseBluetooth(); boolean useBluetooth = container.getUseBluetooth();
String networkName = container.getNetworkName(); String networkName = container.getNetworkName();
continueButton.setEnabled(localAuthorId != null && boolean networkAvailable = useBluetooth || networkName != null;
(useBluetooth || networkName != null)); continueButton.setEnabled(localAuthorId != null && networkAvailable);
} }
public void onItemSelected(AdapterView<?> parent, View view, int position, public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) { long id) {
container.setLocalAuthorId(adapter.getItem(position).getId()); LocalAuthorItem item = adapter.getItem(position);
if(item == NEW) {
container.setLocalAuthorId(null);
Intent i = new Intent(container, CreateIdentityActivity.class);
container.startActivity(i);
} else {
container.setLocalAuthorId(item.getLocalAuthor().getId());
}
enableOrDisableContinueButton(); enableOrDisableContinueButton();
} }

View File

@@ -149,6 +149,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
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);
adapter.notifyDataSetChanged();
selectFirstUnread(); selectFirstUnread();
} }
}); });

View File

@@ -148,6 +148,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
adapter.add(new ConversationListItem(c, headerList)); adapter.add(new ConversationListItem(c, headerList));
adapter.sort(ConversationComparator.INSTANCE); adapter.sort(ConversationComparator.INSTANCE);
} }
adapter.notifyDataSetChanged();
selectFirstUnread(); selectFirstUnread();
} }
}); });

View File

@@ -114,7 +114,7 @@ implements OnItemSelectedListener, OnClickListener {
TextView to = new TextView(this); TextView to = new TextView(this);
to.setTextSize(18); to.setTextSize(18);
to.setPadding(10, 10, 10, 10); to.setPadding(10, 0, 0, 10);
to.setText(R.string.to); to.setText(R.string.to);
header.addView(to); header.addView(to);