New chat room list view almost done

This commit is contained in:
Sylvain Berfini 2017-11-10 10:59:44 +01:00
parent cf7032dea9
commit 24b81aa8b7
2 changed files with 144 additions and 228 deletions

View file

@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
package org.linphone.chat; package org.linphone.chat;
import android.app.Dialog;
import android.app.Fragment; import android.app.Fragment;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -26,6 +27,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
@ -46,11 +48,12 @@ import static org.linphone.fragments.FragmentsAvailable.CHAT_LIST;
public class ChatListFragment extends Fragment implements OnItemClickListener, ContactsUpdatedListener { public class ChatListFragment extends Fragment implements OnItemClickListener, ContactsUpdatedListener {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ListView chatList; private ListView mChatRoomsList;
private TextView noChatHistory; private TextView mNoChatHistory;
private ImageView edit, selectAll, deselectAll, delete, newDiscussion, cancel, backInCall; private ImageView mEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton, mNewDiscussionButton, mCancelButton, mBackToCallButton;
private LinearLayout editList, topbar; private LinearLayout mEditTopBar, mTopBar;
private boolean isEditMode = false; private boolean isEditMode = false;
private ChatRoomsAdapter mChatRoomsAdapter;
private CoreListenerStub mListener; private CoreListenerStub mListener;
@Override @Override
@ -58,69 +61,91 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
mInflater = inflater; mInflater = inflater;
View view = inflater.inflate(R.layout.chatlist, container, false); View view = inflater.inflate(R.layout.chatlist, container, false);
chatList = view.findViewById(R.id.chatList); mChatRoomsList = view.findViewById(R.id.chatList);
chatList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater)); mChatRoomsList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater));
chatList.setOnItemClickListener(this); mChatRoomsList.setOnItemClickListener(this);
noChatHistory = view.findViewById(R.id.noChatHistory); mNoChatHistory = view.findViewById(R.id.noChatHistory);
editList = view.findViewById(R.id.edit_list); mEditTopBar = view.findViewById(R.id.edit_list);
topbar = view.findViewById(R.id.top_bar); mTopBar = view.findViewById(R.id.top_bar);
cancel = view.findViewById(R.id.cancel); mCancelButton = view.findViewById(R.id.cancel);
cancel.setOnClickListener(new View.OnClickListener() { mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO quitEditionMode();
} }
}); });
edit = view.findViewById(R.id.edit); mEditButton = view.findViewById(R.id.edit);
edit.setOnClickListener(new View.OnClickListener() { mEditButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO mChatRoomsAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
} }
}); });
newDiscussion = view.findViewById(R.id.new_discussion); mNewDiscussionButton = view.findViewById(R.id.new_discussion);
newDiscussion.setOnClickListener(new View.OnClickListener() { mNewDiscussionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LinphoneActivity.instance().goToChatCreator(null, false); LinphoneActivity.instance().goToChatCreator(null, false);
} }
}); });
selectAll = view.findViewById(R.id.select_all); mSelectAllButton = view.findViewById(R.id.select_all);
selectAll.setOnClickListener(new View.OnClickListener() { mSelectAllButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO mChatRoomsAdapter.selectAll();
} }
}); });
deselectAll = view.findViewById(R.id.deselect_all); mDeselectAllButton = view.findViewById(R.id.deselect_all);
deselectAll.setOnClickListener(new View.OnClickListener() { mDeselectAllButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO mChatRoomsAdapter.deselectAll();
} }
}); });
backInCall = view.findViewById(R.id.back_in_call); mBackToCallButton = view.findViewById(R.id.back_in_call);
backInCall.setOnClickListener(new View.OnClickListener() { mBackToCallButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LinphoneActivity.instance().resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); LinphoneActivity.instance().resetClassicMenuLayoutAndGoBackToCallIfStillRunning();
return;
} }
}); });
delete = view.findViewById(R.id.delete); mDeleteSelectionButton = view.findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() { mDeleteSelectionButton.setEnabled(false);
mDeleteSelectionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { 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(); mChatRoomsAdapter = new ChatRoomsAdapter(getActivity(), this, mInflater);
ChatFragment.addChatListener(this);*/ mChatRoomsList.setAdapter(mChatRoomsAdapter);
return view; return view;
} }
private void refreshChatRoomsList() { private void refreshChatRoomsList() {
((ChatRoomsAdapter)chatList.getAdapter()).refresh(); mChatRoomsAdapter.refresh();
} }
/*private void selectAllList(boolean isSelectAll){ private void deleteSelectedRooms() {
int size = chatList.getAdapter().getCount(); ChatRoom rooms[] = mChatRoomsAdapter.getSelectedItems();
for(int i=0; i<size; i++) { //TODO
chatList.setItemChecked(i,isSelectAll); }
}
}*/
/*private void removeChatsConversation() { public void updateSelectionButtons(boolean isSelectionEmpty, boolean isSelectionFull) {
int size = chatList.getAdapter().getCount(); if (isSelectionEmpty) {
for (int i = 0; i < size; i++) { mDeleteSelectionButton.setEnabled(false);
if (chatList.isItemChecked(i)) {
String sipUri = chatList.getAdapter().getItem(i).toString();
if (sipUri != null) {
ChatRoom chatroom = LinphoneManager.getLc().getChatRoomFromUri(sipUri);
if (chatroom != null) {
chatroom.deleteHistory();
}
}
}
}
quitEditMode();
LinphoneActivity.instance().updateMissedChatCount();
}*/
/*public void quitEditMode(){
isEditMode = false;
editList.setVisibility(View.GONE);
topbar.setVisibility(View.VISIBLE);
refresh();
if(getResources().getBoolean(R.bool.isTablet)){
displayFirstChat();
}
}*/
/*public int getNbItemsChecked(){
int size = chatList.getAdapter().getCount();
int nb = 0;
for(int i=0; i<size; i++) {
if(chatList.isItemChecked(i)) {
nb ++;
}
}
return nb;
}*/
/*public void enabledDeleteButton(Boolean enabled){
if(enabled){
delete.setEnabled(true);
} else { } else {
if (getNbItemsChecked() == 0){ mDeleteSelectionButton.setEnabled(true);
delete.setEnabled(false);
}
} }
}*/
/*private void hideAndDisplayMessageIfNoChat() { if (isSelectionFull) {
if (mConversations.size() == 0) { mSelectAllButton.setVisibility(View.GONE);
noChatHistory.setVisibility(View.VISIBLE); mDeselectAllButton.setVisibility(View.VISIBLE);
chatList.setVisibility(View.GONE);
edit.setEnabled(false);
} else { } else {
noChatHistory.setVisibility(View.GONE); mSelectAllButton.setVisibility(View.VISIBLE);
chatList.setVisibility(View.VISIBLE); mDeselectAllButton.setVisibility(View.GONE);
chatList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
chatList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater));
edit.setEnabled(true);
} }
}*/ }
/*public void refresh() { private void quitEditionMode() {
refreshChatRoomsList(); mChatRoomsAdapter.enableEdition(false);
hideAndDisplayMessageIfNoChat(); mTopBar.setVisibility(View.VISIBLE);
}*/ mEditTopBar.setVisibility(View.GONE);
mDeleteSelectionButton.setEnabled(false);
/*public void displayFirstChat(){ mSelectAllButton.setVisibility(View.VISIBLE);
if (mConversations != null && mConversations.size() > 0) { mDeselectAllButton.setVisibility(View.GONE);
LinphoneActivity.instance().displayChat(mConversations.get(0), null, null); }
} else {
LinphoneActivity.instance().displayEmptyFragment();
}
}*/
@Override @Override
public void onResume() { public void onResume() {
@ -233,9 +207,9 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
ContactsManager.addContactsListener(this); ContactsManager.addContactsListener(this);
if (LinphoneManager.getLc().getCallsNb() > 0) { if (LinphoneManager.getLc().getCallsNb() > 0) {
backInCall.setVisibility(View.VISIBLE); mBackToCallButton.setVisibility(View.VISIBLE);
} else { } else {
backInCall.setVisibility(View.INVISIBLE); mBackToCallButton.setVisibility(View.INVISIBLE);
} }
if (LinphoneActivity.isInstanciated()) { if (LinphoneActivity.isInstanciated()) {
@ -266,7 +240,7 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != CHAT_LIST) if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != CHAT_LIST)
return; return;
ChatRoomsAdapter adapter = (ChatRoomsAdapter)chatList.getAdapter(); ChatRoomsAdapter adapter = (ChatRoomsAdapter) mChatRoomsList.getAdapter();
if (adapter != null) { if (adapter != null) {
adapter.notifyDataSetInvalidated(); adapter.notifyDataSetInvalidated();
} }
@ -274,98 +248,12 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
@Override @Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { 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) { if (LinphoneActivity.isInstanciated() && !isEditMode) {
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asString()); 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();
}*/
} }

