From f8bf1b24c583513cb540b1822f572dea1b4990e0 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 7 Sep 2017 16:40:19 +0200 Subject: [PATCH] Creation of chat worked --- res/layout/contact_selected.xml | 30 +++++++ res/layout/create_chat.xml | 28 ++++++- res/layout/search_contact_cell.xml | 3 +- .../org/linphone/ChatCreationFragment.java | 80 ++++++++++++++++--- src/android/org/linphone/ContactAddress.java | 36 ++++++++- .../org/linphone/ContactSelectView.java | 60 ++++++++++++++ .../linphone/SearchContactsListAdapter.java | 51 ++++++++---- 7 files changed, 254 insertions(+), 34 deletions(-) create mode 100644 res/layout/contact_selected.xml create mode 100644 src/android/org/linphone/ContactSelectView.java diff --git a/res/layout/contact_selected.xml b/res/layout/contact_selected.xml new file mode 100644 index 000000000..6666e6bf5 --- /dev/null +++ b/res/layout/contact_selected.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/res/layout/create_chat.xml b/res/layout/create_chat.xml index 01123a7c2..52aceef0a 100644 --- a/res/layout/create_chat.xml +++ b/res/layout/create_chat.xml @@ -112,10 +112,32 @@ - + android:layout_height="50dp" + android:layout_below="@+id/layoutSearchField" + android:layout_marginTop="5dp" + android:background="@drawable/resizable_textfield" + android:lines="1" + android:visibility="gone"> + + + + + + android:src="@drawable/check_selected"/> diff --git a/src/android/org/linphone/ChatCreationFragment.java b/src/android/org/linphone/ChatCreationFragment.java index 85943b19a..4378b26d1 100644 --- a/src/android/org/linphone/ChatCreationFragment.java +++ b/src/android/org/linphone/ChatCreationFragment.java @@ -28,11 +28,16 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.EditText; +import android.widget.HorizontalScrollView; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; +import java.util.ArrayList; +import java.util.List; + /** * Created by Erwan Croze. */ @@ -40,7 +45,10 @@ import android.widget.TextView; public class ChatCreationFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener, ContactsUpdatedListener { private LayoutInflater mInflater; private ListView contactsList; + private LinearLayout contactsSelectedLayout; + private HorizontalScrollView contactsSelectLayout; private TextView noSipContact, noContact; + private List contactsSelected; private ImageView allContacts, linphoneContacts; private boolean onlyDisplayLinphoneContacts; private View allContactsSelected, linphoneContactsSelected; @@ -48,18 +56,20 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private EditText searchField; private ProgressBar contactsFetchInProgress; private SearchContactsListAdapter searchAdapter; - private ImageView back; + private ImageView back, next; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mInflater = inflater; View view = inflater.inflate(R.layout.create_chat, container, false); + contactsSelected = new ArrayList(); noSipContact = (TextView) view.findViewById(R.id.noSipContact); noContact = (TextView) view.findViewById(R.id.noContact); contactsList = (ListView) view.findViewById(R.id.contactsList); - contactsList.setOnItemClickListener(this); + contactsSelectedLayout = (LinearLayout) view.findViewById(R.id.contactsSelected); + contactsSelectLayout = (HorizontalScrollView) view.findViewById(R.id.layoutContactsSelected); allContacts = (ImageView) view.findViewById(R.id.all_contacts); allContacts.setOnClickListener(this); @@ -76,6 +86,9 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen back = (ImageView) view.findViewById(R.id.back); back.setOnClickListener(this); + next = (ImageView) view.findViewById(R.id.next); + next.setOnClickListener(this); + clearSearchField = (ImageView) view.findViewById(R.id.clearSearchField); clearSearchField.setOnClickListener(this); @@ -84,6 +97,8 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen searchAdapter = new SearchContactsListAdapter(null, mInflater, contactsFetchInProgress); contactsList.setAdapter(searchAdapter); + contactsList.setOnItemClickListener(this); + searchField = (EditText) view.findViewById(R.id.searchField); searchField.addTextChangedListener(new TextWatcher() { @@ -107,7 +122,48 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen return view; } - public ChatCreationFragment() { + private void updateList() { + searchAdapter.searchContacts(searchField.getText().toString(), contactsList); + searchAdapter.notifyDataSetChanged(); + } + + private void updateListSelected() { + if (contactsSelected.size() > 0) { + contactsSelectLayout.setVisibility(View.VISIBLE); + } else { + contactsSelectLayout.setVisibility(View.GONE); + } + } + + private void updateContactsClick(ContactAddress ca) { + if(ca.isSelect()) { + ContactSelectView csv = new ContactSelectView(LinphoneActivity.instance()); + csv.setListener(this); + csv.setContactName(ca); + contactsSelected.add(ca); + View viewContact = LayoutInflater.from(LinphoneActivity.instance()).inflate(R.layout.contact_selected, null); + ((TextView)viewContact.findViewById(R.id.sipUri)).setText(ca.getContact().getFullName()); + viewContact.findViewById(R.id.contactChatDelete).setOnClickListener(this); + ca.setView(viewContact); + contactsSelectedLayout.addView(viewContact); + } else { + contactsSelected.remove(ca); + contactsSelectedLayout.removeAllViews(); + for (ContactAddress contactAddress : contactsSelected) { + contactsSelectedLayout.addView(contactAddress.getView()); + } + } + searchAdapter.setContactsSelectedList(contactsSelected); + contactsSelectedLayout.invalidate(); + } + + private void removeContactFromView(View v) { + for (ContactAddress ca : contactsSelected) { + if (ca.getView() == v) { + ca.setSelect(false); + updateContactsClick(ca); + } + } } @Override @@ -119,16 +175,14 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen allContacts.setEnabled(false); linphoneContacts.setEnabled(true); linphoneContactsSelected.setVisibility(View.INVISIBLE); - searchAdapter.setContactsList(null); - searchAdapter.searchContacts(searchField.getText().toString(), contactsList); + updateList(); } else if (id == R.id.linphone_contacts) { searchAdapter.setOnlySipContact(true); linphoneContactsSelected.setVisibility(View.VISIBLE); linphoneContacts.setEnabled(false); allContacts.setEnabled(onlyDisplayLinphoneContacts = true); allContactsSelected.setVisibility(View.INVISIBLE); - searchAdapter.setContactsList(null); - searchAdapter.searchContacts(searchField.getText().toString(), contactsList); + updateList(); } else if (id == R.id.back) { getFragmentManager().popBackStackImmediate(); } else if (id == R.id.next) { @@ -136,16 +190,24 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen } else if (id == R.id.clearSearchField) { searchField.setText(""); searchAdapter.searchContacts("", contactsList); + } else if (id == R.id.deleteContact) { + //TODO + removeContactFromView(view); } } @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { - + // Get contact + ContactAddress ca = searchAdapter.getContacts().get(i); + ca.setSelect(!ca.isSelect()); + updateContactsClick(ca); + updateList(); + updateListSelected(); } @Override public void onContactsUpdated() { - + searchAdapter.searchContacts(searchField.getText().toString(), contactsList); } } diff --git a/src/android/org/linphone/ContactAddress.java b/src/android/org/linphone/ContactAddress.java index 41f3cb092..95d04458a 100644 --- a/src/android/org/linphone/ContactAddress.java +++ b/src/android/org/linphone/ContactAddress.java @@ -19,16 +19,35 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +import android.view.View; + public class ContactAddress { - LinphoneContact contact; - String address; - boolean isLinphoneContact; - boolean isSelect = false; + private LinphoneContact contact; + private String address; + private boolean isLinphoneContact; + private boolean isSelect = false; + private View view; public boolean isSelect() { return isSelect; } + public void setView(View v) { + view = v; + } + + public View getView() { + return view; + } + + public LinphoneContact getContact() { + return contact; + } + + public String getAddress() { + return address; + } + public void setSelect(boolean select) { isSelect = select; } @@ -42,4 +61,13 @@ public class ContactAddress { this.address = a; this.isLinphoneContact = isLC; } + + @Override + public boolean equals(Object other){ + if (other == null) return false; + if (other == this) return true; + if (!(other instanceof ContactAddress))return false; + if (((ContactAddress)other).getAddress() == this.getAddress()) return true; + return false; + } } diff --git a/src/android/org/linphone/ContactSelectView.java b/src/android/org/linphone/ContactSelectView.java new file mode 100644 index 000000000..33db1746f --- /dev/null +++ b/src/android/org/linphone/ContactSelectView.java @@ -0,0 +1,60 @@ +package org.linphone; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +/* +ContactSelectView.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. +*/ + +/** + * Created by Erwan Croze. + */ + +public class ContactSelectView extends View { + private TextView contactName; + private ImageView deleteContact; + + ContactSelectView(Context context) { + super(context); + + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE ); + + View view = inflater.inflate(R.layout.contact_selected, null); + + contactName = view.findViewById(R.id.sipUri); + deleteContact = view.findViewById(R.id.contactChatDelete); + + } + + public void setContactName(ContactAddress ca) { + if (ca.getContact() != null) { + contactName.setText(ca.getContact().getFirstName()); + } else { + LinphoneManager.getLc().createFriendWithAddress(ca.getAddress()).getName(); + contactName.setText(ca.getAddress()); + } + } + + public void setListener(OnClickListener listener) { + deleteContact.setOnClickListener(listener); + } +} diff --git a/src/android/org/linphone/SearchContactsListAdapter.java b/src/android/org/linphone/SearchContactsListAdapter.java index 238812a37..ea6639139 100644 --- a/src/android/org/linphone/SearchContactsListAdapter.java +++ b/src/android/org/linphone/SearchContactsListAdapter.java @@ -19,7 +19,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import android.media.Image; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -38,6 +37,7 @@ import java.util.Locale; */ public class SearchContactsListAdapter extends BaseAdapter { + private class ViewHolder { public TextView name; public TextView address; @@ -52,14 +52,16 @@ public class SearchContactsListAdapter extends BaseAdapter { } } - public List getContacts() { - return contacts; - } - private List contacts; + private List contactsSelected; private LayoutInflater mInflater; private ProgressBar progressBar; private boolean mOnlySipContact = false; + private View.OnClickListener listener; + + public List getContacts() { + return contacts; + } public void setOnlySipContact(boolean enable) { mOnlySipContact = enable; @@ -69,11 +71,10 @@ public class SearchContactsListAdapter extends BaseAdapter { this.listener = listener; } - private View.OnClickListener listener; - SearchContactsListAdapter(List contactsList, LayoutInflater inflater, ProgressBar pB) { mInflater = inflater; progressBar = pB; + setContactsSelectedList(null); setContactsList(contactsList); } @@ -87,6 +88,14 @@ public class SearchContactsListAdapter extends BaseAdapter { } } + public void setContactsSelectedList(List contactsList) { + if (contactsList == null) { + contactsSelected = new ArrayList(); + } else { + contactsSelected = contactsList; + } + } + public List getContactsList() { List list = new ArrayList(); if(ContactsManager.getInstance().hasContacts()) { @@ -99,10 +108,17 @@ public class SearchContactsListAdapter extends BaseAdapter { value = value.substring(4); value = LinphoneUtils.getFullAddressFromUsername(value); } - list.add(new ContactAddress(con, value, con.isInLinphoneFriendList())); + ContactAddress ca = new ContactAddress(con, value, con.isInLinphoneFriendList()); + list.add(ca); } } } + + for (ContactAddress caS : contactsSelected) { + for (ContactAddress ca : list) { + if (ca.equals(caS)) ca.setSelect(true); + } + } return list; } @@ -125,7 +141,7 @@ public class SearchContactsListAdapter extends BaseAdapter { public void searchContacts(String search, ListView resultContactsSearch) { if (search == null || search.length() == 0) { - setContactsList(null); + contacts = getContactsList(); resultContactsSearch.setAdapter(this); return; } @@ -133,9 +149,10 @@ public class SearchContactsListAdapter extends BaseAdapter { List result = new ArrayList(); if(search != null) { for (ContactAddress c : getContacts()) { - String address = c.address; + String address = c.getAddress(); if (address.startsWith("sip:")) address = address.substring(4); - if (c.contact.getFullName() != null && c.contact.getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault())) + if (c.getContact().getFullName() != null + && c.getContact().getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault())) || address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) { result.add(c); } @@ -166,8 +183,8 @@ public class SearchContactsListAdapter extends BaseAdapter { view.setTag(holder); } - final String a = contact.address; - LinphoneContact c = contact.contact; + final String a = contact.getAddress(); + LinphoneContact c = contact.getContact(); holder.name.setText(c.getFullName()); holder.address.setText(a); @@ -180,14 +197,14 @@ public class SearchContactsListAdapter extends BaseAdapter { } if (holder.isSelect != null) { if (contact.isSelect()) { - holder.isSelect.setImageResource(R.drawable.check_selected); + holder.isSelect.setVisibility(View.VISIBLE); } else { - holder.isSelect.setImageResource(R.drawable.check_unselected); + holder.isSelect.setVisibility(View.INVISIBLE); } } view.setTag(R.id.contact_search_name, a); - view.setOnClickListener(listener); - + if (listener != null) + view.setOnClickListener(listener); return view; } }