Started rework of contacts

This commit is contained in:
Sylvain Berfini 2016-03-17 15:43:35 +01:00 committed by Jehan Monnier
parent 9139ff69ed
commit a75da820ed
27 changed files with 525 additions and 1005 deletions

View file

@ -9,7 +9,6 @@
<bool name="assistant_use_linphone_login_as_first_fragment">false</bool>
<bool name="hide_in_call_stats">false</bool>
<bool name="use_linphone_friend">false</bool>
<bool name="orientation_portrait_only">false</bool>
<bool name="show_statusbar_only_on_dialer">false</bool>
<bool name="replace_assistant_with_old_interface">false</bool>

View file

@ -1557,12 +1557,12 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
}
private void setContactInformation(TextView contactName, ImageView contactPicture, LinphoneAddress lAddress) {
Contact lContact = ContactsManager.getInstance().findContactWithAddress(contactName.getContext().getContentResolver(), lAddress);
LinphoneContact lContact = ContactsManager.getInstance().findContactFromAddress(contactName.getContext().getContentResolver(), lAddress);
if (lContact == null) {
contactName.setText(LinphoneUtils.getAddressDisplayName(lAddress));
contactPicture.setImageResource(R.drawable.avatar);
} else {
contactName.setText(lContact.getName());
contactName.setText(lContact.getFullName());
LinphoneUtils.setImagePictureFromUri(contactPicture.getContext(), contactPicture, lContact.getPhotoUri(), lContact.getThumbnailUri());
}
}
@ -1720,11 +1720,11 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
conferenceList.setId(index + 1);
TextView contact = (TextView) confView.findViewById(R.id.contactNameOrNumber);
Contact lContact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(),call.getRemoteAddress());
LinphoneContact lContact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(),call.getRemoteAddress());
if (lContact == null) {
contact.setText(call.getRemoteAddress().getUserName());
} else {
contact.setText(lContact.getName());
contact.setText(lContact.getFullName());
}
registerCallDurationTimer(confView, call);

View file

@ -41,7 +41,6 @@ public class CallAudioFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
incallActvityInstance = (CallActivity) activity;
if (incallActvityInstance != null) {

View file

@ -54,7 +54,6 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
private LinphoneCoreListenerBase mListener;
private LinearLayout acceptUnlock;
private LinearLayout declineUnlock;
private StatusFragment status;
private boolean isActive;
private float answerX;
private float declineX;
@ -233,10 +232,10 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
return;
}
LinphoneAddress address = mCall.getRemoteAddress();
Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), address);
if (contact != null) {
LinphoneUtils.setImagePictureFromUri(this, contactPicture, contact.getPhotoUri(), contact.getThumbnailUri());
name.setText(contact.getName());
name.setText(contact.getFullName());
} else {
name.setText(LinphoneUtils.getAddressDisplayName(address));
}
@ -267,10 +266,6 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
return super.onKeyDown(keyCode, event);
}
public void updateStatusFragment(StatusFragment fragment) {
status = fragment;
}
private void decline() {
LinphoneManager.getLc().terminateCall(mCall);
finish();

View file

@ -47,7 +47,6 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
private LinphoneCall mCall;
private LinphoneCoreListenerBase mListener;
private boolean isMicMuted, isSpeakerEnabled;
private StatusFragment status;
public static CallOutgoingActivity instance() {
return instance;
@ -57,10 +56,6 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
return instance != null;
}
public void updateStatusFragment(StatusFragment fragment) {
status = fragment;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -148,10 +143,10 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
}
LinphoneAddress address = mCall.getRemoteAddress();
Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), address);
if (contact != null) {
LinphoneUtils.setImagePictureFromUri(this, contactPicture, contact.getPhotoUri(), contact.getThumbnailUri());
name.setText(contact.getName());
name.setText(contact.getFullName());
} else {
name.setText(LinphoneUtils.getAddressDisplayName(address));
}

View file

