diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java index 1967e2cd0..ee82e165b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java @@ -100,7 +100,7 @@ public class ForumActivity extends super.onActivityResult(request, result, data); if (request == REQUEST_SHARE_FORUM && result == RESULT_OK) { - displaySnackbarShort(R.string.forum_shared_snackbar); + displaySnackbar(R.string.forum_shared_snackbar); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java index 8abb679a7..feaddbec9 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java @@ -183,7 +183,7 @@ public class GroupActivity extends @Override protected void onActivityResult(int request, int result, Intent data) { if (request == REQUEST_GROUP_INVITE && result == RESULT_OK) { - displaySnackbarShort(R.string.groups_invitation_sent); + displaySnackbar(R.string.groups_invitation_sent); } else super.onActivityResult(request, result, data); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageAdapter.java index dbf8c7b96..b511804f3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageAdapter.java @@ -31,9 +31,8 @@ class GroupMessageAdapter extends ThreadItemAdapter { @LayoutRes @Override public int getItemViewType(int position) { - GroupMessageItem item = getVisibleItem(position); - if (item != null) return item.getLayout(); - return R.layout.list_item_thread; + GroupMessageItem item = items.get(position); + return item.getLayout(); } @Override @@ -58,7 +57,7 @@ class GroupMessageAdapter extends ThreadItemAdapter { GroupMessageItem item = items.get(position); if (item instanceof JoinMessageItem) { ((JoinMessageItem) item).setVisibility(v); - notifyItemChanged(getVisiblePos(item), item); + notifyItemChanged(findItemPosition(item), item); } } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageItem.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageItem.java index 79ca011d2..a64769fdf 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupMessageItem.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android.privategroup.conversation; import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; import android.support.annotation.UiThread; import org.briarproject.bramble.api.identity.Author; @@ -20,9 +21,8 @@ class GroupMessageItem extends ThreadItem { private final GroupId groupId; private GroupMessageItem(MessageId messageId, GroupId groupId, - MessageId parentId, - String text, long timestamp, Author author, Status status, - boolean isRead) { + @Nullable MessageId parentId, String text, long timestamp, + Author author, Status status, boolean isRead) { super(messageId, parentId, text, timestamp, author, status, isRead); this.groupId = groupId; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItem.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItem.java index dfdd92022..405a862d0 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItem.java @@ -27,11 +27,6 @@ class JoinMessageItem extends GroupMessageItem { return 0; } - @Override - public boolean hasDescendants() { - return false; - } - @Override @LayoutRes public int getLayout() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java index 5fe8cf399..6d6a1f216 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/JoinMessageItemViewHolder.java @@ -12,7 +12,6 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.R; import org.briarproject.briar.android.privategroup.reveal.RevealContactsActivity; import org.briarproject.briar.android.threaded.BaseThreadItemViewHolder; -import org.briarproject.briar.android.threaded.ThreadItemAdapter; import org.briarproject.briar.android.threaded.ThreadItemAdapter.ThreadItemListener; import static org.briarproject.bramble.api.identity.Author.Status.OURSELVES; @@ -41,10 +40,9 @@ class JoinMessageItemViewHolder } @Override - public void bind(ThreadItemAdapter adapter, - ThreadItemListener listener, - GroupMessageItem item, int pos) { - super.bind(adapter, listener, item, pos); + public void bind(GroupMessageItem item, + ThreadItemListener listener) { + super.bind(item, listener); if (isCreator) bindForCreator((JoinMessageItem) item); else bind((JoinMessageItem) item); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java index a01865237..b7fdeff1a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java @@ -20,9 +20,6 @@ import org.briarproject.briar.R; import org.briarproject.briar.android.threaded.ThreadItemAdapter.ThreadItemListener; import org.briarproject.briar.android.view.AuthorView; -import static android.view.View.INVISIBLE; -import static android.view.View.VISIBLE; - @UiThread @NotNullByDefault public abstract class BaseThreadItemViewHolder @@ -33,7 +30,6 @@ public abstract class BaseThreadItemViewHolder protected final TextView textView; private final ViewGroup layout; private final AuthorView author; - private final View topDivider; public BaseThreadItemViewHolder(View v) { super(v); @@ -41,43 +37,30 @@ public abstract class BaseThreadItemViewHolder layout = (ViewGroup) v.findViewById(R.id.layout); textView = (TextView) v.findViewById(R.id.text); author = (AuthorView) v.findViewById(R.id.author); - topDivider = v.findViewById(R.id.top_divider); } - // TODO improve encapsulation, so we don't need to pass the adapter here @CallSuper - public void bind(final ThreadItemAdapter adapter, - final ThreadItemListener listener, final I item, int pos) { - + public void bind(final I item, final ThreadItemListener listener) { textView.setText(StringUtils.trim(item.getText())); - if (pos == 0) { - topDivider.setVisibility(INVISIBLE); - } else { - topDivider.setVisibility(VISIBLE); - } - author.setAuthor(item.getAuthor()); author.setDate(item.getTimestamp()); author.setAuthorStatus(item.getStatus()); - if (item.equals(adapter.getReplyItem())) { + if (item.isHighlighted()) { layout.setActivated(true); } else if (!item.isRead()) { layout.setActivated(true); - animateFadeOut(adapter, item); + animateFadeOut(); listener.onUnreadItemVisible(item); } else { layout.setActivated(false); } } - private void animateFadeOut(final ThreadItemAdapter adapter, - final I addedItem) { - + private void animateFadeOut() { setIsRecyclable(false); ValueAnimator anim = new ValueAnimator(); - adapter.addAnimatingItem(addedItem, anim); ColorDrawable viewColor = new ColorDrawable(ContextCompat .getColor(getContext(), R.color.forum_cell_highlight)); anim.setIntValues(viewColor.getColor(), ContextCompat @@ -94,7 +77,6 @@ public abstract class BaseThreadItemViewHolder R.drawable.list_item_thread_background); layout.setActivated(false); setIsRecyclable(true); - adapter.removeAnimatingItem(addedItem); } @Override public void onAnimationCancel(Animator animation) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java index 39d00f98f..62431da9a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItem.java @@ -23,9 +23,7 @@ public abstract class ThreadItem implements MessageNode { private final Author author; private final Status status; private int level = UNDEFINED; - private boolean isShowingDescendants = true; - private int descendantCount = 0; - private boolean isRead; + private boolean isRead, highlighted; public ThreadItem(MessageId messageId, @Nullable MessageId parentId, String text, long timestamp, Author author, Status status, @@ -37,6 +35,7 @@ public abstract class ThreadItem implements MessageNode { this.author = author; this.status = status; this.isRead = isRead; + this.highlighted = false; } public String getText() { @@ -71,19 +70,11 @@ public abstract class ThreadItem implements MessageNode { return status; } - public boolean isShowingDescendants() { - return isShowingDescendants; - } - @Override public void setLevel(int level) { this.level = level; } - public void setShowingDescendants(boolean showingDescendants) { - this.isShowingDescendants = showingDescendants; - } - public boolean isRead() { return isRead; } @@ -92,13 +83,12 @@ public abstract class ThreadItem implements MessageNode { isRead = read; } - public boolean hasDescendants() { - return descendantCount > 0; + public void setHighlighted(boolean highlighted) { + this.highlighted = highlighted; } - @Override - public void setDescendantCount(int descendantCount) { - this.descendantCount = descendantCount; + public boolean isHighlighted() { + return highlighted; } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java index f663a219c..72b03a03f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java @@ -1,6 +1,5 @@ package org.briarproject.briar.android.threaded; -import android.animation.ValueAnimator; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.v7.widget.LinearLayoutManager; @@ -13,14 +12,11 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.R; import org.briarproject.briar.android.util.VersionedAdapter; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import static android.support.v7.widget.RecyclerView.NO_POSITION; +@UiThread public class ThreadItemAdapter extends RecyclerView.Adapter> implements VersionedAdapter { @@ -28,13 +24,9 @@ public class ThreadItemAdapter static final int UNDEFINED = -1; protected final NestedTreeList items = new NestedTreeList<>(); - private final Map animatingItems = new HashMap<>(); private final ThreadItemListener listener; private final LinearLayoutManager layoutManager; - @Nullable - private I replyItem; - private volatile int revision = 0; public ThreadItemAdapter(ThreadItemListener listener, @@ -53,24 +45,23 @@ public class ThreadItemAdapter @Override public void onBindViewHolder(BaseThreadItemViewHolder ui, int position) { - I item = getVisibleItem(position); - if (item == null) return; - ui.bind(this, listener, item, position); + I item = items.get(position); + ui.bind(item, listener); } - /** - * Contrary to the super class adapter, - * this returns the number of visible items, - * not all items in the dataset. - */ @Override public int getItemCount() { - return getVisiblePos(null); + return items.size(); } - @Nullable - I getReplyItem() { - return replyItem; + @Override + public int getRevision() { + return revision; + } + + @Override + public void incrementRevision() { + revision++; } public void setItems(Collection items) { @@ -81,233 +72,51 @@ public class ThreadItemAdapter public void add(I item) { items.add(item); - if (item.getParentId() == null) { - notifyItemInserted(getVisiblePos(item)); - } else { - // Try to find the item's parent and perform the proper ui update if - // it's present and visible. - for (int i = items.indexOf(item) - 1; i >= 0; i--) { - I higherItem = items.get(i); - if (higherItem.getLevel() < item.getLevel()) { - // parent found - if (higherItem.isShowingDescendants()) { - int parentVisiblePos = getVisiblePos(higherItem); - if (parentVisiblePos != NO_POSITION) { - // parent is visible, we need to update its ui - notifyItemChanged(parentVisiblePos); - // new item insert ui - int visiblePos = getVisiblePos(item); - notifyItemInserted(visiblePos); - break; - } - } else { - // do not show the new item if its parent is not showing - // descendants (this can be overridden by the user by - // pressing the snack bar) - break; - } - } - } - } + notifyItemInserted(findItemPosition(item)); } - void scrollTo(I item) { - int visiblePos = getVisiblePos(item); - MessageId parentId = item.getParentId(); - if (visiblePos == NO_POSITION && parentId != null) { - // The item is not visible due to being hidden by its parent item. - // Find the parent and make it visible and traverse up the parent - // chain if necessary to make the item visible - for (int i = items.indexOf(item) - 1; i >= 0; i--) { - I higherItem = items.get(i); - if (higherItem.getId().equals(parentId)) { - // parent found - showDescendants(higherItem); - int parentPos = getVisiblePos(higherItem); - if (parentPos != NO_POSITION) { - // parent or ancestor is visible, item's visibility - // is ensured - notifyItemChanged(parentPos); - visiblePos = parentPos; - break; - } - // parent or ancestor is hidden, we need to continue up the - // dependency chain - parentId = higherItem.getParentId(); - if (parentId == null) throw new AssertionError(); - } - } + @Nullable + public I getItemAt(int position) { + if (position == NO_POSITION || position >= items.size()) { + return null; } - if (visiblePos != NO_POSITION) - layoutManager.scrollToPositionWithOffset(visiblePos, 0); + return items.get(position); } - int getReplyCount(I item) { - int counter = 0; - int pos = items.indexOf(item); - if (pos >= 0) { - int ancestorLvl = item.getLevel(); - for (int i = pos + 1; i < items.size(); i++) { - int descendantLvl = items.get(i).getLevel(); - if (descendantLvl <= ancestorLvl) - break; - if (descendantLvl == ancestorLvl + 1) - counter++; - } + protected int findItemPosition(@Nullable I item) { + for (int i = 0; i < items.size(); i++) { + if (items.get(i).equals(item)) return i; } - return counter; + return NO_POSITION; // Not found } - void setReplyItem(@Nullable I item) { - if (replyItem != null) { - notifyItemChanged(getVisiblePos(replyItem)); - } - replyItem = item; - if (replyItem != null) { - notifyItemChanged(getVisiblePos(replyItem)); - } - } - - void setReplyItemById(MessageId id) { - for (I item : items) { - if (item.getId().equals(id)) { - setReplyItem(item); - break; - } - } - } - - private List getSubTreeIndexes(int pos, int levelLimit) { - List indexList = new ArrayList<>(); - - for (int i = pos + 1; i < getItemCount(); i++) { - I item = getVisibleItem(i); - if (item != null && item.getLevel() > levelLimit) { - indexList.add(i); - } else { - break; - } - } - return indexList; - } - - public void showDescendants(I item) { - item.setShowingDescendants(true); - int visiblePos = getVisiblePos(item); - List indexList = - getSubTreeIndexes(visiblePos, item.getLevel()); - if (!indexList.isEmpty()) { - if (indexList.size() == 1) { - notifyItemInserted(indexList.get(0)); - } else { - notifyItemRangeInserted(indexList.get(0), - indexList.size()); - } - } - } - - public void hideDescendants(I item) { - int visiblePos = getVisiblePos(item); - List indexList = - getSubTreeIndexes(visiblePos, item.getLevel()); - if (!indexList.isEmpty()) { - // stop animating children - for (int index : indexList) { - ValueAnimator anim = animatingItems.get(items.get(index)); - if (anim != null && anim.isRunning()) { - anim.cancel(); - } - } - if (indexList.size() == 1) { - notifyItemRemoved(indexList.get(0)); - } else { - notifyItemRangeRemoved(indexList.get(0), - indexList.size()); - } - } - item.setShowingDescendants(false); - } - - /** - * Returns the visible item at the given position + * Highlights the item with the given {@link MessageId} + * and disables the highlight for a previously highlighted item, if any. * - * @param position is visible item index - * @return the visible item at index 'position' from an ordered list of - * visible items, or null if 'position' is larger than the number of - * visible items. + * Only one item can be highlighted at a time. */ + void setHighlightedItem(@Nullable MessageId id) { + for (int i = 0; i < items.size(); i++) { + I item = items.get(i); + if (id != null && item.getId().equals(id)) { + item.setHighlighted(true); + notifyItemChanged(i, item); + } else if (item.isHighlighted()) { + item.setHighlighted(false); + notifyItemChanged(i, item); + } + } + } + @Nullable - public I getVisibleItem(int position) { - int levelLimit = UNDEFINED; - for (I item : items) { - if (levelLimit >= 0) { - // skip hidden items that their parent is hiding - if (item.getLevel() > levelLimit) { - continue; - } - levelLimit = UNDEFINED; - } - if (!item.isShowingDescendants()) { - levelLimit = item.getLevel(); - } - if (position-- == 0) { - return item; - } + I getHighlightedItem() { + for (I i : items) { + if (i.isHighlighted()) return i; } return null; } - /** - * Returns the visible position of the given item. - * - * @param item the item to find the visible position of, or null to - * return the total count of visible items. - * @return the visible position of 'item', or the total number of visible - * items if 'item' is null. If 'item' is not visible, NO_POSITION is - * returned. - */ - protected int getVisiblePos(@Nullable I item) { - int visibleCounter = 0; - int levelLimit = UNDEFINED; - for (I i : items) { - if (levelLimit >= 0) { - if (i.getLevel() > levelLimit) { - // skip all the items below a non visible branch - continue; - } - levelLimit = UNDEFINED; - } - if (item != null && item.equals(i)) { - return visibleCounter; - } else if (!i.isShowingDescendants()) { - levelLimit = i.getLevel(); - } - visibleCounter++; - } - return item == null ? visibleCounter : NO_POSITION; - } - - void addAnimatingItem(I item, ValueAnimator anim) { - animatingItems.put(item, anim); - } - - void removeAnimatingItem(I item) { - animatingItems.remove(item); - } - - @Override - public int getRevision() { - return revision; - } - - @UiThread - @Override - public void incrementRevision() { - revision++; - } - - /** * Gets the number of unread items above and below the current view port. * @@ -321,24 +130,13 @@ public class ThreadItemAdapter return new UnreadCount(0, 0); int unreadCounterTop = 0, unreadCounterBottom = 0; - int visibleCounter = 0; - int levelLimit = UNDEFINED; - for (I i : items) { - if (levelLimit >= 0) { - if (i.getLevel() > levelLimit) { - // skip all the items below a non visible branch - continue; - } - levelLimit = UNDEFINED; - } - if (visibleCounter > positionBottom && !i.isRead()) { - unreadCounterBottom++; - } else if (visibleCounter < positionTop && !i.isRead()) { + for (int i = 0; i < items.size(); i++) { + I item = items.get(i); + if (i < positionTop && !item.isRead()) { unreadCounterTop++; - } else if (!i.isShowingDescendants()) { - levelLimit = i.getLevel(); + } else if (i > positionBottom && !item.isRead()) { + unreadCounterBottom++; } - visibleCounter++; } return new UnreadCount(unreadCounterTop, unreadCounterBottom); } @@ -348,22 +146,9 @@ public class ThreadItemAdapter */ public int getVisibleUnreadPosBottom() { final int positionBottom = layoutManager.findLastVisibleItemPosition(); - int visibleCounter = 0; - int levelLimit = UNDEFINED; - for (I i : items) { - if (levelLimit >= 0) { - if (i.getLevel() > levelLimit) { - // skip all the items below a non visible branch - continue; - } - levelLimit = UNDEFINED; - } - if (visibleCounter > positionBottom && !i.isRead()) { - return visibleCounter; - } else if (!i.isShowingDescendants()) { - levelLimit = i.getLevel(); - } - visibleCounter++; + if (positionBottom == NO_POSITION) return NO_POSITION; + for (int i = positionBottom + 1; i < items.size(); i++) { + if (!items.get(i).isRead()) return i; } return NO_POSITION; } @@ -374,24 +159,12 @@ public class ThreadItemAdapter public int getVisibleUnreadPosTop() { final int positionTop = layoutManager.findFirstVisibleItemPosition(); int position = NO_POSITION; - int visibleCounter = 0; - int levelLimit = UNDEFINED; - for (I i : items) { - if (levelLimit >= 0) { - if (i.getLevel() > levelLimit) { - // skip all the items below a non visible branch - continue; - } - levelLimit = UNDEFINED; - } - if (visibleCounter < positionTop && !i.isRead()) { - position = visibleCounter; - } if (visibleCounter >= positionTop) { + for (int i = 0; i < items.size(); i++) { + if (i < positionTop && !items.get(i).isRead()) { + position = i; + } else if (i >= positionTop) { return position; - } else if (!i.isShowingDescendants()) { - levelLimit = i.getLevel(); } - visibleCounter++; } return NO_POSITION; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java index c43ce66e0..77ef46971 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java @@ -3,6 +3,7 @@ package org.briarproject.briar.android.threaded; import android.content.Intent; import android.os.Bundle; import android.support.annotation.CallSuper; +import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.annotation.UiThread; import android.support.design.widget.Snackbar; @@ -32,11 +33,11 @@ import org.briarproject.briar.android.view.TextInputView.TextInputListener; import org.briarproject.briar.android.view.UnreadMessageButton; import org.briarproject.briar.api.client.NamedGroup; import org.briarproject.briar.api.client.PostHeader; +import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout; import java.util.Collection; import java.util.logging.Logger; -import javax.annotation.Nullable; import javax.inject.Inject; import static android.support.design.widget.Snackbar.make; @@ -62,9 +63,11 @@ public abstract class ThreadListActivity getController(); @@ -89,9 +92,9 @@ public abstract class ThreadListActivity handler = new UiResultExceptionHandler(this) { @Override @@ -346,7 +371,7 @@ public abstract class ThreadListActivity extends BaseThreadItemViewHolder { - private final TextView lvlText, repliesText; + private final TextView lvlText; private final View[] lvls; - private final View chevron, replyButton; + private final View replyButton; + + private final static int[] nestedLineIds = { + R.id.nested_line_1, R.id.nested_line_2, R.id.nested_line_3, + R.id.nested_line_4, R.id.nested_line_5 + }; public ThreadPostViewHolder(View v) { super(v); lvlText = (TextView) v.findViewById(R.id.nested_line_text); - repliesText = (TextView) v.findViewById(R.id.replies); - int[] nestedLineIds = { - R.id.nested_line_1, R.id.nested_line_2, R.id.nested_line_3, - R.id.nested_line_4, R.id.nested_line_5 - }; lvls = new View[nestedLineIds.length]; for (int i = 0; i < lvls.length; i++) { lvls[i] = v.findViewById(nestedLineIds[i]); } - chevron = v.findViewById(R.id.chevron); replyButton = v.findViewById(R.id.btn_reply); } - // TODO improve encapsulation, so we don't need to pass the adapter here @Override - public void bind(final ThreadItemAdapter adapter, - final ThreadItemListener listener, final I item, int pos) { - super.bind(adapter, listener, item, pos); + public void bind(final I item, final ThreadItemListener listener) { + super.bind(item, listener); for (int i = 0; i < lvls.length; i++) { lvls[i].setVisibility(i < item.getLevel() ? VISIBLE : GONE); @@ -53,41 +50,10 @@ public class ThreadPostViewHolder lvlText.setVisibility(GONE); } - int replies = adapter.getReplyCount(item); - if (replies == 0) { - repliesText.setText(""); - } else { - repliesText.setText(getContext().getResources() - .getQuantityString(R.plurals.message_replies, replies, - replies)); - } - - if (item.hasDescendants()) { -// chevron.setVisibility(VISIBLE); - if (item.isShowingDescendants()) { - chevron.setSelected(false); - } else { - chevron.setSelected(true); - } - chevron.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - chevron.setSelected(!chevron.isSelected()); - if (chevron.isSelected()) { - adapter.hideDescendants(item); - } else { - adapter.showDescendants(item); - } - } - }); - } else { -// chevron.setVisibility(INVISIBLE); - } replyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onReplyClick(item); - adapter.scrollTo(item); } }); } diff --git a/briar-android/src/main/res/layout/list_item_forum.xml b/briar-android/src/main/res/layout/list_item_forum.xml index 50bd1a18a..a3881e9e7 100644 --- a/briar-android/src/main/res/layout/list_item_forum.xml +++ b/briar-android/src/main/res/layout/list_item_forum.xml @@ -60,7 +60,7 @@ tools:text="Dec 24"/> diff --git a/briar-android/src/main/res/layout/list_item_group.xml b/briar-android/src/main/res/layout/list_item_group.xml index d0b112264..19ea41eb8 100644 --- a/briar-android/src/main/res/layout/list_item_group.xml +++ b/briar-android/src/main/res/layout/list_item_group.xml @@ -97,7 +97,7 @@ - - @@ -45,6 +39,7 @@ android:layout_alignEnd="@+id/text" android:layout_alignRight="@+id/text" android:layout_below="@+id/text" + android:layout_marginBottom="@dimen/margin_medium" android:layout_toRightOf="@+id/icon" android:gravity="center_vertical" android:minHeight="24dp" @@ -57,10 +52,10 @@