X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/8f9a9a8694e75e33d5daba003dba28048553ec07..fd1704c49cfabc9607bc67d35b6f36afca0591ff:/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java diff --git a/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java index 61564d5c..b0ab9569 100644 --- a/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java +++ b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java @@ -1,18 +1,18 @@ 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; @@ -26,108 +26,81 @@ import android.provider.ContactsContract; 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"); } - - }