mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-22 00:32:55 +08:00
merge of latest phonegap/android bs
This commit is contained in:
commit
cbd5686e7d
@ -101,7 +101,10 @@
|
|||||||
|
|
||||||
function get_contacts()
|
function get_contacts()
|
||||||
{
|
{
|
||||||
navigator.ContactManager.getAllContacts(count_contacts, fail, null);
|
var obj = new ContactFindOptions();
|
||||||
|
obj.filter="";
|
||||||
|
obj.multiple=true;
|
||||||
|
navigator.service.contacts.find(["displayName", "phoneNumbers", "emails"], count_contacts, fail, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
function count_contacts(contacts)
|
function count_contacts(contacts)
|
||||||
|
@ -1,72 +1,127 @@
|
|||||||
|
|
||||||
var Contact = function() {
|
var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses,
|
||||||
this.name = new ContactName();
|
ims, organizations, published, updated, birthday, anniversary, gender, note,
|
||||||
this.emails = [];
|
preferredUsername, photos, tags, relationships, urls, accounts, utcOffset, connected) {
|
||||||
this.phones = [];
|
this.id = id || null;
|
||||||
|
this.displayName = displayName || null;
|
||||||
|
this.name = name || null; // ContactName
|
||||||
|
this.nickname = nickname || null;
|
||||||
|
this.phoneNumbers = phoneNumbers || null; // ContactField[]
|
||||||
|
this.emails = emails || null; // ContactField[]
|
||||||
|
this.addresses = addresses || null; // ContactAddress[]
|
||||||
|
this.ims = ims || null; // ContactField[]
|
||||||
|
this.organizations = organizations || null; // ContactOrganization[]
|
||||||
|
this.published = published || null;
|
||||||
|
this.updated = updated || null;
|
||||||
|
this.birthday = birthday || null;
|
||||||
|
this.anniversary = anniversary || null;
|
||||||
|
this.gender = gender || null;
|
||||||
|
this.note = note || null;
|
||||||
|
this.preferredUsername = preferredUsername || null;
|
||||||
|
this.photos = photos || null; // ContactField[]
|
||||||
|
this.tags = tags || null; // ContactField[]
|
||||||
|
this.relationships = relationships || null; // ContactField[]
|
||||||
|
this.urls = urls || null; // ContactField[]
|
||||||
|
this.accounts = accounts || null; // ContactAccount[]
|
||||||
|
this.utcOffset = utcOffset || null;
|
||||||
|
this.connected = connected || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
var ContactName = function() {
|
var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
|
||||||
this.formatted = "";
|
this.formatted = formatted || null;
|
||||||
this.familyName = "";
|
this.familyName = familyName || null;
|
||||||
this.givenName = "";
|
this.givenName = givenName || null;
|
||||||
this.additionalNames = [];
|
this.middleName = middle || null;
|
||||||
this.prefixes = [];
|
this.honorificPrefix = prefix || null;
|
||||||
this.suffixes = [];
|
this.honorificSuffix = suffix || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
var ContactEmail = function() {
|
var ContactField = function(type, value, primary) {
|
||||||
this.types = [];
|
this.type = type || null;
|
||||||
this.address = "";
|
this.value = value || null;
|
||||||
|
this.primary = primary || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
var ContactPhoneNumber = function() {
|
var ContactAddress = function(formatted, streetAddress, locality, region, postalCode, country) {
|
||||||
this.types = [];
|
this.formatted = formatted || null;
|
||||||
this.number = "";
|
this.streetAddress = streetAddress || null;
|
||||||
|
this.locality = locality || null;
|
||||||
|
this.region = region || null;
|
||||||
|
this.postalCode = postalCode || null;
|
||||||
|
this.country = country || null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var ContactOrganization = function(name, dept, title, startDate, endDate, location, desc) {
|
||||||
|
this.name = name || null;
|
||||||
|
this.department = dept || null;
|
||||||
|
this.title = title || null;
|
||||||
|
this.startDate = startDate || null;
|
||||||
|
this.endDate = endDate || null;
|
||||||
|
this.location = location || null;
|
||||||
|
this.description = desc || null;
|
||||||
|
};
|
||||||
|
|
||||||
|
var ContactAccount = function(domain, username, userid) {
|
||||||
|
this.domain = domain || null;
|
||||||
|
this.username = username || null;
|
||||||
|
this.userid = userid || null;
|
||||||
|
}
|
||||||
|
|
||||||
var Contacts = function() {
|
var Contacts = function() {
|
||||||
this.records = [];
|
this.inProgress = false;
|
||||||
};
|
this.records = new Array();
|
||||||
|
}
|
||||||
|
|
||||||
Contacts.prototype.find = function(obj, win, fail) {
|
// Contacts.prototype.find = function(obj, win, fail) {
|
||||||
|
Contacts.prototype.find = function(fields, win, fail, options) {
|
||||||
this.win = win;
|
this.win = win;
|
||||||
this.fail = fail;
|
this.fail = fail;
|
||||||
if(obj.name != null) {
|
|
||||||
// Build up the search term that we'll use in SQL, based on the structure/contents of the contact object passed into find.
|
PhoneGap.execAsync(null, null, "Contacts", "search", [fields, options]);
|
||||||
var searchTerm = '';
|
|
||||||
if (obj.name.givenName && obj.name.givenName.length > 0) {
|
|
||||||
searchTerm = obj.name.givenName.split(' ').join('%');
|
|
||||||
}
|
|
||||||
if (obj.name.familyName && obj.name.familyName.length > 0) {
|
|
||||||
searchTerm += obj.name.familyName.split(' ').join('%');
|
|
||||||
}
|
|
||||||
if (!obj.name.familyName && !obj.name.givenName && obj.name.formatted) {
|
|
||||||
searchTerm = obj.name.formatted;
|
|
||||||
}
|
|
||||||
PhoneGap.execAsync(null, null, "Contacts", "search", [searchTerm, "", ""]);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Contacts.prototype.droidFoundContact = function(name, npa, email) {
|
Contacts.prototype.droidDone = function(contacts) {
|
||||||
var contact = new Contact();
|
this.win(eval('(' + contacts + ')'));
|
||||||
contact.name = new ContactName();
|
|
||||||
contact.name.formatted = name;
|
|
||||||
contact.name.givenName = name;
|
|
||||||
var mail = new ContactEmail();
|
|
||||||
mail.types.push("home");
|
|
||||||
mail.address = email;
|
|
||||||
contact.emails.push(mail);
|
|
||||||
phone = new ContactPhoneNumber();
|
|
||||||
phone.types.push("home");
|
|
||||||
phone.number = npa;
|
|
||||||
contact.phones.push(phone);
|
|
||||||
this.records.push(contact);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Contacts.prototype.droidDone = function() {
|
Contacts.prototype.remove = function(contact) {
|
||||||
this.win(this.records);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Contacts.prototype.save = function(contact) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Contacts.prototype.create = function(contact) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Contacts.prototype.m_foundContacts = function(win, contacts) {
|
||||||
|
this.inProgress = false;
|
||||||
|
win(contacts);
|
||||||
|
};
|
||||||
|
|
||||||
|
var ContactFindOptions = function(filter, multiple, limit, updatedSince) {
|
||||||
|
this.filter = filter || '';
|
||||||
|
this.multiple = multiple || true;
|
||||||
|
this.limit = limit || Number.MAX_VALUE;
|
||||||
|
this.updatedSince = updatedSince || '';
|
||||||
|
};
|
||||||
|
|
||||||
|
var ContactError = function() {
|
||||||
|
this.code=null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ContactError.INVALID_ARGUMENT_ERROR = 0;
|
||||||
|
ContactError.IO_ERROR = 1;
|
||||||
|
ContactError.NOT_FOUND_ERROR = 2;
|
||||||
|
ContactError.NOT_SUPPORTED_ERROR = 3;
|
||||||
|
ContactError.PENDING_OPERATION_ERROR = 4;
|
||||||
|
ContactError.PERMISSION_DENIED_ERROR = 5;
|
||||||
|
ContactError.TIMEOUT_ERROR = 6;
|
||||||
|
ContactError.UNKNOWN_ERROR = 7;
|
||||||
|
|
||||||
PhoneGap.addConstructor(function() {
|
PhoneGap.addConstructor(function() {
|
||||||
if(typeof navigator.contacts == "undefined") navigator.contacts = new Contacts();
|
if(typeof navigator.service == "undefined") navigator.service = new Object();
|
||||||
|
if(typeof navigator.service.contacts == "undefined") navigator.service.contacts = new Contacts();
|
||||||
});
|
});
|
||||||
|
@ -41,7 +41,7 @@ Notification.prototype.blink = function(count, colour) {
|
|||||||
* @param {Integer} mills The number of milliseconds to vibrate for.
|
* @param {Integer} mills The number of milliseconds to vibrate for.
|
||||||
*/
|
*/
|
||||||
Notification.prototype.vibrate = function(mills) {
|
Notification.prototype.vibrate = function(mills) {
|
||||||
PhoneGap.execAsync(null, null, "Device", "vibrate", [mills]);
|
PhoneGap.execAsync(null, null, "Notification", "vibrate", [mills]);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,7 +51,7 @@ Notification.prototype.vibrate = function(mills) {
|
|||||||
* @param {Integer} count The number of beeps.
|
* @param {Integer} count The number of beeps.
|
||||||
*/
|
*/
|
||||||
Notification.prototype.beep = function(count) {
|
Notification.prototype.beep = function(count) {
|
||||||
PhoneGap.execAsync(null, null, "Device", "beep", [count]);
|
PhoneGap.execAsync(null, null, "Notification", "beep", [count]);
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: of course on Blackberry and Android there notifications in the UI as well
|
// TODO: of course on Blackberry and Android there notifications in the UI as well
|
||||||
|
@ -290,6 +290,28 @@ PhoneGap.stringify = function(args) {
|
|||||||
if ((type == "number") || (type == "boolean")) {
|
if ((type == "number") || (type == "boolean")) {
|
||||||
s = s + args[i];
|
s = s + args[i];
|
||||||
}
|
}
|
||||||
|
else if (args[i] instanceof Array) {
|
||||||
|
s = s + "[" + args[i] + "]";
|
||||||
|
}
|
||||||
|
else if (args[i] instanceof Object) {
|
||||||
|
var start = true;
|
||||||
|
s = s + '{';
|
||||||
|
for (var name in args[i]) {
|
||||||
|
if (!start) {
|
||||||
|
s = s + ',';
|
||||||
|
}
|
||||||
|
s = s + '"' + name + '":';
|
||||||
|
var nameType = typeof args[i][name];
|
||||||
|
if ((nameType == "number") || (nameType == "boolean")) {
|
||||||
|
s = s + args[i][name];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s = s + '"' + args[i][name] + '"';
|
||||||
|
}
|
||||||
|
start=false;
|
||||||
|
}
|
||||||
|
s = s + '}';
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
s = s + '"' + args[i] + '"';
|
s = s + '"' + args[i] + '"';
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -21,7 +21,7 @@ import android.webkit.WebView;
|
|||||||
* This class listens to the accelerometer sensor and stores the latest
|
* This class listens to the accelerometer sensor and stores the latest
|
||||||
* acceleration values x,y,z.
|
* acceleration values x,y,z.
|
||||||
*/
|
*/
|
||||||
public class AccelListener implements SensorEventListener, Plugin{
|
public class AccelListener implements SensorEventListener, Plugin {
|
||||||
|
|
||||||
public static int STOPPED = 0;
|
public static int STOPPED = 0;
|
||||||
public static int STARTING = 1;
|
public static int STARTING = 1;
|
||||||
@ -118,6 +118,7 @@ public class AccelListener implements SensorEventListener, Plugin{
|
|||||||
return new PluginResult(PluginResult.Status.IO_EXCEPTION, AccelListener.ERROR_FAILED_TO_START);
|
return new PluginResult(PluginResult.Status.IO_EXCEPTION, AccelListener.ERROR_FAILED_TO_START);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.lastAccessTime = System.currentTimeMillis();
|
||||||
JSONObject r = new JSONObject();
|
JSONObject r = new JSONObject();
|
||||||
r.put("x", this.x);
|
r.put("x", this.x);
|
||||||
r.put("y", this.y);
|
r.put("y", this.y);
|
||||||
|
90
framework/src/com/phonegap/ContactAccessor.java
Normal file
90
framework/src/com/phonegap/ContactAccessor.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// Taken from Android Tutorials
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This abstract class defines SDK-independent API for communication with
|
||||||
|
* Contacts Provider. The actual implementation used by the application depends
|
||||||
|
* on the level of API available on the device. If the API level is Cupcake or
|
||||||
|
* Donut, we want to use the {@link ContactAccessorSdk3_4} class. If it is
|
||||||
|
* Eclair or higher, we want to use {@link ContactAccessorSdk5}.
|
||||||
|
*/
|
||||||
|
public abstract class ContactAccessor {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static singleton instance of {@link ContactAccessor} holding the
|
||||||
|
* SDK-specific implementation of the class.
|
||||||
|
*/
|
||||||
|
private static ContactAccessor sInstance;
|
||||||
|
protected final String LOG_TAG = "ContactsAccessor";
|
||||||
|
protected Activity mApp;
|
||||||
|
protected WebView mView;
|
||||||
|
|
||||||
|
public static ContactAccessor getInstance(WebView view, Activity app) {
|
||||||
|
if (sInstance == null) {
|
||||||
|
String className;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check the version of the SDK we are running on. Choose an
|
||||||
|
* implementation class designed for that version of the SDK.
|
||||||
|
*
|
||||||
|
* Unfortunately we have to use strings to represent the class
|
||||||
|
* names. If we used the conventional ContactAccessorSdk5.class.getName()
|
||||||
|
* syntax, we would get a ClassNotFoundException at runtime on pre-Eclair SDKs.
|
||||||
|
* Using the above syntax would force Dalvik to load the class and try to
|
||||||
|
* resolve references to all other classes it uses. Since the pre-Eclair
|
||||||
|
* does not have those classes, the loading of ContactAccessorSdk5 would fail.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (android.os.Build.VERSION.RELEASE.startsWith("1.")) {
|
||||||
|
className = "com.phonegap.ContactAccessorSdk3_4";
|
||||||
|
} else {
|
||||||
|
className = "com.phonegap.ContactAccessorSdk5";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the required class by name and instantiate it.
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
Class<? extends ContactAccessor> clazz =
|
||||||
|
Class.forName(className).asSubclass(ContactAccessor.class);
|
||||||
|
// Grab constructor for contactsmanager class dynamically.
|
||||||
|
Constructor<? extends ContactAccessor> classConstructor = clazz.getConstructor(Class.forName("android.webkit.WebView"), Class.forName("android.app.Activity"));
|
||||||
|
sInstance = classConstructor.newInstance(view, app);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles searching through SDK-specific contacts API.
|
||||||
|
*/
|
||||||
|
public abstract void search(JSONArray filter, JSONObject options);
|
||||||
|
}
|
362
framework/src/com/phonegap/ContactAccessorSdk3_4.java
Normal file
362
framework/src/com/phonegap/ContactAccessorSdk3_4.java
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
// Taken from Android tutorials
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.provider.Contacts.ContactMethods;
|
||||||
|
import android.provider.Contacts.ContactMethodsColumns;
|
||||||
|
import android.provider.Contacts.Organizations;
|
||||||
|
import android.provider.Contacts.People;
|
||||||
|
import android.provider.Contacts.Phones;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of {@link ContactAccessor} that uses legacy Contacts API.
|
||||||
|
* These APIs are deprecated and should not be used unless we are running on a
|
||||||
|
* pre-Eclair SDK.
|
||||||
|
* <p>
|
||||||
|
* There are several reasons why we wouldn't want to use this class on an Eclair device:
|
||||||
|
* <ul>
|
||||||
|
* <li>It would see at most one account, namely the first Google account created on the device.
|
||||||
|
* <li>It would work through a compatibility layer, which would make it inherently less efficient.
|
||||||
|
* <li>Not relevant to this particular example, but it would not have access to new kinds
|
||||||
|
* of data available through current APIs.
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public class ContactAccessorSdk3_4 extends ContactAccessor {
|
||||||
|
private static final Map<String, String> dbMap = new HashMap<String, String>();
|
||||||
|
static {
|
||||||
|
dbMap.put("id", People._ID);
|
||||||
|
dbMap.put("displayName", People.DISPLAY_NAME);
|
||||||
|
dbMap.put("phoneNumbers", Phones.NUMBER);
|
||||||
|
dbMap.put("phoneNumbers.value", Phones.NUMBER);
|
||||||
|
dbMap.put("emails", ContactMethods.DATA);
|
||||||
|
dbMap.put("emails.value", ContactMethods.DATA);
|
||||||
|
dbMap.put("addresses", ContactMethodsColumns.DATA);
|
||||||
|
dbMap.put("addresses.formatted", ContactMethodsColumns.DATA);
|
||||||
|
dbMap.put("ims", ContactMethodsColumns.DATA);
|
||||||
|
dbMap.put("ims.value", ContactMethodsColumns.DATA);
|
||||||
|
dbMap.put("organizations", Organizations.COMPANY);
|
||||||
|
dbMap.put("organizations.name", Organizations.COMPANY);
|
||||||
|
dbMap.put("organizations.title", Organizations.TITLE);
|
||||||
|
dbMap.put("note", People.NOTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactAccessorSdk3_4(WebView view, Activity app)
|
||||||
|
{
|
||||||
|
mApp = app;
|
||||||
|
mView = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void search(JSONArray filter, JSONObject options) {
|
||||||
|
String searchTerm = "";
|
||||||
|
int limit = Integer.MAX_VALUE;
|
||||||
|
boolean multiple = true;
|
||||||
|
try {
|
||||||
|
searchTerm = options.getString("filter");
|
||||||
|
if (searchTerm.length()==0) {
|
||||||
|
searchTerm = "%";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
searchTerm = "%" + searchTerm + "%";
|
||||||
|
}
|
||||||
|
multiple = options.getBoolean("multiple");
|
||||||
|
if (multiple) {
|
||||||
|
limit = options.getInt("limit");
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentResolver cr = mApp.getContentResolver();
|
||||||
|
|
||||||
|
Set<String> contactIds = buildSetOfContactIds(filter, searchTerm);
|
||||||
|
|
||||||
|
Iterator<String> it = contactIds.iterator();
|
||||||
|
|
||||||
|
JSONArray contacts = new JSONArray();
|
||||||
|
JSONObject contact;
|
||||||
|
String contactId;
|
||||||
|
int pos = 0;
|
||||||
|
while (it.hasNext() && (pos < limit)) {
|
||||||
|
contact = new JSONObject();
|
||||||
|
try {
|
||||||
|
contactId = it.next();
|
||||||
|
contact.put("id", contactId);
|
||||||
|
|
||||||
|
// Do query for name and note
|
||||||
|
// Right now we are just querying the displayName
|
||||||
|
Cursor cur = cr.query(People.CONTENT_URI,
|
||||||
|
null,
|
||||||
|
"people._id = ?",
|
||||||
|
new String[] {contactId},
|
||||||
|
null);
|
||||||
|
cur.moveToFirst();
|
||||||
|
|
||||||
|
// name
|
||||||
|
contact.put("displayName", cur.getString(cur.getColumnIndex(People.DISPLAY_NAME)));
|
||||||
|
// phone number
|
||||||
|
contact.put("phoneNumbers", phoneQuery(cr, contactId));
|
||||||
|
// email
|
||||||
|
contact.put("emails", emailQuery(cr, contactId));
|
||||||
|
// addresses
|
||||||
|
contact.put("addresses", addressQuery(cr, contactId));
|
||||||
|
// organizations
|
||||||
|
contact.put("organizations", organizationQuery(cr, contactId));
|
||||||
|
// ims
|
||||||
|
contact.put("ims", imQuery(cr, contactId));
|
||||||
|
// note
|
||||||
|
contact.put("note", cur.getString(cur.getColumnIndex(People.NOTES)));
|
||||||
|
// nickname
|
||||||
|
// urls
|
||||||
|
// relationship
|
||||||
|
// birthdays
|
||||||
|
// anniversary
|
||||||
|
|
||||||
|
pos++;
|
||||||
|
cur.close();
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
contacts.put(contact);
|
||||||
|
}
|
||||||
|
mView.loadUrl("javascript:navigator.service.contacts.droidDone('" + contacts.toString() + "');");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> buildSetOfContactIds(JSONArray filter, String searchTerm) {
|
||||||
|
Set<String> contactIds = new HashSet<String>();
|
||||||
|
|
||||||
|
String key;
|
||||||
|
try {
|
||||||
|
for (int i=0; i<filter.length(); i++) {
|
||||||
|
key = filter.getString(i);
|
||||||
|
if (key.startsWith("displayName")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
People.CONTENT_URI,
|
||||||
|
People._ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
// else if (key.startsWith("name")) {
|
||||||
|
// Log.d(LOG_TAG, "Doing " + key + " query");
|
||||||
|
// doQuery(searchTerm, contactIds,
|
||||||
|
// ContactsContract.Data.CONTENT_URI,
|
||||||
|
// ContactsContract.Data.CONTACT_ID,
|
||||||
|
// dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
// new String[] {searchTerm, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE});
|
||||||
|
// }
|
||||||
|
else if (key.startsWith("phoneNumbers")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
Phones.CONTENT_URI,
|
||||||
|
Phones.PERSON_ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("emails")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactMethods.CONTENT_EMAIL_URI,
|
||||||
|
ContactMethods.PERSON_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactMethods.KIND + " = ?",
|
||||||
|
new String[] {searchTerm, ContactMethods.CONTENT_EMAIL_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("addresses")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactMethods.CONTENT_URI,
|
||||||
|
ContactMethods.PERSON_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactMethods.KIND + " = ?",
|
||||||
|
new String[] {searchTerm, ContactMethods.CONTENT_POSTAL_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("ims")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactMethods.CONTENT_URI,
|
||||||
|
ContactMethods.PERSON_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactMethods.KIND + " = ?",
|
||||||
|
new String[] {searchTerm, ContactMethods.CONTENT_IM_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("organizations")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
Organizations.CONTENT_URI,
|
||||||
|
ContactMethods.PERSON_ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("note")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
People.CONTENT_URI,
|
||||||
|
People._ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return contactIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doQuery(String searchTerm, Set<String> contactIds,
|
||||||
|
Uri uri, String projection, String selection, String[] selectionArgs) {
|
||||||
|
ContentResolver cr = mApp.getContentResolver();
|
||||||
|
|
||||||
|
Cursor cursor = cr.query(
|
||||||
|
uri,
|
||||||
|
null,
|
||||||
|
selection,
|
||||||
|
selectionArgs,
|
||||||
|
null);
|
||||||
|
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
contactIds.add(cursor.getString(cursor.getColumnIndex(projection)));
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray imQuery(ContentResolver cr, String contactId) {
|
||||||
|
String imWhere = ContactMethods.PERSON_ID
|
||||||
|
+ " = ? AND " + ContactMethods.KIND + " = ?";
|
||||||
|
String[] imWhereParams = new String[]{contactId, ContactMethods.CONTENT_IM_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactMethods.CONTENT_URI,
|
||||||
|
null, imWhere, imWhereParams, null);
|
||||||
|
JSONArray ims = new JSONArray();
|
||||||
|
JSONObject im;
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
im = new JSONObject();
|
||||||
|
try{
|
||||||
|
im.put("primary", false);
|
||||||
|
im.put("value", cursor.getString(
|
||||||
|
cursor.getColumnIndex(ContactMethodsColumns.DATA)));
|
||||||
|
im.put("type", cursor.getString(
|
||||||
|
cursor.getColumnIndex(ContactMethodsColumns.TYPE)));
|
||||||
|
ims.put(im);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray organizationQuery(ContentResolver cr, String contactId) {
|
||||||
|
String orgWhere = ContactMethods.PERSON_ID + " = ?";
|
||||||
|
String[] orgWhereParams = new String[]{contactId};
|
||||||
|
Cursor cursor = cr.query(Organizations.CONTENT_URI,
|
||||||
|
null, orgWhere, orgWhereParams, null);
|
||||||
|
JSONArray organizations = new JSONArray();
|
||||||
|
JSONObject organization;
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
organization = new JSONObject();
|
||||||
|
try{
|
||||||
|
organization.put("name", cursor.getString(cursor.getColumnIndex(Organizations.COMPANY)));
|
||||||
|
organization.put("title", cursor.getString(cursor.getColumnIndex(Organizations.TITLE)));
|
||||||
|
// organization.put("department", cursor.getString(cursor.getColumnIndex(Organizations)));
|
||||||
|
// organization.put("description", cursor.getString(cursor.getColumnIndex(Organizations)));
|
||||||
|
// organization.put("endDate", cursor.getString(cursor.getColumnIndex(Organizations)));
|
||||||
|
// organization.put("location", cursor.getString(cursor.getColumnIndex(Organizations)));
|
||||||
|
// organization.put("startDate", cursor.getString(cursor.getColumnIndex(Organizations)));
|
||||||
|
organizations.put(organization);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return organizations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray addressQuery(ContentResolver cr, String contactId) {
|
||||||
|
String addrWhere = ContactMethods.PERSON_ID
|
||||||
|
+ " = ? AND " + ContactMethods.KIND + " = ?";
|
||||||
|
String[] addrWhereParams = new String[]{contactId,
|
||||||
|
ContactMethods.CONTENT_POSTAL_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactMethods.CONTENT_URI,
|
||||||
|
null, addrWhere, addrWhereParams, null);
|
||||||
|
JSONArray addresses = new JSONArray();
|
||||||
|
JSONObject address;
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
address = new JSONObject();
|
||||||
|
try{
|
||||||
|
address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactMethodsColumns.DATA)));
|
||||||
|
addresses.put(address);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return addresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray phoneQuery(ContentResolver cr, String contactId) {
|
||||||
|
Cursor cursor = cr.query(
|
||||||
|
Phones.CONTENT_URI,
|
||||||
|
null,
|
||||||
|
Phones.PERSON_ID +" = ?",
|
||||||
|
new String[]{contactId}, null);
|
||||||
|
JSONArray phones = new JSONArray();
|
||||||
|
JSONObject phone;
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
phone = new JSONObject();
|
||||||
|
try{
|
||||||
|
phone.put("primary", false);
|
||||||
|
phone.put("value", cursor.getString(cursor.getColumnIndex(Phones.NUMBER)));
|
||||||
|
phone.put("type", cursor.getString(cursor.getColumnIndex(Phones.TYPE)));
|
||||||
|
phones.put(phone);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return phones;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray emailQuery(ContentResolver cr, String contactId) {
|
||||||
|
Cursor cursor = cr.query(
|
||||||
|
ContactMethods.CONTENT_EMAIL_URI,
|
||||||
|
null,
|
||||||
|
ContactMethods.PERSON_ID +" = ?",
|
||||||
|
new String[]{contactId}, null);
|
||||||
|
JSONArray emails = new JSONArray();
|
||||||
|
JSONObject email;
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
email = new JSONObject();
|
||||||
|
try{
|
||||||
|
email.put("primary", false);
|
||||||
|
email.put("value", cursor.getString(cursor.getColumnIndex(ContactMethods.DATA)));
|
||||||
|
// TODO Find out why adding an email type throws and exception
|
||||||
|
//email.put("type", cursor.getString(cursor.getColumnIndex(ContactMethods.TYPE)));
|
||||||
|
emails.put(email);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return emails;
|
||||||
|
}
|
||||||
|
}
|
553
framework/src/com/phonegap/ContactAccessorSdk5.java
Normal file
553
framework/src/com/phonegap/ContactAccessorSdk5.java
Normal file
@ -0,0 +1,553 @@
|
|||||||
|
// Taken from Android tutorials
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of {@link ContactAccessor} that uses current Contacts API.
|
||||||
|
* This class should be used on Eclair or beyond, but would not work on any earlier
|
||||||
|
* release of Android. As a matter of fact, it could not even be loaded.
|
||||||
|
* <p>
|
||||||
|
* This implementation has several advantages:
|
||||||
|
* <ul>
|
||||||
|
* <li>It sees contacts from multiple accounts.
|
||||||
|
* <li>It works with aggregated contacts. So for example, if the contact is the result
|
||||||
|
* of aggregation of two raw contacts from different accounts, it may return the name from
|
||||||
|
* one and the phone number from the other.
|
||||||
|
* <li>It is efficient because it uses the more efficient current API.
|
||||||
|
* <li>Not obvious in this particular example, but it has access to new kinds
|
||||||
|
* of data available exclusively through the new APIs. Exercise for the reader: add support
|
||||||
|
* for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or
|
||||||
|
* social status updates (see {@link android.provider.ContactsContract.StatusUpdates}).
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public class ContactAccessorSdk5 extends ContactAccessor {
|
||||||
|
|
||||||
|
private static final String WHERE_STRING = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
|
||||||
|
private static final Map<String, String> dbMap = new HashMap<String, String>();
|
||||||
|
static {
|
||||||
|
dbMap.put("id", ContactsContract.Contacts._ID);
|
||||||
|
dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME);
|
||||||
|
dbMap.put("name", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
|
||||||
|
dbMap.put("name.formatted", ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
|
||||||
|
dbMap.put("name.familyName", ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
|
||||||
|
dbMap.put("name.givenName", ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
|
||||||
|
dbMap.put("name.middleName", ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);
|
||||||
|
dbMap.put("name.honorificPrefix", ContactsContract.CommonDataKinds.StructuredName.PREFIX);
|
||||||
|
dbMap.put("name.honorificSuffix", ContactsContract.CommonDataKinds.StructuredName.SUFFIX);
|
||||||
|
dbMap.put("nickname", ContactsContract.CommonDataKinds.Nickname.NAME);
|
||||||
|
dbMap.put("phoneNumbers", ContactsContract.CommonDataKinds.Phone.NUMBER);
|
||||||
|
dbMap.put("phoneNumbers.value", ContactsContract.CommonDataKinds.Phone.NUMBER);
|
||||||
|
dbMap.put("emails", ContactsContract.CommonDataKinds.Email.DATA);
|
||||||
|
dbMap.put("emails.value", ContactsContract.CommonDataKinds.Email.DATA);
|
||||||
|
dbMap.put("addresses", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
|
||||||
|
dbMap.put("addresses.formatted", ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
|
||||||
|
dbMap.put("addresses.streetAddress", ContactsContract.CommonDataKinds.StructuredPostal.STREET);
|
||||||
|
dbMap.put("addresses.locality", ContactsContract.CommonDataKinds.StructuredPostal.CITY);
|
||||||
|
dbMap.put("addresses.region", ContactsContract.CommonDataKinds.StructuredPostal.REGION);
|
||||||
|
dbMap.put("addresses.postalCode", ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE);
|
||||||
|
dbMap.put("addresses.country", ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY);
|
||||||
|
dbMap.put("ims", ContactsContract.CommonDataKinds.Im.DATA);
|
||||||
|
dbMap.put("ims.value", ContactsContract.CommonDataKinds.Im.DATA);
|
||||||
|
dbMap.put("organizations", ContactsContract.CommonDataKinds.Organization.COMPANY);
|
||||||
|
dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY);
|
||||||
|
dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT);
|
||||||
|
dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE);
|
||||||
|
dbMap.put("organizations.location", ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION);
|
||||||
|
dbMap.put("organizations.description", ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION);
|
||||||
|
//dbMap.put("published", null);
|
||||||
|
//dbMap.put("updated", null);
|
||||||
|
dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
|
||||||
|
dbMap.put("anniversary", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
|
||||||
|
//dbMap.put("gender", null);
|
||||||
|
dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE);
|
||||||
|
//dbMap.put("preferredUsername", null);
|
||||||
|
//dbMap.put("photos.value", null);
|
||||||
|
//dbMap.put("tags.value", null);
|
||||||
|
dbMap.put("relationships", ContactsContract.CommonDataKinds.Relation.NAME);
|
||||||
|
dbMap.put("relationships.value", ContactsContract.CommonDataKinds.Relation.NAME);
|
||||||
|
dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL);
|
||||||
|
dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL);
|
||||||
|
//dbMap.put("accounts.domain", null);
|
||||||
|
//dbMap.put("accounts.username", null);
|
||||||
|
//dbMap.put("accounts.userid", null);
|
||||||
|
//dbMap.put("utcOffset", null);
|
||||||
|
//dbMap.put("connected", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContactAccessorSdk5(WebView view, Activity app)
|
||||||
|
{
|
||||||
|
mApp = app;
|
||||||
|
mView = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void search(JSONArray filter, JSONObject options) {
|
||||||
|
String searchTerm = "";
|
||||||
|
int limit = Integer.MAX_VALUE;
|
||||||
|
boolean multiple = true;
|
||||||
|
try {
|
||||||
|
searchTerm = options.getString("filter");
|
||||||
|
if (searchTerm.length()==0) {
|
||||||
|
searchTerm = "%";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
searchTerm = "%" + searchTerm + "%";
|
||||||
|
}
|
||||||
|
multiple = options.getBoolean("multiple");
|
||||||
|
if (multiple) {
|
||||||
|
limit = options.getInt("limit");
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
// Get a cursor by creating the query.
|
||||||
|
ContentResolver cr = mApp.getContentResolver();
|
||||||
|
|
||||||
|
Set<String> contactIds = buildSetOfContactIds(filter, searchTerm);
|
||||||
|
|
||||||
|
Iterator<String> it = contactIds.iterator();
|
||||||
|
|
||||||
|
JSONArray contacts = new JSONArray();
|
||||||
|
JSONObject contact;
|
||||||
|
String contactId;
|
||||||
|
int pos = 0;
|
||||||
|
while (it.hasNext() && (pos < limit)) {
|
||||||
|
contact = new JSONObject();
|
||||||
|
contactId = it.next();
|
||||||
|
|
||||||
|
try {
|
||||||
|
contact.put("id", contactId);
|
||||||
|
contact.put("displayName", displayNameQuery(cr, contactId));
|
||||||
|
contact.put("name", nameQuery(cr, contactId));
|
||||||
|
contact.put("phoneNumbers", phoneQuery(cr, contactId));
|
||||||
|
contact.put("emails", emailQuery(cr, contactId));
|
||||||
|
contact.put("addresses", addressQuery(cr, contactId));
|
||||||
|
contact.put("organizations", organizationQuery(cr, contactId));
|
||||||
|
contact.put("ims",imQuery(cr, contactId));
|
||||||
|
contact.put("note",noteQuery(cr, contactId));
|
||||||
|
contact.put("nickname",nicknameQuery(cr, contactId));
|
||||||
|
contact.put("urls",websiteQuery(cr, contactId));
|
||||||
|
contact.put("relationships",relationshipQuery(cr, contactId));
|
||||||
|
contact.put("birthday",birthdayQuery(cr, contactId));
|
||||||
|
contact.put("anniversary",anniversaryQuery(cr, contactId));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
contacts.put(contact);
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
mView.loadUrl("javascript:navigator.service.contacts.droidDone('" + contacts.toString() + "');");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> buildSetOfContactIds(JSONArray filter, String searchTerm) {
|
||||||
|
Set<String> contactIds = new HashSet<String>();
|
||||||
|
|
||||||
|
String key;
|
||||||
|
try {
|
||||||
|
for (int i=0; i<filter.length(); i++) {
|
||||||
|
key = filter.getString(i);
|
||||||
|
if (key.startsWith("displayName")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Contacts.CONTENT_URI,
|
||||||
|
ContactsContract.Contacts._ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("name")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("nickname")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("phoneNumbers")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
|
||||||
|
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("emails")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
|
||||||
|
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ?",
|
||||||
|
new String[] {searchTerm});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("addresses")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("ims")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("organizations")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("birthday")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (key.startsWith("anniversary")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (key.startsWith("note")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("relationships")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
else if (key.startsWith("urls")) {
|
||||||
|
doQuery(searchTerm, contactIds,
|
||||||
|
ContactsContract.Data.CONTENT_URI,
|
||||||
|
ContactsContract.Data.CONTACT_ID,
|
||||||
|
dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
|
||||||
|
new String[] {searchTerm, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return contactIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doQuery(String searchTerm, Set<String> contactIds,
|
||||||
|
Uri uri, String projection, String selection, String[] selectionArgs) {
|
||||||
|
// Get a cursor by creating the query.
|
||||||
|
ContentResolver cr = mApp.getContentResolver();
|
||||||
|
|
||||||
|
Cursor cursor = cr.query(
|
||||||
|
uri,
|
||||||
|
new String[] {projection},
|
||||||
|
selection,
|
||||||
|
selectionArgs,
|
||||||
|
null);
|
||||||
|
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
contactIds.add(cursor.getString(cursor.getColumnIndex(projection)));
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String displayNameQuery(ContentResolver cr, String contactId) {
|
||||||
|
Cursor cursor = cr.query(
|
||||||
|
ContactsContract.Contacts.CONTENT_URI,
|
||||||
|
new String[] {ContactsContract.Contacts.DISPLAY_NAME},
|
||||||
|
ContactsContract.Contacts._ID + " = ?",
|
||||||
|
new String[] {contactId},
|
||||||
|
null);
|
||||||
|
cursor.moveToFirst();
|
||||||
|
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
|
||||||
|
cursor.close();
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray organizationQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] orgWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, orgWhereParams, null);
|
||||||
|
JSONArray organizations = new JSONArray();
|
||||||
|
JSONObject organization = new JSONObject();
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
try {
|
||||||
|
organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT)));
|
||||||
|
organization.put("description", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION)));
|
||||||
|
// TODO No endDate
|
||||||
|
// organization.put("endDate", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization)));
|
||||||
|
organization.put("location", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION)));
|
||||||
|
organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY)));
|
||||||
|
// TODO no startDate
|
||||||
|
// organization.put("startDate", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization)));
|
||||||
|
organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)));
|
||||||
|
organizations.put(organization);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return organizations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray addressQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] addrWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, addrWhereParams, null);
|
||||||
|
JSONArray addresses = new JSONArray();
|
||||||
|
JSONObject address = new JSONObject();
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
try {
|
||||||
|
address.put("formatted", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)));
|
||||||
|
address.put("streetAddress", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)));
|
||||||
|
address.put("locality", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)));
|
||||||
|
address.put("region", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)));
|
||||||
|
address.put("postalCode", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)));
|
||||||
|
address.put("country", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)));
|
||||||
|
addresses.put(address);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return addresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONObject nameQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] addrWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor name = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, addrWhereParams, null);
|
||||||
|
JSONObject contactName = new JSONObject();
|
||||||
|
if (name.moveToFirst()) {
|
||||||
|
try {
|
||||||
|
String familyName = name.getString(name.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
|
||||||
|
String givenName = name.getString(name.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
|
||||||
|
String middleName = name.getString(name.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME));
|
||||||
|
String honorificPrefix = name.getString(name.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX));
|
||||||
|
String honorificSuffix = name.getString(name.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX));
|
||||||
|
|
||||||
|
// Create the formatted name
|
||||||
|
StringBuffer formatted = new StringBuffer("");
|
||||||
|
if (honorificPrefix != null) { formatted.append(honorificPrefix + " "); }
|
||||||
|
if (givenName != null) { formatted.append(givenName + " "); }
|
||||||
|
if (middleName != null) { formatted.append(middleName + " "); }
|
||||||
|
if (familyName != null) { formatted.append(familyName + " "); }
|
||||||
|
if (honorificSuffix != null) { formatted.append(honorificSuffix + " "); }
|
||||||
|
|
||||||
|
contactName.put("familyName", familyName);
|
||||||
|
contactName.put("givenName", givenName);
|
||||||
|
contactName.put("middleName", middleName);
|
||||||
|
contactName.put("honorificPrefix", honorificPrefix);
|
||||||
|
contactName.put("honorificSuffix", honorificSuffix);
|
||||||
|
contactName.put("formatted", formatted);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
name.close();
|
||||||
|
return contactName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray phoneQuery(ContentResolver cr, String contactId) {
|
||||||
|
Cursor phones = cr.query(
|
||||||
|
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
|
||||||
|
null,
|
||||||
|
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
|
||||||
|
null, null);
|
||||||
|
JSONArray phoneNumbers = new JSONArray();
|
||||||
|
JSONObject phoneNumber = new JSONObject();
|
||||||
|
while (phones.moveToNext()) {
|
||||||
|
try {
|
||||||
|
phoneNumber.put("primary", false); // Android does not store primary attribute
|
||||||
|
phoneNumber.put("value", phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
|
||||||
|
phoneNumber.put("type", phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)));
|
||||||
|
phoneNumbers.put(phoneNumber);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
phones.close();
|
||||||
|
return phoneNumbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray emailQuery(ContentResolver cr, String contactId) {
|
||||||
|
Cursor emails = cr.query(
|
||||||
|
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
|
||||||
|
null,
|
||||||
|
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
|
||||||
|
null, null);
|
||||||
|
JSONArray emailAddresses = new JSONArray();
|
||||||
|
JSONObject email = new JSONObject();
|
||||||
|
while (emails.moveToNext()) {
|
||||||
|
try {
|
||||||
|
email.put("primary", false); // Android does not store primary attribute
|
||||||
|
email.put("value", emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));
|
||||||
|
email.put("type", emails.getInt(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)));
|
||||||
|
emailAddresses.put(email);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emails.close();
|
||||||
|
return emailAddresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray imQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] addrWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, addrWhereParams, null);
|
||||||
|
JSONArray ims = new JSONArray();
|
||||||
|
JSONObject im = new JSONObject();
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
try {
|
||||||
|
im.put("primary", false); // Android does not store primary attribute
|
||||||
|
im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)));
|
||||||
|
im.put("type", cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)));
|
||||||
|
ims.put(im);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return ims;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String noteQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] noteWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, noteWhereParams, null);
|
||||||
|
String note = new String("");
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
note = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return note;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String nicknameQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] nicknameWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, nicknameWhereParams, null);
|
||||||
|
String nickname = new String("");
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
nickname = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return nickname;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray websiteQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] websiteWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, websiteWhereParams, null);
|
||||||
|
JSONArray websites = new JSONArray();
|
||||||
|
JSONObject website = new JSONObject();
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
try {
|
||||||
|
website.put("primary", false); // Android does not store primary attribute
|
||||||
|
website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL)));
|
||||||
|
website.put("type", cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)));
|
||||||
|
websites.put(website);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return websites;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONArray relationshipQuery(ContentResolver cr, String contactId) {
|
||||||
|
String[] relationshipWhereParams = new String[]{contactId,
|
||||||
|
ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, relationshipWhereParams, null);
|
||||||
|
JSONArray relationships = new JSONArray();
|
||||||
|
JSONObject relationship = new JSONObject();
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
try {
|
||||||
|
relationship.put("primary", false); // Android does not store primary attribute
|
||||||
|
relationship.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Relation.NAME)));
|
||||||
|
relationship.put("type", cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Relation.TYPE)));
|
||||||
|
relationships.put(relationship);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return relationships;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String birthdayQuery(ContentResolver cr, String contactId) {
|
||||||
|
String birthday = conditionalStringQuery(cr, contactId, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE,
|
||||||
|
ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY, ContactsContract.CommonDataKinds.Event.TYPE,
|
||||||
|
ContactsContract.CommonDataKinds.Event.START_DATE);
|
||||||
|
return birthday;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String anniversaryQuery(ContentResolver cr, String contactId) {
|
||||||
|
String anniversary = conditionalStringQuery(cr, contactId, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE,
|
||||||
|
ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY, ContactsContract.CommonDataKinds.Event.TYPE,
|
||||||
|
ContactsContract.CommonDataKinds.Event.START_DATE);
|
||||||
|
return anniversary;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String conditionalStringQuery(ContentResolver cr, String contactId, String dataType, int type, String label, String data) {
|
||||||
|
String[] whereParams = new String[]{contactId, dataType};
|
||||||
|
Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
|
||||||
|
null, WHERE_STRING, whereParams, null);
|
||||||
|
String retVal = new String("");
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
if (type == cursor.getInt(cursor.getColumnIndex(label))) {
|
||||||
|
retVal = cursor.getString(cursor.getColumnIndex(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
@ -6,32 +6,17 @@ import org.json.JSONException;
|
|||||||
import com.phonegap.api.Plugin;
|
import com.phonegap.api.Plugin;
|
||||||
import com.phonegap.api.PluginResult;
|
import com.phonegap.api.PluginResult;
|
||||||
|
|
||||||
import android.provider.Contacts.ContactMethods;
|
|
||||||
import android.provider.Contacts.People;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.database.sqlite.SQLiteException;
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public class ContactManager implements Plugin {
|
public class ContactManager implements Plugin {
|
||||||
|
|
||||||
public class ContactTriplet
|
private static ContactAccessor contactAccessor;
|
||||||
{
|
|
||||||
public String name = "";
|
|
||||||
public String email = "";
|
|
||||||
public String phone = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
WebView webView; // WebView object
|
WebView webView; // WebView object
|
||||||
DroidGap ctx; // DroidGap object
|
DroidGap ctx; // DroidGap object
|
||||||
|
|
||||||
private static final String LOG_TAG = "Contact Query";
|
private static final String LOG_TAG = "Contact Query";
|
||||||
Uri mPeople = android.provider.Contacts.People.CONTENT_URI;
|
|
||||||
Uri mPhone = android.provider.Contacts.Phones.CONTENT_URI;
|
|
||||||
Uri mEmail = android.provider.Contacts.ContactMethods.CONTENT_URI;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
@ -67,18 +52,28 @@ public class ContactManager implements Plugin {
|
|||||||
* @return A CommandResult object with a status and message.
|
* @return A CommandResult object with a status and message.
|
||||||
*/
|
*/
|
||||||
public PluginResult execute(String action, JSONArray args) {
|
public PluginResult execute(String action, JSONArray args) {
|
||||||
|
if (contactAccessor == null) {
|
||||||
|
contactAccessor = ContactAccessor.getInstance(webView, ctx);
|
||||||
|
}
|
||||||
PluginResult.Status status = PluginResult.Status.OK;
|
PluginResult.Status status = PluginResult.Status.OK;
|
||||||
String result = "";
|
String result = "";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (action.equals("getContactsAndSendBack")) {
|
if (action.equals("search")) {
|
||||||
this.getContactsAndSendBack();
|
contactAccessor.search(args.getJSONArray(0), args.getJSONObject(1));
|
||||||
}
|
}
|
||||||
else if (action.equals("search")) {
|
else if (action.equals("create")) {
|
||||||
this.search(args.getString(0), args.getString(1), args.getString(2));
|
// TODO Coming soon!
|
||||||
|
}
|
||||||
|
else if (action.equals("save")) {
|
||||||
|
// TODO Coming soon!
|
||||||
|
}
|
||||||
|
else if (action.equals("remove")) {
|
||||||
|
// TODO Coming soon!
|
||||||
}
|
}
|
||||||
return new PluginResult(status, result);
|
return new PluginResult(status, result);
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
|
Log.e(LOG_TAG, e.getMessage(), e);
|
||||||
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -123,269 +118,4 @@ public class ContactManager implements Plugin {
|
|||||||
*/
|
*/
|
||||||
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
// LOCAL METHODS
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// This is to add backwards compatibility to the OLD Contacts API\
|
|
||||||
public void getContactsAndSendBack()
|
|
||||||
{
|
|
||||||
String[] projection = new String[] {
|
|
||||||
People._ID,
|
|
||||||
People.NAME,
|
|
||||||
People.NUMBER,
|
|
||||||
People.PRIMARY_EMAIL_ID
|
|
||||||
};
|
|
||||||
|
|
||||||
try{
|
|
||||||
Cursor myCursor = this.ctx.managedQuery(mPeople, projection,
|
|
||||||
null, null , People.NAME + " ASC");
|
|
||||||
processResults(myCursor, true);
|
|
||||||
}
|
|
||||||
catch (SQLiteException ex)
|
|
||||||
{
|
|
||||||
Log.d(LOG_TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void search(String name, String npa, String email)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (email.length() > 0)
|
|
||||||
searchByEmail(email);
|
|
||||||
else
|
|
||||||
searchPeople(name, npa);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void searchByEmail(String email)
|
|
||||||
{
|
|
||||||
String[] projection = new String[] {
|
|
||||||
ContactMethods._ID,
|
|
||||||
ContactMethods.DATA,
|
|
||||||
ContactMethods.KIND,
|
|
||||||
ContactMethods.PERSON_ID
|
|
||||||
};
|
|
||||||
String[] variables = new String[] {
|
|
||||||
email
|
|
||||||
};
|
|
||||||
|
|
||||||
try{
|
|
||||||
Cursor myCursor = this.ctx.managedQuery(mEmail, projection,
|
|
||||||
"contact_methods." + ContactMethods.DATA + " = ?" + "AND contact_methods.kind = 1", variables , ContactMethods.DATA + " ASC");
|
|
||||||
getMethodData(myCursor);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (SQLiteException ex)
|
|
||||||
{
|
|
||||||
Log.d(LOG_TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void searchPeople(String name, String number)
|
|
||||||
{
|
|
||||||
String conditions = "";
|
|
||||||
|
|
||||||
if (name.length() == 0)
|
|
||||||
{
|
|
||||||
name = "%";
|
|
||||||
conditions += People.NAME + " LIKE ? AND ";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
conditions += People.NAME + " = ? AND ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (number.length() == 0)
|
|
||||||
number = "%";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
number = number.replace('+', '%');
|
|
||||||
number = number.replace('.', '%');
|
|
||||||
number = number.replace('-', '%');
|
|
||||||
}
|
|
||||||
|
|
||||||
conditions += People.NUMBER + " LIKE ? ";
|
|
||||||
|
|
||||||
String[] projection = new String[] {
|
|
||||||
People._ID,
|
|
||||||
People.NAME,
|
|
||||||
People.NUMBER,
|
|
||||||
People.PRIMARY_EMAIL_ID
|
|
||||||
};
|
|
||||||
|
|
||||||
String[] variables = new String[] {
|
|
||||||
name, number
|
|
||||||
};
|
|
||||||
|
|
||||||
try{
|
|
||||||
Cursor myCursor = this.ctx.managedQuery(mPeople, projection,
|
|
||||||
conditions, variables , People.NAME + " ASC");
|
|
||||||
processResults(myCursor, false);
|
|
||||||
}
|
|
||||||
catch (SQLiteException ex)
|
|
||||||
{
|
|
||||||
Log.d(LOG_TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processResults(Cursor cur, boolean all){
|
|
||||||
|
|
||||||
if (cur.moveToFirst()) {
|
|
||||||
|
|
||||||
String name;
|
|
||||||
String phoneNumber;
|
|
||||||
String email_id;
|
|
||||||
String email;
|
|
||||||
|
|
||||||
int nameColumn = cur.getColumnIndex(People.NAME);
|
|
||||||
int phoneColumn = cur.getColumnIndex(People.NUMBER);
|
|
||||||
int emailIdColumn = cur.getColumnIndex(People.PRIMARY_EMAIL_ID);
|
|
||||||
|
|
||||||
do {
|
|
||||||
// Get the field values
|
|
||||||
name = cur.getString(nameColumn);
|
|
||||||
phoneNumber = cur.getString(phoneColumn);
|
|
||||||
email_id = cur.getString(emailIdColumn);
|
|
||||||
if (email_id != null && email_id.length() > 0)
|
|
||||||
email = getEmail(email_id);
|
|
||||||
else
|
|
||||||
email = "";
|
|
||||||
|
|
||||||
// Code for backwards compatibility with the OLD Contacts API
|
|
||||||
if (all) {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidFoundContact('" + name + "','" + phoneNumber + "','" + email +"');");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidFoundContact('" + name + "','" + phoneNumber + "','" + email +"');");
|
|
||||||
}
|
|
||||||
} while (cur.moveToNext());
|
|
||||||
if (all) {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidDone();");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidDone();");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (all) {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.fail('Error');");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.fail('None found!');");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getMethodData(Cursor cur)
|
|
||||||
{
|
|
||||||
ContactTriplet data = new ContactTriplet();
|
|
||||||
String id;
|
|
||||||
String email;
|
|
||||||
|
|
||||||
if (cur.moveToFirst()) {
|
|
||||||
|
|
||||||
int idColumn = cur.getColumnIndex(ContactMethods._ID);
|
|
||||||
int emailColumn = cur.getColumnIndex(ContactMethods.DATA);
|
|
||||||
do {
|
|
||||||
// Get the field values
|
|
||||||
id = cur.getString(idColumn);
|
|
||||||
email = cur.getString(emailColumn);
|
|
||||||
|
|
||||||
data = getContactData(id);
|
|
||||||
if(data != null)
|
|
||||||
{
|
|
||||||
data.email = email;
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidFoundContact('" + data.name + "','" + data.phone + "','" + data.email +"');");
|
|
||||||
}
|
|
||||||
} while (cur.moveToNext());
|
|
||||||
this.ctx.sendJavascript("navigator.contacts.droidDoneContacts();");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ContactTriplet getContactData(String id) {
|
|
||||||
ContactTriplet data = null;
|
|
||||||
String[] projection = new String[] {
|
|
||||||
People._ID,
|
|
||||||
People.NAME,
|
|
||||||
People.NUMBER,
|
|
||||||
People.PRIMARY_EMAIL_ID
|
|
||||||
};
|
|
||||||
|
|
||||||
String[] variables = new String[] {
|
|
||||||
id
|
|
||||||
};
|
|
||||||
|
|
||||||
try{
|
|
||||||
Cursor myCursor = this.ctx.managedQuery(mPeople, projection,
|
|
||||||
People.PRIMARY_EMAIL_ID + " = ?", variables , People.NAME + " ASC");
|
|
||||||
data = getTriplet(myCursor);
|
|
||||||
}
|
|
||||||
catch (SQLiteException ex)
|
|
||||||
{
|
|
||||||
Log.d(LOG_TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ContactTriplet getTriplet(Cursor cur) {
|
|
||||||
ContactTriplet data = new ContactTriplet();
|
|
||||||
if (cur.moveToFirst()) {
|
|
||||||
|
|
||||||
int nameColumn = cur.getColumnIndex(People.NAME);
|
|
||||||
int numberColumn = cur.getColumnIndex(People.NUMBER);
|
|
||||||
do {
|
|
||||||
|
|
||||||
data.name = cur.getString(nameColumn);
|
|
||||||
data.phone = cur.getString(numberColumn);
|
|
||||||
|
|
||||||
} while (cur.moveToNext());
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEmailColumnData(Cursor cur)
|
|
||||||
{
|
|
||||||
String email = "";
|
|
||||||
if (cur != null && cur.moveToFirst()) {
|
|
||||||
int emailColumn = cur.getColumnIndex(ContactMethods.DATA);
|
|
||||||
do {
|
|
||||||
// Get the field values
|
|
||||||
email = cur.getString(emailColumn);
|
|
||||||
} while (cur.moveToNext());
|
|
||||||
}
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEmail(String id)
|
|
||||||
{
|
|
||||||
String email = "";
|
|
||||||
String[] projection = new String[] {
|
|
||||||
ContactMethods._ID,
|
|
||||||
ContactMethods.DATA,
|
|
||||||
ContactMethods.KIND
|
|
||||||
};
|
|
||||||
String[] variables = new String[] {
|
|
||||||
id
|
|
||||||
};
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Cursor myCursor = this.ctx.managedQuery(mEmail, projection,
|
|
||||||
"contact_methods." + ContactMethods._ID + " = ?" + " AND contact_methods.kind = 1", variables , ContactMethods.DATA + " ASC");
|
|
||||||
email = getEmailColumnData(myCursor);
|
|
||||||
}
|
|
||||||
catch (SQLiteException ex)
|
|
||||||
{
|
|
||||||
Log.d(LOG_TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
52
framework/src/com/phonegap/Device.java
Normal file → Executable file
52
framework/src/com/phonegap/Device.java
Normal file → Executable file
@ -23,23 +23,16 @@ package com.phonegap;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import com.phonegap.api.Plugin;
|
import com.phonegap.api.Plugin;
|
||||||
import com.phonegap.api.PluginResult;
|
import com.phonegap.api.PluginResult;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Vibrator;
|
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.media.Ringtone;
|
|
||||||
import android.media.RingtoneManager;
|
|
||||||
|
|
||||||
public class Device implements Plugin {
|
public class Device implements Plugin {
|
||||||
|
|
||||||
@ -101,12 +94,6 @@ public class Device implements Plugin {
|
|||||||
//r.put("phonegap", pg);
|
//r.put("phonegap", pg);
|
||||||
return new PluginResult(status, r);
|
return new PluginResult(status, r);
|
||||||
}
|
}
|
||||||
else if (action.equals("beep")) {
|
|
||||||
this.beep(args.getLong(0));
|
|
||||||
}
|
|
||||||
else if (action.equals("vibrate")) {
|
|
||||||
this.vibrate(args.getLong(0));
|
|
||||||
}
|
|
||||||
return new PluginResult(status, result);
|
return new PluginResult(status, result);
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
||||||
@ -160,46 +147,7 @@ public class Device implements Plugin {
|
|||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
// LOCAL METHODS
|
// LOCAL METHODS
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* Beep plays the default notification ringtone.
|
|
||||||
*
|
|
||||||
* @param count Number of times to play notification
|
|
||||||
*/
|
|
||||||
public void beep(long count) {
|
|
||||||
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
|
||||||
Ringtone notification = RingtoneManager.getRingtone(this.ctx, ringtone);
|
|
||||||
|
|
||||||
// If phone is not set to silent mode
|
|
||||||
if (notification != null) {
|
|
||||||
for (long i = 0; i < count; ++i) {
|
|
||||||
notification.play();
|
|
||||||
long timeout = 5000;
|
|
||||||
while (notification.isPlaying() && (timeout > 0)) {
|
|
||||||
timeout = timeout - 100;
|
|
||||||
try {
|
|
||||||
Thread.sleep(100);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Vibrates the device for the specified amount of time.
|
|
||||||
*
|
|
||||||
* @param time Time to vibrate in ms.
|
|
||||||
*/
|
|
||||||
public void vibrate(long time){
|
|
||||||
// Start the vibration, 0 defaults to half a second.
|
|
||||||
if (time == 0) {
|
|
||||||
time = 500;
|
|
||||||
}
|
|
||||||
Vibrator vibrator = (Vibrator) this.ctx.getSystemService(Context.VIBRATOR_SERVICE);
|
|
||||||
vibrator.vibrate(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the OS name.
|
* Get the OS name.
|
||||||
*
|
*
|
||||||
|
@ -296,6 +296,7 @@ public class DroidGap extends Activity {
|
|||||||
this.addService("File", "com.phonegap.FileUtils");
|
this.addService("File", "com.phonegap.FileUtils");
|
||||||
this.addService("Location", "com.phonegap.GeoBroker");
|
this.addService("Location", "com.phonegap.GeoBroker");
|
||||||
this.addService("Network Status", "com.phonegap.NetworkManager");
|
this.addService("Network Status", "com.phonegap.NetworkManager");
|
||||||
|
this.addService("Notification", "com.phonegap.Notification");
|
||||||
this.addService("Storage", "com.phonegap.Storage");
|
this.addService("Storage", "com.phonegap.Storage");
|
||||||
this.addService("Temperature", "com.phonegap.TempListener");
|
this.addService("Temperature", "com.phonegap.TempListener");
|
||||||
}
|
}
|
||||||
|
157
framework/src/com/phonegap/Notification.java
Executable file
157
framework/src/com/phonegap/Notification.java
Executable file
@ -0,0 +1,157 @@
|
|||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import com.phonegap.api.Plugin;
|
||||||
|
import com.phonegap.api.PluginResult;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.media.Ringtone;
|
||||||
|
import android.media.RingtoneManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Vibrator;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides access to notifications on the device.
|
||||||
|
*/
|
||||||
|
public class Notification implements Plugin {
|
||||||
|
|
||||||
|
WebView webView; // WebView object
|
||||||
|
DroidGap ctx; // DroidGap object
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
public Notification() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the context of the Command. This can then be used to do things like
|
||||||
|
* get file paths associated with the Activity.
|
||||||
|
*
|
||||||
|
* @param ctx The context of the main Activity.
|
||||||
|
*/
|
||||||
|
public void setContext(DroidGap ctx) {
|
||||||
|
this.ctx = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the main View of the application, this is the WebView within which
|
||||||
|
* a PhoneGap app runs.
|
||||||
|
*
|
||||||
|
* @param webView The PhoneGap WebView
|
||||||
|
*/
|
||||||
|
public void setView(WebView webView) {
|
||||||
|
this.webView = webView;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the request and returns CommandResult.
|
||||||
|
*
|
||||||
|
* @param action The command to execute.
|
||||||
|
* @param args JSONArry of arguments for the command.
|
||||||
|
* @return A CommandResult object with a status and message.
|
||||||
|
*/
|
||||||
|
public PluginResult execute(String action, JSONArray args) {
|
||||||
|
PluginResult.Status status = PluginResult.Status.OK;
|
||||||
|
String result = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (action.equals("beep")) {
|
||||||
|
this.beep(args.getLong(0));
|
||||||
|
}
|
||||||
|
else if (action.equals("vibrate")) {
|
||||||
|
this.vibrate(args.getLong(0));
|
||||||
|
}
|
||||||
|
return new PluginResult(status, result);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifies if action to be executed returns a value and should be run synchronously.
|
||||||
|
*
|
||||||
|
* @param action The action to execute
|
||||||
|
* @return T=returns value
|
||||||
|
*/
|
||||||
|
public boolean isSynch(String action) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the system is about to start resuming a previous activity.
|
||||||
|
*/
|
||||||
|
public void onPause() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the activity will start interacting with the user.
|
||||||
|
*/
|
||||||
|
public void onResume() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by AccelBroker when listener is to be shut down.
|
||||||
|
* Stop listener.
|
||||||
|
*/
|
||||||
|
public void onDestroy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when an activity you launched exits, giving you the requestCode you started it with,
|
||||||
|
* the resultCode it returned, and any additional data from it.
|
||||||
|
*
|
||||||
|
* @param requestCode The request code originally supplied to startActivityForResult(),
|
||||||
|
* allowing you to identify who this result came from.
|
||||||
|
* @param resultCode The integer result code returned by the child activity through its setResult().
|
||||||
|
* @param data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
|
||||||
|
*/
|
||||||
|
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// LOCAL METHODS
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Beep plays the default notification ringtone.
|
||||||
|
*
|
||||||
|
* @param count Number of times to play notification
|
||||||
|
*/
|
||||||
|
public void beep(long count) {
|
||||||
|
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||||
|
Ringtone notification = RingtoneManager.getRingtone(this.ctx, ringtone);
|
||||||
|
|
||||||
|
// If phone is not set to silent mode
|
||||||
|
if (notification != null) {
|
||||||
|
for (long i = 0; i < count; ++i) {
|
||||||
|
notification.play();
|
||||||
|
long timeout = 5000;
|
||||||
|
while (notification.isPlaying() && (timeout > 0)) {
|
||||||
|
timeout = timeout - 100;
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vibrates the device for the specified amount of time.
|
||||||
|
*
|
||||||
|
* @param time Time to vibrate in ms.
|
||||||
|
*/
|
||||||
|
public void vibrate(long time){
|
||||||
|
// Start the vibration, 0 defaults to half a second.
|
||||||
|
if (time == 0) {
|
||||||
|
time = 500;
|
||||||
|
}
|
||||||
|
Vibrator vibrator = (Vibrator) this.ctx.getSystemService(Context.VIBRATOR_SERVICE);
|
||||||
|
vibrator.vibrate(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user