You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Pavankumar Joshi (JIRA)" <ji...@apache.org> on 2014/11/07 08:00:46 UTC
[jira] [Commented] (CB-5308) Contact.save() call failure callback
even if contact data is successfully saved on device
[ https://issues.apache.org/jira/browse/CB-5308?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14201703#comment-14201703 ]
Pavankumar Joshi commented on CB-5308:
--------------------------------------
I am constantly getting contact.save()(already existing contact) method test failure.
If I apply the patch as mentioned in JIRA https://issues.apache.org/jira/browse/CB-5308 pickContacts API fails.
But without the patch conact.save()(already existing contact) method always fails.
I observed that the query to retrieve the contact which already exists RAWCONTACTS_ID is used This is implemented in onActivityResult() in ContactManager.java
Hence i made the change even to pickContact API.
Earlier Code
public void onActivityResult(int requestCode, int resultCode, final Intent intent) {
if (requestCode == CONTACT_PICKER_RESULT) {
if (resultCode == Activity.RESULT_OK) {
String contactId = intent.getData().getLastPathSegment();
// to populate contact data we require Raw Contact ID
// so we do look up for contact raw id first
Cursor c = this.cordova.getActivity().getContentResolver().query(RawContacts.CONTENT_URI,
new String[] {RawContacts._ID}, RawContacts.CONTACT_ID + " = " + contactId, null, null);
if (!c.moveToFirst()) {
this.callbackContext.error("Error occured while retrieving contact raw id");
return;
}
String id = c.getString(c.getColumnIndex(RawContacts._ID));
c.close();
try {
JSONObject contact = contactAccessor.getContactById(id);
this.callbackContext.success(contact);
return;
} catch (JSONException e) {
Log.e(LOG_TAG, "JSON fail.", e);
}
} else if (resultCode == Activity.RESULT_CANCELED){
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.NO_RESULT, UNKNOWN_ERROR));
return;
}
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR));
}
}
Modified Code : Changed the call " JSONObject contact = contactAccessor.getContactByRawId(id);"
public void onActivityResult(int requestCode, int resultCode, final Intent intent) {
if (requestCode == CONTACT_PICKER_RESULT) {
if (resultCode == Activity.RESULT_OK) {
String contactId = intent.getData().getLastPathSegment();
// to populate contact data we require Raw Contact ID
// so we do look up for contact raw id first
Cursor c = this.cordova.getActivity().getContentResolver().query(RawContacts.CONTENT_URI,
new String[] {RawContacts._ID}, RawContacts.CONTACT_ID + " = " + contactId, null, null);
if (!c.moveToFirst()) {
this.callbackContext.error("Error occured while retrieving contact raw id");
return;
}
String id = c.getString(c.getColumnIndex(RawContacts._ID));
c.close();
try {
//JSONObject contact = contactAccessor.getContactById(id);
JSONObject contact = contactAccessor.getContactByRawId(id);
this.callbackContext.success(contact);
return;
} catch (JSONException e) {
Log.e(LOG_TAG, "JSON fail.", e);
}
} else if (resultCode == Activity.RESULT_CANCELED){
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.NO_RESULT, UNKNOWN_ERROR));
return;
}
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR));
}
}
Please let me know if this is correct or are we missing something
> Contact.save() call failure callback even if contact data is successfully saved on device
> -----------------------------------------------------------------------------------------
>
> Key: CB-5308
> URL: https://issues.apache.org/jira/browse/CB-5308
> Project: Apache Cordova
> Issue Type: Bug
> Components: Android, mobile-spec, Plugin Contacts
> Affects Versions: 3.1.0
> Environment: Android 4.1.2 physical device
> Reporter: Shingo Toda
> Priority: Minor
>
> When I run contact mobile-spec, following specs sometimes fail.
> - contacts.spec.6
> - contacts.spec.20
> - contacts.spec.21
> - contacts.spec.24
> In Java side, it looks that {{ContactAccessorSdk5.save()}} returns contact id but {{ContactAccessorSdk5.getContactById()}} returns {{null}} instead of contact data associated with the id. Actually some of contact data such as "Test Delete" are found on my device so the save operation is actually done.
> This save() returns "newId" in the following code.
> {code:title=ContactAccessorSdk5.java|borderStyle=solid}
> //Add contact
> try {
> ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
> if (cpResults.length >= 0) {
> newId = cpResults[0].uri.getLastPathSegment();
> }
> } catch (RemoteException e) {
> Log.e(LOG_TAG, e.getMessage(), e);
> } catch (OperationApplicationException e) {
> Log.e(LOG_TAG, e.getMessage(), e);
> }
> return newId;
> {code}
> When I debug it, {{cpResults\[0\].uri}} is {{content://com.android.contacts/raw_contacts/xxxx}} so, this is just my assumption, I think {{save()}} returns raw contact id.
> But at {{getContactById()}}, query filter uses {{CONTACT_ID}} column as a projection.
> {code:title=ContactAccessorSdk5.java|borderStyle=solid}
> Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
> null,
> ContactsContract.Data.CONTACT_ID + " = ? ",
> new String[] { id },
> ContactsContract.Data.CONTACT_ID + " ASC");
> {code}
> So if contact id and raw contact id is different then fetching contact data might fail. Actually in my case, if I fail the specs, they are always different.
> I try modifying {{getContactById()}} to process following code if contact JSONObject doesn't have id property, then I didn't get failure for those specs even if I run them some times.
> {code:title=ContactAccessorSdk5.java|borderStyle=solid}
> Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
> null,
> ContactsContract.Data.RAW_CONTACT_ID + " = ? ",
> new String[] { rawid },
> ContactsContract.Data.RAW_CONTACT_ID + " ASC");
> {code}
> I am just learning how contact data is managed on Android so I might be wrong for some use cases, but it works fine for mobile-spec.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org