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 @@ - - - - - - - - - - - - - - - - - - - - - -