X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b0ab3ce0872d2702e82b5979dddaa5a897be340b..de94751cde3af2e78212f043d3d0c2aed90f69a8:/src/com/owncloud/android/syncadapter/FileSyncAdapter.java diff --git a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java index 1e833753..8c9a1535 100644 --- a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -34,6 +34,7 @@ import com.owncloud.android.authenticator.AccountAuthenticator; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; +import com.owncloud.android.files.services.FileObserverService; import com.owncloud.android.utils.OwnCloudVersion; import android.accounts.Account; @@ -149,7 +150,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { Notification notification = new Notification(R.drawable.icon, getContext().getString(R.string.sync_fail_ticker), System.currentTimeMillis()); notification.flags |= Notification.FLAG_AUTO_CANCEL; // TODO put something smart in the contentIntent below - notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT); + notification.contentIntent = PendingIntent.getActivity(getContext().getApplicationContext(), (int)System.currentTimeMillis(), new Intent(), 0); notification.setLatestEventInfo(getContext().getApplicationContext(), getContext().getString(R.string.sync_fail_ticker), String.format(getContext().getString(R.string.sync_fail_content), account.name), @@ -184,6 +185,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { private void fetchData(String uri, SyncResult syncResult, long parentId) { PropFindMethod query = null; + Vector children = null; try { Log.d(TAG, "fetching " + uri); @@ -210,12 +212,15 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { getStorageManager().getFileByPath(file.getRemotePath()).keepInSync() && file.getModificationTimestamp() > getStorageManager().getFileByPath(file.getRemotePath()) .getModificationTimestamp()) { - Intent intent = new Intent(this.getContext(), FileDownloader.class); + // first disable observer so we won't get file upload right after download + Log.d(TAG, "Disabling observation of remote file" + file.getRemotePath()); + Intent intent = new Intent(getContext(), FileObserverService.class); + intent.putExtra(FileObserverService.KEY_FILE_CMD, FileObserverService.CMD_ADD_DOWNLOADING_FILE); + intent.putExtra(FileObserverService.KEY_CMD_ARG, file.getRemotePath()); + getContext().startService(intent); + intent = new Intent(this.getContext(), FileDownloader.class); intent.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount()); intent.putExtra(FileDownloader.EXTRA_FILE, file); - /*intent.putExtra(FileDownloader.EXTRA_FILE_PATH, file.getRemotePath()); - intent.putExtra(FileDownloader.EXTRA_REMOTE_PATH, file.getRemotePath()); - intent.putExtra(FileDownloader.EXTRA_FILE_SIZE, file.getFileLength());*/ file.setKeepInSync(true); getContext().startService(intent); } @@ -224,8 +229,6 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { // Log.v(TAG, "adding file: " + file); updatedFiles.add(file); - if (parentId == 0) - parentId = file.getFileId(); } /* Commented code for ugly performance tests long saveDelay = System.currentTimeMillis(); @@ -237,39 +240,21 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { */ // removal of obsolete files - Vector files = getStorageManager().getDirectoryContent( + children = getStorageManager().getDirectoryContent( getStorageManager().getFileById(parentId)); OCFile file; String currentSavePath = FileDownloader.getSavePath(getAccount().name); - for (int i=0; i < files.size(); ) { - file = files.get(i); + for (int i=0; i < children.size(); ) { + file = children.get(i); if (file.getLastSyncDate() != mCurrentSyncTime) { Log.v(TAG, "removing file: " + file); getStorageManager().removeFile(file, (file.isDown() && file.getStoragePath().startsWith(currentSavePath))); - files.remove(i); + children.remove(i); } else { i++; } } - // recursive fetch - for (int i=0; i < files.size() && !mCancellation; i++) { - OCFile newFile = files.get(i); - if (newFile.getMimetype().equals("DIR")) { - fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId()); - } - } - if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request"); - - /* Commented code for ugly performance tests - mResponseDelays[mDelaysIndex] = responseDelay; - mSaveDelays[mDelaysIndex] = saveDelay; - mDelaysCount++; - mDelaysIndex++; - if (mDelaysIndex >= MAX_DELAYS) - mDelaysIndex = 0; - */ - } else { syncResult.stats.numAuthExceptions++; } @@ -293,8 +278,39 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { // synchronized folder -> notice to UI sendStickyBroadcast(true, getStorageManager().getFileById(parentId).getRemotePath()); } + + + fetchChildren(children, syncResult); + if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request"); + + + /* Commented code for ugly performance tests + mResponseDelays[mDelaysIndex] = responseDelay; + mSaveDelays[mDelaysIndex] = saveDelay; + mDelaysCount++; + mDelaysIndex++; + if (mDelaysIndex >= MAX_DELAYS) + mDelaysIndex = 0; + */ + + } + + /** + * Synchronize data of folders in the list of received files + * + * @param files Files to recursively fetch + * @param syncResult Updated object to provide results to the Synchronization Manager + */ + private void fetchChildren(Vector files, SyncResult syncResult) { + for (int i=0; i < files.size() && !mCancellation; i++) { + OCFile newFile = files.get(i); + if (newFile.getMimetype().equals("DIR")) { + fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId()); + } + } } + private OCFile fillOCFile(WebdavEntry we) { OCFile file = new OCFile(we.decodedPath()); file.setCreationTimestamp(we.createTimestamp());