Progress bar in details view is successfully updated
authorDavid A. Velasco <dvelasco@solidgear.es>
Wed, 20 Feb 2013 11:34:11 +0000 (12:34 +0100)
committerDavid A. Velasco <dvelasco@solidgear.es>
Wed, 20 Feb 2013 11:34:11 +0000 (12:34 +0100)
src/com/owncloud/android/files/services/FileDownloader.java
src/com/owncloud/android/files/services/FileUploader.java
src/com/owncloud/android/ui/activity/FileDetailActivity.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.java

index 5fd6665..4f17cc0 100644 (file)
@@ -20,7 +20,9 @@ package com.owncloud.android.files.services;
 \r
 import java.io.File;\r
 import java.util.AbstractList;\r
 \r
 import java.io.File;\r
 import java.util.AbstractList;\r
+import java.util.HashMap;\r
 import java.util.Iterator;\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 java.util.Vector;\r
 import java.util.concurrent.ConcurrentHashMap;\r
 import java.util.concurrent.ConcurrentMap;\r
@@ -49,7 +51,6 @@ import android.os.Looper;
 import android.os.Message;\r
 import android.os.Process;\r
 import android.util.Log;\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
 import android.widget.RemoteViews;\r
 \r
 import com.owncloud.android.R;\r
@@ -136,6 +137,7 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
             DownloadFileOperation newDownload = new DownloadFileOperation(account, file); \r
             mPendingDownloads.putIfAbsent(downloadKey, newDownload);\r
             newDownload.addDatatransferProgressListener(this);\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
             requestedDownloads.add(downloadKey);\r
             sendBroadcastNewDownload(newDownload);\r
             \r
@@ -165,13 +167,29 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
         return mBinder;\r
     }\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
     \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
          * Cancels a pending or current download of a remote file.\r
@@ -190,6 +208,11 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
         }\r
         \r
         \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
         /**\r
          * Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or waiting to download.\r
          * \r
@@ -225,22 +248,13 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
          * @param file          {@link OCfile} of interest for listener. \r
          */\r
         public void addDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) {\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
             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
         \r
+        \r
         /**\r
          * Removes a listener interested in the progress of the download for a concrete file.\r
          * \r
         /**\r
          * Removes a listener interested in the progress of the download for a concrete file.\r
          * \r
@@ -249,18 +263,27 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
          * @param file          {@link OCfile} of interest for listener. \r
          */\r
         public void removeDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) {\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
             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
             }\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
             }\r
         }\r
         \r
index 8f68554..ad5312d 100644 (file)
@@ -20,7 +20,9 @@ package com.owncloud.android.files.services;
 
 import java.io.File;
 import java.util.AbstractList;
 
 import java.io.File;
 import java.util.AbstractList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -33,6 +35,7 @@ import com.owncloud.android.authenticator.AccountAuthenticator;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.InstantUploadBroadcastReceiver;
 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;
 import com.owncloud.android.operations.ChunkedUploadFileOperation;
 import com.owncloud.android.operations.DownloadFileOperation;
 import com.owncloud.android.operations.RemoteOperationResult;
@@ -254,6 +257,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
                 }
                 mPendingUploads.putIfAbsent(uploadKey, newUpload);
                 newUpload.addDatatransferProgressListener(this);
                 }
                 mPendingUploads.putIfAbsent(uploadKey, newUpload);
                 newUpload.addDatatransferProgressListener(this);
+                newUpload.addDatatransferProgressListener((FileUploaderBinder)mBinder);
                 requestedUploads.add(uploadKey);
             }
             
                 requestedUploads.add(uploadKey);
             }
             
