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;
}
}