send contacts to oc instance
authorBartek Przybylski <bart.p.pl@gmail.com>
Sun, 8 Apr 2012 16:41:23 +0000 (18:41 +0200)
committerBartek Przybylski <bart.p.pl@gmail.com>
Sun, 8 Apr 2012 16:41:23 +0000 (18:41 +0200)
AndroidManifest.xml
res/xml/contacts.xml
src/eu/alefzero/owncloud/cp.java [deleted file]
src/eu/alefzero/owncloud/providers/FileContentProvider.java [new file with mode: 0644]
src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java [new file with mode: 0644]
src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java [new file with mode: 0644]
src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java
src/eu/alefzero/owncloud/ui/fragment/FileList.java

index 12cd591..4c1ac1c 100644 (file)
 <?xml version="1.0" encoding="utf-8"?>\r
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"\r
-      package="eu.alefzero.owncloud"\r
-      android:versionCode="1"\r
-      android:versionName="1.0">\r
-<uses-permission\r
-        android:name="android.permission.GET_ACCOUNTS" />\r
-    <uses-permission\r
-        android:name="android.permission.USE_CREDENTIALS" />\r
-    <uses-permission\r
-        android:name="android.permission.MANAGE_ACCOUNTS" />\r
-    <uses-permission\r
-        android:name="android.permission.AUTHENTICATE_ACCOUNTS" />\r
-    <uses-permission\r
-        android:name="android.permission.INTERNET" />\r
-    <uses-permission\r
-        android:name="android.permission.WRITE_SETTINGS" />\r
-    <uses-permission\r
-        android:name="android.permission.READ_SYNC_STATS" />\r
-    <uses-permission\r
-        android:name="android.permission.READ_SYNC_SETTINGS" />\r
-    <uses-permission\r
-        android:name="android.permission.WRITE_SYNC_SETTINGS" />\r
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="13" />\r
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>\r
-\r
-    <application android:icon="@drawable/icon" android:label="@string/app_name">\r
-        <activity android:name=".ui.activity.FileDisplayActivity" android:theme="@style/Theme.ownCloud" android:label="@string/app_name"></activity>\r
-        <activity android:name=".Uploader">\r
+<manifest package="eu.alefzero.owncloud"\r
+    android:versionCode="1"\r
+    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">\r
+\r
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />\r
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />\r
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />\r
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />\r
+    <uses-permission android:name="android.permission.INTERNET" />\r
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />\r
+    <uses-permission android:name="android.permission.READ_SYNC_STATS" />\r
+    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />\r
+    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />\r
+\r
+    <uses-sdk\r
+        android:minSdkVersion="7"\r
+        android:targetSdkVersion="13" />\r
+\r
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >\r
+    </uses-permission>\r
+    <uses-permission android:name="android.permission.READ_CONTACTS" />\r
+    <uses-permission android:name="android.permission.WRITE_CONTACTS" />\r
+\r
+    <application\r
+        android:icon="@drawable/icon"\r
+        android:label="@string/app_name" >\r
+        <activity\r
+            android:name=".ui.activity.FileDisplayActivity"\r
+            android:label="@string/app_name"\r
+            android:theme="@style/Theme.ownCloud" >\r
+        </activity>\r
+        <activity android:name=".Uploader" >\r
             <intent-filter>\r
-                <action android:name="android.intent.action.SEND"></action>\r
-                <category android:name="android.intent.category.DEFAULT"></category>\r
-                <data android:mimeType="*/*"></data>\r
+                <action android:name="android.intent.action.SEND" >\r
+                </action>\r
+\r
+                <category android:name="android.intent.category.DEFAULT" >\r
+                </category>\r
+\r
+                <data android:mimeType="*/*" >\r
+                </data>\r
             </intent-filter>\r
             <intent-filter>\r
-                <action android:name="android.intent.action.SEND_MULTIPLE"></action>\r
-                <category android:name="android.intent.category.DEFAULT"></category>\r
-                <data android:mimeType="*/*"></data>\r
+                <action android:name="android.intent.action.SEND_MULTIPLE" >\r
+                </action>\r
+\r
+                <category android:name="android.intent.category.DEFAULT" >\r
+                </category>\r
+\r
+                <data android:mimeType="*/*" >\r
+                </data>\r
             </intent-filter>\r
         </activity>\r
