Creation of chat worked

This commit is contained in:
Erwan Croze 2017-09-07 16:40:19 +02:00
parent 1fc73e18fe
commit f8bf1b24c5
7 changed files with 254 additions and 34 deletions

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="5dp"
>
<ImageView
android:id="@+id/contactChatDelete"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="3dp"
android:gravity="center"
android:src="@drawable/chat_group_delete"/>
<TextView
android:id="@+id/sipUri"
style="@style/font6"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toEndOf="@+id/contactChatDelete"
android:layout_toRightOf="@+id/contactChatDelete"
android:gravity="center"
android:lines="1"
android:scrollHorizontally="true"/>
</RelativeLayout>

View file

@ -112,10 +112,32 @@
</RelativeLayout> </RelativeLayout>
<RelativeLayout <HorizontalScrollView
android:layout_below="@+id/layoutSearchField" android:id="@+id/layoutContactsSelected"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="50dp"
android:layout_below="@+id/layoutSearchField"
android:layout_marginTop="5dp"
android:background="@drawable/resizable_textfield"
android:lines="1"
android:visibility="gone">
<LinearLayout
android:id="@+id/contactsSelected"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:lines="1"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:scrollIndicators="bottom"/>
</HorizontalScrollView>
<RelativeLayout
android:layout_below="@+id/layoutContactsSelected"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relativeLayout">
<ListView <ListView
android:id="@+id/contactsList" android:id="@+id/contactsList"

View file

@ -55,6 +55,7 @@
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:layout_gravity="right" android:layout_gravity="right"
android:visibility="invisible"
android:paddingRight="20dp" android:paddingRight="20dp"
android:src="@drawable/check_unselected"/> android:src="@drawable/check_selected"/>
</RelativeLayout> </RelativeLayout>

View file

