nativescript-contacts
Version:
A NativeScript module providing easy access to iOS and android contact directory. Pick a contact, update date, or add a new one!
477 lines (429 loc) • 18.5 kB
JavaScript
var appModule = require("@nativescript/core/application");
var KnownLabel = require("./known-label");
var imageSource = require("image-source");
/* missing constants from the {N} */
var TYPE_CUSTOM = 0;
var RAW_CONTACT_ID = "raw_contact_id"; // android.provider.ContactsContract.Data.RAW_CONTACT_ID
var CONTACT_ID = "contact_id"; // android.provider.ContactsContract.Data.CONTACT_ID
var MIMETYPE = "mimetype"; // android.provider.ContactsContract.Data.MIMETYPE
/*
inside a web worker appModule.android.context does not work (function by Nathanael)
*/
exports.getContext = function () {
if (appModule.android.context) {
return (appModule.android.context);
}
var ctx = java.lang.Class.forName("android.app.AppGlobals").getMethod("getInitialApplication", null).invoke(null, null);
if (ctx) return ctx;
ctx = java.lang.Class.forName("android.app.ActivityThread").getMethod("currentApplication", null).invoke(null, null);
return ctx;
};
/*
add nativescript image-source object to photo property - does not work from inside a web worker
*/
exports.addImageSources = function (message) {
try {
message.data.forEach(function (contact) {
if (contact.photo && contact.photo.photo_uri) {
var bitmap = android.provider.MediaStore.Images.Media.getBitmap(
appModule.android.foregroundActivity.getContentResolver(),
android.net.Uri.parse(contact.photo.photo_uri)
);
var _photo = imageSource.fromNativeSource(bitmap);
for(var prop in _photo){
contact.photo[prop] = _photo[prop]
}
}
});
} catch(e) {
// console.log(e);
}
return message;
};
//Query Sample:
//query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
exports.getBasicCursor = function(uri, id){
var contentResolver = exports.getContext().getContentResolver();
var cursor = contentResolver.query(uri,
null,
CONTACT_ID + "=" + id,
null,
null);
//cursor.moveToFirst();
return cursor;
};
//projection: String[]
//parameters: String[]
exports.getComplexCursor = function(id, uri, projection, parameters){
var contentResolver = exports.getContext().getContentResolver();
var cursor = contentResolver.query(uri,
projection,
CONTACT_ID + "=? AND " + MIMETYPE + "=?",
parameters,
null);
return cursor;
};
//http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Email.html
exports.getEmailType = function(data2, data3) {
var typeInt = parseInt(data2, 10);
var typeConverted = "";
switch(typeInt) {
case TYPE_CUSTOM:
typeConverted = data3; //LABEL
break;
case android.provider.ContactsContract.CommonDataKinds.Email.TYPE_HOME:
typeConverted = KnownLabel.HOME;
break;
case android.provider.ContactsContract.CommonDataKinds.Email.TYPE_WORK:
typeConverted = KnownLabel.WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.Email.TYPE_OTHER:
typeConverted = KnownLabel.OTHER;
break;
case android.provider.ContactsContract.CommonDataKinds.Email.TYPE_MOBILE:
typeConverted = KnownLabel.MOBILE;
break;
}
return typeConverted;
};
exports.getNativeEmailType = function (label) {
var nativeType = TYPE_CUSTOM;
switch (label) {
case KnownLabel.HOME:
nativeType = android.provider.ContactsContract.CommonDataKinds.Email.TYPE_HOME;
break;
case KnownLabel.WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Email.TYPE_WORK;
break;
case KnownLabel.OTHER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Email.TYPE_OTHER;
break;
case KnownLabel.MOBILE:
nativeType = android.provider.ContactsContract.CommonDataKinds.Email.TYPE_MOBILE;
break;
}
return nativeType;
};
//http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Organization.html
exports.getOrgType = function(data2, data3){
var typeInt = parseInt(data2, 10);
var typeConverted = "";
switch(typeInt){
case TYPE_CUSTOM:
typeConverted = data3; //LABEL
break;
case android.provider.ContactsContract.CommonDataKinds.Organization.TYPE_WORK:
typeConverted = KnownLabel.WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.Organization.TYPE_OTHER:
typeConverted = KnownLabel.OTHER;
break;
}
return typeConverted;
};
exports.getNativeOrgType = function (label) {
var nativeType = TYPE_CUSTOM;
switch (label) {
case KnownLabel.WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Organization.TYPE_WORK;
break;
case KnownLabel.OTHER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Organization.TYPE_OTHER;
break;
};
return nativeType;
};
//http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Website.html
exports.getWebsiteType = function(data2, data3){
var typeInt = parseInt(data2, 10);
var typeConverted = "";
switch(typeInt){
case TYPE_CUSTOM:
typeConverted = data3; //LABEL
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE:
typeConverted = KnownLabel.HOMEPAGE;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_BLOG:
typeConverted = KnownLabel.BLOG;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_PROFILE:
typeConverted = KnownLabel.PROFILE;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_HOME:
typeConverted = KnownLabel.HOME;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_WORK:
typeConverted = KnownLabel.WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_FTP:
typeConverted = KnownLabel.FTP;
break;
case android.provider.ContactsContract.CommonDataKinds.Website.TYPE_OTHER:
typeConverted = KnownLabel.OTHER;
break;
}
return typeConverted;
};
exports.getNativeWebsiteType = function (label) {
var nativeType = TYPE_CUSTOM;
switch (label) {
case KnownLabel.HOMEPAGE:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE;
break;
case KnownLabel.BLOG:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_BLOG;
break;
case KnownLabel.PROFILE:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_PROFILE;
break;
case KnownLabel.HOME:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_HOME;
break;
case KnownLabel.WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_WORK;
break;
case KnownLabel.FTP:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_FTP;
break;
case KnownLabel.OTHER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Website.TYPE_OTHER;
break;
}
return nativeType;
};
//http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Email.html
exports.getAddressType = function(data2, data3){
var typeInt = parseInt(data2, 10);
var typeConverted = "";
switch(typeInt){
case TYPE_CUSTOM:
typeConverted = data3; //LABEL
break;
case android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
typeConverted = KnownLabel.HOME;
break;
case android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
typeConverted = KnownLabel.WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER:
typeConverted = KnownLabel.OTHER;
break;
}
return typeConverted;
};
exports.getNativeAddressType = function (label) {
var nativeType = TYPE_CUSTOM;
switch (label) {
case KnownLabel.HOME:
nativeType = android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME;
break;
case KnownLabel.WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK;
break;
case KnownLabel.OTHER:
nativeType = android.provider.ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER;
break;
}
return nativeType;
};
//http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html
exports.getPhoneType = function(data2, data3){
var typeInt = parseInt(data2, 10);
var typeConverted = "";
switch(typeInt){
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
typeConverted = KnownLabel.HOME;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
typeConverted = KnownLabel.MOBILE;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
typeConverted = KnownLabel.WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK:
typeConverted = KnownLabel.FAX_WORK;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
typeConverted = KnownLabel.FAX_HOME;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_PAGER:
typeConverted = KnownLabel.PAGER;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_OTHER:
typeConverted = KnownLabel.OTHER;
break;
case TYPE_CUSTOM:
typeConverted = data3; //Use LABEL
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK:
typeConverted = KnownLabel.CALLBACK;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_CAR:
typeConverted = KnownLabel.CAR;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN:
typeConverted = KnownLabel.COMPANY_MAIN;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_ISDN:
typeConverted = KnownLabel.ISDN;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MAIN:
typeConverted = KnownLabel.MAIN;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX:
typeConverted = KnownLabel.OTHER_FAX;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_RADIO:
typeConverted = KnownLabel.RADIO;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_TELEX:
typeConverted = KnownLabel.TELEX;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD:
typeConverted = KnownLabel.TTY_TDD;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
typeConverted = KnownLabel.WORK_MOBILE;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER:
typeConverted = KnownLabel.WORK_PAGER;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT:
typeConverted = KnownLabel.ASSISTANT;
break;
case android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MMS:
typeConverted = KnownLabel.MMS;
break;
}
return typeConverted;
};
exports.getNativePhoneType = function (label) {
var nativeType = TYPE_CUSTOM;
switch (label) {
case KnownLabel.HOME:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_HOME;
break;
case KnownLabel.MOBILE:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE;
break;
case KnownLabel.WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK;
break;
case KnownLabel.FAX_WORK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK;
break;
case KnownLabel.FAX_HOME:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME;
break;
case KnownLabel.PAGER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_PAGER;
break;
case KnownLabel.OTHER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_OTHER;
break;
case KnownLabel.CALLBACK:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK;
break;
case KnownLabel.CAR:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_CAR;
break;
case KnownLabel.COMPANY_MAIN:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN;
break;
case KnownLabel.ISDN:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_ISDN;
break;
case KnownLabel.MAIN:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MAIN;
break;
case KnownLabel.OTHER_FAX:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX;
break;
case KnownLabel.RADIO:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_RADIO;
break;
case KnownLabel.TELEX:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_TELEX;
break;
case KnownLabel.TTY_TDD:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD;
break;
case KnownLabel.WORK_MOBILE:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE;
break;
case KnownLabel.WORK_PAGER:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER;
break;
case KnownLabel.ASSISTANT:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT;
break;
case KnownLabel.MMS:
nativeType = android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MMS;
break;
}
return nativeType;
};
exports.getContactBuilder = function (id, mimetype) {
var builder;
if (id && id !== "") {
builder = android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(CONTACT_ID + "=? AND " + MIMETYPE + "=?", [id.toString(), mimetype]);
}
else {
builder = android.content.ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(RAW_CONTACT_ID, 0)
.withValue(MIMETYPE, mimetype);
}
return builder;
};
exports.getRawContactBuilder = function (rawId, mimetype, isDelete) {
var builder;
if (isDelete) {
builder = android.content.ContentProviderOperation.newDelete(android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(RAW_CONTACT_ID + "=? AND " + MIMETYPE + "=?", [rawId, mimetype]);
}
else if (rawId) {
builder = android.content.ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValue(RAW_CONTACT_ID, rawId)
.withValue(MIMETYPE, mimetype);
}
else {
builder = android.content.ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(RAW_CONTACT_ID, 0)
.withValue(MIMETYPE, mimetype);
}
return builder;
}
exports.convertNativeCursorToJson = function(cursor) {
//noinspection JSUnresolvedFunction
var count = cursor.getColumnCount();
var results = {};
for (var i=0; i < count; i++) {
var type = cursor.getType(i);
//noinspection JSUnresolvedFunction
var name = cursor.getColumnName(i);
switch (type) {
case 0: // NULL
results[name] = null;
break;
case 1: // Integer
//noinspection JSUnresolvedFunction
results[name] = cursor.getInt(i);
break;
case 2: // Float
//noinspection JSUnresolvedFunction
results[name] = cursor.getFloat(i);
break;
case 3: // String
results[name] = cursor.getString(i);
break;
case 4: // Blob
results[name] = cursor.getBlob(i);
break;
default:
throw new Error('Contacts - Unknown Field Type '+ type);
}
}
return results;
};