diff --git a/src/eu/alefzero/owncloud/cp.java b/src/eu/alefzero/owncloud/cp.java index e63de72660..e125905ba4 100644 --- a/src/eu/alefzero/owncloud/cp.java +++ b/src/eu/alefzero/owncloud/cp.java @@ -120,7 +120,7 @@ public class cp extends ContentProvider { } SQLiteDatabase db = mDbHelper.getWritableDatabase(); - long rowId = db.insert(ProviderTableMeta.DB_NAME, ProviderTableMeta.FILE_NAME, values); + 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); diff --git a/src/eu/alefzero/owncloud/datamodel/OCFile.java b/src/eu/alefzero/owncloud/datamodel/OCFile.java index 20e30fe2e9..bfa9963162 100644 --- a/src/eu/alefzero/owncloud/datamodel/OCFile.java +++ b/src/eu/alefzero/owncloud/datamodel/OCFile.java @@ -23,15 +23,17 @@ import java.util.Vector; import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; import android.accounts.Account; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; +import android.os.RemoteException; import android.util.Log; public class OCFile { private static String TAG = "OCFile"; - + private long id_; private long parent_id_; private long length_; @@ -40,99 +42,184 @@ public class OCFile { private String path_; private String storage_path_; private String mimetype_; - - private ContentResolver cp_; + + private ContentResolver cr_; + private ContentProviderClient cp_; private Account account_; - - public OCFile(ContentResolver cp, Account account, long id) { - cp_ = cp; + + public static OCFile createNewFile(ContentProviderClient cr, Account account, + String path, long length, long creation_timestamp, + long modified_timestamp, String mimetype, long parent_id) { + OCFile new_file = new OCFile(cr, account); + + try { + Cursor c = new_file.cp_.query(ProviderTableMeta.CONTENT_URI_FILE, null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?", new String[]{new_file.account_.name, + path}, null); + if (c.moveToFirst()) + new_file.setFileData(c); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage()); + } + + new_file.path_ = path; + new_file.length_ = length; + new_file.creation_timestamp_ = creation_timestamp; + new_file.modified_timestamp_ = modified_timestamp; + new_file.mimetype_ = mimetype; + new_file.parent_id_ = parent_id; + Log.e(TAG, parent_id+""); + + return new_file; + } + + public OCFile(ContentResolver cr, Account account, long id) { + cr_ = cr; account_ = account; - Cursor c = cp_.query(ProviderTableMeta.CONTENT_URI_FILE, - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + - ProviderTableMeta._ID + "=?", - new String[]{account_.name, String.valueOf(id)}, - null); + Cursor c = cr_.query(ProviderTableMeta.CONTENT_URI_FILE, null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta._ID + "=?", + new String[]{account_.name, String.valueOf(id)}, null); if (c.moveToFirst()) setFileData(c); } - - public OCFile(ContentResolver cp, Account account, String path) { - cp_ = cp; + + public OCFile(ContentResolver cr, Account account, String path) { + cr_ = cr; account_ = account; - Cursor c = cp_.query(ProviderTableMeta.CONTENT_URI_FILE, - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + - ProviderTableMeta.FILE_PATH + "=?", - new String[]{account_.name, path}, - null); + + Cursor c = cr_.query(ProviderTableMeta.CONTENT_URI_FILE, null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?", new String[]{account_.name, + path}, null); if (c.moveToFirst()) { setFileData(c); - if (path_ != null) path_ = path; + if (path_ != null) + path_ = path; } } - - public long getFileId() { return id_; } - - public String getPath() { return path_; } - - public boolean fileExtist() { return id_ != -1; } - - public boolean isDirectory() { return mimetype_ != null && mimetype_.equals("dir"); } - - public boolean isDownloaded() { return storage_path_ != null; } - - public String getStoragePath() { return storage_path_; } - public void setStoragePath(String storage_path) { storage_path_ = storage_path; } - - public long getCreationTimestamp() { return creation_timestamp_; } - public void setCreationTimestamp(long creation_timestamp) { creation_timestamp_ = creation_timestamp; } - public long getModificationTimestamp() { return modified_timestamp_; } - public void setModificationTimestamp(long modification_timestamp) { modified_timestamp_ = modification_timestamp; } + public long getFileId() { + return id_; + } + + public String getPath() { + return path_; + } + + public boolean fileExtist() { + return id_ != -1; + } + + public boolean isDirectory() { + return mimetype_ != null && mimetype_.equals("DIR"); + } + + public boolean isDownloaded() { + return storage_path_ != null; + } + + public String getStoragePath() { + return storage_path_; + } + public void setStoragePath(String storage_path) { + storage_path_ = storage_path; + } + + public long getCreationTimestamp() { + return creation_timestamp_; + } + public void setCreationTimestamp(long creation_timestamp) { + creation_timestamp_ = creation_timestamp; + } + + public long getModificationTimestamp() { + return modified_timestamp_; + } + public void setModificationTimestamp(long modification_timestamp) { + modified_timestamp_ = modification_timestamp; + } public String getFileName() { if (path_ != null) { File f = new File(path_); - return f.getName(); + return f.getName().equals("") ? "/" : f.getName(); } return null; } + public String getMimetype() { + return mimetype_; + } + public void save() { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.FILE_MODIFIED, modified_timestamp_); cv.put(ProviderTableMeta.FILE_CREATION, creation_timestamp_); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, length_); - cv.put(ProviderTableMeta.CONTENT_TYPE, mimetype_); + cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, mimetype_); cv.put(ProviderTableMeta.FILE_NAME, getFileName()); - cv.put(ProviderTableMeta.FILE_PARENT, parent_id_); + if (parent_id_ != 0) + cv.put(ProviderTableMeta.FILE_PARENT, parent_id_); cv.put(ProviderTableMeta.FILE_PATH, path_); cv.put(ProviderTableMeta.FILE_STORAGE_PATH, storage_path_); cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, account_.name); - + if (fileExtist()) { - cp_.update(ProviderTableMeta.CONTENT_URI, - cv, - ProviderTableMeta._ID + "=?", new String[]{String.valueOf(id_)}); + if (cp_ != null) { + try { + cp_.update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + + "=?", new String[]{String.valueOf(id_)}); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage()); + return; + } + } else { + cr_.update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + + "=?", new String[]{String.valueOf(id_)}); + } } else { - Uri new_entry = cp_.insert(ProviderTableMeta.CONTENT_URI, cv); + Uri new_entry = null; + if (cp_ != null) { + try { + new_entry = cp_.insert(ProviderTableMeta.CONTENT_URI_FILE, cv); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage()); + id_ = -1; + return; + } + } else { + new_entry = cr_.insert(ProviderTableMeta.CONTENT_URI_FILE, cv); + } try { - id_ = Integer.parseInt(new_entry.getEncodedPath()); - } catch (NumberFormatException e) { - Log.e(TAG, "Can't retrieve file id from uri: " + new_entry.toString() + - ", reason: " + e.getMessage()); - id_ = -1; + String p = new_entry.getEncodedPath(); + id_ = Integer.parseInt(p.substring(p.lastIndexOf('/')+1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Can't retrieve file id from uri: " + new_entry.toString() + + ", reason: " + e.getMessage()); + id_ = -1; } } } - + public Vector getDirectoryContent() { if (isDirectory() && id_ != -1) { Vector ret = new Vector(); - Uri req_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, String.valueOf(id_)); - Cursor c = cp_.query(req_uri, null, null, null, null); + Uri req_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, + String.valueOf(id_)); + Cursor c = null; + if (cp_ != null) { + try { + c = cp_.query(req_uri, null, null, null, null); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage()); + return ret; + } + } else { + c = cr_.query(req_uri, null, null, null, null); + } if (c.moveToFirst()) do { @@ -145,33 +232,51 @@ public class OCFile { } return null; } - + public void addFile(OCFile file) { file.parent_id_ = id_; file.save(); } - private OCFile(ContentResolver cp, Account account) { + private OCFile(ContentProviderClient cp, Account account) { account_ = account; cp_ = cp; + resetData(); } - - private void setFileData(Cursor c) { + + private OCFile(ContentResolver cr, Account account) { + account_ = account; + cr_ = cr; + resetData(); + } + + private void resetData() { id_ = -1; path_ = null; + parent_id_ = 0; storage_path_ = null; mimetype_ = null; length_ = 0; creation_timestamp_ = 0; - modified_timestamp_ = 0; + modified_timestamp_ = 0; + } + + private void setFileData(Cursor c) { + resetData(); if (c != null) { id_ = c.getLong(c.getColumnIndex(ProviderTableMeta._ID)); path_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH)); - storage_path_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH)); - mimetype_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)); - length_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH)); - creation_timestamp_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_CREATION)); - modified_timestamp_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_MODIFIED)); + parent_id_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_PARENT)); + storage_path_ = c.getString(c + .getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH)); + mimetype_ = c.getString(c + .getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)); + length_ = c.getLong(c + .getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH)); + creation_timestamp_ = c.getLong(c + .getColumnIndex(ProviderTableMeta.FILE_CREATION)); + modified_timestamp_ = c.getLong(c + .getColumnIndex(ProviderTableMeta.FILE_MODIFIED)); } } } diff --git a/src/eu/alefzero/owncloud/syncadapter/AbstractOwnCloudSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/AbstractOwnCloudSyncAdapter.java index e4bacf2950..ff1f81857a 100644 --- a/src/eu/alefzero/owncloud/syncadapter/AbstractOwnCloudSyncAdapter.java +++ b/src/eu/alefzero/owncloud/syncadapter/AbstractOwnCloudSyncAdapter.java @@ -39,10 +39,13 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; +import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.text.TextUtils; +import android.util.Log; import eu.alefzero.owncloud.authenticator.AccountAuthenticator; +import eu.alefzero.owncloud.datamodel.OCFile; import eu.alefzero.webdav.HttpPropFind; import eu.alefzero.webdav.TreeNode; import eu.alefzero.webdav.WebdavClient; @@ -134,8 +137,8 @@ public abstract class AbstractOwnCloudSyncAdapter extends AbstractThreadedSyncAd HttpResponse response = fireRawRequest(query); TreeNode root = new TreeNode(); - root.setProperty(TreeNode.NodeProperty.NAME, "/"); - this.parseResponse(response, getUri(), getClient(), mHost, root.getChildList()); + root.setProperty(TreeNode.NodeProperty.NAME, ""); + this.parseResponse(response, getUri(), getClient(), mHost, root.getChildList(), false, 0); return root; } @@ -161,22 +164,37 @@ public abstract class AbstractOwnCloudSyncAdapter extends AbstractThreadedSyncAd return mClient.getHttpClient(); } - private void parseResponse(HttpResponse resp, Uri uri, DefaultHttpClient client, HttpHost targetHost, LinkedList insertList) throws IOException, OperationCanceledException, AuthenticatorException { - boolean skipFirst = true; - for (TreeNode n :WebdavUtils.parseResponseToNodes(resp.getEntity().getContent())) { - String path = n.stripPathFromFilename(uri.getPath()); - if (skipFirst) { - skipFirst = false; - continue; + private void parseResponse(HttpResponse resp, Uri uri, DefaultHttpClient client, HttpHost targetHost, LinkedList insertList, boolean sf, long parent_id) throws IOException, OperationCanceledException, AuthenticatorException { + boolean skipFirst = sf, override_parent = true; + for (TreeNode n :WebdavUtils.parseResponseToNodes(resp.getEntity().getContent())) { + if (skipFirst) { + skipFirst = false; + continue; + } + String path = n.stripPathFromFilename(uri.getPath()); + OCFile new_file = OCFile.createNewFile(getContentProvider(), + getAccount(), + n.getProperty(NodeProperty.PATH), + 0,//Long.parseLong(n.getProperty(NodeProperty.CONTENT_LENGTH)), + 0,//Long.parseLong(n.getProperty(NodeProperty.CREATE_DATE)), + 0,//Long.parseLong(n.getProperty(NodeProperty.LAST_MODIFIED_DATE)), + n.getProperty(NodeProperty.RESOURCE_TYPE), + parent_id); + new_file.save(); + Log.e("ASD", new_file.getFileId()+""); + Log.e("ASD", new_file.getFileName()+""); + Log.e("ASD", new_file.getPath()+""); + if (override_parent) { + parent_id = new_file.getFileId(); + override_parent = false; } - insertList.add(n); if (!TextUtils.isEmpty(n.getProperty(NodeProperty.NAME)) && n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) { HttpPropFind method = new HttpPropFind(uri.getPath() + path + n.getProperty(NodeProperty.NAME).replace(" ", "%20") + "/"); HttpResponse response = fireRawRequest(method); - parseResponse(response, uri, client, targetHost, n.getChildList()); + parseResponse(response, uri, client, targetHost, n.getChildList(), true, new_file.getFileId()); } } } diff --git a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java index dc18a5b14f..96cf520a5a 100644 --- a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java +++ b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java @@ -69,7 +69,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { query.setEntity(new StringEntity(WebdavUtils.prepareXmlForPropFind())); TreeNode root = this.fireRequest(query); - commitToDatabase(root, null); + // commitToDatabase(root, null); } catch (OperationCanceledException e) { e.printStackTrace(); } catch (AuthenticatorException e) { @@ -78,9 +78,9 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { } catch (IOException e) { syncResult.stats.numIoExceptions++; e.printStackTrace(); - } catch (RemoteException e) { - e.printStackTrace(); - } + }// catch (RemoteException e) { + // e.printStackTrace(); + //} } private void commitToDatabase(TreeNode root, String parentId) throws RemoteException { diff --git a/src/eu/alefzero/owncloud/ui/adapter/FileListListAdapter.java b/src/eu/alefzero/owncloud/ui/adapter/FileListListAdapter.java index 6bb8c10678..f29ebc097b 100644 --- a/src/eu/alefzero/owncloud/ui/adapter/FileListListAdapter.java +++ b/src/eu/alefzero/owncloud/ui/adapter/FileListListAdapter.java @@ -17,14 +17,18 @@ */ package eu.alefzero.owncloud.ui.adapter; +import java.util.Vector; + import eu.alefzero.owncloud.DisplayUtils; import eu.alefzero.owncloud.R; +import eu.alefzero.owncloud.datamodel.OCFile; import eu.alefzero.owncloud.db.ProviderMeta; import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; import android.content.Context; import android.database.Cursor; import android.database.DataSetObserver; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -39,12 +43,13 @@ import android.widget.TextView; * */ public class FileListListAdapter implements ListAdapter { - - private Cursor mCursor; private Context mContext; + private OCFile mFile; + private Vector mFiles; - public FileListListAdapter(Cursor c, Context context) { - mCursor = c; + public FileListListAdapter(OCFile f, Context context) { + mFile = f; + mFiles = mFile.getDirectoryContent(); mContext = context; } @@ -59,12 +64,13 @@ public class FileListListAdapter implements ListAdapter { public int getCount() { // TODO Auto-generated method stub - return mCursor.getCount(); + return mFiles.size(); } public Object getItem(int position) { - // TODO Auto-generated method stub - return null; + if (mFiles.size() <= position) + return null; + return mFiles.get(position); } public long getItemId(int position) { @@ -83,15 +89,16 @@ public class FileListListAdapter implements ListAdapter { LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_layout, null); } - if (mCursor.moveToPosition(position)) { + if (mFiles.size() > position) { + OCFile f = mFiles.get(position); TextView tv = (TextView) v.findViewById(R.id.Filename); - tv.setText(DisplayUtils.HtmlDecode(mCursor.getString(mCursor.getColumnIndex(ProviderMeta.ProviderTableMeta.FILE_NAME)))); - if (!mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)).equals("DIR")) { + tv.setText(DisplayUtils.HtmlDecode(f.getFileName())); + if (!f.getMimetype().equals("DIR")) { ImageView iv = (ImageView) v.findViewById(R.id.imageView1); iv.setImageResource(R.drawable.file); } } - + return v; } diff --git a/src/eu/alefzero/owncloud/ui/fragment/FileList.java b/src/eu/alefzero/owncloud/ui/fragment/FileList.java index cf5eaf3836..4b1c53bd3f 100644 --- a/src/eu/alefzero/owncloud/ui/fragment/FileList.java +++ b/src/eu/alefzero/owncloud/ui/fragment/FileList.java @@ -18,6 +18,7 @@ package eu.alefzero.owncloud.ui.fragment; import java.util.Stack; +import java.util.Vector; import android.accounts.Account; import android.accounts.AccountManager; @@ -46,11 +47,11 @@ import eu.alefzero.owncloud.ui.adapter.FileListListAdapter; * */ public class FileList extends FragmentListView { - private Cursor mCursor; private Account mAccount; private AccountManager mAccountManager; private Stack mDirNames; private Stack mParentsIds; + private Vector mFiles; public FileList() { mDirNames = new Stack(); @@ -68,12 +69,13 @@ public class FileList extends FragmentListView { @Override public void onItemClick(AdapterView l, View v, int position, long id) { - if (!mCursor.moveToPosition(position)) { + if (mFiles.size() <= position) { throw new IndexOutOfBoundsException("Incorrect item selected"); } - String id_ = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta._ID)); - if (mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)).equals("DIR")) { - String dirname = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_NAME)); + OCFile file = mFiles.get(position); + String id_ = String.valueOf(file.getFileId()); + if (file.getMimetype().equals("DIR")) { + String dirname = file.getFileName(); mDirNames.push(dirname); mParentsIds.push(id_); @@ -103,24 +105,12 @@ public class FileList extends FragmentListView { } private void populateFileList() { - if (mParentsIds.empty()) { - OCFile file = new OCFile(getActivity().getContentResolver(), mAccount, "/"); - Log.d("ASD", file.getFileName()+""); - Log.d("ASD", file.getFileId()+""); - if (file.getDirectoryContent() != null) - Log.d("ASD", file.getDirectoryContent().size()+""); - - mCursor = getActivity().getContentResolver().query(ProviderTableMeta.CONTENT_URI, - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?", - new String[]{mAccount.name}, - null); - } else { - mCursor = getActivity().managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, mParentsIds.peek()), - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", - new String[]{mAccount.name}, null); - } - setListAdapter(new FileListListAdapter(mCursor, getActivity())); + String s = "/"; + for (String a : mDirNames) + s+= a+"/"; + + OCFile file = new OCFile(getActivity().getContentResolver(), mAccount, s); + mFiles = file.getDirectoryContent(); + setListAdapter(new FileListListAdapter(file, getActivity())); } } diff --git a/src/eu/alefzero/webdav/TreeNode.java b/src/eu/alefzero/webdav/TreeNode.java index 2919acce74..4a7ef99ad8 100644 --- a/src/eu/alefzero/webdav/TreeNode.java +++ b/src/eu/alefzero/webdav/TreeNode.java @@ -81,9 +81,6 @@ public class TreeNode { path = name.substring(0, name.lastIndexOf('/')+1); name = name.substring(name.lastIndexOf('/')+1); name = name.replace("%20", " "); - if (TextUtils.isEmpty(name)) { - name = "/"; - } propertyMap_.remove(NodeProperty.NAME); propertyMap_.put(NodeProperty.NAME, name); diff --git a/src/eu/alefzero/webdav/WebdavUtils.java b/src/eu/alefzero/webdav/WebdavUtils.java index 515255f263..5cbfebecd3 100644 --- a/src/eu/alefzero/webdav/WebdavUtils.java +++ b/src/eu/alefzero/webdav/WebdavUtils.java @@ -145,12 +145,12 @@ public class WebdavUtils { if (currentElement.getElementsByTagName(davPrefix + LAST_MODIFIED).getLength() != 0) { Date date = parseResponseDate( currentElement.getElementsByTagName(davPrefix + LAST_MODIFIED).item(0).getFirstChild().getNodeValue()); - resultNode.setProperty(NodeProperty.LAST_MODIFIED_DATE, DISPLAY_DATE_FORMAT.format(date)); + resultNode.setProperty(NodeProperty.LAST_MODIFIED_DATE, String.valueOf(date.getTime())); } if (currentElement.getElementsByTagName(davPrefix + CREATE_DATE).getLength() != 0) { Date date = parseResponseDate( currentElement.getElementsByTagName(davPrefix + CREATE_DATE).item(0).getFirstChild().getNodeValue()); - resultNode.setProperty(NodeProperty.CREATE_DATE, DISPLAY_DATE_FORMAT.format(date)); + resultNode.setProperty(NodeProperty.CREATE_DATE, String.valueOf(date)); } }