7055b2afc89adea96168dd9191bc267bb60244c6
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / providers / FileContentProvider.java
1 /* ownCloud Android client application
2 * Copyright (C) 2011 Bartek Przybylski
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18
19 package eu.alefzero.owncloud.providers;
20
21 import java.util.HashMap;
22
23 import eu.alefzero.owncloud.db.ProviderMeta;
24 import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;
25
26 import android.content.ContentProvider;
27 import android.content.ContentUris;
28 import android.content.ContentValues;
29 import android.content.Context;
30 import android.content.UriMatcher;
31 import android.database.Cursor;
32 import android.database.SQLException;
33 import android.database.sqlite.SQLiteDatabase;
34 import android.database.sqlite.SQLiteOpenHelper;
35 import android.database.sqlite.SQLiteQueryBuilder;
36 import android.net.Uri;
37 import android.text.TextUtils;
38
39 /**
40 * The ContentProvider for the ownCloud App.
41 * @author Bartek Przybylski
42 *
43 */
44 public class FileContentProvider extends ContentProvider {
45
46 private DataBaseHelper mDbHelper;
47
48 private static HashMap<String, String> mProjectionMap;
49 static {
50 mProjectionMap = new HashMap<String, String>();
51 mProjectionMap.put(ProviderTableMeta._ID,
52 ProviderTableMeta._ID);
53 mProjectionMap.put(ProviderTableMeta.FILE_PARENT,
54 ProviderTableMeta.FILE_PARENT);
55 mProjectionMap.put(ProviderTableMeta.FILE_PATH,
56 ProviderTableMeta.FILE_PATH);
57 mProjectionMap.put(ProviderTableMeta.FILE_NAME,
58 ProviderTableMeta.FILE_NAME);
59 mProjectionMap.put(ProviderTableMeta.FILE_CREATION,
60 ProviderTableMeta.FILE_CREATION);
61 mProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,
62 ProviderTableMeta.FILE_MODIFIED);
63 mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,
64 ProviderTableMeta.FILE_CONTENT_LENGTH);
65 mProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,
66 ProviderTableMeta.FILE_CONTENT_TYPE);
67 mProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,
68 ProviderTableMeta.FILE_STORAGE_PATH);
69 }
70
71 private static final int SINGLE_FILE = 1;
72 private static final int DIRECTORY = 2;
73 private static final int ROOT_DIRECTORY = 3;
74 private static final UriMatcher mUriMatcher;
75 static {
76 mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
77 mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "/", ROOT_DIRECTORY);
78 mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);
79 mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);
80 mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);
81 }
82
83 @Override
84 public int delete(Uri uri, String where, String[] whereArgs) {
85 SQLiteDatabase db = mDbHelper.getWritableDatabase();
86 int count = 0;
87 switch (mUriMatcher.match(uri)) {
88 case SINGLE_FILE:
89 count = db.delete(ProviderTableMeta.DB_NAME,
90 ProviderTableMeta._ID + "=" + uri.getPathSegments().get(1)
91 + (!TextUtils.isEmpty(where)?" AND (" + where +")" : ""),
92 whereArgs);
93 break;
94 case ROOT_DIRECTORY:
95 count = db.delete(ProviderTableMeta.DB_NAME, where, whereArgs);
96 break;
97 default:
98 throw new IllegalArgumentException("Unknown uri: " + uri.toString());
99 }
100 getContext().getContentResolver().notifyChange(uri, null);
101 return count;
102 }
103
104 @Override
105 public String getType(Uri uri) {
106 switch (mUriMatcher.match(uri)) {
107 case ROOT_DIRECTORY:
108 return ProviderTableMeta.CONTENT_TYPE;
109 case SINGLE_FILE:
110 return ProviderTableMeta.CONTENT_TYPE_ITEM;
111 default:
112 throw new IllegalArgumentException("Unknown Uri id." + uri.toString());
113 }
114 }
115
116 @Override
117 public Uri insert(Uri uri, ContentValues values) {
118 if (mUriMatcher.match(uri) != SINGLE_FILE) {
119 throw new IllegalArgumentException("Unknown uri id: " + uri);
120 }
121
122 SQLiteDatabase db = mDbHelper.getWritableDatabase();
123 long rowId = db.insert(ProviderTableMeta.DB_NAME, null, values);
124 if (rowId > 0) {
125 Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);
126 getContext().getContentResolver().notifyChange(insertedFileUri, null);
127 return insertedFileUri;
128 }
129 throw new SQLException("ERROR " + uri);
130 }
131
132 @Override
133 public boolean onCreate() {
134 mDbHelper = new DataBaseHelper(getContext());
135 return true;
136 }
137
138 @Override
139 public Cursor query(Uri uri, String[] projection, String selection,
140 String[] selectionArgs, String sortOrder) {
141 SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();
142
143 sqlQuery.setTables(ProviderTableMeta.DB_NAME);
144 sqlQuery.setProjectionMap(mProjectionMap);
145
146 switch (mUriMatcher.match(uri)) {
147 case ROOT_DIRECTORY:
148 break;
149 case DIRECTORY:
150 sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="+uri.getPathSegments().get(1));
151 break;
152 case SINGLE_FILE:
153 if (uri.getPathSegments().size() > 1) {
154 sqlQuery.appendWhere(ProviderTableMeta._ID + "=" +
155 uri.getPathSegments().get(1));
156 }
157 break;
158 default:
159 throw new IllegalArgumentException("Unknown uri id: " + uri);
160 }
161
162 String order;
163 if (TextUtils.isEmpty(sortOrder)) {
164 order = ProviderTableMeta.DEFAULT_SORT_ORDER;
165 } else {
166 order = sortOrder;
167 }
168
169 SQLiteDatabase db = mDbHelper.getReadableDatabase();
170 Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order);
171
172 c.setNotificationUri(getContext().getContentResolver(), uri);
173
174 return c;
175 }
176
177 @Override
178 public int update(Uri uri, ContentValues values, String selection,
179 String[] selectionArgs) {
180 return mDbHelper.getWritableDatabase().update(ProviderTableMeta.DB_NAME, values, selection, selectionArgs);
181 }
182
183 class DataBaseHelper extends SQLiteOpenHelper {
184
185 public DataBaseHelper(Context context) {
186 super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION);
187
188 }
189
190 @Override
191 public void onCreate(SQLiteDatabase db) {
192 db.execSQL("CREATE TABLE " + ProviderTableMeta.DB_NAME + "(" +
193 ProviderTableMeta._ID + " INTEGER PRIMARY KEY, " +
194 ProviderTableMeta.FILE_NAME + " TEXT, " +
195 ProviderTableMeta.FILE_PATH + " TEXT, " +
196 ProviderTableMeta.FILE_PARENT + " INTEGER, " +
197 ProviderTableMeta.FILE_CREATION + " INTEGER, " +
198 ProviderTableMeta.FILE_MODIFIED + " INTEGER, " +
199 ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, " +
200 ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, " +
201 ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, " +
202 ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT);");
203 }
204
205 @Override
206 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
207
208 }
209
210 }
211
212 }