From 24b81aa8b7ada9a6ddda9b89703d7489ded7ccbc Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 10 Nov 2017 10:59:44 +0100 Subject: [PATCH] New chat room list view almost done --- .../org/linphone/chat/ChatListFragment.java | 282 ++++++------------ .../org/linphone/chat/ChatRoomsAdapter.java | 90 ++++-- 2 files changed, 144 insertions(+), 228 deletions(-) diff --git a/src/android/org/linphone/chat/ChatListFragment.java b/src/android/org/linphone/chat/ChatListFragment.java index 0c76c0659..b4b324c41 100644 --- a/src/android/org/linphone/chat/ChatListFragment.java +++ b/src/android/org/linphone/chat/ChatListFragment.java @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. package org.linphone.chat; +import android.app.Dialog; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; @@ -26,6 +27,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; +import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; @@ -46,11 +48,12 @@ import static org.linphone.fragments.FragmentsAvailable.CHAT_LIST; public class ChatListFragment extends Fragment implements OnItemClickListener, ContactsUpdatedListener { private LayoutInflater mInflater; - private ListView chatList; - private TextView noChatHistory; - private ImageView edit, selectAll, deselectAll, delete, newDiscussion, cancel, backInCall; - private LinearLayout editList, topbar; + private ListView mChatRoomsList; + private TextView mNoChatHistory; + private ImageView mEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton, mNewDiscussionButton, mCancelButton, mBackToCallButton; + private LinearLayout mEditTopBar, mTopBar; private boolean isEditMode = false; + private ChatRoomsAdapter mChatRoomsAdapter; private CoreListenerStub mListener; @Override @@ -58,69 +61,91 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C mInflater = inflater; View view = inflater.inflate(R.layout.chatlist, container, false); - chatList = view.findViewById(R.id.chatList); - chatList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater)); - chatList.setOnItemClickListener(this); + mChatRoomsList = view.findViewById(R.id.chatList); + mChatRoomsList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater)); + mChatRoomsList.setOnItemClickListener(this); - noChatHistory = view.findViewById(R.id.noChatHistory); + mNoChatHistory = view.findViewById(R.id.noChatHistory); - editList = view.findViewById(R.id.edit_list); - topbar = view.findViewById(R.id.top_bar); + mEditTopBar = view.findViewById(R.id.edit_list); + mTopBar = view.findViewById(R.id.top_bar); - cancel = view.findViewById(R.id.cancel); - cancel.setOnClickListener(new View.OnClickListener() { + mCancelButton = view.findViewById(R.id.cancel); + mCancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //TODO + quitEditionMode(); } }); - edit = view.findViewById(R.id.edit); - edit.setOnClickListener(new View.OnClickListener() { + mEditButton = view.findViewById(R.id.edit); + mEditButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //TODO + mChatRoomsAdapter.enableEdition(true); + mTopBar.setVisibility(View.GONE); + mEditTopBar.setVisibility(View.VISIBLE); } }); - newDiscussion = view.findViewById(R.id.new_discussion); - newDiscussion.setOnClickListener(new View.OnClickListener() { + mNewDiscussionButton = view.findViewById(R.id.new_discussion); + mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LinphoneActivity.instance().goToChatCreator(null, false); } }); - selectAll = view.findViewById(R.id.select_all); - selectAll.setOnClickListener(new View.OnClickListener() { + mSelectAllButton = view.findViewById(R.id.select_all); + mSelectAllButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //TODO + mChatRoomsAdapter.selectAll(); } }); - deselectAll = view.findViewById(R.id.deselect_all); - deselectAll.setOnClickListener(new View.OnClickListener() { + mDeselectAllButton = view.findViewById(R.id.deselect_all); + mDeselectAllButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //TODO + mChatRoomsAdapter.deselectAll(); } }); - backInCall = view.findViewById(R.id.back_in_call); - backInCall.setOnClickListener(new View.OnClickListener() { + mBackToCallButton = view.findViewById(R.id.back_in_call); + mBackToCallButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LinphoneActivity.instance().resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); - return; } }); - delete = view.findViewById(R.id.delete); - delete.setOnClickListener(new View.OnClickListener() { + mDeleteSelectionButton = view.findViewById(R.id.delete); + mDeleteSelectionButton.setEnabled(false); + mDeleteSelectionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //TODO + final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.delete_text)); + Button delete = dialog.findViewById(R.id.delete_button); + Button cancel = dialog.findViewById(R.id.cancel); + + delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + deleteSelectedRooms(); + dialog.dismiss(); + quitEditionMode(); + } + }); + + cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + quitEditionMode(); + } + }); + dialog.show(); } }); @@ -136,96 +161,45 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C } }; - /*ChatFragment.createIfNotExist(); - ChatFragment.addChatListener(this);*/ + mChatRoomsAdapter = new ChatRoomsAdapter(getActivity(), this, mInflater); + mChatRoomsList.setAdapter(mChatRoomsAdapter); + return view; } private void refreshChatRoomsList() { - ((ChatRoomsAdapter)chatList.getAdapter()).refresh(); + mChatRoomsAdapter.refresh(); } - /*private void selectAllList(boolean isSelectAll){ - int size = chatList.getAdapter().getCount(); - for(int i=0; i 0) { - LinphoneActivity.instance().displayChat(mConversations.get(0), null, null); - } else { - LinphoneActivity.instance().displayEmptyFragment(); - } - }*/ + private void quitEditionMode() { + mChatRoomsAdapter.enableEdition(false); + mTopBar.setVisibility(View.VISIBLE); + mEditTopBar.setVisibility(View.GONE); + mDeleteSelectionButton.setEnabled(false); + mSelectAllButton.setVisibility(View.VISIBLE); + mDeselectAllButton.setVisibility(View.GONE); + } @Override public void onResume() { @@ -233,9 +207,9 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C ContactsManager.addContactsListener(this); if (LinphoneManager.getLc().getCallsNb() > 0) { - backInCall.setVisibility(View.VISIBLE); + mBackToCallButton.setVisibility(View.VISIBLE); } else { - backInCall.setVisibility(View.INVISIBLE); + mBackToCallButton.setVisibility(View.INVISIBLE); } if (LinphoneActivity.isInstanciated()) { @@ -266,7 +240,7 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != CHAT_LIST) return; - ChatRoomsAdapter adapter = (ChatRoomsAdapter)chatList.getAdapter(); + ChatRoomsAdapter adapter = (ChatRoomsAdapter) mChatRoomsList.getAdapter(); if (adapter != null) { adapter.notifyDataSetInvalidated(); } @@ -274,98 +248,12 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C @Override public void onItemClick(AdapterView adapter, View view, int position, long id) { - ChatRoom chatRoom = (ChatRoom) chatList.getAdapter().getItem(position); + ChatRoom chatRoom = (ChatRoom) mChatRoomsList.getAdapter().getItem(position); if (LinphoneActivity.isInstanciated() && !isEditMode) { LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asString()); } } - - /*@Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - menu.add(0, v.getId(), 0, getString(R.string.delete)); - }*/ - - /*@Override - public boolean onContextItemSelected(MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - if (info == null || info.targetView == null) { - return false; - } - String sipUri = chatList.getAdapter().getItem(info.position).toString(); - - LinphoneActivity.instance().removeFromChatList(sipUri); - refreshChatRoomsList(); - if (getResources().getBoolean(R.bool.isTablet)) { - quitEditMode(); - } - hideAndDisplayMessageIfNoChat(); - return true; - }*/ - - /*@Override - public void onClick(View v) { - int id = v.getId(); - - - if (id == R.id.select_all) { - deselectAll.setVisibility(View.VISIBLE); - selectAll.setVisibility(View.GONE); - enabledDeleteButton(true); - selectAllList(true); - return; - } - if (id == R.id.deselect_all) { - deselectAll.setVisibility(View.GONE); - selectAll.setVisibility(View.VISIBLE); - enabledDeleteButton(false); - selectAllList(false); - return; - } - - if (id == R.id.cancel) { - quitEditMode(); - return; - } - - if (id == R.id.delete) { - final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.delete_text)); - Button delete = dialog.findViewById(R.id.delete_button); - Button cancel = dialog.findViewById(R.id.cancel); - - delete.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - removeChatsConversation(); - dialog.dismiss(); - quitEditMode(); - } - }); - - cancel.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - quitEditMode(); - } - }); - dialog.show(); - return; - } - else if (id == R.id.edit) { - topbar.setVisibility(View.GONE); - editList.setVisibility(View.VISIBLE); - isEditMode = true; - hideAndDisplayMessageIfNoChat(); - enabledDeleteButton(false); - } - }*/ - - /*@Override - public void onChatUpdated() { - refreshChatRoomsList(); - }*/ } diff --git a/src/android/org/linphone/chat/ChatRoomsAdapter.java b/src/android/org/linphone/chat/ChatRoomsAdapter.java index bad1d565d..7c7a70fd7 100644 --- a/src/android/org/linphone/chat/ChatRoomsAdapter.java +++ b/src/android/org/linphone/chat/ChatRoomsAdapter.java @@ -28,6 +28,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; @@ -46,12 +47,13 @@ import java.util.Arrays; import java.util.List; public class ChatRoomsAdapter extends BaseAdapter { + private class ChatRoomViewHolder { public TextView lastMessageView; public TextView date; public TextView displayName; public TextView unreadMessages; - public CheckBox select; + public CheckBox delete; public ImageView contactPicture; public ChatRoomViewHolder(View view) { @@ -59,7 +61,7 @@ public class ChatRoomsAdapter extends BaseAdapter { date = view.findViewById(R.id.date); displayName = view.findViewById(R.id.sipUri); unreadMessages = view.findViewById(R.id.unreadMessages); - select = view.findViewById(R.id.delete_chatroom); + delete = view.findViewById(R.id.delete_chatroom); contactPicture = view.findViewById(R.id.contact_picture); } } @@ -69,6 +71,20 @@ public class ChatRoomsAdapter extends BaseAdapter { private List mRooms; private LayoutInflater mLayoutInflater; private Bitmap mDefaultBitmap, mDefaultGroupBitmap; + private boolean mIsEditionEnabled; + private List mSelectedItems; + private CompoundButton.OnCheckedChangeListener mDeleteCheckboxListener = new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + Integer position = (Integer)compoundButton.getTag(); + if (checked) { + mSelectedItems.add(position); + } else { + mSelectedItems.remove(position); + } + mFragment.updateSelectionButtons(mSelectedItems.size() == 0, mSelectedItems.size() == mRooms.size()); + } + }; public ChatRoomsAdapter(Context context, ChatListFragment fragment, LayoutInflater inflater) { mContext = context; @@ -77,6 +93,8 @@ public class ChatRoomsAdapter extends BaseAdapter { mRooms = new ArrayList<>(); mDefaultBitmap = ContactsManager.getInstance().getDefaultAvatarBitmap(); mDefaultGroupBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chat_group_avatar); + mIsEditionEnabled = false; + mSelectedItems = new ArrayList<>(); } public void refresh() { @@ -88,6 +106,36 @@ public class ChatRoomsAdapter extends BaseAdapter { * List edition */ + public void enableEdition(boolean enable) { + mIsEditionEnabled = enable; + notifyDataSetInvalidated(); + mSelectedItems.clear(); + } + + public ChatRoom[] getSelectedItems() { + ChatRoom rooms[] = new ChatRoom[mSelectedItems.size()]; + int index = 0; + for (Integer i : mSelectedItems) { + rooms[index] = (ChatRoom)getItem(i); + index++; + } + return rooms; + } + + public void selectAll() { + for (Integer i = 0; i < mRooms.size(); i++) { + mSelectedItems.add(i); + } + mFragment.updateSelectionButtons(false, true); + notifyDataSetInvalidated(); + } + + public void deselectAll() { + mSelectedItems.clear(); + mFragment.updateSelectionButtons(true, false); + notifyDataSetInvalidated(); + } + /** * Adapter's methods */ @@ -190,36 +238,16 @@ public class ChatRoomsAdapter extends BaseAdapter { holder.displayName.setTypeface(null, Typeface.NORMAL); } - /*if (isEditMode) { + if (mIsEditionEnabled) { holder.unreadMessages.setVisibility(View.GONE); - holder.select.setVisibility(View.VISIBLE); - holder.select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - chatList.setItemChecked(position, b); - if (getNbItemsChecked() == getCount()) { - deselectAll.setVisibility(View.VISIBLE); - selectAll.setVisibility(View.GONE); - enabledDeleteButton(true); - } else { - if (getNbItemsChecked() == 0) { - deselectAll.setVisibility(View.GONE); - selectAll.setVisibility(View.VISIBLE); - enabledDeleteButton(false); - } else { - deselectAll.setVisibility(View.GONE); - selectAll.setVisibility(View.VISIBLE); - enabledDeleteButton(true); - } - } - } - }); - if (chatList.isItemChecked(position)) { - holder.select.setChecked(true); - } else { - holder.select.setChecked(false); - } - }*/ + holder.delete.setOnCheckedChangeListener(null); + holder.delete.setVisibility(View.VISIBLE); + holder.delete.setChecked(mSelectedItems.contains(position)); + holder.delete.setTag(position); + holder.delete.setOnCheckedChangeListener(mDeleteCheckboxListener); + } else { + holder.delete.setVisibility(mIsEditionEnabled ? View.VISIBLE : View.GONE); + } return view; } }