Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ rnpm link react-native-contacts-wrapper
in `settings.gradle`

```
include ':react-native-custom-module'
project(':react-native-custom-module').projectDir = new File(settingsDir, '../node_modules/react-native-custom-module/android/')
include ':react-native-contacts-wrapper'
project(':react-native-contacts-wrapper').projectDir = new File(settingsDir, '../node_modules/react-native-contacts-wrapper/android/app')
```

in `build.gradle`
Expand Down Expand Up @@ -87,3 +87,16 @@ ContactsWrapper.getEmail()
});
```

```
import ContactsWrapper from 'react-native-contacts-wrapper';
...
ContactsWrapper.getContact()
.then((contactObj) => {
console.log("contact: ", contactObj);
console.log("email: ", contactObj.email);
})
.catch((error) => {
console.log("ERROR CODE: ", error.code);
console.log("ERROR MESSAGE: ", error.message);
});
```
Original file line number Diff line number Diff line change
@@ -1,35 +1,23 @@
package com.lynxit.contactswrapper;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

import java.net.URI;
import java.util.*;

import com.facebook.react.*;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.ViewManager;

import java.util.HashMap;

public class ContactsWrapper extends ReactContextBaseJavaModule implements ActivityEventListener {

private static final int CONTACT_REQUEST = 1;
private static final int EMAIL_REQUEST = 2;
private static final String E_CONTACT_CANCELLED = "E_CONTACT_CANCELLED";
Expand All @@ -38,34 +26,34 @@ public class ContactsWrapper extends ReactContextBaseJavaModule implements Activ
private static final String E_CONTACT_EXCEPTION = "E_CONTACT_EXCEPTION";
private Promise mContactsPromise;
private Activity mCtx;


public ContactsWrapper(ReactApplicationContext reactContext) {
super(reactContext);
reactContext.addActivityEventListener(this);
}

@Override
public String getName() {
return "ContactsWrapper";
}





@ReactMethod
public void getContact(Promise contactsPromise) {
launchPicker(contactsPromise, CONTACT_REQUEST);
}

@ReactMethod
public void getEmail(Promise contactsPromise) {
launchPicker(contactsPromise, EMAIL_REQUEST);
}

/**
* Lanch the contact picker, with the specified requestCode for returned data.
*
* @param contactsPromise - promise passed in from React Native.
* @param requestCode - request code to specify what contact data to return
* @param requestCode - request code to specify what contact data to return
*/
private void launchPicker(Promise contactsPromise, int requestCode) {
mContactsPromise = contactsPromise;
Expand All @@ -76,26 +64,26 @@ private void launchPicker(Promise contactsPromise, int requestCode) {
mCtx.startActivityForResult(intent, requestCode);
}
}

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
public void onActivityResult(int requestCode, int resultCode, Intent intent) {


String email = null;
switch (resultCode) {
case (Activity.RESULT_OK):
Uri contactUri = intent.getData();
switch(requestCode) {
case(CONTACT_REQUEST):
switch (requestCode) {
case (CONTACT_REQUEST):
try {
/* Retrieve all possible data about contact and return as a JS object */

/* Map Any contact data we want returned to the JS object key for React Native */
HashMap<String, String> returnKeys = new HashMap<String, String>();
returnKeys.put(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, "name");
returnKeys.put(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, "phone");
returnKeys.put(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, "email");

//First get ID
String id = null;
int idx;
Expand All @@ -108,35 +96,35 @@ public void onActivityResult(final int requestCode, final int resultCode, final
mContactsPromise.reject(E_CONTACT_NO_DATA, "Contact Data Not Found");
return;
}

// Build the Entity URI.
Uri.Builder b = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, id).buildUpon();
b.appendPath(ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);
contactUri = b.build();

// Create the projection (SQL fields) and sort order.
String[] projection = {
ContactsContract.Contacts.Entity.MIMETYPE,
ContactsContract.Contacts.Entity.DATA1
ContactsContract.Contacts.Entity.MIMETYPE,
ContactsContract.Contacts.Entity.DATA1
};
String sortOrder = ContactsContract.Contacts.Entity.RAW_CONTACT_ID + " ASC";
cursor = mCtx.getContentResolver().query(contactUri, projection, null, null, sortOrder);

String mime;
boolean foundData = false;
int dataIdx = cursor.getColumnIndex(ContactsContract.Contacts.Entity.DATA1);
int mimeIdx = cursor.getColumnIndex(ContactsContract.Contacts.Entity.MIMETYPE);
if (cursor.moveToFirst()) {
do {
mime = cursor.getString(mimeIdx);
if(returnKeys.containsKey(mime)) {
if (returnKeys.containsKey(mime)) {
contactData.putString((String) returnKeys.get(mime), cursor.getString(dataIdx));
foundData = true;
}
} while (cursor.moveToNext());
}
if(foundData) {

if (foundData) {
mContactsPromise.resolve(contactData);
return;
} else {
Expand All @@ -148,21 +136,21 @@ public void onActivityResult(final int requestCode, final int resultCode, final
return;
}
/* No need to break as all paths return */
case(EMAIL_REQUEST):
case (EMAIL_REQUEST):
/* Return contacts first email address, as string */
try {


// get the contact id from the Uri
String id = contactUri.getLastPathSegment();

// query for everything email
Cursor cursor = mCtx.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", new String[]{id},
null);
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", new String[]{id},
null);

int emailIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);

// For now, return only the first email address, as a string
if (cursor.moveToFirst()) {
email = cursor.getString(emailIdx);
Expand All @@ -189,8 +177,10 @@ public void onActivityResult(final int requestCode, final int resultCode, final
return;
}
}

// @Override Its needed when you add contacts wrapper library in react-native project
@Override
public void onNewIntent(Intent intent) {

}

}