@@ -291,13 +295,28 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
     public IBinder onBind(Intent arg0) {
         return mBinder;
     }
     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.
      */
 
     /**
      *  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.
         
         /**
          * Cancels a pending or current upload of a remote file.
@@ -316,6 +335,14 @@ 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
          * 
         /**
          * Returns True when the file described by 'file' is being uploaded to the ownCloud account 'account' or waiting for it
          * 
@@ -351,22 +378,45 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
          * @param file          {@link OCfile} of interest for listener. 
          */
         public void addDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) {
          * @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);
             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);
             }
         }
         
             }
         }
         
-        
     }
     
     
     }
     
     
index 13e61a9..8ff2bd9 100644 (file)
@@ -73,8 +73,6 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
     private ServiceConnection mDownloadConnection, mUploadConnection = null;\r
     private FileUploaderBinder mUploaderBinder = null;\r
     private boolean mWaitingToPreview;\r
     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
 \r
     @Override\r
@@ -151,36 +149,21 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
 \r
         @Override\r
         public void onServiceConnected(ComponentName component, IBinder service) {\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
                 \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
             } 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
             } 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
             if (detailsFragment != null) {\r
+                detailsFragment.listenForTransferProgress();\r
                 detailsFragment.updateFileDetails(false);   // let the fragment gets the mDownloadBinder through getDownloadBinder() (see FileDetailFragment#updateFileDetais())\r
             }\r
         }\r
                 detailsFragment.updateFileDetails(false);   // let the fragment gets the mDownloadBinder through getDownloadBinder() (see FileDetailFragment#updateFileDetais())\r
             }\r
         }\r
@@ -198,39 +181,6 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
     };    \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
     @Override\r
     public void onDestroy() {\r
         super.onDestroy();\r
index eca461c..1a4dd22 100644 (file)
@@ -137,6 +137,7 @@ public class FileDetailFragment extends SherlockFragment implements
     \r
     private DownloadFinishReceiver mDownloadFinishReceiver;\r
     private UploadFinishReceiver mUploadFinishReceiver;\r
     \r
     private DownloadFinishReceiver mDownloadFinishReceiver;\r
     private UploadFinishReceiver mUploadFinishReceiver;\r
+    public ProgressListener mProgressListener;\r
     \r
     private Handler mHandler;\r
     private RemoteOperation mLastRemoteOperation;\r
     \r
     private Handler mHandler;\r
     private RemoteOperation mLastRemoteOperation;\r
@@ -160,6 +161,7 @@ public class FileDetailFragment extends SherlockFragment implements
         mAccount = null;\r
         mStorageManager = null;\r
         mLayout = R.layout.file_details_empty;\r
         mAccount = null;\r
         mStorageManager = null;\r
         mLayout = R.layout.file_details_empty;\r
+        mProgressListener = null;\r
     }\r
     \r
     \r
     }\r
     \r
     \r
@@ -176,6 +178,7 @@ public class FileDetailFragment extends SherlockFragment implements
         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
         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
     }\r
     \r
     \r
@@ -211,6 +214,8 @@ public class FileDetailFragment extends SherlockFragment implements
             mView.findViewById(R.id.fdOpenBtn).setOnClickListener(this);\r
             mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this);\r
             //mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);\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
         }\r
         \r
         updateFileDetails(false);\r
@@ -261,6 +266,7 @@ public class FileDetailFragment extends SherlockFragment implements
         if (mFile != null && mFile.isAudio()) {\r
             bindMediaService();\r
         }\r
         if (mFile != null && mFile.isAudio()) {\r
             bindMediaService();\r
         }\r
+        listenForTransferProgress();\r
     }\r
     \r
     @Override\r
     }\r
     \r
     @Override\r
@@ -307,6 +313,7 @@ public class FileDetailFragment extends SherlockFragment implements
                 mMediaController = null;\r
             }\r
         }\r
                 mMediaController = null;\r
             }\r
         }\r
+        leaveTransferProgress();\r
     }\r
     \r
     \r
     }\r
     \r
     \r
@@ -1099,16 +1106,66 @@ public class FileDetailFragment extends SherlockFragment implements
             }\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
 \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
+        \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
 \r
 \r
 }\r