@ -21,15 +21,13 @@ import org.linphone.compatibility.Compatibility;
import org.linphone.compatibility.CompatibilityScaleGestureDetector;
import org.linphone.compatibility.CompatibilityScaleGestureListener;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCore;
import org.linphone.mediastream.Log;
import org.linphone.mediastream.video.AndroidVideoWindowImpl;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import android.app.Activity;
//import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.app.Fragment;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
@ -40,6 +38,7 @@ import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
//import android.opengl.GLSurfaceView;
/**
* @author Sylvain Berfini
@ -260,8 +259,6 @@ public class CallVideoFragment extends Fragment implements OnGestureListener, On
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
inCallActivity = (CallActivity) activity;
if (inCallActivity != null) {
inCallActivity.bindVideoFragment(this);

View file

@ -21,33 +21,27 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import android.app.Dialog;
import android.app.Fragment;
import android.graphics.Color;
import android.graphics.Matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneBuffer;
import org.linphone.core.LinphoneChatMessage;
import org.linphone.core.LinphoneChatMessage.State;
import org.linphone.core.LinphoneChatRoom;
import org.linphone.core.LinphoneContent;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneChatMessage.State;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.mediastream.Log;
import org.linphone.ui.BubbleChat;
import android.media.ExifInterface;
import android.support.v4.content.CursorLoader;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
@ -55,13 +49,16 @@ import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.support.v4.content.CursorLoader;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextMenu;
@ -106,21 +103,18 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private LinphoneChatRoom chatRoom;
private String sipUri;
private String displayName;
private String pictureUri;
private EditText message;
private ImageView edit, selectAll, deselectAll, startCall, delete, sendImage, sendMessage, cancel;
private TextView contactName, remoteComposing;
private ImageView back, backToCall;
private EditText searchContactField;
private LinearLayout topBar, editList;
private LinearLayout textLayout;
private SearchContactsListAdapter searchAdapter;
private ListView messagesList, resultContactsSearch;
private LayoutInflater inflater;
private boolean isEditMode = false;
private Contact contact;
private LinphoneContact contact;
private Uri imageToUploadUri;
private String filePathToUpload;
private TextWatcher textWatcher;
@ -152,8 +146,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
} else {
//Retrieve parameter from intent
sipUri = getArguments().getString("SipUri");
displayName = getArguments().getString("DisplayName");
pictureUri = getArguments().getString("PictureUri");
}
//Initialize UI
@ -163,7 +155,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
resultContactsSearch = (ListView) view.findViewById(R.id.result_contacts);
editList = (LinearLayout) view.findViewById(R.id.edit_list);
textLayout = (LinearLayout) view.findViewById(R.id.message_layout);
topBar = (LinearLayout) view.findViewById(R.id.top_bar);
sendMessage = (ImageView) view.findViewById(R.id.send_message);
@ -468,7 +459,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
chatRoom = lc.getChatRoom(lAddress);
chatRoom.markAsRead();
LinphoneActivity.instance().updateMissedChatCount();
contact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), lAddress);
contact = ContactsManager.getInstance().findContactFromAddress(getActivity().getContentResolver(), lAddress);
if (chatRoom != null) {
displayChatHeader(lAddress);
dispayMessageList();
@ -487,7 +478,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private void displayChatHeader(LinphoneAddress address) {
if(contact != null) {
contactName.setText(contact.getName());
contactName.setText(contact.getFullName());
} else if(address != null){
contactName.setText(LinphoneUtils.getAddressDisplayName(address));
}
@ -495,9 +486,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
public void changeDisplayedChat(String newSipUri, String displayName, String pictureUri) {
this.sipUri = newSipUri;
this.displayName = displayName;
this.pictureUri = pictureUri;
initChatRoom(sipUri);
}
@ -732,7 +720,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
//Start new conversation in fast chat
if(newChatConversation && chatRoom == null) {
String address = searchContactField.getText().toString().toLowerCase();
String address = searchContactField.getText().toString().toLowerCase(Locale.getDefault());
if (address != null && !address.equals("")) {
initChatRoom(address);
}
@ -748,7 +736,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
message.setListener(LinphoneManager.getInstance());
if (newChatConversation) {
exitNewConversationMode(contact, lAddress.asStringUriOnly(), null);
exitNewConversationMode(lAddress.asStringUriOnly());
} else {
invalidate();
}
@ -860,12 +848,10 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
class FileUploadPrepareTask extends AsyncTask<Bitmap, Void, byte[]> {
private String path;
private int imageSize;
private ProgressDialog progressDialog;
public FileUploadPrepareTask(Context context, String fileToUploadPath, int size) {
path = fileToUploadPath;
imageSize = size;
progressDialog = new ProgressDialog(context);
progressDialog.setIndeterminate(true);
@ -931,15 +917,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
}
private void showPopupMenuAskingImageSize(final String filePath) {
filePathToUpload = filePath;
try {
sendImage.showContextMenu();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ADD_PHOTO && resultCode == Activity.RESULT_OK) {
@ -961,7 +938,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
//New conversation
private void exitNewConversationMode(Contact c, String address, String username){
private void exitNewConversationMode(String address) {
sipUri = address;
searchContactField.setVisibility(View.GONE);
resultContactsSearch.setVisibility(View.GONE);
@ -1006,10 +983,10 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
private class ContactAddress {
Contact contact;
LinphoneContact contact;
String address;
private ContactAddress(Contact c, String a){
private ContactAddress(LinphoneContact c, String a){
this.contact = c;
this.address = a;
}
@ -1026,7 +1003,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
for (ContactAddress c : searchAdapter.contacts) {
String address = c.address;
if(address.startsWith("sip:")) address = address.substring(4);
if (c.contact.getName().toLowerCase().startsWith(search.toLowerCase()) || address.toLowerCase().startsWith(search.toLowerCase())) {
if (c.contact.getFullName().toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))
|| address.toLowerCase(Locale.getDefault()).startsWith(search.toLowerCase(Locale.getDefault()))) {
result.add(c);
}
}
@ -1049,12 +1027,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
}
public List<ContactAddress>getContactsList(){
public List<ContactAddress> getContactsList() {
List<ContactAddress> list = new ArrayList<ContactAddress>();
if(ContactsManager.getInstance().getAllContacts() != null) {
for (Contact con : ContactsManager.getInstance().getAllContacts()) {
for (String numberOrAddress : con.getNumbersOrAddresses()) {
list.add(new ContactAddress(con, numberOrAddress));
if(ContactsManager.getInstance().hasContacts()) {
for (LinphoneContact con : ContactsManager.getInstance().getContacts()) {
for (LinphoneNumberOrAddress noa : con.getNumbersOrAddresses()) {
list.add(new ContactAddress(con, noa.getValue()));
}
}
}
@ -1092,10 +1070,10 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
final String a = contact.address;
final Contact c = contact.contact;
final LinphoneContact c = contact.contact;
TextView name = (TextView) view.findViewById(R.id.contact_name);
name.setText(c.getName());
name.setText(c.getFullName());
TextView address = (TextView) view.findViewById(R.id.contact_address);
address.setText(a);
@ -1103,7 +1081,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
exitNewConversationMode(c, a, null);
exitNewConversationMode(a);
}
});

View file

@ -17,9 +17,6 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
import org.linphone.core.LinphoneAddress;
@ -30,17 +27,9 @@ import org.linphone.core.LinphoneCoreFactory;
import org.linphone.mediastream.Log;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.app.Fragment;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
@ -59,7 +48,6 @@ import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
@ -70,7 +58,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
private List<String> mConversations, mDrafts;
private ListView chatList;
private TextView noChatHistory;
private ImageView edit, selectAll, deselectAll, delete, newDiscussion, contactPicture, cancel, backInCall;
private ImageView edit, selectAll, deselectAll, delete, newDiscussion, cancel, backInCall;
private LinearLayout editList, topbar;
private boolean isEditMode = false;
@ -323,32 +311,6 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
LinphoneActivity.instance().displayChat(sipUri);
}
}
private String saveImageAsFile(int id, Bitmap bm) {
try {
String path = Environment.getExternalStorageDirectory().toString();
if (!path.endsWith("/"))
path += "/";
path += "Pictures/";
File directory = new File(path);
directory.mkdirs();
String filename = getString(R.string.picture_name_format).replace("%s", String.valueOf(id));
File file = new File(path, filename);
OutputStream fOut = null;
fOut = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
return path + filename;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
class ChatListAdapter extends BaseAdapter {
@ -386,7 +348,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
return view;
}
Contact contact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), address);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getActivity().getContentResolver(), address);
String message = "";
Long time;
@ -416,7 +378,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte
}
displayName.setSelected(true); // For animation
displayName.setText(contact == null ? LinphoneUtils.getAddressDisplayName(address) : contact.getName());
displayName.setText(contact == null ? LinphoneUtils.getAddressDisplayName(address) : contact.getFullName());
if(contact != null){

View file

@ -32,6 +32,7 @@ import android.net.Uri;
/**
* @author Sylvain Berfini
* @deprecated
*/
public class Contact implements Serializable {
private static final long serialVersionUID = 3790717505065723499L;

View file

@ -17,23 +17,13 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.io.InputStream;
import java.util.ArrayList;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.mediastream.Log;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentProviderOperation;
import android.content.DialogInterface;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -47,7 +37,7 @@ import android.widget.TextView;
* @author Sylvain Berfini
*/
public class ContactDetailsFragment extends Fragment implements OnClickListener {
private Contact contact;
private LinphoneContact contact;
private ImageView editContact, deleteContact, back;
private LayoutInflater inflater;
private View view;
@ -71,7 +61,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
} else {
to = v.getTag().toString();
}
LinphoneActivity.instance().setAddresGoToDialerAndCall(to, contact.getName(), contact.getPhotoUri());
LinphoneActivity.instance().setAddresGoToDialerAndCall(to, contact.getFullName(), contact.getPhotoUri());
}
}
}
@ -87,7 +77,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
};
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
contact = (Contact) getArguments().getSerializable("Contact");
contact = (LinphoneContact) getArguments().getSerializable("Contact");
this.inflater = inflater;
view = inflater.inflate(R.layout.contact, container, false);
@ -112,38 +102,37 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
return view;
}
public void changeDisplayedContact(Contact newContact) {
public void changeDisplayedContact(LinphoneContact newContact) {
contact = newContact;
contact.refresh(getActivity().getContentResolver());
//contact.refresh();
displayContact(inflater, view);
}
@SuppressLint("InflateParams")
private void displayContact(LayoutInflater inflater, View view) {
ImageView contactPicture = (ImageView) view.findViewById(R.id.contact_picture);
if (contact.getPhotoUri() != null) {
InputStream input = Compatibility.getContactPictureInputStream(LinphoneActivity.instance().getContentResolver(), contact.getID());
contactPicture.setImageBitmap(BitmapFactory.decodeStream(input));
if (contact.hasPhoto()) {
LinphoneUtils.setImagePictureFromUri(getActivity(), contactPicture, contact.getPhotoUri(), contact.getThumbnailUri());
} else {
contactPicture.setImageResource(R.drawable.avatar);
}
TextView contactName = (TextView) view.findViewById(R.id.contact_name);
contactName.setText(contact.getName());
contactName.setText(contact.getFullName());
TableLayout controls = (TableLayout) view.findViewById(R.id.controls);
controls.removeAllViews();
for (String numberOrAddress : contact.getNumbersOrAddresses()) {
for (LinphoneNumberOrAddress noa : contact.getNumbersOrAddresses()) {
boolean skip = false;
View v = inflater.inflate(R.layout.contact_control_row, null);
String displayednumberOrAddress = numberOrAddress;
if (numberOrAddress.startsWith("sip:")) {
String displayednumberOrAddress = noa.getValue();
if (displayednumberOrAddress.startsWith("sip:")) {
displayednumberOrAddress = displayednumberOrAddress.replace("sip:", "");
}
TextView label = (TextView) v.findViewById(R.id.address_label);
if(LinphoneUtils.isSipAddress(numberOrAddress)) {
if (noa.isSIPAddress()) {
label.setText(R.string.sip_address);
skip |= getResources().getBoolean(R.bool.hide_contact_sip_addresses);
} else {
@ -166,20 +155,19 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
LinphoneProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig();
if (lpc != null) {
displayednumberOrAddress = lpc.normalizePhoneNumber(displayednumberOrAddress);
if (!displayednumberOrAddress.startsWith("sip:")) {
numberOrAddress = "sip:" + displayednumberOrAddress;
String tag = noa.getValue();
if (!tag.startsWith("sip:")) {
tag = "sip:" + tag;
}
String tag = numberOrAddress;
if (!numberOrAddress.contains("@")) {
tag = numberOrAddress + "@" + lpc.getDomain();
if (!tag.contains("@")) {
tag = tag + "@" + lpc.getDomain();
}
v.findViewById(R.id.contact_chat).setTag(tag);
} else {
v.findViewById(R.id.contact_chat).setTag(numberOrAddress);
v.findViewById(R.id.contact_chat).setTag(noa.getValue());
}
final String finalNumberOrAddress = numberOrAddress;
/*ImageView friend = (ImageView) v.findViewById(R.id.addFriend);
if (getResources().getBoolean(R.bool.enable_linphone_friends) && !displayChatAddressOnly) {
friend.setVisibility(View.VISIBLE);
@ -226,8 +214,8 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
LinphoneActivity.instance().selectMenu(FragmentsAvailable.CONTACT_DETAIL);
LinphoneActivity.instance().hideTabBar(false);
}
contact.refresh(getActivity().getContentResolver());
if (contact.getName() == null || contact.getName().equals("")) {
contact.refresh();
if (contact.getFullName() == null || contact.getFullName().equals("")) {
//Contact has been deleted, return
LinphoneActivity.instance().displayContacts(false);
} else {
@ -250,8 +238,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
deleteExistingContact();
ContactsManager.getInstance().removeContactFromLists(getActivity().getContentResolver(), contact);
contact.delete();
LinphoneActivity.instance().displayContacts(false);
dialog.dismiss();
}
@ -270,22 +257,4 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
LinphoneActivity.instance().displayContacts(false);
}
}
private void deleteExistingContact() {
String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[] { contact.getID() };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(select, args)
.build()
);
try {
getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
ContactsManager.getInstance().removeAllFriends(contact);
} catch (Exception e) {
Log.w(e.getMessage() + ":" + e.getStackTrace());
}
}
}

View file

@ -77,9 +77,9 @@ public class ContactEditorFragment extends Fragment {
private static final int ADD_PHOTO = 1337;
private boolean isNewContact = true;
private Contact contact;
private LinphoneContact contact;
private int contactID;
private List<NewOrUpdatedNumberOrAddress> numbersAndAddresses;
//private List<NewOrUpdatedNumberOrAddress> numbersAndAddresses;
private ArrayList<ContentProviderOperation> ops;
private int firstSipAddressIndex = -1;
private LinearLayout sipAddresses, numbers;
@ -88,16 +88,15 @@ public class ContactEditorFragment extends Fragment {
private Uri imageToUploadUri;
private String fileToUploadPath;
private Bitmap imageToUpload;
private Bitmap bitmapUnknown;
byte[] photoToAdd;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.inflater = inflater;
contact = null;
/*contact = null;
if (getArguments() != null) {
if (getArguments().getSerializable("Contact") != null) {
contact = (Contact) getArguments().getSerializable("Contact");
contact = (LinphoneContact) getArguments().getSerializable("Contact");
isNewContact = false;
contactID = Integer.parseInt(contact.getID());
contact.refresh(getActivity().getContentResolver());
@ -181,7 +180,7 @@ public class ContactEditorFragment extends Fragment {
}
getFragmentManager().popBackStackImmediate();
} else {
Contact updatedContact = contactsManager.findContactWithDisplayName(contactsManager.getDisplayName(firstName.getText().toString(), lastName.getText().toString()));
LinphoneContact updatedContact = contactsManager.findContactWithDisplayName(contactsManager.getDisplayName(firstName.getText().toString(), lastName.getText().toString()));
if (updatedContact != null) {
LinphoneActivity.instance().displayContact(updatedContact, false);
} else {
@ -249,7 +248,7 @@ public class ContactEditorFragment extends Fragment {
firstName.setText(fn);
lastName.setText(ln);
} else {
lastName.setText(contact.getName());
lastName.setText(contact.getFullName());
firstName.setText("");
}
deleteContact.setOnClickListener(new OnClickListener() {
@ -262,8 +261,7 @@ public class ContactEditorFragment extends Fragment {
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
deleteExistingContact();
ContactsManager.getInstance().removeContactFromLists(getActivity().getContentResolver(), contact);
contact.delete();
LinphoneActivity.instance().displayContacts(false);
dialog.dismiss();
}
@ -319,7 +317,7 @@ public class ContactEditorFragment extends Fragment {
});
ops = new ArrayList<ContentProviderOperation>();
lastName.requestFocus();
lastName.requestFocus();*/
return view;
}
@ -348,7 +346,7 @@ public class ContactEditorFragment extends Fragment {
super.onPause();
}
private void pickImage() {
/*private void pickImage() {
imageToUploadUri = null;
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
@ -419,24 +417,6 @@ public class ContactEditorFragment extends Fragment {
}
}
private void deleteExistingContact() {
String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[] { contact.getID() };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(select, args)
.build()
);
try {
getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
ContactsManager.getInstance().removeAllFriends(contact);
} catch (Exception e) {
Log.w(e.getMessage() + ":" + e.getStackTrace());
}
}
private void showPopupMenuAskingImageSize(final String filePath, final Bitmap image) {
fileToUploadPath = filePath;
imageToUpload = image;
@ -962,5 +942,5 @@ public class ContactEditorFragment extends Fragment {
);
}
}
}
}*/
}

View file

@ -1,4 +1,3 @@
package org.linphone;
/*
ContactsListFragment.java
Copyright (C) 2015 Belledonne Communications, Grenoble, France
@ -17,23 +16,18 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.util.ArrayList;
package org.linphone;
import java.util.List;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneFriend;
import org.linphone.core.PresenceActivityType;
import org.linphone.mediastream.Log;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.ContentProviderOperation;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.app.Fragment;
import android.provider.ContactsContract;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
@ -43,7 +37,6 @@ import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AlphabetIndexer;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
@ -52,8 +45,6 @@ import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SectionIndexer;
import android.widget.TextView;
/**
@ -69,12 +60,10 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
private View allContactsSelected, linphoneContactsSelected;
private LinearLayout editList, topbar;
private int lastKnownPosition;
private AlphabetIndexer indexer;
private boolean editOnClick = false, editConsumed = false, onlyDisplayChatAddress = false;
private String sipAddressToAdd;
private ImageView clearSearchField;
private EditText searchField;
private Cursor searchCursor;
private static ContactsListFragment instance;
@ -284,31 +273,12 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
}
}
private void deleteExistingContact(Contact contact) {
String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[] { contact.getID() };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(select, args)
.build()
);
try {
getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
ContactsManager.getInstance().removeAllFriends(contact);
} catch (Exception e) {
Log.w(e.getMessage() + ":" + e.getStackTrace());
}
}
private void removeContacts(){
int size = contactsList.getAdapter().getCount();
for(int i=0; i<size; i++) {
if(contactsList.isItemChecked(i)){
Contact contact = (Contact) contactsList.getAdapter().getItem(i);
deleteExistingContact(contact);
ContactsManager.getInstance().removeContactFromLists(getActivity().getContentResolver(), contact);
LinphoneContact contact = (LinphoneContact) contactsList.getAdapter().getItem(i);
contact.delete();
}
}
}
@ -325,7 +295,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
public void displayFirstContact(){
if(contactsList.getAdapter() != null && contactsList.getAdapter().getCount() > 0) {
LinphoneActivity.instance().displayContact((Contact) contactsList.getAdapter().getItem(0), false);
LinphoneActivity.instance().displayContact((LinphoneContact) contactsList.getAdapter().getItem(0), false);
} else {
LinphoneActivity.instance().displayEmptyFragment();
}
@ -341,73 +311,31 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
return;
}
changeContactsToggle();
if (searchCursor != null) {
searchCursor.close();
}
if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) {
//searchCursor = Compatibility.getSIPContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId());
//indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
//contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
//contactsList.setAdapter(new ContactsListAdapter(null, searchCursor));
} else{
if (onlyDisplayLinphoneContacts) {
searchCursor = Compatibility.getSIPContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId());
indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(null, searchCursor));
} else {
searchCursor = Compatibility.getContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId());
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
contactsList.setAdapter(new ContactsListAdapter(null, searchCursor));
}
if (onlyDisplayLinphoneContacts) {
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getSIPContacts()));
} else {
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getContacts()));
}
}
private void changeContactsAdapter() {
changeContactsToggle();
if (searchCursor != null) {
searchCursor.close();
}
Cursor allContactsCursor = ContactsManager.getInstance().getAllContactsCursor();
Cursor sipContactsCursor = ContactsManager.getInstance().getSIPContactsCursor();
noSipContact.setVisibility(View.GONE);
noContact.setVisibility(View.GONE);
contactsList.setVisibility(View.VISIBLE);
if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) {
indexer = new AlphabetIndexer(allContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(allContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
if (onlyDisplayLinphoneContacts) {
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getAllContacts(), allContactsCursor));
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getSIPContacts()));
edit.setEnabled(true);
} else {
if (onlyDisplayLinphoneContacts) {
if (sipContactsCursor != null && sipContactsCursor.getCount() > 0) {
indexer = new AlphabetIndexer(sipContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(sipContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getSIPContacts(), sipContactsCursor));
edit.setEnabled(true);
} else {
noSipContact.setVisibility(View.VISIBLE);
contactsList.setVisibility(View.GONE);
edit.setEnabled(false);
}
} else {
if (allContactsCursor != null && allContactsCursor.getCount() > 0) {
indexer = new AlphabetIndexer(allContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(allContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getAllContacts(), allContactsCursor));
edit.setEnabled(true);
} else {
noContact.setVisibility(View.VISIBLE);
contactsList.setVisibility(View.GONE);
edit.setEnabled(false);
}
}
contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getContacts()));
edit.setEnabled(true);
}
ContactsManager.getInstance().setLinphoneContactsPrefered(onlyDisplayLinphoneContacts);
}
@ -428,7 +356,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
Contact contact = (Contact) adapter.getItemAtPosition(position);
LinphoneContact contact = (LinphoneContact) adapter.getItemAtPosition(position);
if (editOnClick) {
editConsumed = true;
LinphoneActivity.instance().editContact(contact, sipAddressToAdd);
@ -460,9 +388,6 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
@Override
public void onPause() {
instance = null;
if (searchCursor != null) {
searchCursor.close();
}
super.onPause();
}
@ -475,34 +400,19 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
contactsList.setSelectionFromTop(lastKnownPosition, 0);
}
class ContactsListAdapter extends BaseAdapter implements SectionIndexer {
private int margin;
private Bitmap bitmapUnknown;
private List<Contact> contacts;
private Cursor cursor;
class ContactsListAdapter extends BaseAdapter {
private List<LinphoneContact> contacts;
ContactsListAdapter(List<Contact> contactsList, Cursor c) {
ContactsListAdapter(List<LinphoneContact> contactsList) {
contacts = contactsList;
cursor = c;
margin = LinphoneUtils.pixelsToDpi(LinphoneActivity.instance().getResources(), 10);
bitmapUnknown = BitmapFactory.decodeResource(LinphoneActivity.instance().getResources(), R.drawable.avatar);
}
public int getCount() {
if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) {
return LinphoneManager.getLc().getFriendList().length;
} else {
return cursor.getCount();
}
return contacts.size();
}
public Object getItem(int position) {
if (contacts == null || position >= contacts.size()) {
return Compatibility.getContact(getActivity().getContentResolver(), cursor, position);
} else {
return contacts.get(position);
}
return contacts.get(position);
}
public long getItemId(int position) {
@ -511,9 +421,9 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
Contact contact = null;
LinphoneContact contact = null;
do {
contact = (Contact) getItem(position);
contact = (LinphoneContact) getItem(position);
} while (contact == null);
if (convertView != null) {
@ -525,20 +435,14 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
CheckBox delete = (CheckBox) view.findViewById(R.id.delete);
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(contact.getName());
name.setText(contact.getFullName());
LinearLayout separator = (LinearLayout) view.findViewById(R.id.separator);
TextView separatorText = (TextView) view.findViewById(R.id.separator_text);
if (getPositionForSection(getSectionForPosition(position)) != position) {
separator.setVisibility(View.GONE);
} else {
separator.setVisibility(View.VISIBLE);
separatorText.setText(String.valueOf(contact.getName().charAt(0)));
}
separator.setVisibility(View.GONE);
ImageView icon = (ImageView) view.findViewById(R.id.contact_picture);
if (contact.getPhoto() != null) {
icon.setImageBitmap(contact.getPhoto());
if (contact.hasPhoto()) {
LinphoneUtils.setImagePictureFromUri(getActivity(), icon, contact.getPhotoUri(), contact.getThumbnailUri());
} else if (contact.getPhotoUri() != null) {
icon.setImageURI(contact.getPhotoUri());
} else {
@ -568,7 +472,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
}
}
});
if(contactsList.isItemChecked(position)) {
if (contactsList.isItemChecked(position)) {
delete.setChecked(true);
} else {
delete.setChecked(false);
@ -597,20 +501,5 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
return view;
}
@Override
public int getPositionForSection(int section) {
return indexer.getPositionForSection(section);
}
@Override
public int getSectionForPosition(int position) {
return indexer.getSectionForPosition(position);
}
@Override
public Object[] getSections() {
return indexer.getSections();
}
}
}

View file

@ -1,6 +1,5 @@
package org.linphone;
/*
CallManager.java
ContactsManager.java
Copyright (C) 2015 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
@ -18,63 +17,57 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.ContactsContract;
package org.linphone;
import java.util.ArrayList;
import java.util.List;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneFriend;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.mediastream.Log;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Data;
public class ContactsManager {
private static ContactsManager instance;
private List<Contact> contactList, sipContactList;
private Cursor contactCursor, sipContactCursor;
private List<LinphoneContact> contacts;
//private Cursor contactCursor, sipContactCursor;
private Account mAccount;
private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false;
private ContentResolver contentResolver;
private Context context;
private ContactsManager() {}
public ContentResolver getContentResolver() {
return contentResolver;
}
public static final synchronized ContactsManager getInstance() {
if (instance == null) instance = new ContactsManager();
return instance;
}
public List<Contact> getAllContacts() {
return contactList;
}
public List<Contact> getSIPContacts() {
return sipContactList;
}
public Cursor getAllContactsCursor() {
return contactCursor;
}
public Cursor getSIPContactsCursor() {
return sipContactCursor;
public boolean hasContacts() {
return contacts.size() > 0;
}
public void enabledContactsAccess(){
public List<LinphoneContact> getContacts() {
return contacts;
}
public List<LinphoneContact> getSIPContacts() {
return contacts;
}
public void enableContactsAccess() {
hasContactAccess = true;
}
@ -91,7 +84,6 @@ public class ContactsManager {
}
public void initializeContactManager(Context context, ContentResolver contentResolver){
this.context = context;
this.contentResolver = contentResolver;
}
@ -113,529 +105,59 @@ public class ContactsManager {
} else {
mAccount = accounts[0];
}
initializeContactManager(context,contentResolver);
initializeContactManager(context, contentResolver);
}
public String getDisplayName(String firstName, String lastName) {
String displayName = null;
if (firstName.length() > 0 && lastName.length() > 0)
displayName = firstName + " " + lastName;
else if (firstName.length() > 0)
displayName = firstName;
else if (lastName.length() > 0)
displayName = lastName.toString();
return displayName;
public LinphoneContact findContactFromAddress(LinphoneAddress address) {
return findContactFromAddress(null, address);
}
//Contacts
public void createNewContact(ArrayList<ContentProviderOperation> ops, String firstName, String lastName) {
int contactID = 0;
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build()
);
if (getDisplayName(firstName, lastName) != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, contactID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName)
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, getDisplayName(firstName, lastName))
.build()
);
}
}
public void updateExistingContact(ArrayList<ContentProviderOperation> ops, Contact contact, String firstName, String lastName) {
if (getDisplayName(firstName, lastName) != null) {
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'";
String[] args = new String[]{String.valueOf(contact.getID())};
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName)
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName)
.build()
);
}
}
public void updateExistingContactPicture(ArrayList<ContentProviderOperation> ops, Contact contact, String path){
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
String[] args =new String[]{String.valueOf(contact.getID())};
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID, path)
//.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID, )
.build()
);
}
//Manage Linphone Friend if we cannot use Sip address
public boolean createNewFriend(Contact contact, String sipUri) {
if (!sipUri.startsWith("sip:")) {
sipUri = "sip:" + sipUri;
}
LinphoneFriend friend = LinphoneCoreFactory.instance().createLinphoneFriend(sipUri);
if (friend != null) {
friend.edit();
friend.enableSubscribes(false);
friend.setRefKey(contact.getID());
friend.done();
try {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().addFriend(friend);
return true;
} catch (LinphoneCoreException e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
}
public void updateFriend(String oldSipUri, String newSipUri) {
if (!newSipUri.startsWith("sip:")) {
newSipUri = "sip:" + newSipUri;
}
if (!oldSipUri.startsWith("sip:")) {
oldSipUri = "sip:" + oldSipUri;
}
LinphoneFriend friend = LinphoneManager.getLcIfManagerNotDestroyedOrNull().findFriendByAddress(oldSipUri);
if (friend != null) {
friend.edit();
try {
friend.setAddress(LinphoneCoreFactory.instance().createLinphoneAddress(newSipUri));
} catch (LinphoneCoreException e) {
e.printStackTrace();
}
friend.done();
}
}
public boolean removeFriend(String sipUri) {
if (!sipUri.startsWith("sip:")) {
sipUri = "sip:" + sipUri;
}
LinphoneFriend friend = LinphoneManager.getLcIfManagerNotDestroyedOrNull().findFriendByAddress(sipUri);
if (friend != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend);
return true;
}
return false;
}
public void removeAllFriends(Contact contact) {
for (LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) {
if (friend.getRefKey().equals(contact.getID())) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend);
}
}
}
public Contact findContactWithDisplayName(String displayName) {
String[] projection = {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME};
String selection = new StringBuilder()
.append(ContactsContract.Data.DISPLAY_NAME)
.append(" = ?").toString();
Cursor c = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection,
new String[]{displayName}, null);
if (c != null) {
if (c.moveToFirst()) {
Contact contact = Compatibility.getContact(contentResolver, c, c.getPosition());
c.close();
if (contact != null) {
return contact;
} else {
return null;
}
}
c.close();
}
return null;
}
public Contact getContact(String id, ContentResolver contentResolver){
String[] projection = {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME};
String selection = new StringBuilder()
.append(ContactsContract.Data.CONTACT_ID)
.append(" = ?").toString();
Cursor c = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection, new String[]{id}, null);
if(c!=null){
if (c.moveToFirst()) {
Contact contact = Compatibility.getContact(contentResolver, c, c.getPosition());
c.close();
if (contact != null) {
return contact;
} else {
return null;
}
}
c.close();
}
return null;
}
public List<String> getContactsId(){
List<String> ids = new ArrayList<String>();
if(LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList() == null) return null;
for(LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) {
friend.edit();
friend.enableSubscribes(false);
friend.done();
if(!ids.contains(friend.getRefKey())){
ids.add(friend.getRefKey());
}
}
return ids;
}
//End linphone Friend
public boolean removeContactTagIsNeeded(Contact contact){
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
LinphoneProxyConfig lpc = lc.createProxyConfig();
contact.refresh(contentResolver);
for (String address : contact.getNumbersOrAddresses()) {
if (!lpc.isPhoneNumber(address)) {
return false;
}
}
return true;
}
return false;
}
public void removeLinphoneContactTag(Contact contact){
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
String select = ContactsContract.RawContacts._ID + " = ?";
String[] args = new String[] { findRawLinphoneContactID(contact.getID()) };
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(select, args)
.build()
);
try {
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
Log.w(e.getMessage() + ":" + e.getStackTrace());
}
}
private Contact checkPhoneQueryResult(ContentResolver contentResolver, Cursor c, String columnPhone, String columnId, String username) {
boolean contactFound = false;
if (c != null) {
while (!contactFound && c.moveToNext()) {
String phone = c.getString(c.getColumnIndex(columnPhone));
if (phone.equals(username)) {
contactFound = true;
} else {
String normalizedUsername = null;
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
LinphoneProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null) {
normalizedUsername = lpc.normalizePhoneNumber(phone);
}
}
if (normalizedUsername != null && normalizedUsername.equals(username)) {
contactFound = true;
}
}
if(contactFound){
Contact contact = getContact(c.getString(c.getColumnIndex(columnId)), contentResolver);
c.close();
return contact;
}
}
c.close();
}
return null;
}
public Contact findContactWithAddress(LinphoneAddress address) {
public LinphoneContact findContactFromAddress(ContentResolver contentResolver, LinphoneAddress address) {
String sipUri = address.asStringUriOnly();
if (sipUri.startsWith("sip:"))
if (sipUri.startsWith("sip:")) {
sipUri = sipUri.substring(4);
}
for(Contact c: getAllContacts()){
for(String a: c.getNumbersOrAddresses()){
if(a.equals(sipUri))
for (LinphoneContact c: getContacts()) {
for (LinphoneNumberOrAddress noa: c.getNumbersOrAddresses()) {
if (noa.getValue().equals(sipUri)) {
return c;
}
}
return null;
}
public Contact findContactWithAddress(ContentResolver contentResolver, LinphoneAddress address){
String sipUri = address.asStringUriOnly();
if (sipUri.startsWith("sip:"))
sipUri = sipUri.substring(4);
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if(lc != null && lc.getFriendList() != null && LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList().length > 0) {
for (LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) {
if (friend.getAddress().equals(address)) {
return getContact(friend.getRefKey(), contentResolver);
}
}
}
//Find Sip address
if(hasContactAccess) {
Contact contact;
String[] projection = new String[]{ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME};
String selection = new StringBuilder()
.append(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS)
.append(" = ?").toString();
Cursor cur = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection,
new String[]{sipUri}, null);
if (cur != null) {
if (cur.moveToFirst()) {
contact = Compatibility.getContact(contentResolver, cur, cur.getPosition());
cur.close();
if (contact != null) {
return contact;
}
}
cur.close();
}
//Find number
Uri lookupUri = Uri.withAppendedPath(android.provider.ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address.getUserName()));
projection = new String[]{ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup.DISPLAY_NAME};
Cursor c = contentResolver.query(lookupUri, projection, null, null, null);
contact = checkPhoneQueryResult(contentResolver, c, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup._ID, address.getUserName());
if (contact != null) {
return contact;
}
}
return null;
}
public void removeContactFromLists(ContentResolver contentResolver, Contact contact) {
for (Contact c : contactList) {
if (c != null && c.getID().equals(contact.getID())) {
contactList.remove(c);
contactCursor = Compatibility.getContactsCursor(contentResolver,getContactsId());
break;
}
}
for (Contact c : sipContactList) {
if (c != null && c.getID().equals(contact.getID())) {
sipContactList.remove(c);
sipContactCursor = Compatibility.getSIPContactsCursor(contentResolver,getContactsId());
break;
}
}
}
public boolean isContactHasAddress(Contact contact, String address){
if(contact != null) {
contact.refresh(contentResolver);
return contact.getNumbersOrAddresses().contains(address) || contact.getNumbersOrAddresses().contains("sip:" + address);
}
return false;
}
public String findRawContactID(ContentResolver cr, String contactID) {
Cursor c = cr.query(ContactsContract.RawContacts.CONTENT_URI,
new String[]{ContactsContract.RawContacts._ID},
ContactsContract.RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null);
if (c != null) {
String result = null;
if (c.moveToFirst()) {
result = c.getString(c.getColumnIndex(ContactsContract.RawContacts._ID));
}
c.close();
return result;
}
return null;
}
public String findRawLinphoneContactID(String contactID) {
String result = null;
String[] projection = { ContactsContract.RawContacts._ID };
String selection = ContactsContract.RawContacts.CONTACT_ID + "=? AND "
+ ContactsContract.RawContacts.ACCOUNT_TYPE + "=? ";
Cursor c = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI, projection,
selection, new String[]{contactID, "org.linphone"}, null);
if (c != null) {
if (c.moveToFirst()) {
result = c.getString(c.getColumnIndex(ContactsContract.RawContacts._ID));
}
}
c.close();
return result;
}
//Migrate old IM contacts into SIP addresses or linphoneFriends
public void migrateContacts() {
Cursor oldContacts = Compatibility.getImContactsCursor(contentResolver);
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
if(oldContacts != null){
for (int i = 0; i < oldContacts.getCount(); i++) {
Contact contact = Compatibility.getContact(contentResolver, oldContacts, i);
for (String address : Compatibility.extractContactImAddresses(contact.getID(), contentResolver)) {
if (LinphoneUtils.isSipAddress(address)) {
if (address.startsWith("sip:")) {
address = address.substring(4);
}
//Add new sip address
Compatibility.addSipAddressToContact(context, ops, address, findRawContactID(contentResolver, contact.getID()));
try {
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
e.printStackTrace();
}
ops.clear();
contact.refresh(contentResolver);
//If address sip is correctly add, remove the im address
if(contact.getNumbersOrAddresses().contains(address)){
Compatibility.deleteImAddressFromContact(ops, address, contact.getID());
try {
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
e.printStackTrace();
}
ops.clear();
} else {
//Add linphone friend instead
if(createNewFriend(contact, address)) {
contact.refresh(contentResolver);
//Remove IM address
Compatibility.deleteImAddressFromContact(ops, address, contact.getID());
try {
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
ops.clear();
}
}
oldContacts.close();
}
}
public synchronized void prepareContactsInBackground() {
if (contactCursor != null) {
contactCursor.close();
}
if (sipContactCursor != null) {
sipContactCursor.close();
contacts = new ArrayList<LinphoneContact>();
for (LinphoneFriend friend : LinphoneManager.getLc().getFriendList()) {
LinphoneContact contact = new LinphoneContact();
LinphoneAddress addr = friend.getAddress();
contact.setFullName(addr.getDisplayName());
contact.addNumberOrAddress(new LinphoneNumberOrAddress(addr.asStringUriOnly(), true));
contacts.add(contact);
}
if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)){
contactList = new ArrayList<Contact>();
for(LinphoneFriend friend : LinphoneManager.getLc().getFriendList()){
Contact contact = new Contact(friend.getRefKey(),friend.getAddress());
contactList.add(contact);
if (mAccount == null || !hasContactAccess) return;
Cursor c = Compatibility.getContactsCursor(contentResolver, null);
if (c != null) {
c.moveToFirst();
do {
String id = c.getString(c.getColumnIndex(Data.CONTACT_ID));
LinphoneContact contact = new LinphoneContact();
contact.setAndroidId(id);
contact.refresh();
contacts.add(contact);
}
contactCursor = getFriendListCursor(contactList,true);
return;
while (c.moveToNext());
}
if(mAccount == null) return;
contactCursor = Compatibility.getContactsCursor(contentResolver, getContactsId());
sipContactCursor = Compatibility.getSIPContactsCursor(contentResolver, getContactsId());
Thread sipContactsHandler = new Thread(new Runnable() {
@Override
public void run() {
if(sipContactCursor != null && sipContactCursor.getCount() > 0) {
for (int i = 0; i < sipContactCursor.getCount(); i++) {
Contact contact = Compatibility.getContact(contentResolver, sipContactCursor, i);
if (contact == null)
continue;
contact.refresh(contentResolver);
//Add tag to Linphone contact if it not existed
if (LinphoneActivity.isInstanciated() && LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (!isContactHasLinphoneTag(contact, contentResolver)) {
Compatibility.createLinphoneContactTag(context, contentResolver, contact,
findRawContactID(contentResolver, String.valueOf(contact.getID())));
}
}
sipContactList.add(contact);
}
}
if (contactCursor != null) {
for (int i = 0; i < contactCursor.getCount(); i++) {
Contact contact = Compatibility.getContact(contentResolver, contactCursor, i);
if (contact == null)
continue;
//Remove linphone contact tag if the contact has no sip address
if (LinphoneActivity.isInstanciated() && LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_tag)) {
if (removeContactTagIsNeeded(contact) && findRawLinphoneContactID(contact.getID()) != null) {
removeLinphoneContactTag(contact);
}
}
for (Contact c : sipContactList) {
if (c != null && c.getID().equals(contact.getID())) {
contact = c;
break;
}
}
contactList.add(contact);
}
}
}
});
contactList = new ArrayList<Contact>();
sipContactList = new ArrayList<Contact>();
sipContactsHandler.start();
}
public static String queryAddressOrNumber(ContentResolver resolver, Uri contactUri) {
public static String getAddressOrNumberForAndroidContact(ContentResolver resolver, Uri contactUri) {
// Phone Numbers
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER};
String[] projection = new String[]{ ContactsContract.CommonDataKinds.Phone.NUMBER };
Cursor c = resolver.query(contactUri, projection, null, null, null);
if (c != null) {
while (c.moveToNext()) {
@ -647,7 +169,7 @@ public class ContactsManager {
}
// SIP addresses
projection = new String[] {ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS};
projection = new String[] { ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS };
c = resolver.query(contactUri, projection, null, null, null);
if (c != null) {
while (c.moveToNext()) {
@ -660,50 +182,4 @@ public class ContactsManager {
}
return null;
}
boolean isContactHasLinphoneTag(Contact contact, ContentResolver cr) {
String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[] { contact.getID() };
String[] projection = new String[] {ContactsContract.Data.MIMETYPE };
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, projection, select, args, null);
if (cursor != null) {
while (cursor.moveToNext()) {
if(cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)).equals("vnd.android.cursor.item/org.linphone.profile")){
cursor.close();
return true;
}
}
}
cursor.close();
return false;
}
public Cursor getFriendListCursor(List<Contact> contacts, boolean shouldGroupBy){
String[] columns = new String[] { ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME };
if (!shouldGroupBy) {
return null;
}
MatrixCursor result = new MatrixCursor(columns);
Set<String> groupBy = new HashSet<String>();
for (Contact contact: contacts) {
String name = contact.getName();
if (!groupBy.contains(name)) {
groupBy.add(name);
Object[] newRow = new Object[2];
newRow[0] = contact.getID();
newRow[1] = contact.getName();
result.addRow(newRow);
}
}
return result;
}
}

View file

@ -209,7 +209,7 @@ public class DialerFragment extends Fragment {
mAddress.setText(intent.getData().getSchemeSpecificPart());
} else {
Uri contactUri = intent.getData();
String address = ContactsManager.getInstance().queryAddressOrNumber(LinphoneService.instance().getContentResolver(),contactUri);
String address = ContactsManager.getAddressOrNumberForAndroidContact(LinphoneService.instance().getContentResolver(), contactUri);
if(address != null) {
mAddress.setText(address);
} else {

View file

@ -17,17 +17,13 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory;
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -112,9 +108,9 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
if(lAddress != null) {
contactAddress.setText(lAddress.asStringUriOnly());
Contact contact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), lAddress);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getActivity().getContentResolver(), lAddress);
if (contact != null) {
contactName.setText(contact.getName());
contactName.setText(contact.getFullName());
LinphoneUtils.setImagePictureFromUri(view.getContext(),contactPicture,contact.getPhotoUri(),contact.getThumbnailUri());
addToContacts.setVisibility(View.INVISIBLE);
} else {

View file

@ -440,11 +440,11 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
holder.callDirection.setImageResource(R.drawable.call_status_outgoing);
}
Contact c = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), address);
LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(getActivity().getContentResolver(), address);
String displayName = null;
final String sipUri = address.asString();
if(c != null){
displayName = c.getName();
displayName = c.getFullName();
LinphoneUtils.setImagePictureFromUri(view.getContext(),holder.contactPicture,c.getPhotoUri(),c.getThumbnailUri());
} else {
holder.contactPicture.setImageResource(R.drawable.avatar);

View file

@ -27,6 +27,7 @@ import java.util.List;
import org.linphone.LinphoneManager.AddressType;
import org.linphone.assistant.AssistantActivity;
import org.linphone.assistant.RemoteProvisioningLoginActivity;
import org.linphone.core.CallDirection;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneAuthInfo;
@ -44,7 +45,6 @@ import org.linphone.core.LinphoneCoreListenerBase;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.Reason;
import org.linphone.mediastream.Log;
import org.linphone.assistant.RemoteProvisioningLoginActivity;
import org.linphone.ui.AddressText;
import android.Manifest;
@ -99,7 +99,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private static final int CALL_ACTIVITY = 19;
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 200;
private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 201;
private static final int PERMISSIONS_REQUEST_CAMERA = 202;
private static final int PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL = 203;
private static LinphoneActivity instance;
@ -116,7 +115,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private ChatFragment chatFragment;
private Fragment.SavedState dialerSavedState;
private boolean newProxyConfig;
private boolean isAnimationDisabled = true, preferLinphoneContacts = false, emptyFragment = false, permissionAsked = false;
private boolean isAnimationDisabled = true, emptyFragment = false, permissionAsked = false;
private OrientationEventListener mOrientationHelper;
private LinphoneCoreListenerBase mListener;
private LinearLayout mTabBar;
@ -126,7 +125,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private RelativeLayout sideMenuContent, quitLayout, defaultAccount;
private ListView accountsList, sideMenuItemList;
private ImageView menu;
private Dialog authInfoPassword;
static final boolean isInstanciated() {
return instance != null;
@ -547,9 +545,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
//TODO display error message
return;
}
Contact c = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), lAddress);
LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), lAddress);
String displayName = c != null ? c.getName() : LinphoneUtils.getAddressDisplayName(sipUri);
String displayName = c != null ? c.getFullName() : LinphoneUtils.getAddressDisplayName(sipUri);
String pictureUri = c != null && c.getPhotoUri() != null ? c.getPhotoUri().toString() : null;
String status;
@ -597,7 +595,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
return dateFormat.format(cal.getTime());
}
public void displayContact(Contact contact, boolean chatOnly) {
public void displayContact(LinphoneContact contact, boolean chatOnly) {
Fragment fragment2 = getFragmentManager().findFragmentById(R.id.fragmentContainer2);
if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.CONTACT_DETAIL) {
ContactDetailsFragment contactFragment = (ContactDetailsFragment) fragment2;
@ -611,14 +609,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
}
public void displayContacts(boolean chatOnly) {
if (chatOnly) {
preferLinphoneContacts = true;
}
Bundle extras = new Bundle();
extras.putBoolean("ChatAddressOnly", chatOnly);
changeCurrentFragment(FragmentsAvailable.CONTACTS_LIST, extras);
preferLinphoneContacts = false;
}
public void displayChatList() {
@ -677,8 +670,8 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
Log.e("Cannot display chat", e);
return;
}
Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), lAddress);
displayName = contact != null ? contact.getName() : null;
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), lAddress);
displayName = contact != null ? contact.getFullName() : null;
if (contact != null && contact.getPhotoUri() != null) {
pictureUri = contact.getPhotoUri().toString();
@ -1148,7 +1141,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
changeCurrentFragment(FragmentsAvailable.CONTACT_EDITOR, extras);
}
public void editContact(Contact contact)
public void editContact(LinphoneContact contact)
{
Bundle extras = new Bundle();
extras.putSerializable("Contact", contact);
@ -1156,7 +1149,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
}
public void editContact(Contact contact, String sipAddress)
public void editContact(LinphoneContact contact, String sipAddress)
{
Bundle extras = new Bundle();
@ -1241,7 +1234,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
}
if (getPackageManager().checkPermission(Manifest.permission.READ_CONTACTS, getPackageName()) == PackageManager.PERMISSION_GRANTED){
ContactsManager.getInstance().enabledContactsAccess();
ContactsManager.getInstance().enableContactsAccess();
ContactsManager.getInstance().prepareContactsInBackground();
} else {
checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_READ_CONTACTS);

View file

@ -0,0 +1,254 @@
/*
LinphoneContact.java
Copyright (C) 2016 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.linphone;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneFriend;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
public class LinphoneContact implements Serializable {
/**
*
*/
private static final long serialVersionUID = 9015568163905205244L;
private LinphoneFriend friend;
private String fullName, androidId;
private Uri photoUri, thumbnailUri;
private List<LinphoneNumberOrAddress> addresses;
public LinphoneContact() {
addresses = new ArrayList<LinphoneNumberOrAddress>();
androidId = null;
thumbnailUri = null;
photoUri = null;
}
public void setFullName(String name) {
if (name == null) return;
fullName = name;
if (friend != null) {
friend.setName(name);
}
}
public String getFullName() {
return fullName;
}
public boolean hasPhoto() {
return photoUri != null;
}
public void setPhotoUri(Uri uri) {
photoUri = uri;
}
public Uri getPhotoUri() {
return photoUri;
}
public void setThumbnailUri(Uri uri) {
thumbnailUri = uri;
}
public Uri getThumbnailUri() {
return thumbnailUri;
}
public void addNumberOrAddress(LinphoneNumberOrAddress noa) {
if (noa == null) return;
addresses.add(noa);
}
public List<LinphoneNumberOrAddress> getNumbersOrAddresses() {
return addresses;
}
public boolean hasAddress(String address) {
for (LinphoneNumberOrAddress noa : getNumbersOrAddresses()) {
if (noa.isSIPAddress()) {
String value = noa.getValue();
if (value.equals(address) || value.equals("sip:" + address)) {
return true;
}
}
}
return false;
}
public boolean hasAddress() {
for (LinphoneNumberOrAddress noa : getNumbersOrAddresses()) {
if (noa.isSIPAddress()) {
return true;
}
}
return false;
}
public void setAndroidId(String id) {
androidId = id;
}
public String getAndroidId() {
return androidId;
}
public void delete() {
if (isAndroidContact()) {
// TODO
/*String select = ContactsContract.Data.CONTACT_ID + " = ?";
String[] args = new String[] { contact.getID() };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(select, args)
.build()
);
try {
getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
ContactsManager.getInstance().removeAllFriends(contact);
} catch (Exception e) {
Log.w(e.getMessage() + ":" + e.getStackTrace());
}
ContactsManager.getInstance().removeContactFromLists(getActivity().getContentResolver(), contact);*/
}
if (friend != null) {
LinphoneManager.getLcIfManagerNotDestroyedOrNull().removeFriend(friend);
}
}
public void refresh() {
addresses = new ArrayList<LinphoneNumberOrAddress>();
if (friend != null) {
LinphoneAddress addr = friend.getAddress();
if (addr != null) {
addresses.add(new LinphoneNumberOrAddress(addr.asStringUriOnly(), true));
}
}
if (!isAndroidContact()) {
fullName = friend.getName();
thumbnailUri = null;
photoUri = null;
} else {
String id = getAndroidId();
String name = getName(id);
Uri thumbnail = getContactPictureUri(id);
Uri photo = getContactPhotoUri(id);
setFullName(name);
setThumbnailUri(thumbnail);
setPhotoUri(photo);
for (LinphoneNumberOrAddress noa : getAddressesAndNumbersForAndroidContact(id)) {
addresses.add(noa);
}
}
}
public boolean isAndroidContact() {
return androidId != null;
}
public static LinphoneContact createLinphoneFriend(String name, String address) {
LinphoneContact contact = new LinphoneContact();
LinphoneFriend friend = LinphoneCoreFactory.instance().createLinphoneFriend();
contact.friend = friend;
if (name != null) {
contact.setFullName(name);
}
if (address != null) {
contact.addNumberOrAddress(new LinphoneNumberOrAddress(address, true));
}
return contact;
}
private Uri getContactUri(String id) {
Uri person = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, id);
return person;
}
private Uri getContactPictureUri(String id) {
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}
private Uri getContactPhotoUri(String id) {
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
}
private String getName(String id) {
ContentResolver resolver = ContactsManager.getInstance().getContentResolver();
Cursor cursor = resolver.query(getContactUri(id), null, null, null, null);
String name = null;
if (cursor != null) {
if (cursor.moveToFirst()) {
name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
cursor.close();
}
return name;
}
private List<LinphoneNumberOrAddress> getAddressesAndNumbersForAndroidContact(String id) {
List<LinphoneNumberOrAddress> result = new ArrayList<LinphoneNumberOrAddress>();
ContentResolver resolver = ContactsManager.getInstance().getContentResolver();
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection;
// SIP addresses
String selection2 = new StringBuilder().append(ContactsContract.Data.CONTACT_ID).append(" = ? AND ").append(ContactsContract.Data.MIMETYPE).append(" = '").append(ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE).append("'").toString();
projection = new String[] { ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS };
Cursor c = resolver.query(uri, projection, selection2, new String[]{ id }, null);
if (c != null) {
while (c.moveToNext()) {
result.add(new LinphoneNumberOrAddress("sip:" + c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS)), true));
}
c.close();
}
// Phone Numbers
c = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null);
if (c != null) {
while (c.moveToNext()) {
String number = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
result.add(new LinphoneNumberOrAddress(number, false));
}
c.close();
}
return result;
}
}

View file

@ -171,7 +171,6 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mCallLogDatabaseFile = basePath + "/linphone-log-history.db";
mFriendsDatabaseFile = basePath + "/linphone-friends.db";
mErrorToneFile = basePath + "/error.wav";
mConfigFile = basePath + "/configrc";
mUserCertificatePath = basePath;
mPrefs = LinphonePreferences.instance();
@ -197,7 +196,6 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
private final String mCallLogDatabaseFile;
private final String mFriendsDatabaseFile;
private final String mErrorToneFile;
private final String mConfigFile;
private final String mUserCertificatePath;
private ByteArrayInputStream mUploadingImageStream;
@ -866,13 +864,13 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
}
try {
Contact contact = ContactsManager.getInstance().findContactWithAddress(mServiceContext.getContentResolver(), from);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mServiceContext.getContentResolver(), from);
if (!mServiceContext.getResources().getBoolean(R.bool.disable_chat_message_notification)) {
if (LinphoneActivity.isInstanciated() && !LinphoneActivity.instance().displayChatMessageNotification(from.asStringUriOnly())) {
return;
} else {
if (contact != null) {
LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), contact.getName(), textMessage);
LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), contact.getFullName(), textMessage);
} else {
LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), from.getUserName(), textMessage);
}

