Dirty flag not getting set to "1" on contact update
Asked Answered
P

0

1

I am working on a project in which I want to detect the changes in the Contacts. So I have created Account with Account manager and trying to find the changes in the contact list using DIRTY flag. But the DIRTY flag not getting set for my app account_type when contact updated. however DIRTY flag of another account_type(com.google) is getting set. Help me

This is how I am inserting contacts with my account and account_type.

    public static void addContact(Context context,MyContact contact){

    ContentResolver resolver = context.getContentResolver();
    boolean mHasAccount = isAlreadyRegistered(resolver, contact.Id);

    if(mHasAccount){
        Log.d("Contact already","there");
    } else {
        Log.d("new Contact","Adding");

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

        // insert account name and account type
        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, constants.ACCOUNT_NAME)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, constants.ACCOUNT_TYPE)
                .withValue(ContactsContract.RawContacts.AGGREGATION_MODE,
                        ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT)
                .build());

        // insert contact number
        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.number)
                .build());

        // insert contact name
        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.name)
                .build());
        // insert mime-type data
        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, MIMETYPE)
                .withValue(ContactsContract.Data.DATA1, 12345)
                .withValue(ContactsContract.Data.DATA2, "user")
                .withValue(ContactsContract.Data.DATA3, "MyData")
                .build());

        try {
            resolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Code to check the changes in contact list

private void updateServer(){

    Log.d("Server", "updating");
    Cursor cursor = mContentResolver.query(ContactsContract.RawContacts.CONTENT_URI,
            new String[]{ContactsContract.RawContacts.DIRTY, ContactsContract.RawContacts.CONTACT_ID,ContactsContract.RawContacts.ACCOUNT_TYPE},
            ContactsContract.RawContacts.DIRTY+"=? ",
            new String[]{String.valueOf(1)},
            null);

    if (cursor != null && cursor.getCount() >0)
    {

        cursor.moveToFirst();
        while(!cursor.isAfterLast()){

            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
            String dirty = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.DIRTY));
            String type = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));

            if(id!=null && dirty!=null&& type!=null){
                Log.d("Upadte Dirty",dirty);
                Log.d("Update ACCountid",id);
                Log.d("Update type", type);
                Cursor cur = mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
                        new String[]{String.valueOf(id)},
                        null);
                if(cur!=null && cur.getCount()>0) {
                    cur.moveToFirst();
                    while(!cur.isAfterLast()){
                        String name = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        String number = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        Log.d("Update Name", name);
                        Log.d("Update Number", number);

                     /*   ContactsManager.updateContact(getContext(), id, name, number);
                        CV.clear();
                        CV.put(DBconstants.TableConstants.PHONE_NUMBER, number);
                        CV.put(DBconstants.TableConstants.C_CONTACT_NAME, name);
                        DB.updateInformation(DB, DBconstants.TableConstants.TABLE_CONTACTS, CV, DBconstants.TableConstants.C_ID, id);
                        CV.clear();
                    */    cur.moveToNext();

                    }
                    cur.close();
                }else{
                    Log.d("Serverupdate", "nullinvalues");

                }


            }else{
                Log.d("Serverupdate", "nullvalues");

            }

            cursor.moveToNext();
        }
        cursor.close();

    }else {
        Log.d("Serverupdate", "nullcursor");

    }

}
Peerage answered 24/6, 2016 at 11:42 Comment(6)
Which app do you use to update the contacts in your account?Howey
default mobile contacts app.Peerage
Are your contacts aggregated with contacts from other accounts? If you edit just one part of an aggregated contact, the other parts won't get the DIRTY flag set.Howey
When i open contacts app. On clicking on one contact i could see the accounts related to that contact like google whatsapp etc . It means aggregated right?Peerage
That's correct. Android aggregates RawContacts that appear to be the same into one Contact. Each part will have its own dedicated section in the editor though.Howey
Dont know what went wrong. Struggling a lot to find out. Did i miss anything in the code?Peerage

© 2022 - 2024 — McMap. All rights reserved.