-        <activity android:name=".ui.activity.Preferences"></activity>\r
-        <activity android:name=".ui.activity.PreferencesNewSessionewSession"></activity>\r
-                <service\r
-            android:exported="true" android:name=".authenticator.AccountAuthenticatorService">\r
+        <activity android:name=".ui.activity.Preferences" >\r
+        </activity>\r
+        <activity android:name=".ui.activity.PreferencesNewSessionewSession" >\r
+        </activity>\r
+\r
+        <service\r
+            android:name=".authenticator.AccountAuthenticatorService"\r
+            android:exported="true" >\r
             <intent-filter>\r
-                <action\r
-                    android:name="android.accounts.AccountAuthenticator" />\r
+                <action android:name="android.accounts.AccountAuthenticator" />\r
             </intent-filter>\r
+\r
             <meta-data\r
                 android:name="android.accounts.AccountAuthenticator"\r
                 android:resource="@xml/authenticator" />\r
         </service>\r
-         <service\r
-            android:exported="true" android:name=".syncadapter.FileSyncService">\r
+        <service\r
+            android:name=".syncadapter.FileSyncService"\r
+            android:exported="true" >\r
+            <intent-filter>\r
+                <action android:name="android.content.SyncAdapter" />\r
+            </intent-filter>\r
+\r
+            <meta-data\r
+                android:name="android.content.SyncAdapter"\r
+                android:resource="@xml/syncadapter_files" />\r
+        </service>\r
+        <service\r
+            android:name=".syncadapter.ContactSyncService"\r
+            android:exported="true"\r
+            android:process=":contacts" >\r
             <intent-filter>\r
-                <action android:name="android.content.SyncAdapter"/>\r
+                <action android:name="android.content.SyncAdapter" />\r
             </intent-filter>\r
+\r
             <meta-data\r
                 android:name="android.content.SyncAdapter"\r
-                android:resource="@xml/syncadapter_files"/>\r
+                android:resource="@xml/syncadapter_contacts" />\r
+            <meta-data\r
+                android:name="android.provider.CONTACTS_STRUCTURE"\r
+                android:resource="@xml/contacts" />\r
+        </service>\r
+\r
+        <provider\r
+            android:name=".providers.FileContentProvider"\r
+            android:authorities="org.owncloud"\r
+            android:enabled="true"\r
+            android:exported="false"\r
+            android:label="@string/sync_string_files"\r
+            android:syncable="true" >\r
+        </provider>\r
+\r
+        <activity\r
+            android:name=".ui.activity.AuthenticatorActivity"\r
+            android:theme="@style/Theme.ownCloud" >\r
+        </activity>\r
+\r
+        <service android:name=".FileDownloader" >\r
         </service>\r
-         <provider android:name=".cp" android:enabled="true" android:syncable="true" android:exported="false" android:authorities="org.owncloud" android:label="@string/sync_string_files"></provider>\r
-         <activity android:name=".ui.activity.AuthenticatorActivity" android:theme="@style/Theme.ownCloud"></activity>\r
-         <service android:name=".FileDownloader">\r
-         </service>\r
-         <activity android:name=".ui.activity.FileDetailActivity"></activity>\r
-         <activity android:name=".ui.activity.LandingActivity"\r
-             android:theme="@style/Theme.ownCloud"\r
-             android:label="@string/app_name">\r
-             <intent-filter>\r
+\r
+        <activity android:name=".ui.activity.FileDetailActivity" >\r
+        </activity>\r
+        <activity\r
+            android:name=".ui.activity.LandingActivity"\r
+            android:label="@string/app_name"\r
+            android:theme="@style/Theme.ownCloud" >\r
+            <intent-filter>\r
                 <action android:name="android.intent.action.MAIN" />\r
+\r
                 <category android:name="android.intent.category.LAUNCHER" />\r
             </intent-filter>\r
-         </activity>\r
+        </activity>\r
     </application>\r
+\r
 </manifest>
\ No newline at end of file
index 8870941..e55f126 100644 (file)
@@ -20,7 +20,7 @@
 <ContactsSource xmlns:android="http://schemas.android.com/apk/res/android">
 
     <ContactsDataKind
