You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Shingo Toda (JIRA)" <ji...@apache.org> on 2013/11/07 09:08:19 UTC

[jira] [Created] (CB-5308) Contact.save() call failure callback even if contact data is successfully saved on device

Shingo Toda created CB-5308:
-------------------------------

             Summary: 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.1#6144)