Эх сурвалжийг харах

Upload really in progress always and only in top of the list of current uploads

David A. Velasco 9 жил өмнө
parent
commit
26d748a2d3

+ 15 - 8
src/com/owncloud/android/files/services/FileUploader.java

@@ -721,6 +721,17 @@ public class FileUploader extends Service
         }
         }
 
 
 
 
+        public boolean isUploadingNow(OCUpload upload) {
+            return (
+                upload != null  &&
+                mCurrentAccount != null &&
+                mCurrentUpload != null &&
+                upload.getAccountName().equals(mCurrentAccount.name) &&
+                upload.getRemotePath().equals(mCurrentUpload.getRemotePath())
+            );
+        }
+
+
         /**
         /**
          * Adds a listener interested in the progress of the upload for a concrete file.
          * Adds a listener interested in the progress of the upload for a concrete file.
          *
          *
@@ -743,16 +754,14 @@ public class FileUploader extends Service
          * Adds a listener interested in the progress of the upload 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 listener Object to notify about progress of transfer.
-         * @param account  ownCloud account holding the file of interest.
          * @param ocUpload {@link OCUpload} of interest for listener.
          * @param ocUpload {@link OCUpload} of interest for listener.
          */
          */
         public void addDatatransferProgressListener(
         public void addDatatransferProgressListener(
                 OnDatatransferProgressListener listener,
                 OnDatatransferProgressListener listener,
-                Account account,
                 OCUpload ocUpload
                 OCUpload ocUpload
         ) {
         ) {
-            if (account == null || ocUpload == null || listener == null) return;
-            String targetKey = buildRemoteName(account.name, ocUpload.getRemotePath());
+            if (ocUpload == null || listener == null) return;
+            String targetKey = buildRemoteName(ocUpload.getAccountName(), ocUpload.getRemotePath());
             mBoundListeners.put(targetKey, listener);
             mBoundListeners.put(targetKey, listener);
         }
         }
 
 
@@ -781,16 +790,14 @@ public class FileUploader extends Service
          * Removes a listener interested in the progress of the upload for a concrete file.
          * Removes a listener interested in the progress of the upload for a concrete file.
          *
          *
          * @param listener Object to notify about progress of transfer.
          * @param listener Object to notify about progress of transfer.
