diff --git a/res/layout/chatlist_cell.xml b/res/layout/chatlist_cell.xml index 6989dc64e..99aefd1ff 100644 --- a/res/layout/chatlist_cell.xml +++ b/res/layout/chatlist_cell.xml @@ -14,6 +14,7 @@ android:contentDescription="@string/content_description_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:clickable="false" android:adjustViewBounds="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" diff --git a/src/android/org/linphone/chat/ChatListFragment.java b/src/android/org/linphone/chat/ChatListFragment.java index a1e668fe8..59fd4d517 100644 --- a/src/android/org/linphone/chat/ChatListFragment.java +++ b/src/android/org/linphone/chat/ChatListFragment.java @@ -27,9 +27,11 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; 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 { // 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 TextView mNoChatHistory; private ImageView mNewDiscussionButton, mBackToCallButton; private ChatRoomsAdapter mChatRoomsAdapter; private CoreListenerStub mListener; - private ListSelectionHelper mSelectionHelper; +// private ListSelectionHelper mSelectionHelper; private RelativeLayout mWaitLayout; private int mChatRoomDeletionPendingCount; private ChatRoomListenerStub mChatRoomListener; @@ -76,6 +82,8 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene // mInflater = inflater; super.onCreate(savedInstanceState); + + setHasOptionsMenu(true); mRooms = new ArrayList<>(Arrays.asList(LinphoneManager.getLc().getChatRooms())); this.mContext = getActivity().getApplicationContext(); View view = inflater.inflate(R.layout.chatlist, container, false); @@ -87,14 +95,43 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene // mSelectionHelper.setAdapter(mChatRoomsAdapter); // mSelectionHelper.setDialogMessage(R.string.chat_room_delete_dialog); + + + + mWaitLayout = view.findViewById(R.id.waitScreen); mWaitLayout.setVisibility(View.GONE); mChatRoomsList = view.findViewById(R.id.chatList); mChatRoomsList.setAdapter(mChatRoomsAdapter); mChatRoomsList.setLayoutManager(layoutManager); - mNoChatHistory = view.findViewById(R.id.noChatHistory); - mNoChatHistory.setVisibility(View.GONE); +// mNoChatHistory = view.findViewById(R.id.noChatHistory); + +// 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.setOnClickListener(new View.OnClickListener() { @@ -148,9 +185,135 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene 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() { mChatRoomsAdapter.refresh(); - mNoChatHistory.setVisibility(mChatRoomsAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); +// mNoChatHistory.setVisibility(mChatRoomsAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); } public void displayFirstChat() { @@ -232,7 +395,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene ChatRoomsAdapter adapter = (ChatRoomsAdapter) mChatRoomsList.getAdapter(); if (adapter != null) { - //adapter.notifyDataSetInvalidated(); +// adapter.notifyDataSetInvalidated(); } } } diff --git a/src/android/org/linphone/chat/ChatRoomsAdapter.java b/src/android/org/linphone/chat/ChatRoomsAdapter.java index 3775c1ee5..ff8a99d6b 100644 --- a/src/android/org/linphone/chat/ChatRoomsAdapter.java +++ b/src/android/org/linphone/chat/ChatRoomsAdapter.java @@ -25,6 +25,7 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.MediaStore; import android.support.v7.widget.RecyclerView; +import android.view.ActionMode; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -66,7 +67,8 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter mRooms) { + public ChatRoomsAdapter(Context context, int itemResource, List mRooms, ChatRoomViewHolder.ClickListener clickListener) { public ChatRoomsAdapter(Context context, int itemResource, List mRooms) { super(); + this.editionMode = false; + this.clickListener = clickListener; this.mRooms = mRooms; this.mContext = context; this.itemResource = itemResource; @@ -182,10 +209,25 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter(Arrays.asList(LinphoneManager.getLc().getChatRooms())); Collections.sort(mRooms, new Comparator() { @@ -232,6 +274,7 @@ public class ChatRoomsAdapter extends RecyclerView.Adapter