X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/24dd513682cff1f55f7391bab4fb5a8d2ab266a6..ce7f7fa48c5cce2070a8e42ec19d1954a18db090:/src/com/owncloud/android/files/services/FileUploader.java diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 8f68554b..e16d75ce 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -20,7 +20,9 @@ package com.owncloud.android.files.services; import java.io.File; import java.util.AbstractList; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -34,12 +36,13 @@ import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.InstantUploadBroadcastReceiver; import com.owncloud.android.operations.ChunkedUploadFileOperation; -import com.owncloud.android.operations.DownloadFileOperation; import com.owncloud.android.operations.RemoteOperationResult; import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.ui.activity.FileDetailActivity; import com.owncloud.android.ui.fragment.FileDetailFragment; +import com.owncloud.android.ui.preview.PreviewImageActivity; +import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.OwnCloudVersion; import eu.alefzero.webdav.OnDatatransferProgressListener; @@ -118,8 +121,8 @@ public class FileUploader extends Service implements OnDatatransferProgressListe /** * Builds a key for mPendingUploads from the account and file to upload * - * @param account Account where the file to download is stored - * @param file File to download + * @param account Account where the file to upload is stored + * @param file File to upload */ private String buildRemoteName(Account account, OCFile file) { return account.name + file.getRemotePath(); @@ -254,6 +257,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe } mPendingUploads.putIfAbsent(uploadKey, newUpload); newUpload.addDatatransferProgressListener(this); + newUpload.addDatatransferProgressListener((FileUploaderBinder)mBinder); requestedUploads.add(uploadKey); } @@ -291,13 +295,28 @@ public class FileUploader extends Service implements OnDatatransferProgressListe public IBinder onBind(Intent arg0) { return mBinder; } + + /** + * Called when ALL the bound clients were onbound. + */ + @Override + public boolean onUnbind(Intent intent) { + ((FileUploaderBinder)mBinder).clearListeners(); + return false; // not accepting rebinding (default behaviour) + } + /** * Binder to let client components to perform operations on the queue of uploads. * * It provides by itself the available operations. */ - public class FileUploaderBinder extends Binder { + public class FileUploaderBinder extends Binder implements OnDatatransferProgressListener { + + /** + * Map of listeners that will be reported about progress of uploads from a {@link FileUploaderBinder} instance + */ + private Map mBoundListeners = new HashMap(); /** * Cancels a pending or current upload of a remote file. @@ -316,10 +335,18 @@ public class FileUploader extends Service implements OnDatatransferProgressListe } + + public void clearListeners() { + mBoundListeners.clear(); + } + + + + /** * Returns True when the file described by 'file' is being uploaded to the ownCloud account 'account' or waiting for it * - * If 'file' is a directory, returns 'true' if some of its descendant files is downloading or waiting to download. + * If 'file' is a directory, returns 'true' if some of its descendant files is uploading or waiting to upload. * * @param account Owncloud account where the remote file will be stored. * @param file A file that could be in the queue of pending uploads @@ -329,7 +356,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe String targetKey = buildRemoteName(account, file); synchronized (mPendingUploads) { if (file.isDirectory()) { - // this can be slow if there are many downloads :( + // this can be slow if there are many uploads :( Iterator it = mPendingUploads.keySet().iterator(); boolean found = false; while (it.hasNext() && !found) { @@ -344,29 +371,52 @@ public class FileUploader extends Service implements OnDatatransferProgressListe /** - * Adds a listener interested in the progress of the download for a concrete file. + * Adds a listener interested in the progress of the upload for a concrete file. * * @param listener Object to notify about progress of transfer. * @param account ownCloud account holding the file of interest. * @param file {@link OCfile} of interest for listener. */ public void addDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) { - if (account == null || file == null) return; + if (account == null || file == null || listener == null) return; String targetKey = buildRemoteName(account, file); - UploadFileOperation target = null; - synchronized (mPendingUploads) { - if (!file.isDirectory()) { - target = mPendingUploads.get(targetKey); - } else { - // nothing to do for directories, right now - } + mBoundListeners.put(targetKey, listener); + } + + + + /** + * Removes a listener interested in the progress of the upload for a concrete file. + * + * @param listener Object to notify about progress of transfer. + * @param account ownCloud account holding the file of interest. + * @param file {@link OCfile} of interest for listener. + */ + public void removeDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) { + if (account == null || file == null || listener == null) return; + String targetKey = buildRemoteName(account, file); + if (mBoundListeners.get(targetKey) == listener) { + mBoundListeners.remove(targetKey); } - if (target != null) { - target.addDatatransferProgressListener(listener); + } + + + @Override + public void onTransferProgress(long progressRate) { + // old way, should not be in use any more + } + + + @Override + public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, + String fileName) { + String key = buildRemoteName(mCurrentUpload.getAccount(), mCurrentUpload.getFile()); + OnDatatransferProgressListener boundListener = mBoundListeners.get(key); + if (boundListener != null) { + boundListener.onTransferProgress(progressRate, totalTransferredSoFar, totalToTransfer, fileName); } } - } @@ -519,7 +569,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe file.setMimetype(we.contentType()); file.setModificationTimestamp(we.modifiedTimestamp()); file.setModificationTimestampAtLastSyncForData(we.modifiedTimestamp()); - // file.setEtag(mCurrentDownload.getEtag()); // TODO Etag, where available + // file.setEtag(mCurrentUpload.getEtag()); // TODO Etag, where available } @@ -596,7 +646,13 @@ public class FileUploader extends Service implements OnDatatransferProgressListe mNotification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon); /// includes a pending intent in the notification showing the details view of the file - Intent showDetailsIntent = new Intent(this, FileDetailActivity.class); + Intent showDetailsIntent = null; + if (PreviewImageFragment.canBePreviewed(upload.getFile())) { + showDetailsIntent = new Intent(this, PreviewImageActivity.class); + } else { + showDetailsIntent = new Intent(this, FileDetailActivity.class); + showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS); + } showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, upload.getFile()); showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, upload.getAccount()); showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -649,7 +705,13 @@ public class FileUploader extends Service implements OnDatatransferProgressListe mNotification.contentView = mDefaultNotificationContentView; /// includes a pending intent in the notification showing the details view of the file - Intent showDetailsIntent = new Intent(this, FileDetailActivity.class); + Intent showDetailsIntent = null; + if (PreviewImageFragment.canBePreviewed(upload.getFile())) { + showDetailsIntent = new Intent(this, PreviewImageActivity.class); + } else { + showDetailsIntent = new Intent(this, FileDetailActivity.class); + showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS); + } showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, upload.getFile()); showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, upload.getAccount()); showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);