From f1c17e1a93889024b3ade70cda620e6ef87fafd3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 23 Oct 2017 15:13:35 +0200 Subject: [PATCH] Replaced previous group chat creation view by InfoGroupChatFragment --- res/layout/chat_infos.xml | 6 +- res/layout/chat_infos_cell.xml | 4 +- .../linphone/activities/LinphoneActivity.java | 13 +- .../linphone/chat/ChatCreationFragment.java | 32 +---- .../org/linphone/chat/GroupInfoAdapter.java | 126 ++++++++++++++++ .../org/linphone/chat/GroupInfoFragment.java | 134 ++++++++++++++++++ .../linphone/chat/InfoGroupChatFragment.java | 40 ------ 7 files changed, 278 insertions(+), 77 deletions(-) create mode 100644 src/android/org/linphone/chat/GroupInfoAdapter.java create mode 100644 src/android/org/linphone/chat/GroupInfoFragment.java delete mode 100644 src/android/org/linphone/chat/InfoGroupChatFragment.java diff --git a/res/layout/chat_infos.xml b/res/layout/chat_infos.xml index 72d6337c7..540ae9613 100644 --- a/res/layout/chat_infos.xml +++ b/res/layout/chat_infos.xml @@ -84,6 +84,7 @@ android:text="@string/chat_room_participants" /> + android:dividerHeight="1dp"> - contacts, boolean isAlreadyCreatedGroup) { + Bundle extras = new Bundle(); + extras.putBoolean("isAlreadyCreatedGroup", isAlreadyCreatedGroup); + extras.putSerializable("ContactAddress", contacts); + changeCurrentFragment(FragmentsAvailable.INFO_GROUP_CHAT, extras); + } + public void displayChat(String sipUri, String message, String fileUri) { if (getResources().getBoolean(R.bool.disable_chat)) { return; diff --git a/src/android/org/linphone/chat/ChatCreationFragment.java b/src/android/org/linphone/chat/ChatCreationFragment.java index 368fd3342..06ca61f62 100644 --- a/src/android/org/linphone/chat/ChatCreationFragment.java +++ b/src/android/org/linphone/chat/ChatCreationFragment.java @@ -52,7 +52,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private ListView contactsList; private LinearLayout contactsSelectedLayout; private HorizontalScrollView contactsSelectLayout; - private List contactsSelected; + private ArrayList contactsSelected; private ImageView allContacts, linphoneContacts; private boolean onlyDisplayLinphoneContacts; private View allContactsSelected, linphoneContactsSelected; @@ -62,12 +62,9 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private ProgressBar contactsFetchInProgress; private SearchContactsListAdapter searchAdapter; private ImageView back, next, confirm; - private boolean displayChatGroupCreation; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - displayChatGroupCreation = false; - mInflater = inflater; View view = inflater.inflate(R.layout.chat_create, container, false); contactsSelected = new ArrayList<>(); @@ -170,23 +167,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen return view; } - private void displayChatGroupCreation() { - displayChatGroupCreation = true; - confirm.setVisibility(View.VISIBLE); - confirm.setEnabled(subjectField.getText().length() > 0); - next.setVisibility(View.GONE); - - subjectLayout.setVisibility(View.VISIBLE); - contactsList.setVisibility(View.GONE); - searchLayout.setVisibility(View.GONE); - allContacts.setVisibility(View.INVISIBLE); - linphoneContacts.setVisibility(View.INVISIBLE); - allContactsSelected.setVisibility(View.INVISIBLE); - linphoneContactsSelected.setVisibility(View.INVISIBLE); - } - private void displayChatCreation() { - displayChatGroupCreation = false; next.setVisibility(View.VISIBLE); next.setEnabled(contactsSelected.size() > 0); confirm.setVisibility(View.GONE); @@ -298,20 +279,13 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen allContactsSelected.setVisibility(View.INVISIBLE); updateList(); } else if (id == R.id.back) { - if (displayChatGroupCreation) { - displayChatCreation(); - } else { - getFragmentManager().popBackStackImmediate(); - } + getFragmentManager().popBackStackImmediate(); } else if (id == R.id.next) { if (contactsSelected.size() == 1) { LinphoneActivity.instance().displayChat(contactsSelected.get(0).getAddress(), "", ""); } else { - displayChatGroupCreation(); + LinphoneActivity.instance().displayChatGroupInfos(contactsSelected, false); } - } else if (id == R.id.confirm) { - //TODO get chatRoom URI - //LinphoneActivity.instance().displayChat(contactsSelected.get(0).getAddress(), "", ""); } else if (id == R.id.clearSearchField) { searchField.setText(""); searchAdapter.searchContacts("", contactsList); diff --git a/src/android/org/linphone/chat/GroupInfoAdapter.java b/src/android/org/linphone/chat/GroupInfoAdapter.java new file mode 100644 index 000000000..2c0b2f8eb --- /dev/null +++ b/src/android/org/linphone/chat/GroupInfoAdapter.java @@ -0,0 +1,126 @@ +/* +GroupChatFragment.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.chat; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.linphone.LinphoneUtils; +import org.linphone.R; +import org.linphone.activities.LinphoneActivity; +import org.linphone.contacts.ContactAddress; +import org.linphone.contacts.LinphoneContact; + +import java.util.ArrayList; +import java.util.List; + +public class GroupInfoAdapter extends BaseAdapter { + private LayoutInflater mInflater; + private List mItems; + private View.OnClickListener mDeleteListener; + + public GroupInfoAdapter(LayoutInflater inflater, List items) { + mInflater = inflater; + mItems = items; + } + + @Override + public int getCount() { + return mItems.size(); + } + + @Override + public Object getItem(int i) { + return mItems.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + if (view == null) { + view = mInflater.inflate(R.layout.chat_infos_cell, null); + } + + final ContactAddress ca = (ContactAddress)getItem(i); + LinphoneContact c = ca.getContact(); + + TextView name = view.findViewById(R.id.name); + ImageView avatar = view.findViewById(R.id.contact_picture); + ImageView delete = view.findViewById(R.id.delete); + final LinearLayout isAdmin = view.findViewById(R.id.isAdminLayout); + final LinearLayout isNotAdmin = view.findViewById(R.id.isNotAdminLayout); + + name.setText(c.getFullName()); + if (c.hasPhoto()) { + LinphoneUtils.setThumbnailPictureFromUri(LinphoneActivity.instance(), avatar, c.getThumbnailUri()); + } + + delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mDeleteListener != null) { + mDeleteListener.onClick(view); + } + } + }); + delete.setTag(ca); + + isAdmin.setVisibility(ca.isAdmin() ? View.VISIBLE : View.GONE); + isNotAdmin.setVisibility(ca.isAdmin() ? View.GONE : View.VISIBLE); + + isAdmin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + isNotAdmin.setVisibility(View.VISIBLE); + isAdmin.setVisibility(View.GONE); + ca.setAdmin(false); + } + }); + + isNotAdmin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + isNotAdmin.setVisibility(View.GONE); + isAdmin.setVisibility(View.VISIBLE); + ca.setAdmin(true); + } + }); + + return view; + } + + public void setOnDeleteClickListener(View.OnClickListener onClickListener) { + mDeleteListener = onClickListener; + } + + public void updateDataSet(ArrayList mParticipants) { + mItems = mParticipants; + notifyDataSetChanged(); + } +} diff --git a/src/android/org/linphone/chat/GroupInfoFragment.java b/src/android/org/linphone/chat/GroupInfoFragment.java new file mode 100644 index 000000000..3fa86d54c --- /dev/null +++ b/src/android/org/linphone/chat/GroupInfoFragment.java @@ -0,0 +1,134 @@ +/* +InfoGroupChatFragment.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.chat; + +import android.app.Fragment; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; + +import org.linphone.R; +import org.linphone.contacts.ContactAddress; + +import java.util.ArrayList; + +public class GroupInfoFragment extends Fragment { + private ImageView mBackButton, mConfirmButton, mAddParticipantsButton; + private EditText mSubjectField; + private LayoutInflater mInflater; + private ListView mParticipantsList; + private LinearLayout mLeaveGroupButton; + private GroupInfoAdapter mAdapter; + private boolean mIsAlreadyCreatedGroup; + private ArrayList mParticipants; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + mInflater = inflater; + View view = inflater.inflate(R.layout.chat_infos, container, false); + + if (getArguments() == null || getArguments().isEmpty()) { + return null; + } + mParticipants = (ArrayList) getArguments().getSerializable("ContactAddress"); + mIsAlreadyCreatedGroup = getArguments().getBoolean("isAlreadyCreatedGroup"); + + mParticipantsList = view.findViewById(R.id.chat_room_participants); + mAdapter = new GroupInfoAdapter(mInflater, mParticipants); + mAdapter.setOnDeleteClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ContactAddress ca = (ContactAddress) view.getTag(); + mParticipants.remove(ca); + mAdapter.updateDataSet(mParticipants); + mParticipantsList.setAdapter(mAdapter); + mConfirmButton.setEnabled(mSubjectField.getText().length() > 0 && mParticipants.size() > 1); + } + }); + mParticipantsList.setAdapter(mAdapter); + + mSubjectField = view.findViewById(R.id.subjectField); + mSubjectField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + mConfirmButton.setEnabled(mSubjectField.getText().length() > 0 && mParticipants.size() > 1); + } + }); + + mBackButton = view.findViewById(R.id.back); + mBackButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getFragmentManager().popBackStackImmediate(); + } + }); + + mConfirmButton = view.findViewById(R.id.confirm); + mConfirmButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + //TODO + } + }); + mConfirmButton.setEnabled(mSubjectField.getText().length() > 0 && mParticipants.size() > 1); + + mLeaveGroupButton = view.findViewById(R.id.leaveGroupLayout); + mLeaveGroupButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + //TODO + } + }); + mLeaveGroupButton.setVisibility(mIsAlreadyCreatedGroup ? View.VISIBLE : View.GONE); + + mAddParticipantsButton = view.findViewById(R.id.addParticipants); + mAddParticipantsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mIsAlreadyCreatedGroup) { + //TODO + } else { + getFragmentManager().popBackStackImmediate(); + } + } + }); + + //TODO handle contacts removal + + return view; + } +} diff --git a/src/android/org/linphone/chat/InfoGroupChatFragment.java b/src/android/org/linphone/chat/InfoGroupChatFragment.java deleted file mode 100644 index 075d535a1..000000000 --- a/src/android/org/linphone/chat/InfoGroupChatFragment.java +++ /dev/null @@ -1,40 +0,0 @@ -/* -InfoGroupChatFragment.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.chat; - -import android.app.Fragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.linphone.R; - -public class InfoGroupChatFragment extends Fragment { - private LayoutInflater mInflater; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mInflater = inflater; - View view = inflater.inflate(R.layout.chat_infos, container, false); - - return view; - } -}