From: Bartek Przybylski Date: Sun, 8 Apr 2012 16:41:23 +0000 (+0200) Subject: send contacts to oc instance X-Git-Tag: oc-android-1.4.3~464 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/cf2c2eedc56dfd3b4b116b82a907ce72c59b942b?ds=sidebyside send contacts to oc instance --- diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 12cd5911..4c1ac1ca 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,76 +1,129 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + - - - + + + + + + + + - - - + + + + + + - + + - + + + + + + + + - + + + android:resource="@xml/syncadapter_contacts" /> + + + + + + + + + + - - - - - - - + + + + + + - + + \ No newline at end of file diff --git a/res/xml/contacts.xml b/res/xml/contacts.xml index 88709417..e55f1264 100644 --- a/res/xml/contacts.xml +++ b/res/xml/contacts.xml @@ -20,7 +20,7 @@ . - * - */ - -package eu.alefzero.owncloud; - -import java.util.HashMap; - -import eu.alefzero.owncloud.db.ProviderMeta; -import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; - -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.SQLException; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteQueryBuilder; -import android.net.Uri; -import android.text.TextUtils; - -/** -* The ContentProvider for the ownCloud App. -* @author Bartek Przybylski -* -*/ -public class cp extends ContentProvider { - - private DataBaseHelper mDbHelper; - - private static HashMap mProjectionMap; - static { - mProjectionMap = new HashMap(); - mProjectionMap.put(ProviderTableMeta._ID, - ProviderTableMeta._ID); - mProjectionMap.put(ProviderTableMeta.FILE_PARENT, - ProviderTableMeta.FILE_PARENT); - mProjectionMap.put(ProviderTableMeta.FILE_PATH, - ProviderTableMeta.FILE_PATH); - mProjectionMap.put(ProviderTableMeta.FILE_NAME, - ProviderTableMeta.FILE_NAME); - mProjectionMap.put(ProviderTableMeta.FILE_CREATION, - ProviderTableMeta.FILE_CREATION); - mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED, - ProviderTableMeta.FILE_MODIFIED); - mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH, - ProviderTableMeta.FILE_CONTENT_LENGTH); - mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE, - ProviderTableMeta.FILE_CONTENT_TYPE); - mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH, - ProviderTableMeta.FILE_STORAGE_PATH); - } - - private static final int SINGLE_FILE = 1; - private static final int DIRECTORY = 2; - private static final int ROOT_DIRECTORY = 3; - private static final UriMatcher mUriMatcher; - static { - mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY); - mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE); - mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE); - mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY); - } - - @Override - public int delete(Uri uri, String where, String[] whereArgs) { - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - int count = 0; - switch (mUriMatcher.match(uri)) { - case SINGLE_FILE: - count = db.delete(ProviderTableMeta.DB_NAME, - ProviderTableMeta._ID + "=" + uri.getPathSegments().get(1) - + (!TextUtils.isEmpty(where)?" AND (" + where +")" : ""), - whereArgs); - break; - case ROOT_DIRECTORY: - count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs); - break; - default: - throw new IllegalArgumentException("Unknown uri: " + uri.toString()); - } - getContext().getContentResolver().notifyChange(uri, null); - return count; - } - - @Override - public String getType(Uri uri) { - switch (mUriMatcher.match(uri)) { - case ROOT_DIRECTORY: - return ProviderTableMeta.CONTENT_TYPE; - case SINGLE_FILE: - return ProviderTableMeta.CONTENT_TYPE_ITEM; - default: - throw new IllegalArgumentException("Unknown Uri id." + uri.toString()); - } - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - if (mUriMatcher.match(uri) != SINGLE_FILE) { - throw new IllegalArgumentException("Unknown uri id: " + uri); - } - - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values); - if (rowId > 0) { - Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId); - getContext().getContentResolver().notifyChange(insertedFileUri, null); - return insertedFileUri; - } - throw new SQLException("ERROR " + uri); - } - - @Override - public boolean onCreate() { - mDbHelper = new DataBaseHelper(getContext()); - return true; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder) { - SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder(); - - sqlQuery.setTables(ProviderTableMeta.DB_NAME); - sqlQuery.setProjectionMap(mProjectionMap); - - switch (mUriMatcher.match(uri)) { - case ROOT_DIRECTORY: - sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + " is null"); - break; - case DIRECTORY: - sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="+uri.getPathSegments().get(1)); - break; - case SINGLE_FILE: - if (uri.getPathSegments().size() > 1) { - sqlQuery.appendWhere(ProviderTableMeta._ID + "=" + - uri.getPathSegments().get(1)); - } - break; - default: - throw new IllegalArgumentException("Unknown uri id: " + uri); - } - - String order; - if (TextUtils.isEmpty(sortOrder)) { - order = ProviderTableMeta.DEFAULT_SORT_ORDER; - } else { - order = sortOrder; - } - - SQLiteDatabase db = mDbHelper.getReadableDatabase(); - Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order); - - c.setNotificationUri(getContext().getContentResolver(), uri); - - return c; - } - - @Override - public int update(Uri uri, ContentValues values, String selection, - String[] selectionArgs) { - return mDbHelper.getWritableDatabase().update(ProviderTableMeta.DB_NAME, values, selection, selectionArgs); - } - - class DataBaseHelper extends SQLiteOpenHelper { - - public DataBaseHelper(Context context) { - super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION); - - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "(" + - ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " + - ProviderTableMeta.FILE_NAME + " TEXT, " + - ProviderTableMeta.FILE_PATH + " TEXT, " + - ProviderTableMeta.FILE_PARENT + " INTEGER, " + - ProviderTableMeta.FILE_CREATION + " INTEGER, " + - ProviderTableMeta.FILE_MODIFIED + " INTEGER, " + - ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, " + - ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, " + - ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, " + - ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT);"); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - - } - - } - -} diff --git a/src/eu/alefzero/owncloud/providers/FileContentProvider.java b/src/eu/alefzero/owncloud/providers/FileContentProvider.java new file mode 100644 index 00000000..683b6911 --- /dev/null +++ b/src/eu/alefzero/owncloud/providers/FileContentProvider.java @@ -0,0 +1,213 @@ +/* ownCloud Android client application + * Copyright (C) 2011 Bartek Przybylski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package eu.alefzero.owncloud.providers; + +import java.util.HashMap; + +import eu.alefzero.owncloud.db.ProviderMeta; +import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.net.Uri; +import android.text.TextUtils; + +/** +* The ContentProvider for the ownCloud App. +* @author Bartek Przybylski +* +*/ +public class FileContentProvider extends ContentProvider { + + private DataBaseHelper mDbHelper; + + private static HashMap mProjectionMap; + static { + mProjectionMap = new HashMap(); + mProjectionMap.put(ProviderTableMeta._ID, + ProviderTableMeta._ID); + mProjectionMap.put(ProviderTableMeta.FILE_PARENT, + ProviderTableMeta.FILE_PARENT); + mProjectionMap.put(ProviderTableMeta.FILE_PATH, + ProviderTableMeta.FILE_PATH); + mProjectionMap.put(ProviderTableMeta.FILE_NAME, + ProviderTableMeta.FILE_NAME); + mProjectionMap.put(ProviderTableMeta.FILE_CREATION, + ProviderTableMeta.FILE_CREATION); + mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED, + ProviderTableMeta.FILE_MODIFIED); + mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH, + ProviderTableMeta.FILE_CONTENT_LENGTH); + mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE, + ProviderTableMeta.FILE_CONTENT_TYPE); + mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH, + ProviderTableMeta.FILE_STORAGE_PATH); + } + + private static final int SINGLE_FILE = 1; + private static final int DIRECTORY = 2; + private static final int ROOT_DIRECTORY = 3; + private static final UriMatcher mUriMatcher; + static { + mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); + mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY); + mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE); + mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE); + mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY); + } + + @Override + public int delete(Uri uri, String where, String[] whereArgs) { + SQLiteDatabase db = mDbHelper.getWritableDatabase(); + int count = 0; + switch (mUriMatcher.match(uri)) { + case SINGLE_FILE: + count = db.delete(ProviderTableMeta.DB_NAME, + ProviderTableMeta._ID + "=" + uri.getPathSegments().get(1) + + (!TextUtils.isEmpty(where)?" AND (" + where +")" : ""), + whereArgs); + break; + case ROOT_DIRECTORY: + count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs); + break; + default: + throw new IllegalArgumentException("Unknown uri: " + uri.toString()); + } + getContext().getContentResolver().notifyChange(uri, null); + return count; + } + + @Override + public String getType(Uri uri) { + switch (mUriMatcher.match(uri)) { + case ROOT_DIRECTORY: + return ProviderTableMeta.CONTENT_TYPE; + case SINGLE_FILE: + return ProviderTableMeta.CONTENT_TYPE_ITEM; + default: + throw new IllegalArgumentException("Unknown Uri id." + uri.toString()); + } + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + if (mUriMatcher.match(uri) != SINGLE_FILE) { + throw new IllegalArgumentException("Unknown uri id: " + uri); + } + + SQLiteDatabase db = mDbHelper.getWritableDatabase(); + long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values); + if (rowId > 0) { + Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId); + getContext().getContentResolver().notifyChange(insertedFileUri, null); + return insertedFileUri; + } + throw new SQLException("ERROR " + uri); + } + + @Override + public boolean onCreate() { + mDbHelper = new DataBaseHelper(getContext()); + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder(); + + sqlQuery.setTables(ProviderTableMeta.DB_NAME); + sqlQuery.setProjectionMap(mProjectionMap); + + switch (mUriMatcher.match(uri)) { + case ROOT_DIRECTORY: + sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + " is null"); + break; + case DIRECTORY: + sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="+uri.getPathSegments().get(1)); + break; + case SINGLE_FILE: + if (uri.getPathSegments().size() > 1) { + sqlQuery.appendWhere(ProviderTableMeta._ID + "=" + + uri.getPathSegments().get(1)); + } + break; + default: + throw new IllegalArgumentException("Unknown uri id: " + uri); + } + + String order; + if (TextUtils.isEmpty(sortOrder)) { + order = ProviderTableMeta.DEFAULT_SORT_ORDER; + } else { + order = sortOrder; + } + + SQLiteDatabase db = mDbHelper.getReadableDatabase(); + Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order); + + c.setNotificationUri(getContext().getContentResolver(), uri); + + return c; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, + String[] selectionArgs) { + return mDbHelper.getWritableDatabase().update(ProviderTableMeta.DB_NAME, values, selection, selectionArgs); + } + + class DataBaseHelper extends SQLiteOpenHelper { + + public DataBaseHelper(Context context) { + super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION); + + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "(" + + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " + + ProviderTableMeta.FILE_NAME + " TEXT, " + + ProviderTableMeta.FILE_PATH + " TEXT, " + + ProviderTableMeta.FILE_PARENT + " INTEGER, " + + ProviderTableMeta.FILE_CREATION + " INTEGER, " + + ProviderTableMeta.FILE_MODIFIED + " INTEGER, " + + ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, " + + ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, " + + ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, " + + ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT);"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + } + +} diff --git a/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java new file mode 100644 index 00000000..8ddc4149 --- /dev/null +++ b/src/eu/alefzero/owncloud/syncadapter/ContactSyncAdapter.java @@ -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 index 00000000..372c17cb --- /dev/null +++ b/src/eu/alefzero/owncloud/syncadapter/ContactSyncService.java @@ -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(); + } + +} diff --git a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java index 96cf520a..43b15477 100644 --- a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java +++ b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java @@ -80,7 +80,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { e.printStackTrace(); }// catch (RemoteException e) { // e.printStackTrace(); - //} + // q} } private void commitToDatabase(TreeNode root, String parentId) throws RemoteException { diff --git a/src/eu/alefzero/owncloud/ui/fragment/FileList.java b/src/eu/alefzero/owncloud/ui/fragment/FileList.java index 6f3c4c5e..c71d9bf6 100644 --- a/src/eu/alefzero/owncloud/ui/fragment/FileList.java +++ b/src/eu/alefzero/owncloud/ui/fragment/FileList.java @@ -17,14 +17,19 @@ */ package eu.alefzero.owncloud.ui.fragment; +import java.util.ArrayList; import java.util.Stack; import java.util.Vector; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Service; +import android.content.ContentProviderOperation; import android.content.Intent; import android.os.Bundle; +import android.provider.ContactsContract; +import android.provider.ContactsContract.RawContacts; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import eu.alefzero.owncloud.R; @@ -57,6 +62,7 @@ public class FileList extends FragmentListView { mAccountManager = (AccountManager)getActivity().getSystemService(Service.ACCOUNT_SERVICE); mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[0]; populateFileList(); + //addContact(mAccount, "Bartek Przybylski", "czlowiek"); } @Override @@ -102,4 +108,40 @@ public class FileList extends FragmentListView { mFiles = file.getDirectoryContent(); setListAdapter(new FileListListAdapter(file, getActivity())); } + + private void addContact(Account account, String name, String username) { + Log.i("ASD", "Adding contact: " + name); + ArrayList operationList = new ArrayList(); + + //Create our RawContact + ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); + builder.withValue(RawContacts.ACCOUNT_NAME, account.name); + builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); + builder.withValue(RawContacts.SYNC1, username); + operationList.add(builder.build()); + + //Create a Data record of common type 'StructuredName' for our RawContact + builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); + builder.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, 0); + builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name); + operationList.add(builder.build()); + + //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 + builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); + builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); + builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.owncloud.contact.profile"); + builder.withValue(ContactsContract.Data.DATA1, username); + builder.withValue(ContactsContract.Data.DATA2, "Last.fm Profile"); + builder.withValue(ContactsContract.Data.DATA3, "View profile"); + operationList.add(builder.build()); + + try { + getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList); + } catch (Exception e) { + Log.e("ASD", "Something went wrong during creation! " + e); + e.printStackTrace(); + } + } + }