public SUGARContact[] GetAllContacts()
        {
            List <SUGARContact> resultList = new List <SUGARContact>();

            CNContactStore        store   = new CNContactStore();
            CNContactFetchRequest request = new CNContactFetchRequest(
                CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.PhoneNumbers);

            store.EnumerateContacts(request, out NSError err, (CNContact contact, ref Boolean stop) =>
            {
                CNLabeledValue <CNPhoneNumber>[] phoneNumberValues = contact.PhoneNumbers;
                List <string> phoneNumbersAsStrings = new List <string>();
                List <long> phoneNumbersAsLongs     = new List <long>();
                foreach (var labeledValue in phoneNumberValues)
                {
                    string stringValue = labeledValue.Value.StringValue;
                    phoneNumbersAsStrings.Add(stringValue);
                    phoneNumbersAsLongs.Add(ParseNumberAsLong(stringValue));
                }
                SUGARContact nextContact = new SUGARContact($"{contact.GivenName} {contact.FamilyName}",
                                                            phoneNumbersAsStrings, phoneNumbersAsLongs);
                resultList.Add(nextContact);
            });

            return(resultList.ToArray());
        }
Example #2
0
        public SUGARContact[] GetAllContacts()
        {
            var dataCursor = GetDataCursor();

            List <SUGARContact> allContacts = new List <SUGARContact>();

            // The idea is to go through all rows of the data cursor and remember the
            // latest contact.

            string       latestContactName = null;
            SUGARContact latestContact     = null;

            dataCursor.MoveToPosition(-1);
            while (dataCursor.MoveToNext())
            {
                string currentContactName = dataCursor.GetString(dataCursor.GetColumnIndex("display_name"));
                if (latestContactName != null && currentContactName == latestContactName)
                {
                    // Now we have at least two rows with the same name -> get numbers
                    // and add them to the latest contact if not present.
                    string nextNumber     = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));
                    string nextNormNumber = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NormalizedNumber));
                    if (nextNumber != null)
                    {
                        if (!latestContact.PhoneNumbersAsStrings.Contains(nextNumber))
                        {
                            latestContact.PhoneNumbersAsStrings.Add(nextNumber);
                        }
                    }
                    if (nextNormNumber != null)
                    {
                        if (!latestContact.PhoneNumbersAsStrings.Contains(nextNormNumber))
                        {
                            latestContact.PhoneNumbersAsStrings.Add(nextNormNumber);
                        }
                    }
                }
                else
                {
                    // Now it is either the first contact or the name has changed. In the first case,
                    // there has been no contact created yet, the latestContact is null. Otherwise
                    // the latestContact is created and contains all numbers.
                    if (latestContact != null)
                    {
                        allContacts.Add(latestContact);
                    }
                    string        number     = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));
                    string        normNumber = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NormalizedNumber));
                    List <string> numbers    = new List <string>(2);
                    if (number != null)
                    {
                        numbers.Add(number);
                    }
                    if (normNumber != null)
                    {
                        numbers.Add(normNumber);
                    }
                    // Update latest contact
                    latestContact     = new SUGARContact(currentContactName, numbers, new List <long>(0) /*We don't need longs in Android*/);
                    latestContactName = currentContactName;
                }
            }

            dataCursor.Close();
            return(allContacts.ToArray());
        }