GroupChatFragment section converted to RecyclerView, use of ScrollToBottom, Selection Mode adapted, contextual menu adapted

This commit is contained in:
Lucas Legrand 2018-07-24 14:05:39 +02:00
parent 46bcb41d0e
commit b0c7b191bb
3 changed files with 58 additions and 59 deletions

View file

@ -11,6 +11,7 @@
android:layout_width="30dp" android:layout_width="30dp"
android:layout_height="30dp" android:layout_height="30dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:clickable="false"
android:layout_alignParentRight="true"/> android:layout_alignParentRight="true"/>
<LinearLayout <LinearLayout

View file

@ -95,7 +95,8 @@ public class ChatEventsAdapter extends SelectableAdapter<ChatBubbleViewHolder> {
// public ChatEventsAdapter(GroupChatFragment fragment, SelectableHelper helper, LayoutInflater inflater, ArrayList<EventLog> mHistory, ArrayList<LinphoneContact> participants, ChatBubbleViewHolder.ClickListener clickListener) { // public ChatEventsAdapter(GroupChatFragment fragment, SelectableHelper helper, LayoutInflater inflater, ArrayList<EventLog> mHistory, ArrayList<LinphoneContact> participants, ChatBubbleViewHolder.ClickListener clickListener) {
super(helper); super(helper);
this.mContext = fragment.getActivity(); this.mFragment=fragment;
this.mContext = mFragment.getActivity();
this.itemResource = itemResource; this.itemResource = itemResource;
// this.mLayoutInflater = inflater; // this.mLayoutInflater = inflater;
// this.mHistory = mHistory; // this.mHistory = mHistory;
@ -135,10 +136,12 @@ public class ChatEventsAdapter extends SelectableAdapter<ChatBubbleViewHolder> {
@Override @Override
public ChatBubbleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ChatBubbleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// View v = mLayoutInflater.inflate(R.layout.chat_bubble, parent, false);
View v = LayoutInflater.from(parent.getContext()) View v = LayoutInflater.from(parent.getContext())
.inflate(this.itemResource, parent, false); .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 @Override
@ -302,42 +305,42 @@ public class ChatEventsAdapter extends SelectableAdapter<ChatBubbleViewHolder> {
holder.fileTransferAction.setVisibility(View.GONE); holder.fileTransferAction.setVisibility(View.GONE);
} else { } else {
holder.fileTransferAction.setText(mContext.getString(R.string.accept)); holder.fileTransferAction.setText(mContext.getString(R.string.accept));
// holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { holder.fileTransferAction.setOnClickListener(new View.OnClickListener() {
// @Override @Override
// public void onClick(View v) { public void onClick(View v) {
// if (mContext.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED) { if (mContext.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
// v.setEnabled(false); v.setEnabled(false);
// String filename = message.getFileTransferInformation().getName(); String filename = message.getFileTransferInformation().getName();
// File file = new File(Environment.getExternalStorageDirectory(), filename); File file = new File(Environment.getExternalStorageDirectory(), filename);
// int prefix = 1; int prefix = 1;
// while (file.exists()) { while (file.exists()) {
// file = new File(Environment.getExternalStorageDirectory(), prefix + "_" + filename); file = new File(Environment.getExternalStorageDirectory(), prefix + "_" + filename);
// Log.w("File with that name already exists, renamed to " + prefix + "_" + filename); Log.w("File with that name already exists, renamed to " + prefix + "_" + filename);
// prefix += 1; prefix += 1;
// } }
// message.setListener(mListener); message.setListener(mListener);
// message.setFileTransferFilepath(file.getPath()); message.setFileTransferFilepath(file.getPath());
// message.downloadFile(); message.downloadFile();
//
// } else { } else {
// Log.w("WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file"); Log.w("WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file");
// LinphoneActivity.instance().checkAndRequestExternalStoragePermission(); LinphoneActivity.instance().checkAndRequestExternalStoragePermission();
// } }
// } }
// }); });
} }
} else if (message.isFileTransferInProgress()) { // Outgoing file transfer in progress } else if (message.isFileTransferInProgress()) { // Outgoing file transfer in progress
message.setListener(mListener); // add the listener for file upload progress display message.setListener(mListener); // add the listener for file upload progress display
holder.messageSendingInProgress.setVisibility(View.GONE); holder.messageSendingInProgress.setVisibility(View.GONE);
holder.fileTransferLayout.setVisibility(View.VISIBLE); holder.fileTransferLayout.setVisibility(View.VISIBLE);
holder.fileTransferAction.setText(mContext.getString(R.string.cancel)); holder.fileTransferAction.setText(mContext.getString(R.string.cancel));
// holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { holder.fileTransferAction.setOnClickListener(new View.OnClickListener() {
// @Override @Override
// public void onClick(View v) { public void onClick(View v) {
// message.cancelFileTransfer(); message.cancelFileTransfer();
// notifyDataSetChanged(); notifyDataSetChanged();
// } }
// }); });
} }
holder.bubbleLayout.setLayoutParams(layoutParams); holder.bubbleLayout.setLayoutParams(layoutParams);