@ -28,11 +28,16 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.EditText; import android.widget.EditText;
import android.widget.HorizontalScrollView;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/** /**
* Created by Erwan Croze. * Created by Erwan Croze.
*/ */
@ -40,7 +45,10 @@ import android.widget.TextView;
public class ChatCreationFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener, ContactsUpdatedListener { public class ChatCreationFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener, ContactsUpdatedListener {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ListView contactsList; private ListView contactsList;
private LinearLayout contactsSelectedLayout;
private HorizontalScrollView contactsSelectLayout;
private TextView noSipContact, noContact; private TextView noSipContact, noContact;
private List<ContactAddress> contactsSelected;
private ImageView allContacts, linphoneContacts; private ImageView allContacts, linphoneContacts;
private boolean onlyDisplayLinphoneContacts; private boolean onlyDisplayLinphoneContacts;
private View allContactsSelected, linphoneContactsSelected; private View allContactsSelected, linphoneContactsSelected;
@ -48,18 +56,20 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private EditText searchField; private EditText searchField;
private ProgressBar contactsFetchInProgress; private ProgressBar contactsFetchInProgress;
private SearchContactsListAdapter searchAdapter; private SearchContactsListAdapter searchAdapter;
private ImageView back; private ImageView back, next;
@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.create_chat, container, false); View view = inflater.inflate(R.layout.create_chat, container, false);
contactsSelected = new ArrayList<ContactAddress>();
noSipContact = (TextView) view.findViewById(R.id.noSipContact); noSipContact = (TextView) view.findViewById(R.id.noSipContact);
noContact = (TextView) view.findViewById(R.id.noContact); noContact = (TextView) view.findViewById(R.id.noContact);
contactsList = (ListView) view.findViewById(R.id.contactsList); 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 = (ImageView) view.findViewById(R.id.all_contacts);
allContacts.setOnClickListener(this); allContacts.setOnClickListener(this);
@ -76,6 +86,9 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
back = (ImageView) view.findViewById(R.id.back); back = (ImageView) view.findViewById(R.id.back);
back.setOnClickListener(this); back.setOnClickListener(this);
next = (ImageView) view.findViewById(R.id.next);
next.setOnClickListener(this);
clearSearchField = (ImageView) view.findViewById(R.id.clearSearchField); clearSearchField = (ImageView) view.findViewById(R.id.clearSearchField);
clearSearchField.setOnClickListener(this); clearSearchField.setOnClickListener(this);
@ -84,6 +97,8 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
searchAdapter = new SearchContactsListAdapter(null, mInflater, contactsFetchInProgress); searchAdapter = new SearchContactsListAdapter(null, mInflater, contactsFetchInProgress);
contactsList.setAdapter(searchAdapter); contactsList.setAdapter(searchAdapter);
contactsList.setOnItemClickListener(this);
searchField = (EditText) view.findViewById(R.id.searchField); searchField = (EditText) view.findViewById(R.id.searchField);
searchField.addTextChangedListener(new TextWatcher() { searchField.addTextChangedListener(new TextWatcher() {
@ -107,7 +122,48 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
return view; 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 @Override
@ -119,16 +175,14 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
allContacts.setEnabled(false); allContacts.setEnabled(false);
linphoneContacts.setEnabled(true); linphoneContacts.setEnabled(true);
linphoneContactsSelected.setVisibility(View.INVISIBLE); linphoneContactsSelected.setVisibility(View.INVISIBLE);
searchAdapter.setContactsList(null); updateList();
searchAdapter.searchContacts(searchField.getText().toString(), contactsList);
} else if (id == R.id.linphone_contacts) { } else if (id == R.id.linphone_contacts) {
searchAdapter.setOnlySipContact(true); searchAdapter.setOnlySipContact(true);
linphoneContactsSelected.setVisibility(View.VISIBLE); linphoneContactsSelected.setVisibility(View.VISIBLE);
linphoneContacts.setEnabled(false); linphoneContacts.setEnabled(false);
allContacts.setEnabled(onlyDisplayLinphoneContacts = true); allContacts.setEnabled(onlyDisplayLinphoneContacts = true);
allContactsSelected.setVisibility(View.INVISIBLE); allContactsSelected.setVisibility(View.INVISIBLE);
searchAdapter.setContactsList(null); updateList();
searchAdapter.searchContacts(searchField.getText().toString(), contactsList);
} else if (id == R.id.back) { } else if (id == R.id.back) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
} else if (id == R.id.next) { } else if (id == R.id.next) {
@ -136,16 +190,24 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
} else if (id == R.id.clearSearchField) { } else if (id == R.id.clearSearchField) {
searchField.setText(""); searchField.setText("");
searchAdapter.searchContacts("", contactsList); searchAdapter.searchContacts("", contactsList);
} else if (id == R.id.deleteContact) {
//TODO
removeContactFromView(view);
} }
} }
@Override @Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 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 @Override
public void onContactsUpdated() { public void onContactsUpdated() {
searchAdapter.searchContacts(searchField.getText().toString(), contactsList);
} }
} }

View file

