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