ContactSyncAdapter.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.owncloud.android.syncadapter;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import org.apache.http.client.methods.HttpPut;
  5. import org.apache.http.entity.ByteArrayEntity;
  6. import com.owncloud.android.AccountUtils;
  7. import com.owncloud.android.authenticator.AccountAuthenticator;
  8. import android.accounts.Account;
  9. import android.accounts.AccountManager;
  10. import android.accounts.AuthenticatorException;
  11. import android.accounts.OperationCanceledException;
  12. import android.content.ContentProviderClient;
  13. import android.content.Context;
  14. import android.content.SyncResult;
  15. import android.content.res.AssetFileDescriptor;
  16. import android.database.Cursor;
  17. import android.net.Uri;
  18. import android.os.Bundle;
  19. import android.provider.ContactsContract;
  20. public class ContactSyncAdapter extends AbstractOwnCloudSyncAdapter {
  21. private String mAddrBookUri;
  22. public ContactSyncAdapter(Context context, boolean autoInitialize) {
  23. super(context, autoInitialize);
  24. mAddrBookUri = null;
  25. }
  26. @Override
  27. public void onPerformSync(Account account, Bundle extras, String authority,
  28. ContentProviderClient provider, SyncResult syncResult) {
  29. setAccount(account);
  30. setContentProvider(provider);
  31. Cursor c = getLocalContacts(false);
  32. if (c.moveToFirst()) {
  33. do {
  34. String lookup = c.getString(c
  35. .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
  36. String a = getAddressBookUri();
  37. String uri = a + lookup + ".vcf";
  38. FileInputStream f;
  39. try {
  40. f = getContactVcard(lookup);
  41. HttpPut query = new HttpPut(uri);
  42. byte[] b = new byte[f.available()];
  43. f.read(b);
  44. query.setEntity(new ByteArrayEntity(b));
  45. fireRawRequest(query);
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. return;
  49. } catch (OperationCanceledException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. } catch (AuthenticatorException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. } while (c.moveToNext());
  57. // } while (c.moveToNext());
  58. }
  59. }
  60. private String getAddressBookUri() {
  61. if (mAddrBookUri != null)
  62. return mAddrBookUri;
  63. AccountManager am = getAccountManager();
  64. String uri = am.getUserData(getAccount(),
  65. AccountAuthenticator.KEY_OC_URL).replace(
  66. AccountUtils.WEBDAV_PATH_2_0, AccountUtils.CARDDAV_PATH_2_0);
  67. uri += "/addressbooks/"
  68. + getAccount().name.substring(0,
  69. getAccount().name.lastIndexOf('@')) + "/default/";
  70. mAddrBookUri = uri;
  71. return uri;
  72. }
  73. private FileInputStream getContactVcard(String lookupKey)
  74. throws IOException {
  75. Uri uri = Uri.withAppendedPath(
  76. ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
  77. AssetFileDescriptor fd = getContext().getContentResolver()
  78. .openAssetFileDescriptor(uri, "r");
  79. return fd.createInputStream();
  80. }
  81. private Cursor getLocalContacts(boolean include_hidden_contacts) {
  82. return getContext().getContentResolver().query(
  83. ContactsContract.Contacts.CONTENT_URI,
  84. new String[] { ContactsContract.Contacts._ID,
  85. ContactsContract.Contacts.LOOKUP_KEY },
  86. ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ?",
  87. new String[] { (include_hidden_contacts ? "0" : "1") },
  88. ContactsContract.Contacts._ID + " DESC");
  89. }
  90. }