Selection des items achevÃee, selection totale, annulation, affichage des boutons contextuels. A ajouter la suppression, deselection totale.

This commit is contained in:
LuLe73 2018-05-23 17:10:27 +02:00 committed by Lucas Legrand
parent 8006231a69
commit 10565fd636
3 changed files with 214 additions and 7 deletions

View file

@ -14,6 +14,7 @@
android:contentDescription="@string/content_description_delete" android:contentDescription="@string/content_description_delete"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="false"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"

View file

@ -27,9 +27,11 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
@ -59,12 +61,16 @@ import static org.linphone.fragments.FragmentsAvailable.CHAT_LIST;
public class ChatListFragment extends Fragment implements ContactsUpdatedListener, ListSelectionHelper.DeleteListener { public class ChatListFragment extends Fragment implements ContactsUpdatedListener, ListSelectionHelper.DeleteListener {
//public class ChatListFragment extends Fragment { //public class ChatListFragment extends Fragment {
// private LayoutInflater mInflater; // private LayoutInflater mInflater;
private ActionModeCallback actionModeCallback = new ActionModeCallback();
private ActionMode actionMode;
private LinearLayout mEditTopBar, mTopBar;
private ImageView mEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton, mCancelButton;
private RecyclerView mChatRoomsList; private RecyclerView mChatRoomsList;
private TextView mNoChatHistory; private TextView mNoChatHistory;
private ImageView mNewDiscussionButton, mBackToCallButton; private ImageView mNewDiscussionButton, mBackToCallButton;
private ChatRoomsAdapter mChatRoomsAdapter; private ChatRoomsAdapter mChatRoomsAdapter;
private CoreListenerStub mListener; private CoreListenerStub mListener;
private ListSelectionHelper mSelectionHelper; // private ListSelectionHelper mSelectionHelper;
private RelativeLayout mWaitLayout; private RelativeLayout mWaitLayout;
private int mChatRoomDeletionPendingCount; private int mChatRoomDeletionPendingCount;
private ChatRoomListenerStub mChatRoomListener; private ChatRoomListenerStub mChatRoomListener;
@ -76,6 +82,8 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
// mInflater = inflater; // mInflater = inflater;
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mRooms = new ArrayList<>(Arrays.asList(LinphoneManager.getLc().getChatRooms())); mRooms = new ArrayList<>(Arrays.asList(LinphoneManager.getLc().getChatRooms()));
this.mContext = getActivity().getApplicationContext(); this.mContext = getActivity().getApplicationContext();
View view = inflater.inflate(R.layout.chatlist, container, false); View view = inflater.inflate(R.layout.chatlist, container, false);
@ -87,14 +95,43 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
// mSelectionHelper.setAdapter(mChatRoomsAdapter); // mSelectionHelper.setAdapter(mChatRoomsAdapter);
// mSelectionHelper.setDialogMessage(R.string.chat_room_delete_dialog); // mSelectionHelper.setDialogMessage(R.string.chat_room_delete_dialog);
mWaitLayout = view.findViewById(R.id.waitScreen); mWaitLayout = view.findViewById(R.id.waitScreen);
mWaitLayout.setVisibility(View.GONE); mWaitLayout.setVisibility(View.GONE);
mChatRoomsList = view.findViewById(R.id.chatList); mChatRoomsList = view.findViewById(R.id.chatList);
mChatRoomsList.setAdapter(mChatRoomsAdapter); mChatRoomsList.setAdapter(mChatRoomsAdapter);
mChatRoomsList.setLayoutManager(layoutManager); mChatRoomsList.setLayoutManager(layoutManager);
mNoChatHistory = view.findViewById(R.id.noChatHistory); // mNoChatHistory = view.findViewById(R.id.noChatHistory);
mNoChatHistory.setVisibility(View.GONE);
// mNoChatHistory.setVisibility(View.GONE);
mEditTopBar = view.findViewById(R.id.edit_list);
mTopBar = view.findViewById(R.id.top_bar);
mSelectAllButton = view.findViewById(R.id.select_all);
mEditButton = view.findViewById(R.id.edit);
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionMode = getActivity().startActionMode(actionModeCallback);
// mChatRoomsAdapter.setEditionMode(actionMode);
// mTopBar.setVisibility(View.GONE);
// mEditTopBar.setVisibility(View.VISIBLE);
}
});
mCancelButton = view.findViewById(R.id.cancel);
// mCancelButton.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// actionMode.invalidate();
// }
// });
mDeselectAllButton = view.findViewById(R.id.deselect_all);
mNewDiscussionButton = view.findViewById(R.id.new_discussion); mNewDiscussionButton = view.findViewById(R.id.new_discussion);
mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { mNewDiscussionButton.setOnClickListener(new View.OnClickListener() {
@ -148,9 +185,135 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
return view; return view;
} }
@Override
public void onItemClicked(int position) {
if (actionMode != null) {
toggleSelection(position);
}else{
ChatRoom room = (ChatRoom) mChatRoomsAdapter.getItem(position);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asString());
}
}
@Override
public boolean onItemLongClicked(int position) {
if (actionMode == null) {
actionMode = getActivity().startActionMode(actionModeCallback);
}
toggleSelection(position);
return true;
}
private void toggleSelection(int position) {
mChatRoomsAdapter.toggleSelection(position);
//
int count = mChatRoomsAdapter.getSelectedItemCount();
if (count <= mChatRoomsAdapter.getItemCount()) {
// actionMode.finish();
mDeselectAllButton.setVisibility(View.GONE);
mSelectAllButton.setVisibility(View.VISIBLE);
actionMode.invalidate();
} else {
// actionMode.setTitle(String.valueOf(count));
mSelectAllButton.setVisibility(View.GONE);
mDeselectAllButton.setVisibility(View.VISIBLE);
actionMode.invalidate();
}
}
private class ActionModeCallback implements ActionMode.Callback {
@SuppressWarnings("unused")
private final String TAG = ActionModeCallback.class.getSimpleName();
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
for (Integer i = 0; i <= mChatRoomsAdapter.getItemCount(); i++) {
mChatRoomsAdapter.setEditionMode(mode);
}
mode.getMenuInflater().inflate (R.menu.edit_list_menu, menu);
mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionMode.finish();
}
});
//Add all non-selected items to the selection
mSelectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (Integer i = 0; i <= mChatRoomsAdapter.getItemCount(); i++) {
if (!mChatRoomsAdapter.isSelected(i)) {
toggleSelection(i);
}
}
}
});
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// int cpt = 0;
// while (cpt <= mChatRoomsAdapter.getItemCount()) {
// mChatRoomsAdapter.setEditionMode(mode);
// cpt++;
// }
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.delete_button:
// TODO: actually remove items
Log.d(TAG, "menu_remove");
mode.finish();
return true;
case R.id.cancel:
mode.finish();
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mTopBar.setVisibility(View.VISIBLE);
mEditTopBar.setVisibility(View.GONE);
mChatRoomsAdapter.clearSelection();
actionMode = null;
mChatRoomsAdapter.setEditionMode(actionMode);
}
}
private void refreshChatRoomsList() { private void refreshChatRoomsList() {
mChatRoomsAdapter.refresh(); mChatRoomsAdapter.refresh();
mNoChatHistory.setVisibility(mChatRoomsAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); // mNoChatHistory.setVisibility(mChatRoomsAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
} }
public void displayFirstChat() { public void displayFirstChat() {
@ -232,7 +395,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
ChatRoomsAdapter adapter = (ChatRoomsAdapter) mChatRoomsList.getAdapter(); ChatRoomsAdapter adapter = (ChatRoomsAdapter) mChatRoomsList.getAdapter();
if (adapter != null) { if (adapter != null) {
//adapter.notifyDataSetInvalidated(); // adapter.notifyDataSetInvalidated();
} }
} }
} }

