\r
import java.io.File;\r
import java.util.AbstractList;\r
+import java.util.HashMap;\r
import java.util.Iterator;\r
+import java.util.Map;\r
import java.util.Vector;\r
import java.util.concurrent.ConcurrentHashMap;\r
import java.util.concurrent.ConcurrentMap;\r
import android.os.Message;\r
import android.os.Process;\r
import android.util.Log;\r
-import android.widget.ProgressBar;\r
import android.widget.RemoteViews;\r
\r
import com.owncloud.android.R;\r
DownloadFileOperation newDownload = new DownloadFileOperation(account, file); \r
mPendingDownloads.putIfAbsent(downloadKey, newDownload);\r
newDownload.addDatatransferProgressListener(this);\r
+ newDownload.addDatatransferProgressListener((FileDownloaderBinder)mBinder);\r
requestedDownloads.add(downloadKey);\r
sendBroadcastNewDownload(newDownload);\r
\r
return mBinder;\r
}\r
\r
+\r
+ /**\r
+ * Called when ALL the bound clients were onbound.\r
+ */\r
+ @Override\r
+ public boolean onUnbind(Intent intent) {\r
+ ((FileDownloaderBinder)mBinder).clearListeners();\r
+ return false; // not accepting rebinding (default behaviour)\r
+ }\r
+\r
\r
/**\r
* Binder to let client components to perform operations on the queue of downloads.\r
* \r
* It provides by itself the available operations.\r
*/\r
- public class FileDownloaderBinder extends Binder {\r
+ public class FileDownloaderBinder extends Binder implements OnDatatransferProgressListener {\r
+ \r
+ /** \r
+ * Map of listeners that will be reported about progress of downloads from a {@link FileDownloaderBinder} instance \r
+ */\r
+ private Map<String, OnDatatransferProgressListener> mBoundListeners = new HashMap<String, OnDatatransferProgressListener>();\r
+ \r
\r
/**\r
* Cancels a pending or current download of a remote file.\r
}\r
\r
\r
+ public void clearListeners() {\r
+ mBoundListeners.clear();\r
+ }\r
+\r
+\r
/**\r
* Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or waiting to download.\r
* \r
* @param file {@link OCfile} of interest for listener. \r
*/\r
public void addDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) {\r
- if (account == null || file == null) return;\r
+ if (account == null || file == null || listener == null) return;\r
String targetKey = buildRemoteName(account, file);\r
- DownloadFileOperation target = null;\r
- synchronized (mPendingDownloads) {\r
- if (!file.isDirectory()) {\r
- target = mPendingDownloads.get(targetKey);\r
- } else {\r
- // nothing to do for directories, right now\r
- }\r
- }\r
- if (target != null) {\r
- target.addDatatransferProgressListener(listener);\r
- }\r
+ mBoundListeners.put(targetKey, listener);\r
}\r
\r
\r
+ \r
/**\r
* Removes a listener interested in the progress of the download for a concrete file.\r
* \r
* @param file {@link OCfile} of interest for listener. \r
*/\r
public void removeDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) {\r
- if (account == null || file == null) return;\r
+ if (account == null || file == null || listener == null) return;\r
String targetKey = buildRemoteName(account, file);\r
- DownloadFileOperation target = null;\r
- synchronized (mPendingDownloads) {\r
- if (!file.isDirectory()) {\r
- target = mPendingDownloads.get(targetKey);\r
- } else {\r
- // nothing to do for directories, right now\r
- }\r
+ if (mBoundListeners.get(targetKey) == listener) {\r
+ mBoundListeners.remove(targetKey);\r
}\r
- if (target != null) {\r
- target.removeDatatransferProgressListener(listener);\r
+ }\r
+\r
+\r
+ @Override\r
+ public void onTransferProgress(long progressRate) {\r
+ // old way, should not be in use any more\r
+ }\r
+\r
+\r
+ @Override\r
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer,\r
+ String fileName) {\r
+ String key = buildRemoteName(mCurrentDownload.getAccount(), mCurrentDownload.getFile());\r
+ OnDatatransferProgressListener boundListener = mBoundListeners.get(key);\r
+ if (boundListener != null) {\r
+ boundListener.onTransferProgress(progressRate, totalTransferredSoFar, totalToTransfer, fileName);\r
}\r
}\r
\r
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;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.InstantUploadBroadcastReceiver;
+import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.operations.ChunkedUploadFileOperation;
import com.owncloud.android.operations.DownloadFileOperation;
import com.owncloud.android.operations.RemoteOperationResult;
}
mPendingUploads.putIfAbsent(uploadKey, newUpload);
newUpload.addDatatransferProgressListener(this);
+ newUpload.addDatatransferProgressListener((FileUploaderBinder)mBinder);
requestedUploads.add(uploadKey);
}
public IBinder onBind(Intent arg0) {
return mBinder;
}
+
+ /**
+ * Called when ALL the bound clients were onbound.
+ */
+ @Override
+ public boolean onUnbind(Intent intent) {
+ ((FileDownloaderBinder)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 FileDownloaderBinder} instance
+ */
+ private Map<String, OnDatatransferProgressListener> mBoundListeners = new HashMap<String, OnDatatransferProgressListener>();
/**
* Cancels a pending or current upload of a remote file.
}
+
+ 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
*
* @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 download 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);
}
}
-
}
private ServiceConnection mDownloadConnection, mUploadConnection = null;\r
private FileUploaderBinder mUploaderBinder = null;\r
private boolean mWaitingToPreview;\r
-\r
- public ProgressListener mProgressListener;\r
\r
\r
@Override\r
\r
@Override\r
public void onServiceConnected(ComponentName component, IBinder service) {\r
- Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);\r
- FileDetailFragment detailsFragment = (fragment instanceof FileDetailFragment) ? (FileDetailFragment) fragment : null;\r
\r
if (component.equals(new ComponentName(FileDetailActivity.this, FileDownloader.class))) {\r
Log.d(TAG, "Download service connected");\r
mDownloaderBinder = (FileDownloaderBinder) service;\r
- if (detailsFragment != null) {\r
- mProgressListener = new ProgressListener(detailsFragment.getProgressBar());\r
- mDownloaderBinder.addDatatransferProgressListener(\r
- mProgressListener, \r
- (Account) getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT), \r
- (OCFile) getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE)\r
- );\r
- }\r
} else if (component.equals(new ComponentName(FileDetailActivity.this, FileUploader.class))) {\r
Log.d(TAG, "Upload service connected");\r
mUploaderBinder = (FileUploaderBinder) service;\r
- if (detailsFragment != null) {\r
- mProgressListener = new ProgressListener(detailsFragment.getProgressBar());\r
- mUploaderBinder.addDatatransferProgressListener(\r
- mProgressListener, \r
- (Account) getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT), \r
- (OCFile) getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE)\r
- );\r
- }\r
} else {\r
return;\r
}\r
\r
+ Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);\r
+ FileDetailFragment detailsFragment = (fragment instanceof FileDetailFragment) ? (FileDetailFragment) fragment : null;\r
if (detailsFragment != null) {\r
+ detailsFragment.listenForTransferProgress();\r
detailsFragment.updateFileDetails(false); // let the fragment gets the mDownloadBinder through getDownloadBinder() (see FileDetailFragment#updateFileDetais())\r
}\r
}\r
}; \r
\r
\r
- /**\r
- * Helper class responsible for updating the progress bar shown for file uploading or downloading \r
- * \r
- * @author David A. Velasco\r
- */\r
- private class ProgressListener implements OnDatatransferProgressListener {\r
- int mLastPercent = 0;\r
- WeakReference<ProgressBar> mProgressBar = null;\r
- \r
- ProgressListener(ProgressBar progressBar) {\r
- mProgressBar = new WeakReference<ProgressBar>(progressBar);\r
- }\r
- \r
- @Override\r
- public void onTransferProgress(long progressRate) {\r
- // old method, nothing here\r
- };\r
-\r
- @Override\r
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {\r
- int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));\r
- if (percent != mLastPercent) {\r
- ProgressBar pb = mProgressBar.get();\r
- if (pb != null) {\r
- pb.setProgress(percent);\r
- }\r
- }\r
- mLastPercent = percent;\r
- }\r
-\r
- };\r
- \r
-\r
@Override\r
public void onDestroy() {\r
super.onDestroy();\r
\r
private DownloadFinishReceiver mDownloadFinishReceiver;\r
private UploadFinishReceiver mUploadFinishReceiver;\r
+ public ProgressListener mProgressListener;\r
\r
private Handler mHandler;\r
private RemoteOperation mLastRemoteOperation;\r
mAccount = null;\r
mStorageManager = null;\r
mLayout = R.layout.file_details_empty;\r
+ mProgressListener = null;\r
}\r
\r
\r
mAccount = ocAccount;\r
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment \r
mLayout = R.layout.file_details_empty;\r
+ mProgressListener = null;\r
}\r
\r
\r
mView.findViewById(R.id.fdOpenBtn).setOnClickListener(this);\r
mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this);\r
//mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
+ ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.fdProgressBar);\r
+ mProgressListener = new ProgressListener(progressBar);\r
}\r
\r
updateFileDetails(false);\r
if (mFile != null && mFile.isAudio()) {\r
bindMediaService();\r
}\r
+ listenForTransferProgress();\r
}\r
\r
@Override\r
mMediaController = null;\r
}\r
}\r
+ leaveTransferProgress();\r
}\r
\r
\r
}\r
}\r
}\r
+ \r
+ \r
+ public void listenForTransferProgress() {\r
+ if (mProgressListener != null) {\r
+ if (mContainerActivity.getFileDownloaderBinder() != null) {\r
+ mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);\r
+ }\r
+ if (mContainerActivity.getFileUploaderBinder() != null) {\r
+ mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ public void leaveTransferProgress() {\r
+ if (mProgressListener != null) {\r
+ if (mContainerActivity.getFileDownloaderBinder() != null) {\r
+ mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);\r
+ }\r
+ if (mContainerActivity.getFileUploaderBinder() != null) {\r
+ mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);\r
+ }\r
+ }\r
+ }\r
\r
\r
- public ProgressBar getProgressBar() {\r
- View v = getView();\r
- if (v != null) {\r
- return (ProgressBar) v.findViewById(R.id.fdProgressBar);\r
- } else {\r
- return null;\r
+ \r
+ /**\r
+ * Helper class responsible for updating the progress bar shown for file uploading or downloading \r
+ * \r
+ * @author David A. Velasco\r
+ */\r
+ private class ProgressListener implements OnDatatransferProgressListener {\r
+ int mLastPercent = 0;\r
+ WeakReference<ProgressBar> mProgressBar = null;\r
+ \r
+ ProgressListener(ProgressBar progressBar) {\r
+ mProgressBar = new WeakReference<ProgressBar>(progressBar);\r
}\r
- }\r
+ \r
+ @Override\r
+ public void onTransferProgress(long progressRate) {\r
+ // old method, nothing here\r
+ };\r
+\r
+ @Override\r
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {\r
+ int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));\r
+ if (percent != mLastPercent) {\r
+ ProgressBar pb = mProgressBar.get();\r
+ if (pb != null) {\r
+ pb.setProgress(percent);\r
+ pb.postInvalidate();\r
+ }\r
+ }\r
+ mLastPercent = percent;\r
+ }\r
+\r
+ };\r
+ \r
\r
\r
}\r