Created helper classes ListSelectionHelper and ListSelectionAdapter to prevent developper to duplicate code to handle lists' items' selection for removal

This commit is contained in:
Sylvain Berfini 2017-11-17 15:00:21 +01:00
parent 842ebab506
commit 3316d76c48
6 changed files with 279 additions and 330 deletions

View file

@ -62,6 +62,8 @@ import org.linphone.core.Content;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.EventLog; import org.linphone.core.EventLog;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import org.linphone.ui.ListSelectionAdapter;
import org.linphone.ui.ListSelectionHelper;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -73,37 +75,21 @@ import java.util.List;
import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListener { public class ChatEventsAdapter extends ListSelectionAdapter implements ChatMessageListener {
private Context mContext; private Context mContext;
GroupChatFragment mFragment;
private List<EventLog> mHistory; private List<EventLog> mHistory;
private List<LinphoneContact> mParticipants; private List<LinphoneContact> mParticipants;
private LayoutInflater mLayoutInflater; private LayoutInflater mLayoutInflater;
private Bitmap mDefaultBitmap; private Bitmap mDefaultBitmap;
private GroupChatFragment mFragment;
private boolean mIsEditionEnabled; public ChatEventsAdapter(GroupChatFragment fragment, ListSelectionHelper helper, LayoutInflater inflater, EventLog[] history, ArrayList<LinphoneContact> participants) {
private List<Integer> mSelectedItems; super(helper);
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() == mHistory.size());
}
};
public ChatEventsAdapter(Context context, GroupChatFragment fragment, LayoutInflater inflater, EventLog[] history, ArrayList<LinphoneContact> participants) {
mContext = context;
mFragment = fragment; mFragment = fragment;
mContext = mFragment.getActivity();
mLayoutInflater = inflater; mLayoutInflater = inflater;
mHistory = new ArrayList<>(Arrays.asList(history)); mHistory = new ArrayList<>(Arrays.asList(history));
mParticipants = participants; mParticipants = participants;
mIsEditionEnabled = false;
mSelectedItems = new ArrayList<>();
} }
public void addToHistory(EventLog log) { public void addToHistory(EventLog log) {
@ -115,44 +101,6 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
mParticipants = participants; mParticipants = participants;
} }
/**
* List edition
*/
public void enableEdition(boolean enable) {
mIsEditionEnabled = enable;
notifyDataSetInvalidated();
mSelectedItems.clear();
}
public EventLog[] getSelectedItems() {
EventLog logs[] = new EventLog[mSelectedItems.size()];
int index = 0;
for (Integer i : mSelectedItems) {
logs[index] = (EventLog)getItem(i);
index++;
}
return logs;
}
public void selectAll() {
for (Integer i = 0; i < mHistory.size(); i++) {
mSelectedItems.add(i);
}
mFragment.updateSelectionButtons(false, true);
notifyDataSetInvalidated();
}
public void deselectAll() {
mSelectedItems.clear();
mFragment.updateSelectionButtons(true, false);
notifyDataSetInvalidated();
}
/**
* Adapter's methods
*/
@Override @Override
public int getCount() { public int getCount() {
return mHistory.size(); return mHistory.size();
@ -181,7 +129,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
holder.eventLayout.setVisibility(View.GONE); holder.eventLayout.setVisibility(View.GONE);
holder.bubbleLayout.setVisibility(View.GONE); holder.bubbleLayout.setVisibility(View.GONE);
holder.delete.setVisibility(mIsEditionEnabled ? View.VISIBLE : View.GONE); holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.GONE);
holder.messageText.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE);
holder.messageImage.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE);
holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE);
@ -193,11 +141,11 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
holder.messageSendingInProgress.setVisibility(View.GONE); holder.messageSendingInProgress.setVisibility(View.GONE);
holder.imdmLayout.setVisibility(View.INVISIBLE); holder.imdmLayout.setVisibility(View.INVISIBLE);
if (mIsEditionEnabled) { if (isEditionEnabled()) {
holder.delete.setOnCheckedChangeListener(null); holder.delete.setOnCheckedChangeListener(null);
holder.delete.setChecked(mSelectedItems.contains(i)); holder.delete.setChecked(getSelectedItemsPosition().contains(i));
holder.delete.setTag(i); holder.delete.setTag(i);
holder.delete.setOnCheckedChangeListener(mDeleteCheckboxListener); holder.delete.setOnCheckedChangeListener(getDeleteListener());
} }
EventLog event = (EventLog)getItem(i); EventLog event = (EventLog)getItem(i);
@ -243,7 +191,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI)); holder.imdmLabel.setTextColor(mContext.getResources().getColor(R.color.colorI));
} }
if (mIsEditionEnabled) { if (isEditionEnabled()) {
layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId()); layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId());
layoutParams.setMargins(100, 10, 10, 10); layoutParams.setMargins(100, 10, 10, 10);
} else { } else {
@ -280,7 +228,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
holder.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap()); holder.contactPicture.setImageBitmap(ContactsManager.getInstance().getDefaultAvatarBitmap());
} }
if (mIsEditionEnabled) { if (isEditionEnabled()) {
layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId()); layoutParams.addRule(RelativeLayout.LEFT_OF, holder.delete.getId());
layoutParams.setMargins(100, 10, 10, 10); layoutParams.setMargins(100, 10, 10, 10);
} else { } else {

View file

@ -19,7 +19,6 @@ 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;
@ -27,13 +26,12 @@ 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.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import org.linphone.contacts.ContactsManager; import org.linphone.contacts.ContactsManager;
import org.linphone.ui.ListSelectionHelper;
import org.linphone.receivers.ContactsUpdatedListener; import org.linphone.receivers.ContactsUpdatedListener;
import org.linphone.fragments.FragmentsAvailable; import org.linphone.fragments.FragmentsAvailable;
import org.linphone.activities.LinphoneActivity; import org.linphone.activities.LinphoneActivity;
@ -46,48 +44,31 @@ import org.linphone.core.CoreListenerStub;
import static org.linphone.fragments.FragmentsAvailable.CHAT_LIST; import static org.linphone.fragments.FragmentsAvailable.CHAT_LIST;
public class ChatListFragment extends Fragment implements OnItemClickListener, ContactsUpdatedListener { public class ChatListFragment extends Fragment implements OnItemClickListener, ContactsUpdatedListener, ListSelectionHelper.DeleteListener {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ListView mChatRoomsList; private ListView mChatRoomsList;
private TextView mNoChatHistory; private TextView mNoChatHistory;
private ImageView mEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton, mNewDiscussionButton, mCancelButton, mBackToCallButton; private ImageView mNewDiscussionButton, mBackToCallButton;
private LinearLayout mEditTopBar, mTopBar;
private boolean isEditMode = false; private boolean isEditMode = false;
private ChatRoomsAdapter mChatRoomsAdapter; private ChatRoomsAdapter mChatRoomsAdapter;
private CoreListenerStub mListener; private CoreListenerStub mListener;
private ListSelectionHelper mSelectionHelper;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mInflater = inflater; mInflater = inflater;
View view = inflater.inflate(R.layout.chatlist, container, false); View view = inflater.inflate(R.layout.chatlist, container, false);
mSelectionHelper = new ListSelectionHelper(view, this);
mChatRoomsAdapter = new ChatRoomsAdapter(getActivity(), mSelectionHelper, mInflater);
mSelectionHelper.setAdapter(mChatRoomsAdapter);
mChatRoomsList = view.findViewById(R.id.chatList); mChatRoomsList = view.findViewById(R.id.chatList);
mChatRoomsList.setAdapter(new ChatRoomsAdapter(getActivity(), this, mInflater)); mChatRoomsList.setAdapter(mChatRoomsAdapter);
mChatRoomsList.setOnItemClickListener(this); mChatRoomsList.setOnItemClickListener(this);
mNoChatHistory = view.findViewById(R.id.noChatHistory); mNoChatHistory = view.findViewById(R.id.noChatHistory);
mEditTopBar = view.findViewById(R.id.edit_list);
mTopBar = view.findViewById(R.id.top_bar);
mCancelButton = view.findViewById(R.id.cancel);
mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quitEditionMode();
}
});
mEditButton = view.findViewById(R.id.edit);
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mChatRoomsAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
}
});
mNewDiscussionButton = view.findViewById(R.id.new_discussion); mNewDiscussionButton = view.findViewById(R.id.new_discussion);
mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { mNewDiscussionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -96,22 +77,6 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
} }
}); });
mSelectAllButton = view.findViewById(R.id.select_all);
mSelectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mChatRoomsAdapter.selectAll();
}
});
mDeselectAllButton = view.findViewById(R.id.deselect_all);
mDeselectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mChatRoomsAdapter.deselectAll();
}
});
mBackToCallButton = view.findViewById(R.id.back_in_call); mBackToCallButton = view.findViewById(R.id.back_in_call);
mBackToCallButton.setOnClickListener(new View.OnClickListener() { mBackToCallButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -120,35 +85,6 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
} }
}); });
mDeleteSelectionButton = view.findViewById(R.id.delete);
mDeleteSelectionButton.setEnabled(false);
mDeleteSelectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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();
}
});
mListener = new CoreListenerStub() { mListener = new CoreListenerStub() {
@Override @Override
public void onMessageReceived(Core lc, ChatRoom cr, ChatMessage message) { public void onMessageReceived(Core lc, ChatRoom cr, ChatMessage message) {
@ -161,8 +97,6 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
} }
}; };
mChatRoomsAdapter = new ChatRoomsAdapter(getActivity(), this, mInflater);
mChatRoomsList.setAdapter(mChatRoomsAdapter);
return view; return view;
} }
@ -171,36 +105,6 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
mChatRoomsAdapter.refresh(); mChatRoomsAdapter.refresh();
} }
private void deleteSelectedRooms() {
ChatRoom rooms[] = mChatRoomsAdapter.getSelectedItems();
//TODO
}
public void updateSelectionButtons(boolean isSelectionEmpty, boolean isSelectionFull) {
if (isSelectionEmpty) {
mDeleteSelectionButton.setEnabled(false);
} else {
mDeleteSelectionButton.setEnabled(true);
}
if (isSelectionFull) {
mSelectAllButton.setVisibility(View.GONE);
mDeselectAllButton.setVisibility(View.VISIBLE);
} else {
mSelectAllButton.setVisibility(View.VISIBLE);
mDeselectAllButton.setVisibility(View.GONE);
}
}
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 @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
@ -235,6 +139,11 @@ public class ChatListFragment extends Fragment implements OnItemClickListener, C
super.onPause(); super.onPause();
} }
@Override
public void onDeleteSelection(Object[] objectsToDelete) {
//TODO
}
@Override @Override
public void onContactsUpdated() { public void onContactsUpdated() {
if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != CHAT_LIST) if (!LinphoneActivity.isInstanciated() || LinphoneActivity.instance().getCurrentFragment() != CHAT_LIST)

View file

@ -41,12 +41,14 @@ import org.linphone.contacts.LinphoneContact;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ChatMessage; import org.linphone.core.ChatMessage;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.ui.ListSelectionAdapter;
import org.linphone.ui.ListSelectionHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
public class ChatRoomsAdapter extends BaseAdapter { public class ChatRoomsAdapter extends ListSelectionAdapter {
private class ChatRoomViewHolder { private class ChatRoomViewHolder {
public TextView lastMessageView; public TextView lastMessageView;
@ -67,34 +69,17 @@ public class ChatRoomsAdapter extends BaseAdapter {
} }
private Context mContext; private Context mContext;
ChatListFragment mFragment;
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, ListSelectionHelper helper, LayoutInflater inflater) {
super(helper);
mContext = context; mContext = context;
mFragment = fragment;
mLayoutInflater = inflater; mLayoutInflater = inflater;
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() {
@ -102,40 +87,6 @@ public class ChatRoomsAdapter extends BaseAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
/**
* 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
*/ */
@ -238,15 +189,15 @@ public class ChatRoomsAdapter extends BaseAdapter {
holder.displayName.setTypeface(null, Typeface.NORMAL); holder.displayName.setTypeface(null, Typeface.NORMAL);
} }
if (mIsEditionEnabled) { if (isEditionEnabled()) {
holder.unreadMessages.setVisibility(View.GONE); holder.unreadMessages.setVisibility(View.GONE);
holder.delete.setOnCheckedChangeListener(null); holder.delete.setOnCheckedChangeListener(null);
holder.delete.setVisibility(View.VISIBLE); holder.delete.setVisibility(View.VISIBLE);
holder.delete.setChecked(mSelectedItems.contains(position)); holder.delete.setChecked(getSelectedItemsPosition().contains(position));
holder.delete.setTag(position); holder.delete.setTag(position);
holder.delete.setOnCheckedChangeListener(mDeleteCheckboxListener); holder.delete.setOnCheckedChangeListener(getDeleteListener());
} else { } else {
holder.delete.setVisibility(mIsEditionEnabled ? View.VISIBLE : View.GONE); holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.GONE);
} }
return view; return view;
} }

View file

@ -56,7 +56,6 @@ import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneContact; import org.linphone.contacts.LinphoneContact;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ChatMessage; import org.linphone.core.ChatMessage;
import org.linphone.core.ChatMessageListenerStub;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomListener; import org.linphone.core.ChatRoomListener;
import org.linphone.core.Content; import org.linphone.core.Content;
@ -65,6 +64,7 @@ import org.linphone.core.EventLog;
import org.linphone.core.Factory; import org.linphone.core.Factory;
import org.linphone.core.Participant; import org.linphone.core.Participant;
import org.linphone.receivers.ContactsUpdatedListener; import org.linphone.receivers.ContactsUpdatedListener;
import org.linphone.ui.ListSelectionHelper;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@ -72,19 +72,18 @@ import java.util.List;
import static org.linphone.fragments.FragmentsAvailable.CHAT; import static org.linphone.fragments.FragmentsAvailable.CHAT;
public class GroupChatFragment extends Fragment implements ChatRoomListener, ContactsUpdatedListener { public class GroupChatFragment extends Fragment implements ChatRoomListener, ContactsUpdatedListener, ListSelectionHelper.DeleteListener {
private static final int ADD_PHOTO = 1337; private static final int ADD_PHOTO = 1337;
private ImageView mBackButton, mCallButton, mBackToCallButton, mGroupInfosButton, mEditButton; private ImageView mBackButton, mCallButton, mBackToCallButton, mGroupInfosButton;
private ImageView mCancelEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton;
private ImageView mAttachImageButton, mSendMessageButton; private ImageView mAttachImageButton, mSendMessageButton;
private TextView mRoomLabel, mParticipantsLabel, mRemoteComposing; private TextView mRoomLabel, mParticipantsLabel, mRemoteComposing;
private EditText mMessageTextToSend; private EditText mMessageTextToSend;
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ListView mChatEventsList; private ListView mChatEventsList;
private LinearLayout mFilesUploadLayout; private LinearLayout mFilesUploadLayout;
private LinearLayout mTopBar, mEditTopBar;
private boolean mIsReadOnly; private boolean mIsReadOnly;
private ListSelectionHelper mSelectionHelper;
private ViewTreeObserver.OnGlobalLayoutListener mKeyboardListener; private ViewTreeObserver.OnGlobalLayoutListener mKeyboardListener;
private Uri mImageToUploadUri; private Uri mImageToUploadUri;
@ -108,8 +107,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mInflater = inflater; mInflater = inflater;
View view = inflater.inflate(R.layout.chat, container, false); View view = inflater.inflate(R.layout.chat, container, false);
mTopBar = view.findViewById(R.id.top_bar); mSelectionHelper = new ListSelectionHelper(view, this);
mEditTopBar = view.findViewById(R.id.edit_list);
mBackButton = view.findViewById(R.id.back); mBackButton = view.findViewById(R.id.back);
mBackButton.setOnClickListener(new View.OnClickListener() { mBackButton.setOnClickListener(new View.OnClickListener() {
@ -156,69 +154,6 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
}); });
mEditButton = view.findViewById(R.id.edit);
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEventsAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
}
});
mCancelEditButton = view.findViewById(R.id.cancel);
mCancelEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
quitEditionMode();
}
});
mSelectAllButton = view.findViewById(R.id.select_all);
mSelectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEventsAdapter.selectAll();
}
});
mDeselectAllButton = view.findViewById(R.id.deselect_all);
mDeselectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEventsAdapter.deselectAll();
}
});
mDeleteSelectionButton = view.findViewById(R.id.delete);
mDeleteSelectionButton.setEnabled(false);
mDeleteSelectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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) {
deleteSelectedEvents();
dialog.dismiss();
quitEditionMode();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
quitEditionMode();
}
});
dialog.show();
}
});
mRoomLabel = view.findViewById(R.id.subject); mRoomLabel = view.findViewById(R.id.subject);
mParticipantsLabel = view.findViewById(R.id.participants); mParticipantsLabel = view.findViewById(R.id.participants);
@ -338,40 +273,11 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
} }
} }
/** @Override
* Edition related methods public void onDeleteSelection(Object[] objectsToDelete) {
*/
private void deleteSelectedEvents() {
EventLog logs[] = mEventsAdapter.getSelectedItems();
//TODO //TODO
} }
public void updateSelectionButtons(boolean isSelectionEmpty, boolean isSelectionFull) {
if (isSelectionEmpty) {
mDeleteSelectionButton.setEnabled(false);
} else {
mDeleteSelectionButton.setEnabled(true);
}
if (isSelectionFull) {
mSelectAllButton.setVisibility(View.GONE);
mDeselectAllButton.setVisibility(View.VISIBLE);
} else {
mSelectAllButton.setVisibility(View.VISIBLE);
mDeselectAllButton.setVisibility(View.GONE);
}
}
private void quitEditionMode() {
mEventsAdapter.enableEdition(false);
mTopBar.setVisibility(View.VISIBLE);
mEditTopBar.setVisibility(View.GONE);
mDeleteSelectionButton.setEnabled(false);
mSelectAllButton.setVisibility(View.VISIBLE);
mDeselectAllButton.setVisibility(View.GONE);
}
/** /**
* Keyboard management * Keyboard management
*/ */
@ -504,7 +410,8 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
private void displayChatRoomHistory() { private void displayChatRoomHistory() {
if (mChatRoom == null) return; if (mChatRoom == null) return;
mEventsAdapter = new ChatEventsAdapter(getActivity(), this, mInflater, mChatRoom.getHistoryEvents(0), mParticipants); mEventsAdapter = new ChatEventsAdapter(this, mSelectionHelper, mInflater, mChatRoom.getHistoryEvents(0), mParticipants);
mSelectionHelper.setAdapter(mEventsAdapter);
mChatEventsList.setAdapter(mEventsAdapter); mChatEventsList.setAdapter(mEventsAdapter);
} }