-         * @param account  ownCloud account holding the file of interest.
          * @param ocUpload Stored upload of interest
          * @param ocUpload Stored upload of interest
          */
          */
         public void removeDatatransferProgressListener(
         public void removeDatatransferProgressListener(
                 OnDatatransferProgressListener listener,
                 OnDatatransferProgressListener listener,
-                Account account,
                 OCUpload ocUpload
                 OCUpload ocUpload
         ) {
         ) {
-            if (account == null || ocUpload == null || listener == null) return;
-            String targetKey = buildRemoteName(account.name, ocUpload.getRemotePath());
+            if (ocUpload == null || listener == null) return;
+            String targetKey = buildRemoteName(ocUpload.getAccountName(), ocUpload.getRemotePath());
             if (mBoundListeners.get(targetKey) == listener) {
             if (mBoundListeners.get(targetKey) == listener) {
                 mBoundListeners.remove(targetKey);
                 mBoundListeners.remove(targetKey);
             }
             }

+ 51 - 17
src/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java

@@ -91,8 +91,19 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
         }
         }
 
 
         public Comparator<OCUpload> comparator = new Comparator<OCUpload>() {
         public Comparator<OCUpload> comparator = new Comparator<OCUpload>() {
+
             @Override
             @Override
             public int compare(OCUpload upload1, OCUpload upload2) {
             public int compare(OCUpload upload1, OCUpload upload2) {
+                if (upload1.getUploadStatus().equals(UploadStatus.UPLOAD_IN_PROGRESS)) {
+                    FileUploader.FileUploaderBinder binder = mParentActivity.getFileUploaderBinder();
+                    if (binder != null) {
+                        if (binder.isUploadingNow(upload1)) {
+                            return -1;
+                        } else if (binder.isUploadingNow(upload2)) {
+                            return -1;
+                        }
+                    }
+                }
                 if (upload1.getUploadEndTimestamp() == 0) {
                 if (upload1.getUploadEndTimestamp() == 0) {
                     return compareUploadId(upload1, upload2);
                     return compareUploadId(upload1, upload2);
                 } else {
                 } else {
@@ -262,17 +273,34 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                     ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.upload_progress_bar);
                     ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.upload_progress_bar);
                     progressBar.setProgress(0);
                     progressBar.setProgress(0);
                     progressBar.setVisibility(View.VISIBLE);
                     progressBar.setVisibility(View.VISIBLE);
-                    mProgressListener = new ProgressListener(progressBar);
-                    if (mParentActivity.getFileUploaderBinder() != null) {
-                        mParentActivity.getFileUploaderBinder().addDatatransferProgressListener(
+
+                    FileUploader.FileUploaderBinder binder = mParentActivity.getFileUploaderBinder();
+                    if (binder != null) {
+                        if (binder.isUploadingNow(upload)) {
+                            /// really uploading, bind the progress bar to listen for progess updates
+                            mProgressListener = new ProgressListener(upload, progressBar);
+                            binder.addDatatransferProgressListener(
                                 mProgressListener,
                                 mProgressListener,
-                                mParentActivity.getAccount(),
                                 upload
                                 upload
-                        );
+                            );
+
+                        } else {
+                            /// not really uploading; stop listening progress if view is reused!
+                            if (convertView != null &&
+                                    mProgressListener != null &&
+                                    mProgressListener.isWrapping(progressBar))  {
+                                binder.removeDatatransferProgressListener(
+                                    mProgressListener,
+                                    mProgressListener.getUpload()   // the one that was added
+                                );
+                                mProgressListener = null;
+                            }
+                        }
                     } else {
                     } else {
-                        Log_OC.e(TAG, "UploadBinder == null. It should have been created on creating mParentActivity"
-                                + " which inherits from FileActivity. Fix that!");
-                        Log_OC.e(TAG, "PENDING BINDING for upload = " + upload.getLocalPath());
+                        Log_OC.w(
+                            TAG,
+                            "FileUploaderBinder not ready yet for upload " + upload.getRemotePath()
+                        );
                     }
                     }
                     uploadDateTextView.setVisibility(View.GONE);
                     uploadDateTextView.setVisibility(View.GONE);
                     pathTextView.setVisibility(View.GONE);
                     pathTextView.setVisibility(View.GONE);
@@ -356,14 +384,6 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
             if (upload.getUploadStatus() != UploadStatus.UPLOAD_IN_PROGRESS) {
             if (upload.getUploadStatus() != UploadStatus.UPLOAD_IN_PROGRESS) {
                 ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.upload_progress_bar);
                 ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.upload_progress_bar);
                 progressBar.setVisibility(View.GONE);
                 progressBar.setVisibility(View.GONE);
-                if (mParentActivity.getFileUploaderBinder() != null && mProgressListener != null) {
-                    mParentActivity.getFileUploaderBinder().removeDatatransferProgressListener(
-                            mProgressListener,
-                            upload.getAccount(mParentActivity),
-                            upload
-                    );
-                    mProgressListener = null;
-                }
             }
             }
             statusTextView.setText(status);
             statusTextView.setText(status);
 
 
@@ -616,9 +636,11 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
 
 
     public class ProgressListener implements OnDatatransferProgressListener {
     public class ProgressListener implements OnDatatransferProgressListener {
         int mLastPercent = 0;
         int mLastPercent = 0;
+        OCUpload mUpload = null;
         WeakReference<ProgressBar> mProgressBar = null;
         WeakReference<ProgressBar> mProgressBar = null;
 
 
-        ProgressListener(ProgressBar progressBar) {
+        public ProgressListener(OCUpload upload, ProgressBar progressBar) {
+            mUpload = upload;
             mProgressBar = new WeakReference<ProgressBar>(progressBar);
             mProgressBar = new WeakReference<ProgressBar>(progressBar);
         }
         }
 
 
@@ -636,6 +658,18 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
             mLastPercent = percent;
             mLastPercent = percent;
         }
         }
 
 
+        public boolean isWrapping(ProgressBar progressBar) {
+            ProgressBar wrappedProgressBar = mProgressBar.get();
+            return (
+                wrappedProgressBar != null &&
+                wrappedProgressBar == progressBar   // on purpose; don't replace with equals
+            );
+        }
+
+        public OCUpload getUpload() {
+            return mUpload;
+        }
+
     }
     }
 
 
     ;
     ;