-        android:mimeType="vnd.android.cursor.item/vnd.samplesyncadapter.profile"
+        android:mimeType="vnd.android.cursor.item/vnd.owncloud.contact.profile"
         android:icon="@drawable/icon"
         android:summaryColumn="data2"
         android:detailColumn="data3"
diff --git a/src/eu/alefzero/owncloud/cp.java b/src/eu/alefzero/owncloud/cp.java
deleted file mode 100644 (file)
index e125905..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/* ownCloud Android client application\r
- *   Copyright (C) 2011  Bartek Przybylski\r
- *\r
- *   This program is free software: you can redistribute it and/or modify\r
- *   it under the terms of the GNU General Public License as published by\r
- *   the Free Software Foundation, either version 3 of the License, or\r
- *   (at your option) any later version.\r
- *\r
- *   This program is distributed in the hope that it will be useful,\r
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- *   GNU General Public License for more details.\r
- *\r
- *   You should have received a copy of the GNU General Public License\r
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
- *\r
- */\r
-\r
-package eu.alefzero.owncloud;\r
-\r
-import java.util.HashMap;\r
-\r
-import eu.alefzero.owncloud.db.ProviderMeta;\r
-import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\r
-\r
-import android.content.ContentProvider;\r
-import android.content.ContentUris;\r
-import android.content.ContentValues;\r
-import android.content.Context;\r
-import android.content.UriMatcher;\r
-import android.database.Cursor;\r
-import android.database.SQLException;\r
-import android.database.sqlite.SQLiteDatabase;\r
-import android.database.sqlite.SQLiteOpenHelper;\r
-import android.database.sqlite.SQLiteQueryBuilder;\r
-import android.net.Uri;\r
-import android.text.TextUtils;\r
-\r
-/**\r
-* The ContentProvider for the ownCloud App.\r
-* @author Bartek Przybylski\r
-* \r
-*/\r
-public class cp extends ContentProvider {\r
-\r
-  private DataBaseHelper mDbHelper;\r
-  \r
-  private static HashMap<String, String> mProjectionMap;\r
-  static {\r
-    mProjectionMap = new HashMap<String, String>();\r
-    mProjectionMap.put(ProviderTableMeta._ID,\r
-                       ProviderTableMeta._ID);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_PARENT,\r
-                       ProviderTableMeta.FILE_PARENT);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_PATH,\r
-                       ProviderTableMeta.FILE_PATH);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_NAME,\r
-                       ProviderTableMeta.FILE_NAME);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_CREATION,\r
-                       ProviderTableMeta.FILE_CREATION);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,\r
-                       ProviderTableMeta.FILE_MODIFIED);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,\r
-                       ProviderTableMeta.FILE_CONTENT_LENGTH);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,\r
-                       ProviderTableMeta.FILE_CONTENT_TYPE);\r
-    mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,\r
-                       ProviderTableMeta.FILE_STORAGE_PATH);\r
-  }\r
-  \r
-  private static final int SINGLE_FILE = 1;\r
-  private static final int DIRECTORY = 2;\r
-  private static final int ROOT_DIRECTORY = 3;\r
-  private static final UriMatcher mUriMatcher;\r
-  static {\r
-    mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);\r
-    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY);\r
-    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);\r
-    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);\r
-    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);\r
-  }\r
-  \r
-  @Override\r
-  public int delete(Uri uri, String where, String[] whereArgs) {\r
-    SQLiteDatabase db = mDbHelper.getWritableDatabase();\r
-    int count = 0;\r
-    switch (mUriMatcher.match(uri)) {\r
-      case SINGLE_FILE:\r
-        count = db.delete(ProviderTableMeta.DB_NAME,\r
-                          ProviderTableMeta._ID + "=" + uri.getPathSegments().get(1)\r
-                          + (!TextUtils.isEmpty(where)?" AND (" + where +")" : ""),\r
-                          whereArgs);\r
-        break;\r
-      case ROOT_DIRECTORY:\r
-        count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs);\r
-        break;\r
-      default:\r
-        throw new IllegalArgumentException("Unknown uri: " + uri.toString());\r
-    }\r
-    getContext().getContentResolver().notifyChange(uri, null);\r
-    return count;\r
-  }\r
-\r
-  @Override\r
-  public String getType(Uri uri) {\r
-    switch (mUriMatcher.match(uri)) {\r
-      case ROOT_DIRECTORY:\r
-        return ProviderTableMeta.CONTENT_TYPE;\r
-      case SINGLE_FILE:\r
-        return ProviderTableMeta.CONTENT_TYPE_ITEM;\r
-      default:\r
-        throw new IllegalArgumentException("Unknown Uri id." + uri.toString());\r
-    }\r
-  }\r
-\r
-  @Override\r
-  public Uri insert(Uri uri, ContentValues values) {\r
-    if (mUriMatcher.match(uri) != SINGLE_FILE) {\r
-      throw new IllegalArgumentException("Unknown uri id: " + uri);\r
-    }\r
-    \r
-    SQLiteDatabase db = mDbHelper.getWritableDatabase();\r
-    long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values);\r
-    if (rowId > 0) {\r
-      Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);\r
-      getContext().getContentResolver().notifyChange(insertedFileUri, null);\r
-      return insertedFileUri;\r
-    }\r
-    throw new SQLException("ERROR " + uri);\r
-  }\r
-\r
-  @Override\r
-  public boolean onCreate() {\r
-    mDbHelper = new DataBaseHelper(getContext());\r
-    return true;\r
-  }\r
-\r
-  @Override\r
-  public Cursor query(Uri uri, String[] projection, String selection,\r
-      String[] selectionArgs, String sortOrder) {\r
-    SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();\r
-        \r
-    sqlQuery.setTables(ProviderTableMeta.DB_NAME);\r
-    sqlQuery.setProjectionMap(mProjectionMap);\r
-    \r
-    switch (mUriMatcher.match(uri)) {\r
-      case ROOT_DIRECTORY:\r
-        sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + " is null");\r
-        break;\r
-      case DIRECTORY:\r
-        sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="+uri.getPathSegments().get(1));\r
-        break;\r
-      case SINGLE_FILE:\r
-        if (uri.getPathSegments().size() > 1) {\r
-          sqlQuery.appendWhere(ProviderTableMeta._ID + "=" +\r
-                               uri.getPathSegments().get(1));\r
-        }\r
-        break;\r
-      default:\r
-        throw new IllegalArgumentException("Unknown uri id: " + uri);\r
-    }\r
-    \r
-    String order;\r
-    if (TextUtils.isEmpty(sortOrder)) {\r
-      order = ProviderTableMeta.DEFAULT_SORT_ORDER;\r
-    } else {\r
-      order = sortOrder;\r
-    }\r
-    \r
-    SQLiteDatabase db = mDbHelper.getReadableDatabase();\r
-    Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order);\r
-    \r
-    c.setNotificationUri(getContext().getContentResolver(), uri);\r
-\r
-    return c;\r
-  }\r
-\r
-  @Override\r
-  public int update(Uri uri, ContentValues values, String selection,\r
-      String[] selectionArgs) {\r
-    return mDbHelper.getWritableDatabase().update(ProviderTableMeta.DB_NAME, values, selection, selectionArgs);\r
-  }\r
-\r
-  class DataBaseHelper extends SQLiteOpenHelper {\r
-\r
-    public DataBaseHelper(Context context) {\r
-      super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION);\r
-      \r
-    }\r
-    \r
-    @Override\r
-    public void onCreate(SQLiteDatabase db) {\r
-      db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "(" +\r
-                 ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " +\r
-                 ProviderTableMeta.FILE_NAME + " TEXT, " +\r
-                 ProviderTableMeta.FILE_PATH + " TEXT, " +\r
-                 ProviderTableMeta.FILE_PARENT + " INTEGER, " +\r
-                 ProviderTableMeta.FILE_CREATION + " INTEGER, " +\r
-                 ProviderTableMeta.FILE_MODIFIED + " INTEGER, " +\r
-                 ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, " +\r
-                 ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, " +\r
-                 ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, " +\r
-                 ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT);");\r
-    }\r
-\r
-    @Override\r
-    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\r
-      \r
-    }\r
-    \r
-  }\r
-  \r
-}\r
diff --git a/src/eu/alefzero/owncloud/providers/FileContentProvider.java b/src/eu/alefzero/owncloud/providers/FileContentProvider.java
new file mode 100644 (file)
index 0000000..683b691
--- /dev/null
@@ -0,0 +1,213 @@
+/* ownCloud Android client application\r
+ *   Copyright (C) 2011  Bartek Przybylski\r
+ *\r
+ *   This program is free software: you can redistribute it and/or modify\r
+ *   it under the terms of the GNU General Public License as published by\r
+ *   the Free Software Foundation, either version 3 of the License, or\r
+ *   (at your option) any later version.\r
+ *\r
+ *   This program is distributed in the hope that it will be useful,\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ *   GNU General Public License for more details.\r
+ *\r
+ *   You should have received a copy of the GNU General Public License\r
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+package eu.alefzero.owncloud.providers;\r
+\r
+import java.util.HashMap;\r
+\r
+import eu.alefzero.owncloud.db.ProviderMeta;\r
+import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\r
+\r
+import android.content.ContentProvider;\r
+import android.content.ContentUris;\r
+import android.content.ContentValues;\r
+import android.content.Context;\r
+import android.content.UriMatcher;\r
+import android.database.Cursor;\r
+import android.database.SQLException;\r
+import android.database.sqlite.SQLiteDatabase;\r
+import android.database.sqlite.SQLiteOpenHelper;\r
+import android.database.sqlite.SQLiteQueryBuilder;\r
+import android.net.Uri;\r
+import android.text.TextUtils;\r
+\r
+/**\r
+* The ContentProvider for the ownCloud App.\r
+* @author Bartek Przybylski\r
+* \r
+*/\r
+public class FileContentProvider extends ContentProvider {\r
+\r
+  private DataBaseHelper mDbHelper;\r
+  \r
+  private static HashMap<String, String> mProjectionMap;\r
+  static {\r
+    mProjectionMap = new HashMap<String, String>();\r
+    mProjectionMap.put(ProviderTableMeta._ID,\r
+                       ProviderTableMeta._ID);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_PARENT,\r
+                       ProviderTableMeta.FILE_PARENT);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_PATH,\r
+                       ProviderTableMeta.FILE_PATH);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_NAME,\r
+                       ProviderTableMeta.FILE_NAME);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_CREATION,\r
+                       ProviderTableMeta.FILE_CREATION);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,\r
+                       ProviderTableMeta.FILE_MODIFIED);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,\r
+                       ProviderTableMeta.FILE_CONTENT_LENGTH);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,\r
+                       ProviderTableMeta.FILE_CONTENT_TYPE);\r
+    mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,\r
+                       ProviderTableMeta.FILE_STORAGE_PATH);\r
+  }\r
+  \r
+  private static final int SINGLE_FILE = 1;\r
+  private static final int DIRECTORY = 2;\r
+  private static final int ROOT_DIRECTORY = 3;\r
+  private static final UriMatcher mUriMatcher;\r
+  static {\r
+    mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);\r
+    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY);\r
+    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);\r
+    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);\r
+    mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);\r
+  }\r
+  \r
+  @Override\r
+  public int delete(Uri uri, String where, String[] whereArgs) {\r
+    SQLiteDatabase db = mDbHelper.getWritableDatabase();\r
+    int count = 0;\r
+    switch (mUriMatcher.match(uri)) {\r
+      case SINGLE_FILE:\r
+        count = db.delete(ProviderTableMeta.DB_NAME,\r
+                          ProviderTableMeta._ID + "=" + uri.getPathSegments().get(1)\r
+                          + (!TextUtils.isEmpty(where)?" AND (" + where +")" : ""),\r
+                          whereArgs);\r
+        break;\r
+      case ROOT_DIRECTORY:\r
+        count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs);\r
+        break;\r
+      default:\r
+        throw new IllegalArgumentException("Unknown uri: " + uri.toString());\r
+    }\r
+    getContext().getContentResolver().notifyChange(uri, null);\r
+    return count;\r
+  }\r
+\r
+  @Override\r
+  public String getType(Uri uri) {\r
+    switch (mUriMatcher.match(uri)) {\r
+      case ROOT_DIRECTORY:\r
+        return ProviderTableMeta.CONTENT_TYPE;\r
+      case SINGLE_FILE:\r
+        return ProviderTableMeta.CONTENT_TYPE_ITEM;\r
+      default:\r
+        throw new IllegalArgumentException("Unknown Uri id." + uri.toString());\r
+    }\r
+  }\r
+\r
+  @Override\r
+  public Uri insert(Uri uri, ContentValues values) {\r
+    if (mUriMatcher.match(uri) != SINGLE_FILE) {\r
+      throw new IllegalArgumentException("Unknown uri id: " + uri);\r
+    }\r
+    \r
+    SQLiteDatabase db = mDbHelper.getWritableDatabase();\r
+    long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values);\r
+    if (rowId > 0) {\r
+      Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);\r
+      getContext().getContentResolver().notifyChange(insertedFileUri, null);\r
+      return insertedFileUri;\r
+    }\r
+    throw new SQLException("ERROR " + uri);\r
+  }\r
+\r
+  @Override\r
+  public boolean onCreate() {\r
+    mDbHelper = new DataBaseHelper(getContext());\r
+    return true;\r
+  }\r
+\r
+  @Override\r
+  public Cursor query(Uri uri, String[] projection, String selection,\r
+      String[] selectionArgs, String sortOrder) {\r
+    SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();\r
+        \r
+    sqlQuery.setTables(ProviderTableMeta.DB_NAME);\r
+    sqlQuery.setProjectionMap(mProjectionMap);\r
+    \r
+    switch (mUriMatcher.match(uri)) {\r
+      case ROOT_DIRECTORY:\r
+        sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + " is null");\r
+        break;\r
+      case DIRECTORY:\r
+        sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="+uri.getPathSegments().get(1));\r
+        break;\r
+      case SINGLE_FILE:\r
+        if (uri.getPathSegments().size() > 1) {\r
+          sqlQuery.appendWhere(ProviderTableMeta._ID + "=" +\r
+                               uri.getPathSegments().get(1));\r
+        }\r
+        break;\r
+      default:\r
+        throw new IllegalArgumentException("Unknown uri id: " + uri);\r
+    }\r
+    \r
+    String order;\r
+    if (TextUtils.isEmpty(sortOrder)) {\r
+      order = ProviderTableMeta.DEFAULT_SORT_ORDER;\r
+    } else {\r
+      order = sortOrder;\r
+    }\r
+    \r
+    SQLiteDatabase db = mDbHelper.getReadableDatabase();\r
+    Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order);\r
+    \r
+    c.setNotificationUri(getContext().getContentResolver(), uri);\r
+\r
+    return c;\r
+  }\r
+\r
+  @Override\r
+  public int update(Uri uri, ContentValues values, String selection,\r
+      String[] selectionArgs) {\r
+    return mDbHelper.getWritableDatabase().update(ProviderTableMeta.DB_NAME, values, selection, selectionArgs);\r
+  }\r
+\r
+  class DataBaseHelper extends SQLiteOpenHelper {\r
+\r
+    public DataBaseHelper(Context context) {\r
+      super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION);\r
+      \r
+    }\r
+    \r
+    @Override\r
+    public void onCreate(SQLiteDatabase db) {\r
+      db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "(" +\r
+                 ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " +\r
+                 ProviderTableMeta.FILE_NAME + " TEXT, " +\r
+                 ProviderTableMeta.FILE_PATH + " TEXT, " +\r
+                 ProviderTableMeta.FILE_PARENT + " INTEGER, " +\r
+                 ProviderTableMeta.FILE_CREATION + " INTEGER, " +\r
+                 ProviderTableMeta.FILE_MODIFIED + " INTEGER, " +\r
+                 ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, " +\r
+                 ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, " +\r
+                 ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, " +\r
+                 ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT);");\r
+    }\r
+\r
+    @Override\r
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\r
+      \r
+    }\r
+    \r
+  }\r
+  \r
+}\r
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..8ddc414
--- /dev/null
@@ -0,0 +1,98 @@
+package eu.alefzero.owncloud.syncadapter;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.ByteArrayEntity;
+
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
+import eu.alefzero.owncloud.authenticator.AuthUtils;
+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.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 String mAddrBookUri;
+  
+  public ContactSyncAdapter(Context context, boolean autoInitialize) {
+    super(context, autoInitialize);
+    mAddrBookUri = null;
+  }
+
+  @Override
+  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 {
+        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);
+      } catch (IOException e) {
+        e.printStackTrace();
+        return;
+      } catch (OperationCanceledException e) {
+        // TODO Auto-generated catch block
+        e.printStackTrace();
+      } catch (AuthenticatorException e) {
+        // TODO Auto-generated catch block
+        e.printStackTrace();
+      }
+      }while (c.moveToNext());
+      //} while (c.moveToNext());
+    }
+
+  }
+
+  private String getAddressBookUri() {
+    if (mAddrBookUri != null) return mAddrBookUri;
+
+    AccountManager am = getAccountManager();
+    String uri = am.getUserData(getAccount(), AccountAuthenticator.KEY_OC_URL)
+                   .replace(AuthUtils.WEBDAV_PATH_2_0, AuthUtils.CARDDAV_PATH_2_0);
+    uri += "/addressbooks/" + getAccount().name.substring(0, getAccount().name.lastIndexOf('@'))
+        + "/default/";
+    mAddrBookUri = uri;
+    return uri;
+  }
+  
+  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();
+  }
+  
+  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");
+  }
+  
+}
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..372c17c
--- /dev/null
@@ -0,0 +1,25 @@
+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 mSyncAdapter = null;
+  
+  @Override
+  public void onCreate() {
+      synchronized (syncAdapterLock) {
+          if (mSyncAdapter == null) {
+              mSyncAdapter = new ContactSyncAdapter(getApplicationContext(), true);
+          }
+      }
+  }
+  
+  @Override
+  public IBinder onBind(Intent arg0) {
+    return mSyncAdapter.getSyncAdapterBinder();
+  }
+
+}
index 96cf520..43b1547 100644 (file)
@@ -80,7 +80,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
                        e.printStackTrace();\r
                }// catch (RemoteException e) {\r
                //      e.printStackTrace();\r
