From a75da820ed626fc48d03f730fd9afa1cbf9a674e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 17 Mar 2016 15:43:35 +0100 Subject: [PATCH] Started rework of contacts --- res/values/non_localizable_custom.xml | 1 - src/org/linphone/CallActivity.java | 8 +- src/org/linphone/CallAudioFragment.java | 1 - src/org/linphone/CallIncomingActivity.java | 9 +- src/org/linphone/CallOutgoingActivity.java | 9 +- src/org/linphone/CallVideoFragment.java | 7 +- src/org/linphone/ChatFragment.java | 72 +- src/org/linphone/ChatListFragment.java | 48 +- src/org/linphone/Contact.java | 1 + src/org/linphone/ContactDetailsFragment.java | 75 +- src/org/linphone/ContactEditorFragment.java | 40 +- src/org/linphone/ContactsListFragment.java | 175 +---- src/org/linphone/ContactsManager.java | 656 ++---------------- src/org/linphone/DialerFragment.java | 2 +- src/org/linphone/HistoryDetailFragment.java | 10 +- src/org/linphone/HistoryListFragment.java | 4 +- src/org/linphone/LinphoneActivity.java | 27 +- src/org/linphone/LinphoneContact.java | 254 +++++++ src/org/linphone/LinphoneManager.java | 6 +- src/org/linphone/LinphoneNumberOrAddress.java | 42 ++ src/org/linphone/LinphoneService.java | 5 +- src/org/linphone/LinphoneUtils.java | 23 +- src/org/linphone/StatusFragment.java | 12 +- .../linphone/compatibility/ApiFivePlus.java | 26 +- .../linphone/compatibility/ApiNinePlus.java | 7 +- .../linphone/compatibility/Compatibility.java | 3 +- src/org/linphone/ui/BubbleChat.java | 7 +- 27 files changed, 525 insertions(+), 1005 deletions(-) create mode 100644 src/org/linphone/LinphoneContact.java create mode 100644 src/org/linphone/LinphoneNumberOrAddress.java diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index f99b87b04..8db855a1b 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -9,7 +9,6 @@ false false - false false false false diff --git a/src/org/linphone/CallActivity.java b/src/org/linphone/CallActivity.java index 03e0be2b5..7922449bf 100644 --- a/src/org/linphone/CallActivity.java +++ b/src/org/linphone/CallActivity.java @@ -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); diff --git a/src/org/linphone/CallAudioFragment.java b/src/org/linphone/CallAudioFragment.java index a2fed87da..a31e04b0f 100644 --- a/src/org/linphone/CallAudioFragment.java +++ b/src/org/linphone/CallAudioFragment.java @@ -41,7 +41,6 @@ public class CallAudioFragment extends Fragment { @Override public void onAttach(Activity activity) { - super.onAttach(activity); incallActvityInstance = (CallActivity) activity; if (incallActvityInstance != null) { diff --git a/src/org/linphone/CallIncomingActivity.java b/src/org/linphone/CallIncomingActivity.java index 8264e5c04..adbaaebf2 100644 --- a/src/org/linphone/CallIncomingActivity.java +++ b/src/org/linphone/CallIncomingActivity.java @@ -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(); diff --git a/src/org/linphone/CallOutgoingActivity.java b/src/org/linphone/CallOutgoingActivity.java index 11c9d2c01..093d545dd 100644 --- a/src/org/linphone/CallOutgoingActivity.java +++ b/src/org/linphone/CallOutgoingActivity.java @@ -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)); } diff --git a/src/org/linphone/CallVideoFragment.java b/src/org/linphone/CallVideoFragment.java index 19d4b705f..fc581d292 100644 --- a/src/org/linphone/CallVideoFragment.java +++ b/src/org/linphone/CallVideoFragment.java @@ -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); diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index 24f50ea75..0e116f5ba 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -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 { 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 ListgetContactsList(){ + public List getContactsList() { List list = new ArrayList(); - 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); } }); diff --git a/src/org/linphone/ChatListFragment.java b/src/org/linphone/ChatListFragment.java index a91efc074..ea9dcb7cc 100644 --- a/src/org/linphone/ChatListFragment.java +++ b/src/org/linphone/ChatListFragment.java @@ -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 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){ diff --git a/src/org/linphone/Contact.java b/src/org/linphone/Contact.java index e1a0128a1..78b3667d1 100644 --- a/src/org/linphone/Contact.java +++ b/src/org/linphone/Contact.java @@ -32,6 +32,7 @@ import android.net.Uri; /** * @author Sylvain Berfini + * @deprecated */ public class Contact implements Serializable { private static final long serialVersionUID = 3790717505065723499L; diff --git a/src/org/linphone/ContactDetailsFragment.java b/src/org/linphone/ContactDetailsFragment.java index f77b16ea4..5a6737913 100644 --- a/src/org/linphone/ContactDetailsFragment.java +++ b/src/org/linphone/ContactDetailsFragment.java @@ -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 ops = new ArrayList(); - 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()); - } - } } diff --git a/src/org/linphone/ContactEditorFragment.java b/src/org/linphone/ContactEditorFragment.java index e8621463f..9df4e3c39 100644 --- a/src/org/linphone/ContactEditorFragment.java +++ b/src/org/linphone/ContactEditorFragment.java @@ -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 numbersAndAddresses; + //private List numbersAndAddresses; private ArrayList 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(); - 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 cameraIntents = new ArrayList(); 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 ops = new ArrayList(); - 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 { ); } } - } + }*/ } \ No newline at end of file diff --git a/src/org/linphone/ContactsListFragment.java b/src/org/linphone/ContactsListFragment.java index 09ba25795..8d208787b 100644 --- a/src/org/linphone/ContactsListFragment.java +++ b/src/org/linphone/ContactsListFragment.java @@ -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 ops = new ArrayList(); - 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 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 contacts; - private Cursor cursor; + class ContactsListAdapter extends BaseAdapter { + private List contacts; - ContactsListAdapter(List contactsList, Cursor c) { + ContactsListAdapter(List 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(); - } } } diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 2c0f1814e..e3ff7dd3d 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -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 contactList, sipContactList; - private Cursor contactCursor, sipContactCursor; + private List 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 getAllContacts() { - return contactList; - } - - public List 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 getContacts() { + return contacts; + } + + public List 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 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 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 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 getContactsId(){ - List ids = new ArrayList(); - 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 ops = new ArrayList(); - 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 ops = new ArrayList(); - - 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(); + + 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(); - 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(); - sipContactList = new ArrayList(); - - 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 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 groupBy = new HashSet(); - 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; - } - } diff --git a/src/org/linphone/DialerFragment.java b/src/org/linphone/DialerFragment.java index 8ddb7cdee..5e0abac44 100644 --- a/src/org/linphone/DialerFragment.java +++ b/src/org/linphone/DialerFragment.java @@ -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 { diff --git a/src/org/linphone/HistoryDetailFragment.java b/src/org/linphone/HistoryDetailFragment.java index 1a94e47eb..7d0f181a2 100644 --- a/src/org/linphone/HistoryDetailFragment.java +++ b/src/org/linphone/HistoryDetailFragment.java @@ -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 { diff --git a/src/org/linphone/HistoryListFragment.java b/src/org/linphone/HistoryListFragment.java index b62cf6134..6ebdd7328 100644 --- a/src/org/linphone/HistoryListFragment.java +++ b/src/org/linphone/HistoryListFragment.java @@ -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); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 54c1a93c0..3bae4279e 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -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); diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java new file mode 100644 index 000000000..98a3dbc64 --- /dev/null +++ b/src/org/linphone/LinphoneContact.java @@ -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 addresses; + + public LinphoneContact() { + addresses = new ArrayList(); + 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 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 ops = new ArrayList(); + 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(); + 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 getAddressesAndNumbersForAndroidContact(String id) { + List result = new ArrayList(); + 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; + } +} diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 2fa56d428..baa850fd2 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -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); } diff --git a/src/org/linphone/LinphoneNumberOrAddress.java b/src/org/linphone/LinphoneNumberOrAddress.java new file mode 100644 index 000000000..5d5cf974b --- /dev/null +++ b/src/org/linphone/LinphoneNumberOrAddress.java @@ -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; + } +} diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 216740ddc..2d8762bd3 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -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"); diff --git a/src/org/linphone/LinphoneUtils.java b/src/org/linphone/LinphoneUtils.java index 4015b1ce7..ca49cffc6 100644 --- a/src/org/linphone/LinphoneUtils.java +++ b/src/org/linphone/LinphoneUtils.java @@ -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 contactCursorToList(ContentResolver cr, Cursor cursor) { + ArrayList list = new ArrayList(); + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + list.add(Compatibility.getContact(cr, cursor, cursor.getPosition())); + } + return list; + } } diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java index aa607cdac..a87cc2765 100644 --- a/src/org/linphone/StatusFragment.java +++ b/src/org/linphone/StatusFragment.java @@ -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); diff --git a/src/org/linphone/compatibility/ApiFivePlus.java b/src/org/linphone/compatibility/ApiFivePlus.java index fdbdb3462..9ac9be80a 100644 --- a/src/org/linphone/compatibility/ApiFivePlus.java +++ b/src/org/linphone/compatibility/ApiFivePlus.java @@ -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(); } diff --git a/src/org/linphone/compatibility/ApiNinePlus.java b/src/org/linphone/compatibility/ApiNinePlus.java index 1bf125de6..82e4d9ad8 100644 --- a/src/org/linphone/compatibility/ApiNinePlus.java +++ b/src/org/linphone/compatibility/ApiNinePlus.java @@ -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(); } diff --git a/src/org/linphone/compatibility/Compatibility.java b/src/org/linphone/compatibility/Compatibility.java index 2e8bd3afb..da9f9b934 100644 --- a/src/org/linphone/compatibility/Compatibility.java +++ b/src/org/linphone/compatibility/Compatibility.java @@ -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); } diff --git a/src/org/linphone/ui/BubbleChat.java b/src/org/linphone/ui/BubbleChat.java index ecc37a7bc..8081bece6 100644 --- a/src/org/linphone/ui/BubbleChat.java +++ b/src/org/linphone/ui/BubbleChat.java @@ -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);