View file

@ -0,0 +1,82 @@
/*
ListSelectionAdapter.java
Copyright (C) 2017 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.linphone.ui;
import android.widget.BaseAdapter;
import android.widget.CompoundButton;
import java.util.ArrayList;
import java.util.List;
public abstract class ListSelectionAdapter extends BaseAdapter {
private ListSelectionHelper mListHelper;
private List<Integer> mSelectedItems;
private boolean mIsEditionEnabled;
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);
}
mListHelper.updateSelectionButtons(mSelectedItems.size() == 0, mSelectedItems.size() == getCount());
}
};
public ListSelectionAdapter(ListSelectionHelper helper) {
mListHelper = helper;
mSelectedItems = new ArrayList<>();
}
public boolean isEditionEnabled() {
return mIsEditionEnabled;
}
public CompoundButton.OnCheckedChangeListener getDeleteListener() {
return mDeleteCheckboxListener;
}
public void selectAll() {
for (Integer i = 0; i < getCount(); i++) {
mSelectedItems.add(i);
}
mListHelper.updateSelectionButtons(false, true);
notifyDataSetInvalidated();
}
public void deselectAll() {
mSelectedItems.clear();
mListHelper.updateSelectionButtons(true, false);
notifyDataSetInvalidated();
}
public void enableEdition(boolean enable) {
mIsEditionEnabled = enable;
notifyDataSetInvalidated();
mSelectedItems.clear();
}
public List<Integer> getSelectedItemsPosition() {
return mSelectedItems;
}
}

View file

@ -0,0 +1,152 @@
/*
ListSelectionHelper.java
Copyright (C) 2017 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.linphone.ui;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import org.linphone.R;
import org.linphone.activities.LinphoneActivity;
public class ListSelectionHelper {
private ImageView mEditButton, mSelectAllButton, mDeselectAllButton, mDeleteSelectionButton, mCancelButton;
private LinearLayout mEditTopBar, mTopBar;
private ListSelectionAdapter mAdapter;
private DeleteListener mDeleteListener;
private Context mContext;
public interface DeleteListener {
void onDeleteSelection(Object[] objectsToDelete);
}
public ListSelectionHelper(View view, DeleteListener listener) {
mContext = view.getContext();
mDeleteListener = listener;
mEditTopBar = view.findViewById(R.id.edit_list);
mTopBar = view.findViewById(R.id.top_bar);
mCancelButton = view.findViewById(R.id.cancel);
mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quitEditionMode();
}
});
mEditButton = view.findViewById(R.id.edit);
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);
}
});
mSelectAllButton = view.findViewById(R.id.select_all);
mSelectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.selectAll();
}
});
mDeselectAllButton = view.findViewById(R.id.deselect_all);
mDeselectAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.deselectAll();
}
});
mDeleteSelectionButton = view.findViewById(R.id.delete);
mDeleteSelectionButton.setEnabled(false);
mDeleteSelectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = LinphoneActivity.instance().displayDialog(mContext.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) {
mDeleteListener.onDeleteSelection(getSelectedObjects());
dialog.dismiss();
quitEditionMode();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
quitEditionMode();
}
});
dialog.show();
}
});
}
public void setAdapter(ListSelectionAdapter adapter) {
mAdapter = adapter;
}
public void updateSelectionButtons(boolean isSelectionEmpty, boolean isSelectionFull) {
if (isSelectionEmpty) {
mDeleteSelectionButton.setEnabled(false);
} else {
mDeleteSelectionButton.setEnabled(true);
}
if (isSelectionFull) {
mSelectAllButton.setVisibility(View.GONE);
mDeselectAllButton.setVisibility(View.VISIBLE);
} else {
mSelectAllButton.setVisibility(View.VISIBLE);
mDeselectAllButton.setVisibility(View.GONE);
}
}
private void quitEditionMode() {
mAdapter.enableEdition(false);
mTopBar.setVisibility(View.VISIBLE);
mEditTopBar.setVisibility(View.GONE);
mDeleteSelectionButton.setEnabled(false);
mSelectAllButton.setVisibility(View.VISIBLE);
mDeselectAllButton.setVisibility(View.GONE);
}
private Object[] getSelectedObjects() {
Object objects[] = new Object[mAdapter.getSelectedItemsPosition().size()];
int index = 0;
for (Integer i : mAdapter.getSelectedItemsPosition()) {
objects[index] = mAdapter.getItem(i);
index++;
}
return objects;
}
}