diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java
index fcab9f4ad..cdc1ea72b 100644
--- a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java
+++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java
@@ -100,7 +100,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem.
- */
-
-package com.nextcloud.talk.adapters.items;
-
-import android.content.res.Resources;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.view.View;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-
-import com.facebook.drawee.backends.pipeline.Fresco;
-import com.facebook.drawee.interfaces.DraweeController;
-import com.facebook.drawee.view.SimpleDraweeView;
-import com.nextcloud.talk.R;
-import com.nextcloud.talk.application.NextcloudTalkApplication;
-import com.nextcloud.talk.events.MoreMenuClickEvent;
-import com.nextcloud.talk.models.database.UserEntity;
-import com.nextcloud.talk.models.json.conversations.Conversation;
-import com.nextcloud.talk.utils.ApiUtils;
-import com.nextcloud.talk.utils.DisplayUtils;
-
-import org.greenrobot.eventbus.EventBus;
-
-import java.util.List;
-import java.util.regex.Pattern;
-
-import androidx.emoji.widget.EmojiTextView;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import eu.davidea.flexibleadapter.FlexibleAdapter;
-import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
-import eu.davidea.flexibleadapter.items.IFilterable;
-import eu.davidea.flexibleadapter.items.ISectionable;
-import eu.davidea.flexibleadapter.utils.FlexibleUtils;
-import eu.davidea.viewholders.FlexibleViewHolder;
-
-public class CallItem extends AbstractFlexibleItem implements ISectionable, IFilterable {
-
- private Conversation conversation;
- private UserEntity userEntity;
- private GenericTextHeaderItem header;
-
- public CallItem(Conversation conversation, UserEntity userEntity) {
- this.conversation = conversation;
- this.userEntity = userEntity;
- }
-
- public CallItem(Conversation conversation, UserEntity userEntity, GenericTextHeaderItem genericTextHeaderItem) {
- this.conversation = conversation;
- this.userEntity = userEntity;
- this.header = genericTextHeaderItem;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof CallItem) {
- CallItem inItem = (CallItem) o;
- return conversation.equals(inItem.getModel());
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return conversation.hashCode();
- }
-
- /**
- * @return the model object
- */
-
- public Conversation getModel() {
- return conversation;
- }
-
- /**
- * Filter is applied to the model fields.
- */
-
- @Override
- public int getLayoutRes() {
- return R.layout.rv_item_conversation;
- }
-
- @Override
- public RoomItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
- return new RoomItemViewHolder(view, adapter);
- }
-
- @Override
- public void bindViewHolder(final FlexibleAdapter adapter, RoomItemViewHolder holder, int position, List payloads) {
- if (adapter.hasFilter()) {
- FlexibleUtils.highlightText(holder.roomDisplayName, conversation.getDisplayName(),
- String.valueOf(adapter.getFilter(String.class)), NextcloudTalkApplication.Companion.getSharedApplication()
- .getResources().getColor(R.color.colorPrimary));
- } else {
- holder.roomDisplayName.setText(conversation.getDisplayName());
- }
-
- if (conversation.getLastPing() == 0) {
- holder.roomLastPing.setText(R.string.nc_never);
- } else {
- holder.roomLastPing.setText(DateUtils.getRelativeTimeSpanString(conversation.getLastPing() * 1000L,
- System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE));
- }
-
- if (conversation.hasPassword) {
- holder.passwordProtectedImageView.setVisibility(View.VISIBLE);
- } else {
- holder.passwordProtectedImageView.setVisibility(View.GONE);
- }
-
- Resources resources = NextcloudTalkApplication.Companion.getSharedApplication().getResources();
- switch (conversation.getType()) {
- case ROOM_TYPE_ONE_TO_ONE_CALL:
- holder.avatarImageView.setVisibility(View.VISIBLE);
-
- holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
- .nc_description_more_menu_one_to_one), conversation.getDisplayName()));
-
- if (!TextUtils.isEmpty(conversation.getName())) {
- DraweeController draweeController = Fresco.newDraweeControllerBuilder()
- .setOldController(holder.avatarImageView.getController())
- .setAutoPlayAnimations(true)
- .setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
- conversation.getName(),
- R.dimen.avatar_size), null))
- .build();
- holder.avatarImageView.setController(draweeController);
- } else {
- holder.avatarImageView.setVisibility(View.GONE);
- }
- break;
- case ROOM_GROUP_CALL:
- holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
- .nc_description_more_menu_group), conversation.getDisplayName()));
- holder.avatarImageView.setActualImageResource(R.drawable.ic_circular_group);
- holder.avatarImageView.setVisibility(View.VISIBLE);
- break;
- case ROOM_PUBLIC_CALL:
- holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
- .nc_description_more_menu_public), conversation.getDisplayName()));
- holder.avatarImageView.setActualImageResource(R.drawable.ic_circular_link);
- holder.avatarImageView.setVisibility(View.VISIBLE);
- break;
- default:
- holder.avatarImageView.setVisibility(View.GONE);
-
- }
-
- holder.moreMenuButton.setOnClickListener(view -> EventBus.getDefault().post(new MoreMenuClickEvent(conversation)));
- }
-
- @Override
- public boolean filter(String constraint) {
- return conversation.getDisplayName() != null &&
- Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(conversation.getDisplayName().trim()).find();
- }
-
- @Override
- public GenericTextHeaderItem getHeader() {
- return header;
- }
-
- @Override
- public void setHeader(GenericTextHeaderItem header) {
- this.header = header;
- }
-
- static class RoomItemViewHolder extends FlexibleViewHolder {
-
- @BindView(R.id.name_text)
- public EmojiTextView roomDisplayName;
- @BindView(R.id.secondary_text)
- public EmojiTextView roomLastPing;
- @BindView(R.id.avatar_image)
- public SimpleDraweeView avatarImageView;
- @BindView(R.id.more_menu)
- public ImageButton moreMenuButton;
- @BindView(R.id.password_protected_image_view)
- ImageView passwordProtectedImageView;
-
- RoomItemViewHolder(View view, FlexibleAdapter adapter) {
- super(view, adapter);
- ButterKnife.bind(this, view);
- }
- }
-}
diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
index 0f04addf8..40c3cdf49 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
+++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
@@ -65,7 +65,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.kennyc.bottomsheet.BottomSheet;
import com.nextcloud.talk.R;
import com.nextcloud.talk.activities.MainActivity;
-import com.nextcloud.talk.adapters.items.CallItem;
import com.nextcloud.talk.adapters.items.ConversationItem;
import com.nextcloud.talk.adapters.items.GenericTextHeaderItem;
import com.nextcloud.talk.api.NcApi;
@@ -183,9 +182,9 @@ public class ConversationsListController extends BaseController implements Searc
private Disposable roomsQueryDisposable;
private Disposable openConversationsQueryDisposable;
private FlexibleAdapter adapter;
- private List callItems = new ArrayList<>();
- private List callItemsWithHeader = new ArrayList<>();
- private List searchableCallItems = new ArrayList<>();
+ private List conversationItems = new ArrayList<>();
+ private List conversationItemsWithHeader = new ArrayList<>();
+ private final List searchableConversationItems = new ArrayList<>();
private BottomSheet bottomSheet;
private MenuItem searchItem;
@@ -193,7 +192,6 @@ public class ConversationsListController extends BaseController implements Searc
private String searchQuery;
private View view;
- private boolean shouldUseLastMessageLayout;
private String credentials;
@@ -246,7 +244,7 @@ public class ConversationsListController extends BaseController implements Searc
}
if (adapter == null) {
- adapter = new FlexibleAdapter<>(callItems, getActivity(), true);
+ adapter = new FlexibleAdapter<>(conversationItems, getActivity(), true);
} else {
loadingContent.setVisibility(View.GONE);
}
@@ -309,8 +307,6 @@ public class ConversationsListController extends BaseController implements Searc
}
credentials = ApiUtils.getCredentials(currentUser.getUsername(), currentUser.getToken());
- shouldUseLastMessageLayout = CapabilitiesUtil.hasSpreedFeatureCapability(currentUser,
- "last-room-activity");
if (getActivity() != null && getActivity() instanceof MainActivity) {
loadUserAvatar(((MainActivity) getActivity()).binding.switchAccountButton);
}
@@ -372,7 +368,7 @@ public class ConversationsListController extends BaseController implements Searc
} else {
MainActivity activity = (MainActivity) getActivity();
- searchItem.setVisible(callItems.size() > 0);
+ searchItem.setVisible(conversationItems.size() > 0);
if (activity != null) {
if (adapter.hasFilter()) {
showSearchView(activity, searchView, searchItem);
@@ -409,7 +405,7 @@ public class ConversationsListController extends BaseController implements Searc
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
adapter.setHeadersShown(true);
- adapter.updateDataSet(searchableCallItems, false);
+ adapter.updateDataSet(searchableConversationItems, false);
adapter.showAllHeaders();
swipeRefreshLayout.setEnabled(false);
return true;
@@ -418,7 +414,7 @@ public class ConversationsListController extends BaseController implements Searc
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
adapter.setHeadersShown(false);
- adapter.updateDataSet(callItems, false);
+ adapter.updateDataSet(conversationItems, false);
adapter.hideAllHeaders();
swipeRefreshLayout.setEnabled(true);
@@ -478,8 +474,8 @@ public class ConversationsListController extends BaseController implements Searc
isRefreshing = true;
- callItems = new ArrayList<>();
- callItemsWithHeader = new ArrayList<>();
+ conversationItems = new ArrayList<>();
+ conversationItemsWithHeader = new ArrayList<>();
int apiVersion = ApiUtils.getConversationApiVersion(currentUser, new int[]{ApiUtils.APIv4, ApiUtils.APIv3, 1});
@@ -528,41 +524,26 @@ public class ConversationsListController extends BaseController implements Searc
callHeaderItems.put(headerTitle, genericTextHeaderItem);
}
- if (shouldUseLastMessageLayout) {
- if (getActivity() != null) {
- ConversationItem conversationItem = new ConversationItem(
- conversation,
- currentUser,
- getActivity());
- callItems.add(conversationItem);
-
- ConversationItem conversationItemWithHeader = new ConversationItem(
- conversation,
- currentUser,
- getActivity(),
- callHeaderItems.get(headerTitle));
-
- callItemsWithHeader.add(conversationItemWithHeader);
- }
- } else {
- CallItem callItem = new CallItem(
- conversation,
- currentUser);
- callItems.add(callItem);
-
- CallItem callItemWithHeader = new CallItem(
+ if (getActivity() != null) {
+ ConversationItem conversationItem = new ConversationItem(
conversation,
currentUser,
- callHeaderItems.get(headerTitle));
+ getActivity());
+ conversationItems.add(conversationItem);
- callItemsWithHeader.add(callItemWithHeader);
+ ConversationItem conversationItemWithHeader = new ConversationItem(
+ conversation,
+ currentUser,
+ getActivity(),
+ callHeaderItems.get(headerTitle));
+ conversationItemsWithHeader.add(conversationItemWithHeader);
}
}
- sortConversations(callItems);
- sortConversations(callItemsWithHeader);
+ sortConversations(conversationItems);
+ sortConversations(conversationItemsWithHeader);
- adapter.updateDataSet(callItems, false);
+ adapter.updateDataSet(conversationItems, false);
new Handler().postDelayed(this::checkToShowUnreadBubble, UNREAD_BUBBLE_DELAY);
@@ -597,26 +578,20 @@ public class ConversationsListController extends BaseController implements Searc
});
}
- private void sortConversations(List callItems) {
- if (CapabilitiesUtil.hasSpreedFeatureCapability(currentUser, "last-room-activity")) {
- Collections.sort(callItems, (o1, o2) -> {
- Conversation conversation1 = ((ConversationItem) o1).getModel();
- Conversation conversation2 = ((ConversationItem) o2).getModel();
- return new CompareToBuilder()
- .append(conversation2.isFavorite(), conversation1.isFavorite())
- .append(conversation2.getLastActivity(), conversation1.getLastActivity())
- .toComparison();
- });
- } else {
- Collections.sort(callItems, (callItem, t1) ->
- Long.compare(((CallItem) t1).getModel().getLastPing(),
- ((CallItem) callItem).getModel().getLastPing()));
- }
+ private void sortConversations(List conversationItems) {
+ Collections.sort(conversationItems, (o1, o2) -> {
+ Conversation conversation1 = ((ConversationItem) o1).getModel();
+ Conversation conversation2 = ((ConversationItem) o2).getModel();
+ return new CompareToBuilder()
+ .append(conversation2.isFavorite(), conversation1.isFavorite())
+ .append(conversation2.getLastActivity(), conversation1.getLastActivity())
+ .toComparison();
+ });
}
private void fetchOpenConversations(int apiVersion){
- searchableCallItems.clear();
- searchableCallItems.addAll(callItemsWithHeader);
+ searchableConversationItems.clear();
+ searchableConversationItems.addAll(conversationItemsWithHeader);
if (CapabilitiesUtil.hasSpreedFeatureCapability(currentUser, "listable-rooms")) {
List openConversationItems = new ArrayList<>();
@@ -637,20 +612,15 @@ public class ConversationsListController extends BaseController implements Searc
callHeaderItems.put(headerTitle, genericTextHeaderItem);
}
+ ConversationItem conversationItem = new ConversationItem(
+ conversation,
+ currentUser,
+ getActivity(),
+ callHeaderItems.get(headerTitle));
- if (shouldUseLastMessageLayout) {
- if (getActivity() != null) {
- ConversationItem conversationItem = new ConversationItem(conversation
- , currentUser, getActivity(), callHeaderItems.get(headerTitle));
- openConversationItems.add(conversationItem);
- }
- } else {
- CallItem callItem = new CallItem(conversation, currentUser, callHeaderItems.get(headerTitle));
- openConversationItems.add(callItem);
- }
+ openConversationItems.add(conversationItem);
}
-
- searchableCallItems.addAll(openConversationItems);
+ searchableConversationItems.addAll(openConversationItems);
}, throwable -> {
handleHttpExceptions(throwable);
@@ -746,7 +716,7 @@ public class ConversationsListController extends BaseController implements Searc
private void checkToShowUnreadBubble() {
try {
int lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
- for (AbstractFlexibleItem flexItem : callItems) {
+ for (AbstractFlexibleItem flexItem : conversationItems) {
Conversation conversationItem = ((ConversationItem) flexItem).getModel();
int position = adapter.getGlobalPositionOf(flexItem);
if ((conversationItem.unreadMention ||
@@ -902,7 +872,7 @@ public class ConversationsListController extends BaseController implements Searc
@Override
public boolean onItemClick(View view, int position) {
- selectedConversation = getConversation(position);
+ selectedConversation = ((ConversationItem) Objects.requireNonNull(adapter.getItem(position))).getModel();
if (selectedConversation != null && getActivity() != null) {
if (showShareToScreen) {
handleSharedData();
@@ -973,20 +943,13 @@ public class ConversationsListController extends BaseController implements Searc
@Override
public void onItemLongClick(int position) {
-
if (showShareToScreen) {
Log.d(TAG, "sharing to multiple rooms not yet implemented. onItemLongClick is ignored.");
- } else if (CapabilitiesUtil.hasSpreedFeatureCapability(currentUser, "last-room-activity")) {
+ } else {
Object clickedItem = adapter.getItem(position);
if (clickedItem != null) {
- Conversation conversation;
- if (shouldUseLastMessageLayout) {
- conversation = ((ConversationItem) clickedItem).getModel();
- } else {
- conversation = ((CallItem) clickedItem).getModel();
- }
-
+ Conversation conversation = ((ConversationItem) clickedItem).getModel();
MoreMenuClickEvent moreMenuClickEvent = new MoreMenuClickEvent(conversation);
onMessageEvent(moreMenuClickEvent);
}
@@ -1110,17 +1073,6 @@ public class ConversationsListController extends BaseController implements Searc
}
}
- private Conversation getConversation(int position) {
- Object clickedItem = adapter.getItem(position);
- Conversation conversation;
- if (shouldUseLastMessageLayout) {
- conversation = ((ConversationItem) clickedItem).getModel();
- } else {
- conversation = ((CallItem) clickedItem).getModel();
- }
- return conversation;
- }
-
@Subscribe(sticky = true, threadMode = ThreadMode.BACKGROUND)
public void onMessageEvent(EventStatus eventStatus) {
if (currentUser != null && eventStatus.getUserId() == currentUser.getId()) {
diff --git a/app/src/main/res/layout/account_item.xml b/app/src/main/res/layout/account_item.xml
index 004cd3f3b..d14829831 100644
--- a/app/src/main/res/layout/account_item.xml
+++ b/app/src/main/res/layout/account_item.xml
@@ -57,16 +57,6 @@
fresco:placeholderImage="@drawable/account_circle_48dp"
fresco:failureImage="@drawable/account_circle_48dp"
app:roundAsCircle="true"/>
-
-
@@ -80,7 +70,7 @@
android:paddingStart="3dp"
android:paddingEnd="0dp">
-
-
-
-
-
diff --git a/app/src/main/res/layout/controller_call_menu.xml b/app/src/main/res/layout/controller_call_menu.xml
index 85c8d822e..06a836a81 100644
--- a/app/src/main/res/layout/controller_call_menu.xml
+++ b/app/src/main/res/layout/controller_call_menu.xml
@@ -27,8 +27,7 @@
+ android:layout_height="wrap_content" />
diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml
index 62b263c5c..d571421cd 100644
--- a/app/src/main/res/layout/controller_conversations_rv.xml
+++ b/app/src/main/res/layout/controller_conversations_rv.xml
@@ -103,8 +103,7 @@
+ android:layout_height="match_parent" />
diff --git a/app/src/main/res/layout/controller_generic_rv.xml b/app/src/main/res/layout/controller_generic_rv.xml
index 66cfe6cda..3178906d1 100644
--- a/app/src/main/res/layout/controller_generic_rv.xml
+++ b/app/src/main/res/layout/controller_generic_rv.xml
@@ -43,6 +43,5 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_anchor="@+id/swipe_refresh_layout"
- app:layout_anchorGravity="center"
- tools:listitem="@layout/rv_item_conversation" />
+ app:layout_anchorGravity="center" />
diff --git a/app/src/main/res/layout/current_account_item.xml b/app/src/main/res/layout/current_account_item.xml
new file mode 100644
index 000000000..5e6ab4d57
--- /dev/null
+++ b/app/src/main/res/layout/current_account_item.xml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_choose_account.xml b/app/src/main/res/layout/dialog_choose_account.xml
index 3e84ff898..b15e29920 100644
--- a/app/src/main/res/layout/dialog_choose_account.xml
+++ b/app/src/main/res/layout/dialog_choose_account.xml
@@ -23,7 +23,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-