View file

@ -25,6 +25,7 @@ import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.ActionMode;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -66,7 +67,8 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
public Context mContext; public Context mContext;
public ChatRoom mRoom; public ChatRoom mRoom;
public ChatRoomViewHolder(Context context,View itemView) {
public ChatRoomViewHolder(Context context,View itemView, ClickListener listener) {
super(itemView); super(itemView);
this.mContext= context; this.mContext= context;
this.lastMessageSenderView = itemView.findViewById(R.id.lastMessageSender); this.lastMessageSenderView = itemView.findViewById(R.id.lastMessageSender);
@ -76,6 +78,9 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
this.unreadMessages = itemView.findViewById(R.id.unreadMessages); this.unreadMessages = itemView.findViewById(R.id.unreadMessages);
this.delete = itemView.findViewById(R.id.delete_chatroom); this.delete = itemView.findViewById(R.id.delete_chatroom);
this.contactPicture = itemView.findViewById(R.id.contact_picture); this.contactPicture = itemView.findViewById(R.id.contact_picture);
//this.selectedOverlay = itemView.findViewById(R.id.selected_overlay);
this.listener = listener;
itemView.setOnClickListener(this); itemView.setOnClickListener(this);
} }
public void bindChatRoom(ChatRoom room) { public void bindChatRoom(ChatRoom room) {
@ -87,7 +92,11 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
this.date.setText(mRoom.getLastMessageInHistory()!=null ? LinphoneUtils.timestampToHumanDate(this.mContext, mRoom.getLastUpdateTime(), R.string.messages_list_date_format) : ""); this.date.setText(mRoom.getLastMessageInHistory()!=null ? LinphoneUtils.timestampToHumanDate(this.mContext, mRoom.getLastUpdateTime(), R.string.messages_list_date_format) : "");
this.displayName.setText(getContact(mRoom)); this.displayName.setText(getContact(mRoom));
this.unreadMessages.setText(String.valueOf(LinphoneManager.getInstance().getUnreadCountForChatRoom(mRoom))); this.unreadMessages.setText(String.valueOf(LinphoneManager.getInstance().getUnreadCountForChatRoom(mRoom)));
this.delete.setChecked(!this.delete.isChecked()); // this.delete.setChecked(!this.delete.isChecked());
// this.delete.setChecked(!this.delete.isChecked());
// this.delete.setVisibility(this.editionMode == true ? View.VISIBLE : View.INVISIBLE);
// this.unreadMessages.setVisibility(this.editionMode == false ? View.VISIBLE : View.INVISIBLE);
getAvatar(mRoom); getAvatar(mRoom);
} }
@ -101,6 +110,16 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
} }
} }
@Override
public boolean onLongClick(View v) {
if (listener != null) {
return listener.onItemLongClicked(getAdapterPosition());
}
return false;
}
public String getSender(ChatRoom mRoom){ public String getSender(ChatRoom mRoom){
if (mRoom.getLastMessageInHistory() != null) { if (mRoom.getLastMessageInHistory() != null) {
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mRoom.getLastMessageInHistory().getFromAddress()); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mRoom.getLastMessageInHistory().getFromAddress());
@ -138,6 +157,7 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
} }
private Context mContext; private Context mContext;
@ -146,9 +166,16 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
private Bitmap mDefaultBitmap, mDefaultGroupBitmap; private Bitmap mDefaultBitmap, mDefaultGroupBitmap;
private ChatRoomListenerStub mListener; private ChatRoomListenerStub mListener;
private int itemResource; private int itemResource;
private ChatRoomViewHolder.ClickListener clickListener;
private boolean editionMode;
// public ChatRoomsAdapter(Context context, int itemResource, List<ChatRoom> mRooms) {
public ChatRoomsAdapter(Context context, int itemResource, List<ChatRoom> mRooms, ChatRoomViewHolder.ClickListener clickListener) {
public ChatRoomsAdapter(Context context, int itemResource, List<ChatRoom> mRooms) { public ChatRoomsAdapter(Context context, int itemResource, List<ChatRoom> mRooms) {
super(); super();
this.editionMode = false;
this.clickListener = clickListener;
this.mRooms = mRooms; this.mRooms = mRooms;
this.mContext = context; this.mContext = context;
this.itemResource = itemResource; this.itemResource = itemResource;
@ -182,10 +209,25 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
// 5. Use position to access the correct Bakery object // 5. Use position to access the correct Bakery object
ChatRoom room = this.mRooms.get(position); ChatRoom room = this.mRooms.get(position);
//Colors the item when selected
holder.delete.setVisibility(this.editionMode == true ? View.VISIBLE : View.INVISIBLE);
holder.unreadMessages.setVisibility(this.editionMode == false ? View.VISIBLE : View.INVISIBLE);
holder.delete.setChecked(isSelected(position) ? true : false);
// holder.unreadMessages.setVisibility(View.VISIBLE);
// 6. Bind the bakery object to the holder // 6. Bind the bakery object to the holder
holder.bindChatRoom(room); holder.bindChatRoom(room);
} }
public void setEditionMode(ActionMode actionMode) {
if ( actionMode != null) {
this.editionMode=true;
this.notifyDataSetChanged();
} else {
this.editionMode=false;
this.notifyDataSetChanged();
}
}
public void refresh() { public void refresh() {
mRooms = new ArrayList<>(Arrays.asList(LinphoneManager.getLc().getChatRooms())); mRooms = new ArrayList<>(Arrays.asList(LinphoneManager.getLc().getChatRooms()));
Collections.sort(mRooms, new Comparator<ChatRoom>() { Collections.sort(mRooms, new Comparator<ChatRoom>() {
@ -232,6 +274,7 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.Chat
return position; return position;
} }
// @Override // @Override
// public View getView(final int position, View convertView, ViewGroup viewGroup) { // public View getView(final int position, View convertView, ViewGroup viewGroup) {
// View view; // View view;