package io.github.privacystreams.communication; import android.Manifest; import android.content.ContentResolver; import android.database.Cursor; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import io.github.privacystreams.core.PStreamProvider; import io.github.privacystreams.utils.CommunicationUtils; import java.util.ArrayList; import java.util.List; /** * Provide a stream of contact list. */ class ContactListProvider extends PStreamProvider { ContactListProvider() { this.addRequiredPermissions(Manifest.permission.READ_CONTACTS); } @Override protected void provide() { this.getContactList(); } private void getContactList() { ContentResolver contentResolver = this.getContext().getContentResolver(); Cursor contactCur = contentResolver.query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null ); if (contactCur != null && contactCur.getCount() > 0) { contactCur.moveToFirst(); while (!contactCur.isAfterLast()) { String _id = contactCur.getString(contactCur.getColumnIndex(ContactsContract.Data._ID)); String name = contactCur.getString(contactCur.getColumnIndex(Phone.DISPLAY_NAME)); List<String> phones = new ArrayList<>(); Cursor phoneCur = contentResolver.query( Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = " + _id, null, null); if (phoneCur != null) { while (phoneCur.moveToNext()) { String number = phoneCur.getString(phoneCur.getColumnIndex(Phone.NUMBER)); phones.add(CommunicationUtils.normalizePhoneNumber(number)); // int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); } phoneCur.close(); } List<String> emails = new ArrayList<>(); Cursor emailCur = contentResolver.query( Email.CONTENT_URI, null, Email.CONTACT_ID + " = " + _id, null, null); if (emailCur != null) { while (emailCur.moveToNext()) { String email = emailCur.getString(emailCur.getColumnIndex(Email.ADDRESS)); emails.add(email); } emailCur.close(); } Contact contact = new Contact(_id, name, phones, emails); this.output(contact); contactCur.moveToNext(); } } if (contactCur != null) { contactCur.close(); } this.finish(); } }