View file

@ -28,6 +28,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -46,12 +47,13 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
public class ChatRoomsAdapter extends BaseAdapter { public class ChatRoomsAdapter extends BaseAdapter {
private class ChatRoomViewHolder { private class ChatRoomViewHolder {
public TextView lastMessageView; public TextView lastMessageView;
public TextView date; public TextView date;
public TextView displayName; public TextView displayName;
public TextView unreadMessages; public TextView unreadMessages;
public CheckBox select; public CheckBox delete;
public ImageView contactPicture; public ImageView contactPicture;
public ChatRoomViewHolder(View view) { public ChatRoomViewHolder(View view) {
@ -59,7 +61,7 @@ public class ChatRoomsAdapter extends BaseAdapter {
date = view.findViewById(R.id.date); date = view.findViewById(R.id.date);
displayName = view.findViewById(R.id.sipUri); displayName = view.findViewById(R.id.sipUri);
unreadMessages = view.findViewById(R.id.unreadMessages); 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); contactPicture = view.findViewById(R.id.contact_picture);
} }
} }
@ -69,6 +71,20 @@ public class ChatRoomsAdapter extends BaseAdapter {
private List<ChatRoom> mRooms; private List<ChatRoom> mRooms;
private LayoutInflater mLayoutInflater; private LayoutInflater mLayoutInflater;
private Bitmap mDefaultBitmap, mDefaultGroupBitmap; private Bitmap mDefaultBitmap, mDefaultGroupBitmap;
private boolean mIsEditionEnabled;
private List<Integer> 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) { public ChatRoomsAdapter(Context context, ChatListFragment fragment, LayoutInflater inflater) {
mContext = context; mContext = context;
@ -77,6 +93,8 @@ public class ChatRoomsAdapter extends BaseAdapter {
mRooms = new ArrayList<>(); mRooms = new ArrayList<>();
mDefaultBitmap = ContactsManager.getInstance().getDefaultAvatarBitmap(); mDefaultBitmap = ContactsManager.getInstance().getDefaultAvatarBitmap();
mDefaultGroupBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chat_group_avatar); mDefaultGroupBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chat_group_avatar);
mIsEditionEnabled = false;
mSelectedItems = new ArrayList<>();
} }
public void refresh() { public void refresh() {
@ -88,6 +106,36 @@ public class ChatRoomsAdapter extends BaseAdapter {
* List edition * 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 * Adapter's methods
*/ */
@ -190,36 +238,16 @@ public class ChatRoomsAdapter extends BaseAdapter {
holder.displayName.setTypeface(null, Typeface.NORMAL); holder.displayName.setTypeface(null, Typeface.NORMAL);
} }
/*if (isEditMode) { if (mIsEditionEnabled) {
holder.unreadMessages.setVisibility(View.GONE); holder.unreadMessages.setVisibility(View.GONE);
holder.select.setVisibility(View.VISIBLE); holder.delete.setOnCheckedChangeListener(null);
holder.select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { holder.delete.setVisibility(View.VISIBLE);
@Override holder.delete.setChecked(mSelectedItems.contains(position));
public void onCheckedChanged(CompoundButton compoundButton, boolean b) { holder.delete.setTag(position);
chatList.setItemChecked(position, b); holder.delete.setOnCheckedChangeListener(mDeleteCheckboxListener);
if (getNbItemsChecked() == getCount()) { } else {
deselectAll.setVisibility(View.VISIBLE); holder.delete.setVisibility(mIsEditionEnabled ? View.VISIBLE : View.GONE);
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);
}
}*/
return view; return view;
} }
} }