diff --git a/README.md b/README.md index 15e9798..a0be82c 100644 --- a/README.md +++ b/README.md @@ -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` @@ -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); + }); +``` diff --git a/android/app/src/main/java/com/lynxit/contactswrapper/ContactsWrapper.java b/android/app/src/main/java/com/lynxit/contactswrapper/ContactsWrapper.java index 21e085e..1cbd267 100644 --- a/android/app/src/main/java/com/lynxit/contactswrapper/ContactsWrapper.java +++ b/android/app/src/main/java/com/lynxit/contactswrapper/ContactsWrapper.java @@ -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"; @@ -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; @@ -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 returnKeys = new HashMap(); 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; @@ -108,20 +96,20 @@ 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); @@ -129,14 +117,14 @@ public void onActivityResult(final int requestCode, final int resultCode, final 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 { @@ -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); @@ -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) { } + }