diff --git a/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java new file mode 100644 index 0000000000..217d3a37cb --- /dev/null +++ b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java @@ -0,0 +1,97 @@ +package eu.alefzero.owncloud.syncadapter; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +import android.accounts.Account; +import android.content.ContentProviderClient; +import android.content.Context; +import android.content.SyncResult; +import android.content.res.AssetFileDescriptor; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.util.Log; + +public class ContactSyncAdapter extends AbstractOwnCloudSyncAdapter { + + private static final String TAG = "ContactSyncAdapter"; + + public ContactSyncAdapter(Context context, boolean autoInitialize) { + super(context, autoInitialize); + } + + @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)); + Log.d(TAG, "Found Contact id: " + id + " with lookupkey: "+lookup); + + try { + FileInputStream fis = getContactVcard(lookup); + // 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? + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + } + + /** + * 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"); + 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); + } + +} diff --git a/src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java b/src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java new file mode 100644 index 0000000000..2dd7661cf8 --- /dev/null +++ b/src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java @@ -0,0 +1,31 @@ +package eu.alefzero.owncloud.syncadapter; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +public class ContactSyncService extends Service { + private static final Object syncAdapterLock = new Object(); + private static AbstractOwnCloudSyncAdapter concretSyncAdapter = null; + + /* + * {@inheritDoc} + */ + @Override + public void onCreate() { + synchronized (syncAdapterLock) { + if (concretSyncAdapter == null) { + concretSyncAdapter = new ContactSyncAdapter(getApplicationContext(), true); + } + } + } + + /* + * {@inheritDoc} + */ + @Override + public IBinder onBind(Intent intent) { + return concretSyncAdapter.getSyncAdapterBinder(); + } + +}