From a91f3cdf179bfdef27d7ec0c268321e2328ba9ec Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Sun, 14 Apr 2013 15:17:54 +0100 Subject: [PATCH] Added create blog/group items to blog/group spinners. --- briar-android/res/values/strings.xml | 2 + .../sf/briar/android/GroupNameComparator.java | 15 ----- .../briar/android/blogs/LocalGroupItem.java | 18 ++++++ .../blogs/LocalGroupItemComparator.java | 20 ++++++ .../blogs/LocalGroupSpinnerAdapter.java | 62 +++++++++++++++---- .../android/blogs/WriteBlogPostActivity.java | 28 +++++---- .../sf/briar/android/groups/GroupItem.java | 18 ++++++ .../android/groups/GroupItemComparator.java | 18 ++++++ .../android/groups/GroupSpinnerAdapter.java | 62 +++++++++++++++---- .../groups/WriteGroupPostActivity.java | 28 +++++---- 10 files changed, 208 insertions(+), 63 deletions(-) delete mode 100644 briar-android/src/net/sf/briar/android/GroupNameComparator.java create mode 100644 briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java create mode 100644 briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java create mode 100644 briar-android/src/net/sf/briar/android/groups/GroupItem.java create mode 100644 briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 003bfac943..b57845c6b6 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -54,12 +54,14 @@ <string name="group_visible_to_all">Share this group with all contacts</string> <string name="group_visible_to_some">Share this group with chosen contacts</string> <string name="compose_group_title">New Post</string> + <string name="new_group_item">New group\u2026</string> <string name="blogs_title">Blogs</string> <string name="create_blog_title">New Blog</string> <string name="choose_blog_name">Choose a name for your blog:</string> <string name="blog_visible_to_all">Share this blog with all contacts</string> <string name="blog_visible_to_some">Share this blog with chosen contacts</string> <string name="compose_blog_title">New Post</string> + <string name="new_blog_item">New blog\u2026</string> <string name="create_nickname_item">New nickname\u2026</string> <string name="create_identity_title">Create an Identity</string> <string name="choose_nickname">Choose your nickname:</string> diff --git a/briar-android/src/net/sf/briar/android/GroupNameComparator.java b/briar-android/src/net/sf/briar/android/GroupNameComparator.java deleted file mode 100644 index 8e397be1b1..0000000000 --- a/briar-android/src/net/sf/briar/android/GroupNameComparator.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.sf.briar.android; - -import java.util.Comparator; - -import net.sf.briar.api.messaging.Group; - -public class GroupNameComparator implements Comparator<Group> { - - public static final GroupNameComparator INSTANCE = - new GroupNameComparator(); - - public int compare(Group a, Group b) { - return String.CASE_INSENSITIVE_ORDER.compare(a.getName(), b.getName()); - } -} diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java new file mode 100644 index 0000000000..cd7f893556 --- /dev/null +++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItem.java @@ -0,0 +1,18 @@ +package net.sf.briar.android.blogs; + +import net.sf.briar.api.messaging.LocalGroup; + +class LocalGroupItem { + + static final LocalGroupItem NEW = new LocalGroupItem(null); + + private final LocalGroup localGroup; + + LocalGroupItem(LocalGroup localGroup) { + this.localGroup = localGroup; + } + + LocalGroup getLocalGroup() { + return localGroup; + } +} diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java new file mode 100644 index 0000000000..b6943000ce --- /dev/null +++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupItemComparator.java @@ -0,0 +1,20 @@ +package net.sf.briar.android.blogs; + +import static net.sf.briar.android.blogs.LocalGroupItem.NEW; + +import java.util.Comparator; + +class LocalGroupItemComparator implements Comparator<LocalGroupItem> { + + static final LocalGroupItemComparator INSTANCE = + new LocalGroupItemComparator(); + + public int compare(LocalGroupItem a, LocalGroupItem b) { + if(a == b) return 0; + if(a == NEW) return 1; + if(b == NEW) return -1; + String aName = a.getLocalGroup().getName(); + String bName = b.getLocalGroup().getName(); + return String.CASE_INSENSITIVE_ORDER.compare(aName, bName); + } +} diff --git a/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java index 8dc22083a4..c4cf025cb8 100644 --- a/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java +++ b/briar-android/src/net/sf/briar/android/blogs/LocalGroupSpinnerAdapter.java @@ -1,40 +1,76 @@ package net.sf.briar.android.blogs; +import static net.sf.briar.android.blogs.LocalGroupItem.NEW; + 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.api.messaging.LocalGroup; import android.content.Context; import android.content.res.Resources; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; import android.widget.SpinnerAdapter; import android.widget.TextView; -class LocalGroupSpinnerAdapter extends ArrayAdapter<LocalGroup> -implements SpinnerAdapter { +class LocalGroupSpinnerAdapter extends BaseAdapter implements SpinnerAdapter { + + private final Context ctx; + private final List<LocalGroupItem> list = new ArrayList<LocalGroupItem>(); + + LocalGroupSpinnerAdapter(Context ctx) { + this.ctx = ctx; + } + + public void add(LocalGroupItem item) { + list.add(item); + } - LocalGroupSpinnerAdapter(Context context) { - super(context, android.R.layout.simple_spinner_item, - new ArrayList<LocalGroup>()); + public void clear() { + list.clear(); + } + + public int getCount() { + return list.size() + 1; } @Override + public View getDropDownView(int position, View convertView, + ViewGroup parent) { + return getView(position, convertView, parent); + } + + public LocalGroupItem getItem(int position) { + 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(getContext()); + TextView name = new TextView(ctx); name.setTextSize(18); name.setMaxLines(1); - Resources res = getContext().getResources(); + Resources res = ctx.getResources(); int pad = res.getInteger(R.integer.spinner_padding); name.setPadding(pad, pad, pad, pad); - name.setText(getItem(position).getName()); + LocalGroupItem item = getItem(position); + if(item == NEW) name.setText(R.string.new_blog_item); + else name.setText(item.getLocalGroup().getName()); return name; } @Override - public View getDropDownView(int position, View convertView, - ViewGroup parent) { - return getView(position, convertView, parent); + public boolean isEmpty() { + return getCount() == 0; + } + + public void sort(Comparator<LocalGroupItem> comparator) { + Collections.sort(list, comparator); } } diff --git a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java index 15a807ab43..57dfded067 100644 --- a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java @@ -7,8 +7,6 @@ import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.VERTICAL; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static net.sf.briar.android.identity.LocalAuthorItem.ANONYMOUS; -import static net.sf.briar.android.identity.LocalAuthorItem.NEW; import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP; import java.io.IOException; @@ -22,7 +20,6 @@ import net.sf.briar.R; import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; -import net.sf.briar.android.GroupNameComparator; import net.sf.briar.android.identity.CreateIdentityActivity; import net.sf.briar.android.identity.LocalAuthorItem; import net.sf.briar.android.identity.LocalAuthorItemComparator; @@ -190,6 +187,7 @@ implements OnItemSelectedListener, OnClickListener { final Collection<LocalAuthor> localAuthors) { runOnUiThread(new Runnable() { public void run() { + if(localAuthors.isEmpty()) throw new IllegalStateException(); fromAdapter.clear(); for(LocalAuthor a : localAuthors) fromAdapter.add(new LocalAuthorItem(a)); @@ -226,11 +224,14 @@ implements OnItemSelectedListener, OnClickListener { public void run() { if(groups.isEmpty()) finish(); toAdapter.clear(); - for(LocalGroup g : groups) toAdapter.add(g); - toAdapter.sort(GroupNameComparator.INSTANCE); + for(LocalGroup g : groups) toAdapter.add(new LocalGroupItem(g)); + toAdapter.sort(LocalGroupItemComparator.INSTANCE); + toAdapter.notifyDataSetChanged(); int count = toAdapter.getCount(); for(int i = 0; i < count; i++) { - if(toAdapter.getItem(i).getId().equals(localGroupId)) { + LocalGroupItem item = toAdapter.getItem(i); + if(item == LocalGroupItem.NEW) continue; + if(item.getLocalGroup().getId().equals(localGroupId)) { toSpinner.setSelection(i); break; } @@ -256,18 +257,23 @@ implements OnItemSelectedListener, OnClickListener { long id) { if(parent == fromSpinner) { LocalAuthorItem item = fromAdapter.getItem(position); - if(item == ANONYMOUS) { + if(item == LocalAuthorItem.ANONYMOUS) { localAuthor = null; - } else if(item == NEW) { + } else if(item == LocalAuthorItem.NEW) { localAuthor = null; startActivity(new Intent(this, CreateIdentityActivity.class)); } else { localAuthor = item.getLocalAuthor(); } } else if(parent == toSpinner) { - localGroup = toAdapter.getItem(position); - localGroupId = localGroup.getId(); - sendButton.setEnabled(true); + LocalGroupItem item = toAdapter.getItem(position); + if(item == LocalGroupItem.NEW) { + startActivity(new Intent(this, CreateBlogActivity.class)); + } else { + localGroup = item.getLocalGroup(); + localGroupId = localGroup.getId(); + sendButton.setEnabled(true); + } } } diff --git a/briar-android/src/net/sf/briar/android/groups/GroupItem.java b/briar-android/src/net/sf/briar/android/groups/GroupItem.java new file mode 100644 index 0000000000..ff45e226bd --- /dev/null +++ b/briar-android/src/net/sf/briar/android/groups/GroupItem.java @@ -0,0 +1,18 @@ +package net.sf.briar.android.groups; + +import net.sf.briar.api.messaging.Group; + +class GroupItem { + + static final GroupItem NEW = new GroupItem(null); + + private final Group group; + + GroupItem(Group group) { + this.group = group; + } + + Group getGroup() { + return group; + } +} diff --git a/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java b/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java new file mode 100644 index 0000000000..f9f377ebd2 --- /dev/null +++ b/briar-android/src/net/sf/briar/android/groups/GroupItemComparator.java @@ -0,0 +1,18 @@ +package net.sf.briar.android.groups; + +import static net.sf.briar.android.groups.GroupItem.NEW; + +import java.util.Comparator; + +class GroupItemComparator implements Comparator<GroupItem> { + + static final GroupItemComparator INSTANCE = new GroupItemComparator(); + + public int compare(GroupItem a, GroupItem b) { + if(a == b) return 0; + if(a == NEW) return 1; + if(b == NEW) return -1; + String aName = a.getGroup().getName(), bName = b.getGroup().getName(); + return String.CASE_INSENSITIVE_ORDER.compare(aName, bName); + } +} diff --git a/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java index 821c5ae16e..c4180324b9 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupSpinnerAdapter.java @@ -1,40 +1,76 @@ package net.sf.briar.android.groups; +import static net.sf.briar.android.groups.GroupItem.NEW; + 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.api.messaging.Group; import android.content.Context; import android.content.res.Resources; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; import android.widget.SpinnerAdapter; import android.widget.TextView; -class GroupSpinnerAdapter extends ArrayAdapter<Group> -implements SpinnerAdapter { +class GroupSpinnerAdapter extends BaseAdapter implements SpinnerAdapter { + + private final Context ctx; + private final List<GroupItem> list = new ArrayList<GroupItem>(); + + GroupSpinnerAdapter(Context ctx) { + this.ctx = ctx; + } + + public void add(GroupItem item) { + list.add(item); + } - GroupSpinnerAdapter(Context context) { - super(context, android.R.layout.simple_spinner_item, - new ArrayList<Group>()); + public void clear() { + list.clear(); + } + + public int getCount() { + return list.size() + 1; } @Override + public View getDropDownView(int position, View convertView, + ViewGroup parent) { + return getView(position, convertView, parent); + } + + public GroupItem getItem(int position) { + 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(getContext()); + TextView name = new TextView(ctx); name.setTextSize(18); name.setMaxLines(1); - Resources res = getContext().getResources(); + Resources res = ctx.getResources(); int pad = res.getInteger(R.integer.spinner_padding); name.setPadding(pad, pad, pad, pad); - name.setText(getItem(position).getName()); + GroupItem item = getItem(position); + if(item == NEW) name.setText(R.string.new_group_item); + else name.setText(item.getGroup().getName()); return name; } @Override - public View getDropDownView(int position, View convertView, - ViewGroup parent) { - return getView(position, convertView, parent); + public boolean isEmpty() { + return getCount() == 0; + } + + public void sort(Comparator<GroupItem> comparator) { + Collections.sort(list, comparator); } } diff --git a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java index 9b4621c7ea..7fb542d741 100644 --- a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java @@ -7,8 +7,6 @@ import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.VERTICAL; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static net.sf.briar.android.identity.LocalAuthorItem.ANONYMOUS; -import static net.sf.briar.android.identity.LocalAuthorItem.NEW; import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_WRAP; import java.io.IOException; @@ -24,7 +22,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; -import net.sf.briar.android.GroupNameComparator; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.identity.CreateIdentityActivity; import net.sf.briar.android.identity.LocalAuthorItem; @@ -193,6 +190,7 @@ implements OnItemSelectedListener, OnClickListener { final Collection<LocalAuthor> localAuthors) { runOnUiThread(new Runnable() { public void run() { + if(localAuthors.isEmpty()) throw new IllegalStateException(); fromAdapter.clear(); for(LocalAuthor a : localAuthors) fromAdapter.add(new LocalAuthorItem(a)); @@ -231,11 +229,14 @@ implements OnItemSelectedListener, OnClickListener { public void run() { if(groups.isEmpty()) finish(); toAdapter.clear(); - for(Group g : groups) toAdapter.add(g); - toAdapter.sort(GroupNameComparator.INSTANCE); + for(Group g : groups) toAdapter.add(new GroupItem(g)); + toAdapter.sort(GroupItemComparator.INSTANCE); + toAdapter.notifyDataSetChanged(); int count = toAdapter.getCount(); for(int i = 0; i < count; i++) { - if(toAdapter.getItem(i).getId().equals(groupId)) { + GroupItem g = toAdapter.getItem(i); + if(g == GroupItem.NEW) continue; + if(g.getGroup().getId().equals(groupId)) { toSpinner.setSelection(i); break; } @@ -261,18 +262,23 @@ implements OnItemSelectedListener, OnClickListener { long id) { if(parent == fromSpinner) { LocalAuthorItem item = fromAdapter.getItem(position); - if(item == ANONYMOUS) { + if(item == LocalAuthorItem.ANONYMOUS) { localAuthor = null; - } else if(item == NEW) { + } else if(item == LocalAuthorItem.NEW) { localAuthor = null; startActivity(new Intent(this, CreateIdentityActivity.class)); } else { localAuthor = item.getLocalAuthor(); } } else if(parent == toSpinner) { - group = toAdapter.getItem(position); - groupId = group.getId(); - sendButton.setEnabled(true); + GroupItem item = toAdapter.getItem(position); + if(item == GroupItem.NEW) { + startActivity(new Intent(this, CreateGroupActivity.class)); + } else { + group = item.getGroup(); + groupId = group.getId(); + sendButton.setEnabled(true); + } } } -- GitLab