add new own sync adapter/service for contacts (work in progress)
authorSven Aßmann <sven.assmann@lubico.biz>
Thu, 15 Sep 2011 19:42:38 +0000 (21:42 +0200)
committerSven Aßmann <sven.assmann@lubico.biz>
Thu, 15 Sep 2011 19:42:38 +0000 (21:42 +0200)
src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java [new file with mode: 0644]
src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java [new file with mode: 0644]

diff --git a/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java
new file mode 100644 (file)
index 0000000..217d3a3
--- /dev/null
@@ -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 (file)
index 0000000..2dd7661
--- /dev/null
@@ -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();
+    }
+
+}