X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/576de8a8bcd3991cc3f701c1c353630ddbafc8e5..40b5fb815613c4cf9023c9c9ad93cda0d2521f86:/src/com/owncloud/android/providers/FileContentProvider.java diff --git a/src/com/owncloud/android/providers/FileContentProvider.java b/src/com/owncloud/android/providers/FileContentProvider.java index f3a4e2ef..fc038070 100644 --- a/src/com/owncloud/android/providers/FileContentProvider.java +++ b/src/com/owncloud/android/providers/FileContentProvider.java @@ -22,9 +22,10 @@ import java.util.ArrayList; import java.util.HashMap; import com.owncloud.android.R; -import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.db.ProviderMeta; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; +import com.owncloud.android.lib.resources.files.FileUtils; +import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.utils.Log_OC; @@ -99,6 +100,8 @@ public class FileContentProvider extends ContentProvider { private static final int DIRECTORY = 2; private static final int ROOT_DIRECTORY = 3; private static final int SHARES = 4; + + private static final String TAG = FileContentProvider.class.getSimpleName(); // Projection for ocshares table private static HashMap mOCSharesProjectionMap; @@ -131,27 +134,65 @@ public class FileContentProvider extends ContentProvider { ProviderTableMeta.OCSHARES_USER_ID); mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED); + mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER); } private UriMatcher mUriMatcher; @Override public int delete(Uri uri, String where, String[] whereArgs) { - //Log_OC.d(TAG, "Deleting " + uri + " at provider " + this); + Log_OC.d(TAG, "Deleting " + uri + " at provider " + this); int count = 0; SQLiteDatabase db = mDbHelper.getWritableDatabase(); db.beginTransaction(); + + // Get parentId to notify the change + long parentId = getParentId(uri); + + // Delete action try { count = delete(db, uri, where, whereArgs); db.setTransactionSuccessful(); } finally { db.endTransaction(); } + Log_OC.d(TAG, "Uri " + uri); getContext().getContentResolver().notifyChange(uri, null); + + // Notify the change to the parent folder + notifyChangeToParentUri(parentId); return count; } - // TODO: switch(uri) + private long getParentId(Uri uri) { + long parentId = -1; + + if (mUriMatcher.match(uri) == SINGLE_FILE || mUriMatcher.match(uri) == DIRECTORY) { + String fileId = uri.toString().substring(uri.toString().lastIndexOf(FileUtils.PATH_SEPARATOR) + 1); + Uri selectFileUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, fileId); + String[] fileProjection = new String[] { ProviderTableMeta.FILE_PARENT }; + Cursor fileCursor = query(selectFileUri, fileProjection, null, null, null); + + if (fileCursor != null && fileCursor.moveToFirst()) { + parentId = fileCursor.getLong(fileCursor.getColumnIndex(ProviderTableMeta.FILE_PARENT)); + } + fileCursor.close(); + } + Log_OC.d(TAG, "getParentId = " + parentId); + return parentId; + } + + private void notifyChangeToParentUri(long parentId) { + if (parentId != -1) { + Uri parentUri = Uri.withAppendedPath( + ProviderTableMeta.CONTENT_URI_DIR, + String.valueOf(parentId)); + Log_OC.d(TAG, "ParentUri " + parentUri); + getContext().getContentResolver().notifyChange(parentUri, null); + } + } + private int delete(SQLiteDatabase db, Uri uri, String where, String[] whereArgs) { int count = 0; switch (mUriMatcher.match(uri)) { @@ -222,6 +263,9 @@ public class FileContentProvider extends ContentProvider { //Log_OC.d(TAG, "Removing ROOT!"); count = db.delete(ProviderTableMeta.FILE_TABLE_NAME, where, whereArgs); break; + case SHARES: + count = db.delete(ProviderTableMeta.OCSHARES_TABLE_NAME, where, whereArgs); + break; default: //Log_OC.e(TAG, "Unknown uri " + uri); throw new IllegalArgumentException("Unknown uri: " + uri.toString()); @@ -230,7 +274,6 @@ public class FileContentProvider extends ContentProvider { } - // TODO: switch(uri) @Override public String getType(Uri uri) { switch (mUriMatcher.match(uri)) { @@ -247,9 +290,12 @@ public class FileContentProvider extends ContentProvider { @Override public Uri insert(Uri uri, ContentValues values) { //Log_OC.d(TAG, "Inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); + Log_OC.d(TAG, "Uri " + uri); Uri newUri = null; SQLiteDatabase db = mDbHelper.getWritableDatabase(); db.beginTransaction(); + + // Insert action try { newUri = insert(db, uri, values); db.setTransactionSuccessful(); @@ -257,42 +303,87 @@ public class FileContentProvider extends ContentProvider { db.endTransaction(); } getContext().getContentResolver().notifyChange(newUri, null); + + // Get parentId to notify the change + long parentId = getParentId(newUri); + // Notify the change to the parent folder + notifyChangeToParentUri(parentId); + return newUri; } - // TODO: switch(uri) private Uri insert(SQLiteDatabase db, Uri uri, ContentValues values) { - if (mUriMatcher.match(uri) != SINGLE_FILE && - mUriMatcher.match(uri) != ROOT_DIRECTORY) { - //Log_OC.e(TAG, "Inserting invalid URI: " + uri); - throw new IllegalArgumentException("Unknown uri id: " + uri); - } + switch (mUriMatcher.match(uri)){ + case ROOT_DIRECTORY: + case SINGLE_FILE: + String remotePath = values.getAsString(ProviderTableMeta.FILE_PATH); + String accountName = values.getAsString(ProviderTableMeta.FILE_ACCOUNT_OWNER); + String[] projection = new String[] {ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH, ProviderTableMeta.FILE_ACCOUNT_OWNER }; + String where = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?"; + String[] whereArgs = new String[] {remotePath, accountName}; + Cursor doubleCheck = query(db, uri, projection, where, whereArgs, null); + if (doubleCheck == null || !doubleCheck.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider + long rowId = db.insert(ProviderTableMeta.FILE_TABLE_NAME, null, values); + if (rowId > 0) { + Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId); + //Log_OC.d(TAG, "Inserted " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); + return insertedFileUri; + } else { + //Log_OC.d(TAG, "Error while inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); + throw new SQLException("ERROR " + uri); + } + } else { + // file is already inserted; race condition, let's avoid a duplicated entry + Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, doubleCheck.getLong(doubleCheck.getColumnIndex(ProviderTableMeta._ID))); + doubleCheck.close(); - String remotePath = values.getAsString(ProviderTableMeta.FILE_PATH); - String accountName = values.getAsString(ProviderTableMeta.FILE_ACCOUNT_OWNER); - String[] projection = new String[] {ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH, ProviderTableMeta.FILE_ACCOUNT_OWNER }; - String where = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?"; - String[] whereArgs = new String[] {remotePath, accountName}; - Cursor doubleCheck = query(db, uri, projection, where, whereArgs, null); - if (doubleCheck == null || !doubleCheck.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider - long rowId = db.insert(ProviderTableMeta.FILE_TABLE_NAME, null, values); - if (rowId > 0) { - Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId); - //Log_OC.d(TAG, "Inserted " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); return insertedFileUri; + } + + case SHARES: + String path = values.getAsString(ProviderTableMeta.OCSHARES_PATH); + String accountNameShare= values.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER); + String[] projectionShare = new String[] {ProviderTableMeta._ID, ProviderTableMeta.OCSHARES_PATH, ProviderTableMeta.OCSHARES_ACCOUNT_OWNER }; + String whereShare = ProviderTableMeta.OCSHARES_PATH + "=? AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?"; + String[] whereArgsShare = new String[] {path, accountNameShare}; + Uri insertedShareUri = null; + Cursor doubleCheckShare = query(db, uri, projectionShare, whereShare, whereArgsShare, null); + if (doubleCheckShare == null || !doubleCheckShare.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider + long rowId = db.insert(ProviderTableMeta.OCSHARES_TABLE_NAME, null, values); + if (rowId >0) { + insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, rowId); + } else { + throw new SQLException("ERROR " + uri); + + } } else { - //Log_OC.d(TAG, "Error while inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); - throw new SQLException("ERROR " + uri); + // file is already inserted; race condition, let's avoid a duplicated entry + insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, doubleCheckShare.getLong(doubleCheckShare.getColumnIndex(ProviderTableMeta._ID))); + doubleCheckShare.close(); } - } else { - // file is already inserted; race condition, let's avoid a duplicated entry - Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, doubleCheck.getLong(doubleCheck.getColumnIndex(ProviderTableMeta._ID))); - doubleCheck.close(); - return insertedFileUri; + updateFilesTableAccordingToShareInsertion(db, uri, values); + return insertedShareUri; + + + default: + throw new IllegalArgumentException("Unknown uri id: " + uri); } + + } + + private void updateFilesTableAccordingToShareInsertion(SQLiteDatabase db, Uri uri, ContentValues shareValues) { + ContentValues fileValues = new ContentValues(); + fileValues.put(ProviderTableMeta.FILE_SHARE_BY_LINK, + ShareType.PUBLIC_LINK.getValue() == shareValues.getAsInteger(ProviderTableMeta.OCSHARES_SHARE_TYPE)? 1 : 0); + String whereShare = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?"; + String[] whereArgsShare = new String[] { + shareValues.getAsString(ProviderTableMeta.OCSHARES_PATH), + shareValues.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER) + }; + db.update(ProviderTableMeta.FILE_TABLE_NAME, fileValues, whereShare, whereArgsShare); } - + @Override public boolean onCreate() { mDbHelper = new DataBaseHelper(getContext()); @@ -345,7 +436,13 @@ public class FileContentProvider extends ContentProvider { + uri.getPathSegments().get(1)); } break; - case SHARES: //TODO + case SHARES: + sqlQuery.setTables(ProviderTableMeta.OCSHARES_TABLE_NAME); + sqlQuery.setProjectionMap(mOCSharesProjectionMap); + if (uri.getPathSegments().size() > 1) { + sqlQuery.appendWhere(ProviderTableMeta._ID + "=" + + uri.getPathSegments().get(1)); + } break; default: throw new IllegalArgumentException("Unknown uri id: " + uri); @@ -353,7 +450,12 @@ public class FileContentProvider extends ContentProvider { String order; if (TextUtils.isEmpty(sortOrder)) { - order = ProviderTableMeta.FILE_DEFAULT_SORT_ORDER; + if (mUriMatcher.match(uri) == SHARES) { + order = ProviderTableMeta.OCSHARES_DEFAULT_SORT_ORDER; + } else { + + order = ProviderTableMeta.FILE_DEFAULT_SORT_ORDER; + } } else { order = sortOrder; } @@ -361,15 +463,16 @@ public class FileContentProvider extends ContentProvider { // DB case_sensitive db.execSQL("PRAGMA case_sensitive_like = true"); Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order); + Log_OC.d(TAG, "setting notification URI: " + uri); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } - // TODO: switch(uri) @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - //Log_OC.d(TAG, "Updating " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); + Log_OC.d(TAG, "Updating " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this); + Log_OC.d(TAG, "Uri " + uri); int count = 0; SQLiteDatabase db = mDbHelper.getWritableDatabase(); db.beginTransaction(); @@ -380,21 +483,29 @@ public class FileContentProvider extends ContentProvider { db.endTransaction(); } getContext().getContentResolver().notifyChange(uri, null); + + // Get parentId to notify the change + long parentId = getParentId(uri); + // Notify the change to the parent folder + notifyChangeToParentUri(parentId); + return count; } - // TODO: switch(uri) + private int update(SQLiteDatabase db, Uri uri, ContentValues values, String selection, String[] selectionArgs) { switch (mUriMatcher.match(uri)) { case DIRECTORY: - return updateFolderSize(db, selectionArgs[0]); + return 0; //updateFolderSize(db, selectionArgs[0]); + case SHARES: + return db.update(ProviderTableMeta.OCSHARES_TABLE_NAME, values, selection, selectionArgs); default: return db.update(ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs); } } - + /* private int updateFolderSize(SQLiteDatabase db, String folderId) { int count = 0; String [] whereArgs = new String[] { folderId }; @@ -445,7 +556,7 @@ public class FileContentProvider extends ContentProvider { } return count; } - +*/ @Override public ContentProviderResult[] applyBatch (ArrayList operations) throws OperationApplicationException { @@ -499,6 +610,24 @@ public class FileContentProvider extends ContentProvider { + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER, " + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT );" ); + + // Create table ocshares + db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "(" + + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " + + ProviderTableMeta.OCSHARES_FILE_SOURCE + " INTEGER, " + + ProviderTableMeta.OCSHARES_ITEM_SOURCE + " INTEGER, " + + ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, " + + ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, " + + ProviderTableMeta.OCSHARES_PATH + " TEXT, " + + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, " + + ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, " + + ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, " + + ProviderTableMeta.OCSHARES_TOKEN + " TEXT, " + + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, " + + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean + + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, " + + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER," + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" ); } @Override @@ -596,8 +725,8 @@ public class FileContentProvider extends ContentProvider { + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, " + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, " - + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER );" - ); + + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER," + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" ); upgraded = true; db.setTransactionSuccessful();