View file

@ -0,0 +1,42 @@
/*
LinphoneNumberOrAddress.java
Copyright (C) 2016 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.linphone;
public class LinphoneNumberOrAddress {
private boolean isSIPAddress;
private String value;
public LinphoneNumberOrAddress(String v, boolean isSIP) {
value = v;
isSIPAddress = isSIP;
}
public boolean isSIPAddress() {
return isSIPAddress;
}
public String getValue() {
return value;
}
public void setValue(String v) {
value = v;
}
}

View file

@ -315,7 +315,7 @@ public final class LinphoneService extends Service {
LinphoneAddress address = LinphoneCoreFactory.instance().createLinphoneAddress(userName,domain,null);
address.setDisplayName(displayName);
Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address);
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), address);
Uri pictureUri = contact != null ? contact.getPhotoUri() : null;
Bitmap bm = null;
try {
@ -393,7 +393,7 @@ public final class LinphoneService extends Service {
Uri pictureUri = null;
try {
Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), LinphoneCoreFactory.instance().createLinphoneAddress(fromSipUri));
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(getContentResolver(), LinphoneCoreFactory.instance().createLinphoneAddress(fromSipUri));
if (contact != null)
pictureUri = contact.getThumbnailUri();
} catch (LinphoneCoreException e1) {
@ -489,7 +489,6 @@ public final class LinphoneService extends Service {
}
}
@SuppressWarnings("deprecation")
private void dumpDeviceInformation() {
StringBuilder sb = new StringBuilder();
sb.append("DEVICE=").append(Build.DEVICE).append("\n");

View file

@ -35,9 +35,11 @@ import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.linphone.compatibility.Compatibility;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State;
@ -46,7 +48,6 @@ import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.mediastream.Log;
import org.linphone.mediastream.Version;
import org.linphone.mediastream.video.capture.hwconf.Hacks;
import android.app.Activity;
@ -54,6 +55,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
@ -148,9 +150,9 @@ public final class LinphoneUtils {
SimpleDateFormat dateFormat;
if (isToday(cal)) {
dateFormat = new SimpleDateFormat(context.getResources().getString(R.string.today_date_format));
dateFormat = new SimpleDateFormat(context.getResources().getString(R.string.today_date_format), Locale.getDefault());
} else {
dateFormat = new SimpleDateFormat(format);
dateFormat = new SimpleDateFormat(format, Locale.getDefault());
}
return dateFormat.format(cal.getTime());
@ -226,7 +228,7 @@ public final class LinphoneUtils {
try {
bm = MediaStore.Images.Media.getBitmap(c.getContentResolver(),uri);
} catch (IOException e) {
if(tUri != null){
if (tUri != null) {
try {
bm = MediaStore.Images.Media.getBitmap(c.getContentResolver(),tUri);
} catch (IOException ie) {
@ -234,10 +236,11 @@ public final class LinphoneUtils {
}
}
}
if(bm != null) {
if (bm != null) {
view.setImageBitmap(bm);
} else {
view.setImageResource(R.drawable.avatar);
}
}
}
@ -456,5 +459,13 @@ public final class LinphoneUtils {
e.printStackTrace();
}
}
public static List<LinphoneContact> contactCursorToList(ContentResolver cr, Cursor cursor) {
ArrayList<LinphoneContact> list = new ArrayList<LinphoneContact>();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
list.add(Compatibility.getContact(cr, cursor, cursor.getPosition()));
}
return list;
}
}

View file

@ -35,15 +35,13 @@ import org.linphone.core.PayloadType;
import org.linphone.mediastream.Log;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -170,12 +168,6 @@ public class StatusFragment extends Fragment {
} else if (activity instanceof AssistantActivity) {
((AssistantActivity) activity).updateStatusFragment(this);
isInCall = false;
} else if (activity instanceof CallIncomingActivity) {
((CallIncomingActivity) activity).updateStatusFragment(this);
isInCall = true;
} else if (activity instanceof CallOutgoingActivity) {
((CallOutgoingActivity) activity).updateStatusFragment(this);
isInCall = true;
}
}
@ -192,7 +184,7 @@ public class StatusFragment extends Fragment {
voicemailCount.setVisibility(View.GONE);
if (isInCall && isAttached) {
LinphoneCall call = LinphoneManager.getLc().getCurrentCall();
//LinphoneCall call = LinphoneManager.getLc().getCurrentCall();
//initCallStatsRefresher(call, callStats);
} else if (!isInCall) {
voicemailCount.setVisibility(View.VISIBLE);

View file

@ -6,7 +6,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.linphone.Contact;
import org.linphone.LinphoneContact;
import org.linphone.R;
import org.linphone.core.LinphoneAddress;
@ -21,8 +21,6 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.net.Uri;
import android.preference.CheckBoxPreference;
@ -208,7 +206,7 @@ public class ApiFivePlus {
return cursor.getColumnIndex(Data.DISPLAY_NAME);
}
public static Contact getContact(ContentResolver cr, Cursor cursor, int position) {
public static LinphoneContact getContact(ContentResolver cr, Cursor cursor, int position) {
try {
if(cursor != null) {
cursor.moveToFirst();
@ -222,16 +220,12 @@ public class ApiFivePlus {
Uri photo = getContactPhotoUri(id);
InputStream input = getContactPictureInputStream(cr, id);
Contact contact;
if (input == null) {
contact = new Contact(id, name);
} else {
Bitmap bm = null;
try {
bm = BitmapFactory.decodeStream(input);
} catch (OutOfMemoryError oome) {
}
contact = new Contact(id, name, photo, thumbnail, bm);
LinphoneContact contact = new LinphoneContact();
contact.setAndroidId(id);
contact.setFullName(name);
if (input != null) {
contact.setPhotoUri(photo);
contact.setThumbnailUri(thumbnail);
}
return contact;
@ -270,9 +264,9 @@ public class ApiFivePlus {
Cursor cursor = getSIPContactCursor(cr, sipUri);
if(cursor != null) {
Contact contact = getContact(cr, cursor, 0);
LinphoneContact contact = getContact(cr, cursor, 0);
if (contact != null && contact.getNumbersOrAddresses().contains(sipUri)) {
address.setDisplayName(contact.getName());
address.setDisplayName(contact.getFullName());
cursor.close();
return contact.getPhotoUri();
}

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import org.linphone.Contact;
import org.linphone.LinphoneContact;
import org.linphone.LinphoneUtils;
import org.linphone.R;
import org.linphone.core.LinphoneAddress;
@ -16,8 +17,8 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.text.TextUtils;
@ -183,9 +184,9 @@ public class ApiNinePlus {
String sipUri = username + "@" + domain;
Cursor cursor = getSIPContactCursor(cr, sipUri);
Contact contact = ApiFivePlus.getContact(cr, cursor, 0);
LinphoneContact contact = ApiFivePlus.getContact(cr, cursor, 0);
if (contact != null && contact.getNumbersOrAddresses().contains(sipUri)) {
address.setDisplayName(contact.getName());
address.setDisplayName(contact.getFullName());
cursor.close();
return contact.getPhotoUri();
}

View file

@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.List;
import org.linphone.Contact;
import org.linphone.LinphoneContact;
import org.linphone.core.LinphoneAddress;
import org.linphone.mediastream.Version;
@ -131,7 +132,7 @@ public class Compatibility {
return -1;
}
public static Contact getContact(ContentResolver cr, Cursor cursor, int position) {
public static LinphoneContact getContact(ContentResolver cr, Cursor cursor, int position) {
if (Version.sdkAboveOrEqual(Version.API05_ECLAIR_20)) {
return ApiFivePlus.getContact(cr, cursor, position);
}

View file

@ -26,7 +26,7 @@ import java.util.Calendar;
import java.util.HashMap;
import java.util.Map.Entry;
import org.linphone.Contact;
import org.linphone.LinphoneContact;
import org.linphone.LinphoneManager;
import org.linphone.LinphoneUtils;
import org.linphone.R;
@ -81,7 +81,7 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen
private Bitmap defaultBitmap;
@SuppressLint("InflateParams")
public BubbleChat(final Context context, LinphoneChatMessage message, Contact c) {
public BubbleChat(final Context context, LinphoneChatMessage message, LinphoneContact c) {
if (message == null) {
return;
}
@ -211,10 +211,9 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen
contactPicture = (ImageView) view.findViewById(R.id.contact_picture);
String displayName = nativeMessage.getFrom().getUserName();
final String sipUri = nativeMessage.getFrom().asStringUriOnly();
if(!nativeMessage.isOutgoing()) {
if (c != null) {
displayName = c.getName();
displayName = c.getFullName();
LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture, c.getPhotoUri(), c.getThumbnailUri());
} else {
contactPicture.setImageResource(R.drawable.avatar);