package eu.alefzero.owncloud.syncadapter;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
-import android.accounts.AccountManager;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ByteArrayEntity;
+import eu.alefzero.owncloud.AccountUtils;
import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
-import eu.alefzero.webdav.HttpPropFind;
-
+import eu.alefzero.owncloud.db.ProviderMeta;
+import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;
import android.accounts.Account;
+import android.accounts.AccountManager;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.ContentProviderClient;
import android.util.Log;
public class ContactSyncAdapter extends AbstractOwnCloudSyncAdapter {
-
- private static final String TAG = "ContactSyncAdapter";
+ private String mAddrBookUri;
public ContactSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
+ mAddrBookUri = null;
}
@Override
- public synchronized void onPerformSync(
- Account account,
- Bundle extras,
- String authority,
- ContentProviderClient provider,
- SyncResult syncResult) {
-
- this.setAccount(account);
- this.setContentProvider(provider);
-
- // TODO find all contacts on ownCloud that not synced or the sync date is behind than the last sync date
- Cursor cursor = getContacts();
- if (cursor != null && cursor.getCount() > 0) {
- while (cursor.moveToNext()) {
- String id = cursor.getString(
- cursor.getColumnIndex(ContactsContract.Contacts._ID));
- String lookup = cursor.getString(
- cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
-
+ public void onPerformSync(Account account, Bundle extras, String authority,
+ ContentProviderClient provider, SyncResult syncResult) {
+ setAccount(account);
+ setContentProvider(provider);
+ Cursor c = getLocalContacts(false);
+ if (c.moveToFirst()) {
+ do {
+ String lookup = c.getString(c
+ .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
+ String a = getAddressBookUri();
+ String uri = a + lookup + ".vcf";
+ FileInputStream f;
try {
- FileInputStream fis = getContactVcard(lookup);
-
- HttpPut query = new HttpPut(
- getUri() +
- "/addressbooks/"+
- getAccount().name.split("@")[0]+
- "/default/"+
- lookup+
- ".vcf"
- );
- byte[] b = new byte[fis.available()];
- fis.read(b);
+ f = getContactVcard(lookup);
+ HttpPut query = new HttpPut(uri);
+ byte[] b = new byte[f.available()];
+ f.read(b);
query.setEntity(new ByteArrayEntity(b));
HttpResponse response = fireRawRequest(query);
- if(201 != response.getStatusLine().getStatusCode()) {
- syncResult.stats.numIoExceptions++;
- }
- // TODO make a webdav request based on the stream
- // TODO send request to the ownCloud server
- // TODO mark the current contact as synced - where to store?
- fis.close();
} catch (IOException e) {
- syncResult.stats.numIoExceptions++;
- } catch (OperationCanceledException e) {
- //TODO maybe to a better break here
+ e.printStackTrace();
return;
+ } catch (OperationCanceledException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
} catch (AuthenticatorException e) {
- syncResult.stats.numAuthExceptions++;
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
- }
+ } while (c.moveToNext());
+ // } while (c.moveToNext());
}
+
}
- protected Uri getUri() {
- Uri uri = Uri.parse(this.getAccountManager().getUserData(getAccount(), AccountAuthenticator.KEY_CONTACT_URL));
+ private String getAddressBookUri() {
+ if (mAddrBookUri != null)
+ return mAddrBookUri;
+
+ AccountManager am = getAccountManager();
+ String uri = am.getUserData(getAccount(),
+ AccountAuthenticator.KEY_OC_URL).replace(
+ AccountUtils.WEBDAV_PATH_2_0, AccountUtils.CARDDAV_PATH_2_0);
+ uri += "/addressbooks/"
+ + getAccount().name.substring(0,
+ getAccount().name.lastIndexOf('@')) + "/default/";
+ mAddrBookUri = uri;
return uri;
}
- /**
- * Returns the vCard based on the LookupKey for Contact as Stream
- *
- * @param lookupKey
- * @return
- * @throws IOException
- */
- private FileInputStream getContactVcard(String lookupKey) throws IOException {
- Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
- AssetFileDescriptor fd = getContext().getContentResolver().openAssetFileDescriptor(uri, "r");
+ private FileInputStream getContactVcard(String lookupKey)
+ throws IOException {
+ Uri uri = Uri.withAppendedPath(
+ ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
+ AssetFileDescriptor fd = getContext().getContentResolver()
+ .openAssetFileDescriptor(uri, "r");
return fd.createInputStream();
}
- /**
- * Obtains the contact list.
- *
- * @return A cursor for for accessing the contact list.
- */
- private Cursor getContacts()
- {
- // Run query
- Uri uri = ContactsContract.Contacts.CONTENT_URI;
- String[] projection = new String[] {
- ContactsContract.Contacts._ID,
- ContactsContract.Contacts.LOOKUP_KEY
- };
-
- boolean showInvisible = false;
- String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
- (showInvisible ? "0" : "1") + "'";
- String[] selectionArgs = null;
- String sortOrder = ContactsContract.Contacts._ID + " DESC";
-
- return getContext().getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
+ private Cursor getLocalContacts(boolean include_hidden_contacts) {
+ return getContext().getContentResolver().query(
+ ContactsContract.Contacts.CONTENT_URI,
+ new String[] { ContactsContract.Contacts._ID,
+ ContactsContract.Contacts.LOOKUP_KEY },
+ ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ?",
+ new String[] { (include_hidden_contacts ? "0" : "1") },
+ ContactsContract.Contacts._ID + " DESC");
}
-
-
}