diff --git a/briar-android/artwork/empty_state_blog.svg b/briar-android/artwork/empty_state_blog.svg
new file mode 100644
index 000000000..eb1cd25c7
--- /dev/null
+++ b/briar-android/artwork/empty_state_blog.svg
@@ -0,0 +1,91 @@
+
+
diff --git a/briar-android/artwork/empty_state_contact_list.svg b/briar-android/artwork/empty_state_contact_list.svg
new file mode 100644
index 000000000..efc3f10ba
--- /dev/null
+++ b/briar-android/artwork/empty_state_contact_list.svg
@@ -0,0 +1,56 @@
+
+
diff --git a/briar-android/artwork/empty_state_forum_list.svg b/briar-android/artwork/empty_state_forum_list.svg
new file mode 100644
index 000000000..101eca192
--- /dev/null
+++ b/briar-android/artwork/empty_state_forum_list.svg
@@ -0,0 +1,81 @@
+
+
diff --git a/briar-android/artwork/empty_state_group_list.svg b/briar-android/artwork/empty_state_group_list.svg
new file mode 100644
index 000000000..58e0218d7
--- /dev/null
+++ b/briar-android/artwork/empty_state_group_list.svg
@@ -0,0 +1,86 @@
+
+
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
index 6d8223681..6c44abbc4 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
@@ -81,7 +81,9 @@ public class FeedFragment extends BaseFragment implements
list = v.findViewById(R.id.postList);
list.setLayoutManager(layoutManager);
list.setAdapter(adapter);
+ list.setEmptyImage(R.drawable.ic_empty_state_blog);
list.setEmptyText(R.string.blogs_feed_empty_state);
+ list.setEmptyAction(R.string.blogs_feed_empty_state_action);
return v;
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
index 2dc00d67f..5ab78c73c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
@@ -148,7 +148,9 @@ public class ContactListFragment extends BaseFragment implements EventListener {
list = contentView.findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list.setAdapter(adapter);
+ list.setEmptyImage(R.drawable.ic_empty_state_contact_list);
list.setEmptyText(getString(R.string.no_contacts));
+ list.setEmptyAction(getString(R.string.no_contacts_action));
return contentView;
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java
index 7817169b1..8e6b1fa2a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java
@@ -97,7 +97,6 @@ public class ForumListFragment extends BaseEventFragment implements
list = contentView.findViewById(R.id.forumList);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setAdapter(adapter);
- list.setEmptyText(getString(R.string.no_forums));
snackbar = Snackbar.make(list, "", LENGTH_INDEFINITE);
snackbar.getView().setBackgroundResource(R.color.briar_primary);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
index d12ee9087..2015069be 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java
@@ -69,7 +69,9 @@ public class GroupListFragment extends BaseFragment implements
adapter = new GroupListAdapter(getContext(), this);
list = v.findViewById(R.id.list);
+ list.setEmptyImage(R.drawable.ic_empty_state_group_list);
list.setEmptyText(R.string.groups_list_empty);
+ list.setEmptyAction(R.string.groups_list_empty_action);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list.setAdapter(adapter);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java b/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java
index 69d063bf9..61e6bffeb 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/BriarRecyclerView.java
@@ -2,8 +2,13 @@ package org.briarproject.briar.android.view;
import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.StringRes;
+import android.support.constraint.Group;
+import android.support.v7.widget.AppCompatImageView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.util.AttributeSet;
@@ -29,7 +34,9 @@ public class BriarRecyclerView extends FrameLayout {
private final Handler handler = new Handler(Looper.getMainLooper());
private RecyclerView recyclerView;
- private TextView emptyView;
+ private Group emptyState;
+ private AppCompatImageView emptyImage;
+ private TextView emptyText, emptyAction;
private ProgressBar progressBar;
private RecyclerView.AdapterDataObserver emptyObserver;
private Runnable refresher = null;
@@ -51,9 +58,15 @@ public class BriarRecyclerView extends FrameLayout {
R.styleable.BriarRecyclerView);
isScrollingToEnd = attributes
.getBoolean(R.styleable.BriarRecyclerView_scrollToEnd, true);
+ Drawable drawable = attributes
+ .getDrawable(R.styleable.BriarRecyclerView_emptyImage);
+ if (drawable != null) setEmptyImage(drawable);
String emtpyText =
attributes.getString(R.styleable.BriarRecyclerView_emptyText);
if (emtpyText != null) setEmptyText(emtpyText);
+ String emtpyAction =
+ attributes.getString(R.styleable.BriarRecyclerView_emptyAction);
+ if (emtpyAction != null) setEmptyAction(emtpyAction);
attributes.recycle();
}
@@ -68,7 +81,10 @@ public class BriarRecyclerView extends FrameLayout {
R.layout.briar_recycler_view, this, true);
recyclerView = v.findViewById(R.id.recyclerView);
- emptyView = v.findViewById(R.id.emptyView);
+ emptyState = v.findViewById(R.id.emptyState);
+ emptyImage = v.findViewById(R.id.emptyImage);
+ emptyText = v.findViewById(R.id.emptyText);
+ emptyAction = v.findViewById(R.id.emptyAction);
progressBar = v.findViewById(R.id.progressBar);
showProgressBar();
@@ -129,20 +145,40 @@ public class BriarRecyclerView extends FrameLayout {
}
}
- public void setEmptyText(String text) {
+ public void setEmptyImage(Drawable drawable) {
if (recyclerView == null) initViews();
- emptyView.setText(text);
+ emptyImage.setImageDrawable(drawable);
}
- public void setEmptyText(int res) {
+ public void setEmptyImage(@DrawableRes int res) {
if (recyclerView == null) initViews();
- emptyView.setText(res);
+ emptyImage.setImageResource(res);
+ }
+
+ public void setEmptyText(String text) {
+ if (recyclerView == null) initViews();
+ emptyText.setText(text);
+ }
+
+ public void setEmptyText(@StringRes int res) {
+ if (recyclerView == null) initViews();
+ emptyText.setText(res);
+ }
+
+ public void setEmptyAction(String text) {
+ if (recyclerView == null) initViews();
+ emptyAction.setText(text);
+ }
+
+ public void setEmptyAction(@StringRes int res) {
+ if (recyclerView == null) initViews();
+ emptyAction.setText(res);
}
public void showProgressBar() {
if (recyclerView == null) initViews();
recyclerView.setVisibility(INVISIBLE);
- emptyView.setVisibility(INVISIBLE);
+ emptyState.setVisibility(INVISIBLE);
progressBar.setVisibility(VISIBLE);
}
@@ -151,11 +187,11 @@ public class BriarRecyclerView extends FrameLayout {
Adapter adapter = recyclerView.getAdapter();
if (adapter != null) {
if (adapter.getItemCount() == 0) {
- emptyView.setVisibility(VISIBLE);
+ emptyState.setVisibility(VISIBLE);
recyclerView.setVisibility(INVISIBLE);
} else {
// use GONE here so empty view doesn't use space on small lists
- emptyView.setVisibility(GONE);
+ emptyState.setVisibility(GONE);
recyclerView.setVisibility(VISIBLE);
}
progressBar.setVisibility(GONE);
diff --git a/briar-android/src/main/res/drawable/ic_empty_state_blog.xml b/briar-android/src/main/res/drawable/ic_empty_state_blog.xml
new file mode 100644
index 000000000..a93f3eb1a
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_empty_state_blog.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/briar-android/src/main/res/drawable/ic_empty_state_contact_list.xml b/briar-android/src/main/res/drawable/ic_empty_state_contact_list.xml
new file mode 100644
index 000000000..560b137c5
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_empty_state_contact_list.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/briar-android/src/main/res/drawable/ic_empty_state_forum_list.xml b/briar-android/src/main/res/drawable/ic_empty_state_forum_list.xml
new file mode 100644
index 000000000..132ec634e
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_empty_state_forum_list.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/briar-android/src/main/res/drawable/ic_empty_state_group_list.xml b/briar-android/src/main/res/drawable/ic_empty_state_group_list.xml
new file mode 100644
index 000000000..21f892221
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_empty_state_group_list.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/briar-android/src/main/res/layout/briar_recycler_view.xml b/briar-android/src/main/res/layout/briar_recycler_view.xml
index ad5012041..e3791373f 100644
--- a/briar-android/src/main/res/layout/briar_recycler_view.xml
+++ b/briar-android/src/main/res/layout/briar_recycler_view.xml
@@ -1,6 +1,8 @@
-
@@ -10,24 +12,78 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
- tools:listitem="@layout/list_item_contact"/>
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ tools:listitem="@layout/list_item_contact"
+ tools:visibility="visible"/>
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ tools:visibility="invisible"/>
-
+
+
+
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/main/res/layout/fragment_forum_list.xml b/briar-android/src/main/res/layout/fragment_forum_list.xml
index 6b09a7ff6..2a34c3e78 100644
--- a/briar-android/src/main/res/layout/fragment_forum_list.xml
+++ b/briar-android/src/main/res/layout/fragment_forum_list.xml
@@ -1,15 +1,11 @@
-
-
-
-
-
+ android:layout_height="match_parent"
+ app:emptyAction="@string/no_forums_action"
+ app:emptyImage="@drawable/ic_empty_state_forum_list"
+ app:emptyText="@string/no_forums"
+ app:layout_behavior="org.briarproject.briar.android.view.BriarRecyclerViewBehavior"/>
diff --git a/briar-android/src/main/res/values/attrs.xml b/briar-android/src/main/res/values/attrs.xml
index 8655d2126..d2e212bb7 100644
--- a/briar-android/src/main/res/values/attrs.xml
+++ b/briar-android/src/main/res/values/attrs.xml
@@ -3,7 +3,9 @@
+
+
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index fa73572f3..d9b3fc2f0 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -121,7 +121,8 @@
Sorry
- No contacts to show\n\nTap the + icon to add a contact
+ No contacts to show
+ Tap the + icon to add a contact
No messages.
No messages to show
Type message
@@ -177,7 +178,8 @@
- No groups to show\n\nTap the + icon to create a group, or ask your contacts to share groups with you
+ No groups to show
+ Tap the + icon to create a group, or ask your contacts to share groups with you
Created by %s
- %d message
@@ -233,7 +235,8 @@
Contact relationship is not visible to the group
- No forums to show\n\nTap the + icon to create a forum, or ask your contacts to share forums with you
+ No forums to show
+ Tap the + icon to create a forum, or ask your contacts to share forums with you
Create Forum
Choose a name for your forum
Create Forum
@@ -293,7 +296,8 @@
Blog Post Created
New Blog Post Received
Scroll To
- No posts to show\n\nPosts from your contacts and blogs you subscribe to will appear here\n\nTap the pen icon to write a post
+ No posts to show
+ Posts from your contacts and blogs you subscribe to will appear here\n\nTap the pen icon to write a post
Remove Blog
Are you sure that you want to remove this blog?\n\nPosts will be removed from your device but not from other people\'s devices.\n\nAny contacts you\'ve shared this blog with might stop receiving updates.
Remove