-               //}\r
+               // q}\r
        }\r
 \r
        private void commitToDatabase(TreeNode root, String parentId) throws RemoteException {\r
index 6f3c4c5..c71d9bf 100644 (file)
  */\r
 package eu.alefzero.owncloud.ui.fragment;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Stack;\r
 import java.util.Vector;\r
 \r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
 import android.app.Service;\r
+import android.content.ContentProviderOperation;\r
 import android.content.Intent;\r
 import android.os.Bundle;\r
+import android.provider.ContactsContract;\r
+import android.provider.ContactsContract.RawContacts;\r
+import android.util.Log;\r
 import android.view.View;\r
 import android.widget.AdapterView;\r
 import eu.alefzero.owncloud.R;\r
@@ -57,6 +62,7 @@ public class FileList extends FragmentListView {
     mAccountManager = (AccountManager)getActivity().getSystemService(Service.ACCOUNT_SERVICE);\r
     mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[0];\r
     populateFileList();\r
+    //addContact(mAccount, "Bartek Przybylski", "czlowiek");\r
   }\r
   \r
   @Override\r
@@ -102,4 +108,40 @@ public class FileList extends FragmentListView {
     mFiles = file.getDirectoryContent();\r
     setListAdapter(new FileListListAdapter(file, getActivity()));\r
   }\r
+  \r
+  private  void addContact(Account account, String name, String username) {\r
+    Log.i("ASD", "Adding contact: " + name);\r
+    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();\r
+    \r
+    //Create our RawContact\r
+    ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);\r
+    builder.withValue(RawContacts.ACCOUNT_NAME, account.name);\r
+    builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);\r
+    builder.withValue(RawContacts.SYNC1, username);\r
+    operationList.add(builder.build());\r
+    \r
+    //Create a Data record of common type 'StructuredName' for our RawContact\r
+    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);\r
+    builder.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, 0);\r
+    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);\r
+    builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);\r
+    operationList.add(builder.build());\r
+    \r
+    //Create a Data record of custom type "vnd.android.cursor.item/vnd.fm.last.android.profile" to display a link to the Last.fm profile\r
+    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);\r
+    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);\r
+    builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.owncloud.contact.profile");\r
+    builder.withValue(ContactsContract.Data.DATA1, username);\r
+    builder.withValue(ContactsContract.Data.DATA2, "Last.fm Profile");\r
+    builder.withValue(ContactsContract.Data.DATA3, "View profile");\r
+    operationList.add(builder.build());\r
+    \r
+    try {\r
+     getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);\r
+    } catch (Exception e) {\r
+     Log.e("ASD", "Something went wrong during creation! " + e);\r
+     e.printStackTrace();\r
+    }\r
+   }\r
+  \r
 }\r