From b0c7b191bb42f3ff48cb1eeca433e820f54828c5 Mon Sep 17 00:00:00 2001 From: Lucas Legrand Date: Tue, 24 Jul 2018 14:05:39 +0200 Subject: [PATCH] GroupChatFragment section converted to RecyclerView, use of ScrollToBottom, Selection Mode adapted, contextual menu adapted --- res/layout/chat_bubble.xml | 1 + .../org/linphone/chat/ChatEventsAdapter.java | 69 ++++++++++--------- .../org/linphone/chat/GroupChatFragment.java | 47 ++++++------- 3 files changed, 58 insertions(+), 59 deletions(-) diff --git a/res/layout/chat_bubble.xml b/res/layout/chat_bubble.xml index 1933f372a..0942f2127 100644 --- a/res/layout/chat_bubble.xml +++ b/res/layout/chat_bubble.xml @@ -11,6 +11,7 @@ android:layout_width="30dp" android:layout_height="30dp" android:adjustViewBounds="true" + android:clickable="false" android:layout_alignParentRight="true"/> { // public ChatEventsAdapter(GroupChatFragment fragment, SelectableHelper helper, LayoutInflater inflater, ArrayList mHistory, ArrayList participants, ChatBubbleViewHolder.ClickListener clickListener) { super(helper); - this.mContext = fragment.getActivity(); + this.mFragment=fragment; + this.mContext = mFragment.getActivity(); this.itemResource = itemResource; // this.mLayoutInflater = inflater; // this.mHistory = mHistory; @@ -135,10 +136,12 @@ public class ChatEventsAdapter extends SelectableAdapter { @Override public ChatBubbleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { -// View v = mLayoutInflater.inflate(R.layout.chat_bubble, parent, false); View v = LayoutInflater.from(parent.getContext()) .inflate(this.itemResource, parent, false); - return new ChatBubbleViewHolder(this.mContext,v, clickListener); + ChatBubbleViewHolder VH = new ChatBubbleViewHolder(this.mContext,v, clickListener); + mFragment.registerForContextMenu(v); + v.setTag(VH); + return VH; } @Override @@ -302,42 +305,42 @@ public class ChatEventsAdapter extends SelectableAdapter { holder.fileTransferAction.setVisibility(View.GONE); } else { holder.fileTransferAction.setText(mContext.getString(R.string.accept)); -// holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// if (mContext.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED) { -// v.setEnabled(false); -// String filename = message.getFileTransferInformation().getName(); -// File file = new File(Environment.getExternalStorageDirectory(), filename); -// int prefix = 1; -// while (file.exists()) { -// file = new File(Environment.getExternalStorageDirectory(), prefix + "_" + filename); -// Log.w("File with that name already exists, renamed to " + prefix + "_" + filename); -// prefix += 1; -// } -// message.setListener(mListener); -// message.setFileTransferFilepath(file.getPath()); -// message.downloadFile(); -// -// } else { -// Log.w("WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file"); -// LinphoneActivity.instance().checkAndRequestExternalStoragePermission(); -// } -// } -// }); + holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mContext.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED) { + v.setEnabled(false); + String filename = message.getFileTransferInformation().getName(); + File file = new File(Environment.getExternalStorageDirectory(), filename); + int prefix = 1; + while (file.exists()) { + file = new File(Environment.getExternalStorageDirectory(), prefix + "_" + filename); + Log.w("File with that name already exists, renamed to " + prefix + "_" + filename); + prefix += 1; + } + message.setListener(mListener); + message.setFileTransferFilepath(file.getPath()); + message.downloadFile(); + + } else { + Log.w("WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file"); + LinphoneActivity.instance().checkAndRequestExternalStoragePermission(); + } + } + }); } } else if (message.isFileTransferInProgress()) { // Outgoing file transfer in progress message.setListener(mListener); // add the listener for file upload progress display holder.messageSendingInProgress.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.VISIBLE); holder.fileTransferAction.setText(mContext.getString(R.string.cancel)); -// holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// message.cancelFileTransfer(); -// notifyDataSetChanged(); -// } -// }); + holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + message.cancelFileTransfer(); + notifyDataSetChanged(); + } + }); } holder.bubbleLayout.setLayoutParams(layoutParams); diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index 7684f13ec..18e550e94 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -81,7 +81,6 @@ import org.linphone.ui.SelectableHelper; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static android.content.Context.INPUT_METHOD_SERVICE; @@ -108,7 +107,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con private ArrayList mParticipants; private ArrayList mHistory; private LinearLayoutManager layoutManager; - + private int mContextMenuMessagePosition; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -222,7 +221,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con mSelectionHelper = new SelectableHelper(view, this); layoutManager = new LinearLayoutManager(mContext); mChatEventsList.setLayoutManager(layoutManager); - registerForContextMenu(mChatEventsList); +// registerForContextMenu(mChatEventsList); @@ -356,12 +355,16 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } } + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; - EventLog event = (EventLog) mEventsAdapter.getItem(info.position); + ChatBubbleViewHolder holder = (ChatBubbleViewHolder) v.getTag(); + mContextMenuMessagePosition = holder.getAdapterPosition(); + + EventLog event = (EventLog) mEventsAdapter.getItem(mContextMenuMessagePosition); +// EventLog event = log.getEventLog(); if (event.getType() != EventLog.Type.ConferenceChatMessage) { return; } @@ -374,8 +377,8 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con inflater.inflate(R.menu.chat_bubble_menu, menu); } - if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { - // Do not show messages' IDMN state in 1 to 1 chat room as it is already visible in the lower corner of the bubble + if (!message.isOutgoing() && mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { + // Do not show incoming messages IDMN state in 1 to 1 chat room as we don't receive IMDN for them menu.removeItem(R.id.imdn_infos); } if (!message.hasTextContent()) { @@ -384,11 +387,18 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } } + + @Override public boolean onContextItemSelected(MenuItem item) { - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); +// AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); +// + + + + EventLog event = (EventLog) mEventsAdapter.getItem(mContextMenuMessagePosition); +// EventLog event = (EventLog) mEventsAdapter.getItem(info.position); - EventLog event = (EventLog) mEventsAdapter.getItem(info.position); if (event.getType() != EventLog.Type.ConferenceChatMessage) { return super.onContextItemSelected(item); } @@ -397,7 +407,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con String messageId = message.getMessageId(); if (item.getItemId() == R.id.resend) { - mEventsAdapter.removeItem(info.position); + mEventsAdapter.removeItem(mContextMenuMessagePosition); message.resend(); return true; } @@ -415,7 +425,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } if (item.getItemId() == R.id.delete_message) { mChatRoom.deleteMessage(message); - mEventsAdapter.removeItem(info.position); + mEventsAdapter.removeItem(mContextMenuMessagePosition); return true; } return super.onContextItemSelected(item); @@ -566,22 +576,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } mSelectionHelper.setAdapter(mEventsAdapter); mChatEventsList.setAdapter(mEventsAdapter); - - scrollToBottom(); - /*if (mChatRoom == null) return; - if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { - EventLog[] history = mChatRoom.getHistoryMessageEvents(0); - mHistory = new ArrayList<>(Arrays.asList(history)); - mEventsAdapter = new ChatEventsAdapter(this, mSelectionHelper, R.layout.chat_bubble, mHistory, mParticipants, this); -// mChatRoomsAdapter = new ChatRoomsAdapter(mContext, R.layout.chatlist_cell, mRooms,this, mSelectionHelper); - } else { - EventLog[] history = mChatRoom.getHistoryEvents(0); - mHistory = new ArrayList<>(Arrays.asList(history)); - mEventsAdapter = new ChatEventsAdapter(this, mSelectionHelper, R.layout.chat_bubble, mHistory, mParticipants, this); - } - mChatEventsList.setAdapter(mEventsAdapter); - mSelectionHelper.setAdapter(mEventsAdapter);*/ } public void scrollToBottom() {