@ -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. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
import android.view.View;
public class ContactAddress { public class ContactAddress {
LinphoneContact contact; private LinphoneContact contact;
String address; private String address;
boolean isLinphoneContact; private boolean isLinphoneContact;
boolean isSelect = false; private boolean isSelect = false;
private View view;
public boolean isSelect() { public boolean isSelect() {
return 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) { public void setSelect(boolean select) {
isSelect = select; isSelect = select;
} }
@ -42,4 +61,13 @@ public class ContactAddress {
this.address = a; this.address = a;
this.isLinphoneContact = isLC; 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;
}
} }

View file

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

View file

@ -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. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
import android.media.Image;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -38,6 +37,7 @@ import java.util.Locale;
*/ */
public class SearchContactsListAdapter extends BaseAdapter { public class SearchContactsListAdapter extends BaseAdapter {
private class ViewHolder { private class ViewHolder {
public TextView name; public TextView name;
public TextView address; public TextView address;
@ -52,14 +52,16 @@ public class SearchContactsListAdapter extends BaseAdapter {
} }
} }
public List<ContactAddress> getContacts() {
return contacts;
}
private List<ContactAddress> contacts; private List<ContactAddress> contacts;
private List<ContactAddress> contactsSelected;
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ProgressBar progressBar; private ProgressBar progressBar;
private boolean mOnlySipContact = false; private boolean mOnlySipContact = false;
private View.OnClickListener listener;
public List<ContactAddress> getContacts() {
return contacts;
}
public void setOnlySipContact(boolean enable) { public void setOnlySipContact(boolean enable) {
mOnlySipContact = enable; mOnlySipContact = enable;
@ -69,11 +71,10 @@ public class SearchContactsListAdapter extends BaseAdapter {
this.listener = listener; this.listener = listener;
} }
private View.OnClickListener listener;
SearchContactsListAdapter(List<ContactAddress> contactsList, LayoutInflater inflater, ProgressBar pB) { SearchContactsListAdapter(List<ContactAddress> contactsList, LayoutInflater inflater, ProgressBar pB) {
mInflater = inflater; mInflater = inflater;
progressBar = pB; progressBar = pB;
setContactsSelectedList(null);
setContactsList(contactsList); setContactsList(contactsList);
} }
@ -87,6 +88,14 @@ public class SearchContactsListAdapter extends BaseAdapter {
} }
} }
public void setContactsSelectedList(List<ContactAddress> contactsList) {
if (contactsList == null) {
contactsSelected = new ArrayList<ContactAddress>();
} else {
contactsSelected = contactsList;
}
}
public List<ContactAddress> getContactsList() { public List<ContactAddress> getContactsList() {
List<ContactAddress> list = new ArrayList<ContactAddress>(); List<ContactAddress> list = new ArrayList<ContactAddress>();
if(ContactsManager.getInstance().hasContacts()) { if(ContactsManager.getInstance().hasContacts()) {
@ -99,10 +108,17 @@ public class SearchContactsListAdapter extends BaseAdapter {
value = value.substring(4); value = value.substring(4);
value = LinphoneUtils.getFullAddressFromUsername(value); 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; return list;
} }
@ -125,7 +141,7 @@ public class SearchContactsListAdapter extends BaseAdapter {
public void searchContacts(String search, ListView resultContactsSearch) { public void searchContacts(String search, ListView resultContactsSearch) {
if (search == null || search.length() == 0) { if (search == null || search.length() == 0) {
setContactsList(null); contacts = getContactsList();
resultContactsSearch.setAdapter(this); resultContactsSearch.setAdapter(this);
return; return;
} }
@ -133,9 +149,10 @@ public class SearchContactsListAdapter extends BaseAdapter {
List<ContactAddress> result = new ArrayList<ContactAddress>(); List<ContactAddress> result = new ArrayList<ContactAddress>();
if(search != null) { if(search != null) {
for (ContactAddress c : getContacts()) { for (ContactAddress c : getContacts()) {
String address = c.address; String address = c.getAddress();
if (address.startsWith("sip:")) address = address.substring(4); 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()))) { || address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) {
result.add(c); result.add(c);
} }
@ -166,8 +183,8 @@ public class SearchContactsListAdapter extends BaseAdapter {
view.setTag(holder); view.setTag(holder);
} }
final String a = contact.address; final String a = contact.getAddress();
LinphoneContact c = contact.contact; LinphoneContact c = contact.getContact();
holder.name.setText(c.getFullName()); holder.name.setText(c.getFullName());
holder.address.setText(a); holder.address.setText(a);
@ -180,14 +197,14 @@ public class SearchContactsListAdapter extends BaseAdapter {
} }
if (holder.isSelect != null) { if (holder.isSelect != null) {
if (contact.isSelect()) { if (contact.isSelect()) {
holder.isSelect.setImageResource(R.drawable.check_selected); holder.isSelect.setVisibility(View.VISIBLE);
} else { } else {
holder.isSelect.setImageResource(R.drawable.check_unselected); holder.isSelect.setVisibility(View.INVISIBLE);
} }
} }
view.setTag(R.id.contact_search_name, a); view.setTag(R.id.contact_search_name, a);
if (listener != null)
view.setOnClickListener(listener); view.setOnClickListener(listener);
return view; return view;
} }
} }