View file

@ -81,7 +81,6 @@ import org.linphone.ui.SelectableHelper;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static android.content.Context.INPUT_METHOD_SERVICE; import static android.content.Context.INPUT_METHOD_SERVICE;
@ -108,7 +107,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
private ArrayList<LinphoneContact> mParticipants; private ArrayList<LinphoneContact> mParticipants;
private ArrayList<EventLog> mHistory; private ArrayList<EventLog> mHistory;
private LinearLayoutManager layoutManager; private LinearLayoutManager layoutManager;
private int mContextMenuMessagePosition;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -222,7 +221,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mSelectionHelper = new SelectableHelper(view, this); mSelectionHelper = new SelectableHelper(view, this);
layoutManager = new LinearLayoutManager(mContext); layoutManager = new LinearLayoutManager(mContext);
mChatEventsList.setLayoutManager(layoutManager); mChatEventsList.setLayoutManager(layoutManager);
registerForContextMenu(mChatEventsList); // registerForContextMenu(mChatEventsList);
@ -356,12 +355,16 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
} }
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; ChatBubbleViewHolder holder = (ChatBubbleViewHolder) v.getTag();
EventLog event = (EventLog) mEventsAdapter.getItem(info.position); mContextMenuMessagePosition = holder.getAdapterPosition();
EventLog event = (EventLog) mEventsAdapter.getItem(mContextMenuMessagePosition);
// EventLog event = log.getEventLog();
if (event.getType() != EventLog.Type.ConferenceChatMessage) { if (event.getType() != EventLog.Type.ConferenceChatMessage) {
return; return;
} }
@ -374,8 +377,8 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
inflater.inflate(R.menu.chat_bubble_menu, menu); inflater.inflate(R.menu.chat_bubble_menu, menu);
} }
if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { if (!message.isOutgoing() && 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 // 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); menu.removeItem(R.id.imdn_infos);
} }
if (!message.hasTextContent()) { if (!message.hasTextContent()) {
@ -384,11 +387,18 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
} }
@Override @Override
public boolean onContextItemSelected(MenuItem item) { 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) { if (event.getType() != EventLog.Type.ConferenceChatMessage) {
return super.onContextItemSelected(item); return super.onContextItemSelected(item);
} }
@ -397,7 +407,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
String messageId = message.getMessageId(); String messageId = message.getMessageId();
if (item.getItemId() == R.id.resend) { if (item.getItemId() == R.id.resend) {
mEventsAdapter.removeItem(info.position); mEventsAdapter.removeItem(mContextMenuMessagePosition);
message.resend(); message.resend();
return true; return true;
} }
@ -415,7 +425,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
if (item.getItemId() == R.id.delete_message) { if (item.getItemId() == R.id.delete_message) {
mChatRoom.deleteMessage(message); mChatRoom.deleteMessage(message);
mEventsAdapter.removeItem(info.position); mEventsAdapter.removeItem(mContextMenuMessagePosition);
return true; return true;
} }
return super.onContextItemSelected(item); return super.onContextItemSelected(item);
@ -566,22 +576,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
mSelectionHelper.setAdapter(mEventsAdapter); mSelectionHelper.setAdapter(mEventsAdapter);
mChatEventsList.setAdapter(mEventsAdapter); mChatEventsList.setAdapter(mEventsAdapter);
scrollToBottom(); 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() { public void scrollToBottom() {