diff --git a/src/com/owncloud/android/files/FileMenuFilter.java b/src/com/owncloud/android/files/FileMenuFilter.java index f2a0baf726..b63446baa6 100644 --- a/src/com/owncloud/android/files/FileMenuFilter.java +++ b/src/com/owncloud/android/files/FileMenuFilter.java @@ -140,7 +140,9 @@ public class FileMenuFilter { boolean downloading = false; boolean uploading = false; if (mComponentsGetter != null && mFile != null && mAccount != null) { - downloading = mFile.isDownloading() || mFile.isSynchronizing(); + //downloading = mFile.isDownloading() || mFile.isSynchronizing(); + FileDownloaderBinder downloaderBinder = mComponentsGetter.getFileDownloaderBinder(); + downloading = (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)); FileUploaderBinder uploaderBinder = mComponentsGetter.getFileUploaderBinder(); uploading = (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile)); } diff --git a/src/com/owncloud/android/files/FileOperationsHelper.java b/src/com/owncloud/android/files/FileOperationsHelper.java index c8cb275614..47e44728fb 100644 --- a/src/com/owncloud/android/files/FileOperationsHelper.java +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@ -287,7 +287,8 @@ public class FileOperationsHelper { if (!file.isFolder()) { FileDownloaderBinder downloaderBinder = mFileActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mFileActivity.getFileUploaderBinder(); - if (downloaderBinder != null && file.isDownloading()) { + //if (downloaderBinder != null && file.isDownloading()) { + if (downloaderBinder != null && downloaderBinder.isDownloading(account, file)) { // Remove etag for parent, if file is a keep_in_sync if (file.keepInSync()) { OCFile parent = mFileActivity.getStorageManager().getFileById(file.getParentId()); diff --git a/src/com/owncloud/android/files/services/FileDownloader.java b/src/com/owncloud/android/files/services/FileDownloader.java index 61483af8b6..2b70606c4f 100644 --- a/src/com/owncloud/android/files/services/FileDownloader.java +++ b/src/com/owncloud/android/files/services/FileDownloader.java @@ -26,8 +26,6 @@ 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.R; import com.owncloud.android.authentication.AuthenticatorActivity; @@ -89,7 +87,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis private Account mLastAccount = null; private FileDataStorageManager mStorageManager; - private ConcurrentMap mPendingDownloads = new ConcurrentHashMap(); + private IndexedForest mPendingDownloads = new IndexedForest(); + private DownloadFileOperation mCurrentDownload = null; private NotificationManager mNotificationManager; @@ -105,17 +104,6 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis return FileDownloader.class.getName().toString() + DOWNLOAD_FINISH_MESSAGE; } - /** - * Builds a key for mPendingDownloads from the account and file to download - * - * @param account Account where the file to download is stored - * @param file File to download - */ - private String buildRemoteName(Account account, OCFile file) { - return account.name + file.getRemotePath(); - } - - /** * Service initialization */ @@ -133,16 +121,14 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis /** * Entry point to add one or several files to the queue of downloads. - * - * New downloads are added calling to startService(), resulting in a call to this method. This ensures the service will keep on working - * although the caller activity goes away. + * + * New downloads are added calling to startService(), resulting in a call to this method. + * This ensures the service will keep on working although the caller activity goes away. */ @Override public int onStartCommand(Intent intent, int flags, int startId) { if ( !intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_FILE) - /*!intent.hasExtra(EXTRA_FILE_PATH) || - !intent.hasExtra(EXTRA_REMOTE_PATH)*/ ) { Log_OC.e(TAG, "Not enough information provided in intent"); return START_NOT_STICKY; @@ -161,19 +147,21 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis } else { - AbstractList requestedDownloads = new Vector(); // dvelasco: now this always contains just one element, but that can change in a near future (download of multiple selection) - String downloadKey = buildRemoteName(account, file); + AbstractList requestedDownloads = new Vector(); try { DownloadFileOperation newDownload = new DownloadFileOperation(account, file); - mPendingDownloads.putIfAbsent(downloadKey, newDownload); + String downloadKey = mPendingDownloads.putIfAbsent(account, file.getRemotePath(), newDownload); newDownload.addDatatransferProgressListener(this); newDownload.addDatatransferProgressListener((FileDownloaderBinder) mBinder); requestedDownloads.add(downloadKey); // Store file on db with state 'downloading' + /* + TODO - check if helps with UI responsiveness, letting only folders use FileDownloaderBinder to check FileDataStorageManager storageManager = new FileDataStorageManager(account, getContentResolver()); file.setDownloading(true); storageManager.saveFile(file); + */ sendBroadcastNewDownload(newDownload); @@ -193,11 +181,12 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis return START_NOT_STICKY; } - - + + /** - * Provides a binder object that clients can use to perform operations on the queue of downloads, excepting the addition of new files. - * + * Provides a binder object that clients can use to perform operations on the queue of downloads, + * excepting the addition of new files. + * * Implemented to perform cancellation, pause and resume of existing downloads. */ @Override @@ -215,18 +204,20 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis return false; // not accepting rebinding (default behaviour) } - + /** * Binder to let client components to perform operations on the queue of downloads. - * + * * It provides by itself the available operations. */ public class FileDownloaderBinder extends Binder implements OnDatatransferProgressListener { /** - * Map of listeners that will be reported about progress of downloads from a {@link FileDownloaderBinder} instance + * Map of listeners that will be reported about progress of downloads from a {@link FileDownloaderBinder} + * instance. */ - private Map mBoundListeners = new HashMap(); + private Map mBoundListeners = + new HashMap(); /** @@ -237,9 +228,7 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis */ public void cancel(Account account, OCFile file) { DownloadFileOperation download = null; - synchronized (mPendingDownloads) { - download = mPendingDownloads.remove(buildRemoteName(account, file)); - } + download = mPendingDownloads.remove(account, file.getRemotePath()); if (download != null) { download.cancel(); } @@ -252,32 +241,19 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis /** - * Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or waiting to download. + * Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or + * waiting to download. * - * 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 any of its descendant files is downloading or + * waiting to download. * - * @param account Owncloud account where the remote file is stored. + * @param account ownCloud account where the remote file is stored. * @param file A file that could be in the queue of downloads. */ - /* public boolean isDownloading(Account account, OCFile file) { if (account == null || file == null) return false; - String targetKey = buildRemoteName(account, file); - synchronized (mPendingDownloads) { - if (file.isFolder()) { - // this can be slow if there are many downloads :( - Iterator it = mPendingDownloads.keySet().iterator(); - boolean found = false; - while (it.hasNext() && !found) { - found = it.next().startsWith(targetKey); - } - return found; - } else { - return (mPendingDownloads.containsKey(targetKey)); - } - } + return (mPendingDownloads.contains(account, file.getRemotePath())); } - */ /** @@ -285,12 +261,14 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis * * @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. + * @param file {@link OCFile} of interest for listener. */ - public void addDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) { + public void addDatatransferProgressListener ( + OnDatatransferProgressListener listener, Account account, OCFile file + ) { if (account == null || file == null || listener == null) return; - String targetKey = buildRemoteName(account, file); - mBoundListeners.put(targetKey, listener); + //String targetKey = buildKey(account, file.getRemotePath()); + mBoundListeners.put(file.getFileId(), listener); } @@ -299,21 +277,24 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis * * @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. + * @param file {@link OCFile} of interest for listener. */ - public void removeDatatransferProgressListener (OnDatatransferProgressListener listener, Account account, OCFile file) { + 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); + //String targetKey = buildKey(account, file.getRemotePath()); + Long fileId = file.getFileId(); + if (mBoundListeners.get(fileId) == listener) { + mBoundListeners.remove(fileId); } } @Override public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName) { - String key = buildRemoteName(mCurrentDownload.getAccount(), mCurrentDownload.getFile()); - OnDatatransferProgressListener boundListener = mBoundListeners.get(key); + //String key = buildKey(mCurrentDownload.getAccount(), mCurrentDownload.getFile().getRemotePath()); + OnDatatransferProgressListener boundListener = mBoundListeners.get(mCurrentDownload.getFile().getFileId()); if (boundListener != null) { boundListener.onTransferProgress(progressRate, totalTransferredSoFar, totalToTransfer, fileName); } @@ -358,11 +339,9 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis * @param downloadKey Key to access the download to perform, contained in mPendingDownloads */ private void downloadFile(String downloadKey) { - - synchronized(mPendingDownloads) { - mCurrentDownload = mPendingDownloads.get(downloadKey); - } - + + mCurrentDownload = mPendingDownloads.get(downloadKey); + if (mCurrentDownload != null) { notifyDownloadStart(mCurrentDownload); @@ -383,21 +362,20 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis downloadResult = mCurrentDownload.execute(mDownloadClient); if (downloadResult.isSuccess()) { saveDownloadedFile(); - } else { + /*} else { updateUnsuccessfulDownloadedFile(); + */ } } catch (AccountsException e) { - Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e); + Log_OC.e(TAG, "Error while trying to get authorization for " + mLastAccount.name, e); downloadResult = new RemoteOperationResult(e); } catch (IOException e) { - Log_OC.e(TAG, "Error while trying to get autorization for " + mLastAccount.name, e); + Log_OC.e(TAG, "Error while trying to get authorization for " + mLastAccount.name, e); downloadResult = new RemoteOperationResult(e); } finally { - synchronized(mPendingDownloads) { - mPendingDownloads.remove(downloadKey); - } + mPendingDownloads.remove(mLastAccount, mCurrentDownload.getRemotePath()); } @@ -425,7 +403,7 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis file.setStoragePath(mCurrentDownload.getSavePath()); file.setFileLength((new File(mCurrentDownload.getSavePath()).length())); file.setRemoteId(mCurrentDownload.getFile().getRemoteId()); - file.setDownloading(false); + //file.setDownloading(false); mStorageManager.saveFile(file); mStorageManager.triggerMediaScan(file.getStoragePath()); } @@ -484,7 +462,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis * Callback method to update the progress bar in the status notification. */ @Override - public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filePath) { + public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filePath) + { int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer)); if (percent != mLastPercent) { mNotificationBuilder.setProgress(100, percent, totalToTransfer < 0); @@ -528,7 +507,9 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis // let the user update credentials with one click Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, download.getAccount()); - updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); + updateAccountCredentials.putExtra( + AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN + ); updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND); @@ -536,7 +517,7 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis .setContentIntent(PendingIntent.getActivity( this, (int) System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT)); - mDownloadClient = null; // grant that future retries on the same account will get the fresh credentials + mDownloadClient = null; // grant that future retries on the same account will get the fresh credentials } else { // TODO put something smart in showDetailsIntent @@ -546,7 +527,9 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis this, (int) System.currentTimeMillis(), showDetailsIntent, 0)); } - mNotificationBuilder.setContentText(ErrorMessageAdapter.getErrorCauseMessage(downloadResult, download, getResources())); + mNotificationBuilder.setContentText( + ErrorMessageAdapter.getErrorCauseMessage(downloadResult, download, getResources()) + ); mNotificationManager.notify(tickerId, mNotificationBuilder.build()); // Remove success notification @@ -593,38 +576,47 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis /** * Cancel operation - * @param account Owncloud account where the remote file is stored. + * @param account ownCloud account where the remote file is stored. * @param file File OCFile */ public void cancel(Account account, OCFile file){ DownloadFileOperation download = null; - String targetKey = buildRemoteName(account, file); + //String targetKey = buildKey(account, file.getRemotePath()); ArrayList keyItems = new ArrayList(); - synchronized (mPendingDownloads) { - if (file.isFolder()) { - Log_OC.d(TAG, "Folder download. Canceling pending downloads (from folder)"); - Iterator it = mPendingDownloads.keySet().iterator(); - boolean found = false; - while (it.hasNext()) { - String keyDownloadOperation = it.next(); - found = keyDownloadOperation.startsWith(targetKey); - if (found) { - keyItems.add(keyDownloadOperation); - } - } - } else { - // this is not really expected... - Log_OC.d(TAG, "Canceling file download"); - keyItems.add(buildRemoteName(account, file)); - } - } - for (String item: keyItems) { - download = mPendingDownloads.remove(item); - Log_OC.d(TAG, "Key removed: " + item); + if (file.isFolder()) { + Log_OC.d(TAG, "Folder download. Canceling pending downloads (from folder)"); + // TODO + /* + Iterator it = mPendingDownloads.keySet().iterator(); + boolean found = false; + while (it.hasNext()) { + String keyDownloadOperation = it.next(); + found = keyDownloadOperation.startsWith(targetKey); + if (found) { + keyItems.add(keyDownloadOperation); + } + } + + for (String item: keyItems) { + download = mPendingDownloads.remove(item); + Log_OC.d(TAG, "Key removed: " + item); + + if (download != null) { + download.cancel(); + } + } + + */ + + } else { + // this is not really expected... + Log_OC.d(TAG, "Canceling file download"); + download = mPendingDownloads.remove(account, file.getRemotePath()); if (download != null) { download.cancel(); } } } + } diff --git a/src/com/owncloud/android/files/services/IndexedForest.java b/src/com/owncloud/android/files/services/IndexedForest.java new file mode 100644 index 0000000000..daf46a5680 --- /dev/null +++ b/src/com/owncloud/android/files/services/IndexedForest.java @@ -0,0 +1,179 @@ +/* ownCloud Android client application + * Copyright (C) 2015 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.owncloud.android.files.services; + +import android.accounts.Account; + +import com.owncloud.android.datamodel.OCFile; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * Helper structure to keep the trees of folders containing any file downloading or synchronizing. + * + * A map provides the indexation based in hashing. + * + * A tree is created per account. + * + * @author David A. Velasco + */ +public class IndexedForest { + + private ConcurrentMap> mMap = new ConcurrentHashMap>(); + + private class Node { + String mKey = null; + Node mParent = null; + Set> mChildren = new HashSet>(); // TODO be careful with hash() + V mPayload = null; + + // payload is optional + public Node(String key, V payload) { + if (key == null) { + throw new IllegalArgumentException("Argument key MUST NOT be null"); + } + mKey = key; + mPayload = payload; + } + + public Node getParent() { + return mParent; + }; + + public Set> getChildren() { + return mChildren; + } + + public String getKey() { + return mKey; + } + + public V getPayload() { + return mPayload; + } + + public void addChild(Node child) { + mChildren.add(child); + child.setParent(this); + } + + private void setParent(Node parent) { + mParent = parent; + } + + public boolean hasChildren() { + return mChildren.size() > 0; + } + + public void removeChild(Node removed) { + mChildren.remove(removed); + } + } + + + public /* synchronized */ String putIfAbsent(Account account, String remotePath, V value) { + String targetKey = buildKey(account, remotePath); + Node valuedNode = new Node(targetKey, value); + mMap.putIfAbsent( + targetKey, + valuedNode + ); + + String currentPath = remotePath, parentPath = null, parentKey = null; + Node currentNode = valuedNode, parentNode = null; + boolean linked = false; + while (!OCFile.ROOT_PATH.equals(currentPath) && !linked) { + parentPath = new File(currentPath).getParent(); + if (!parentPath.endsWith(OCFile.PATH_SEPARATOR)) { + parentPath += OCFile.PATH_SEPARATOR; + } + parentKey = buildKey(account, parentPath); + parentNode = mMap.get(parentKey); + if (parentNode == null) { + parentNode = new Node(parentKey, null); + parentNode.addChild(currentNode); + mMap.put(parentKey, parentNode); + } else { + parentNode.addChild(currentNode); + linked = true; + } + currentPath = parentPath; + currentNode = parentNode; + } + + return targetKey; + }; + + public /* synchronized */ V remove(Account account, String remotePath) { + String targetKey = buildKey(account, remotePath); + Node firstRemoved = mMap.remove(targetKey); + + if (firstRemoved != null) { + Node removed = firstRemoved; + Node parent = removed.getParent(); + while (parent != null) { + parent.removeChild(removed); + if (!parent.hasChildren()) { + removed = mMap.remove(parent.getKey()); + parent = removed.getParent(); + } else { + parent = null; + } + } + } + + if (firstRemoved != null) { + return firstRemoved.getPayload(); + } else { + return null; + } + + } + + public boolean contains(Account account, String remotePath) { + String targetKey = buildKey(account, remotePath); + return mMap.containsKey(targetKey); + } + + public /* synchronized */ V get(String key) { + Node node = mMap.get(key); + if (node != null) { + return node.getPayload(); + } else { + return null; + } + } + + + /** + * Builds a key to index files + * + * @param account Account where the file to download is stored + * @param remotePath Path of the file in the server + */ + private String buildKey(Account account, String remotePath) { + return account.name + remotePath; + } + + + +} diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index 779e5b6ad1..5e038f14d5 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -17,6 +17,7 @@ package com.owncloud.android.services; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; @@ -469,8 +470,22 @@ public class OperationsService extends Service { } catch (IOException e) { Log_OC.e(TAG, "Error while trying to get autorization", e); } finally { - synchronized(mPendingOperations) { + synchronized (mPendingOperations) { mPendingOperations.remove(syncKey); + /* + SynchronizeFolderOperation checkedOp = mCurrentSyncOperation; + String checkedKey = syncKey; + while (checkedOp.getPendingChildrenCount() <= 0) { + // while (!checkedOp.hasChildren()) { + mPendingOperations.remove(checkedKey); + String parentKey = buildRemoteName(account, (new File(checkedOp.getFolderPath())).getParent()); + // String parentKey = buildRemoteName(account, checkedOp.getParentPath()); + SynchronizeFolderOperation parentOp = mPendingOperations.get(parentKey); + if (parentOp != null) { + parentOp.decreasePendingChildrenCount(); + } + } + */ } mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result); diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index fbd35edc70..a0ce0db3dc 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -1255,7 +1255,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /** - * Class waiting for broadcast events from the {@link FielDownloader} service. + * Class waiting for broadcast events from the {@link FileDownloader} service. * * Updates the UI when a download is started or finished, provided that it is relevant for the * current folder. @@ -1725,7 +1725,8 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private void requestForDownload() { Account account = getAccount(); - if (mWaitingToPreview.isDownloading()) { + //if (!mWaitingToPreview.isDownloading()) { + if (!mDownloaderBinder.isDownloading(account, mWaitingToPreview)) { Intent i = new Intent(this, FileDownloader.class); i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); i.putExtra(FileDownloader.EXTRA_FILE, mWaitingToPreview); @@ -1781,9 +1782,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } private void requestForDownload(OCFile file) { - if (file.isDownloading()) { + Account account = getAccount(); + if (!mDownloaderBinder.isDownloading(account, mWaitingToPreview)) { Intent i = new Intent(this, FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount()); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); i.putExtra(FileDownloader.EXTRA_FILE, file); startService(i); } diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index bfec11ccd7..33f16c834f 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -41,6 +41,7 @@ import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.ui.activity.ComponentsGetter; import com.owncloud.android.utils.DisplayUtils; @@ -151,8 +152,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); localStateView.bringToFront(); + FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); - if (file.isSynchronizing() || file.isDownloading()) { + //if (file.isSynchronizing() || file.isDownloading()) { + if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { localStateView.setImageResource(R.drawable.downloading_file_indicator); localStateView.setVisibility(View.VISIBLE); } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index dc607b5157..30ac7e1cfc 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -346,8 +346,12 @@ public class FileDetailFragment extends FileFragment implements OnClickListener cb.setChecked(file.keepInSync()); // configure UI for depending upon local state of the file + FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); - if (transferring || file.isDownloading() || uploaderBinder.isUploading(mAccount, file)) { + if (transferring || + (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || + (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) + ) { setButtonsForTransferring(); } else if (file.isDown()) { @@ -446,8 +450,10 @@ public class FileDetailFragment extends FileFragment implements OnClickListener getView().findViewById(R.id.fdProgressBlock).setVisibility(View.VISIBLE); TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText); progressText.setVisibility(View.VISIBLE); + FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); - if (getFile().isDownloading()) { + //if (getFile().isDownloading()) { + if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) { progressText.setText(R.string.downloader_download_in_progress_ticker); } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) { progressText.setText(R.string.uploader_upload_in_progress_ticker); diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index 13d6adcf42..1cee30e8a1 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -365,7 +365,7 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener { if (mDownloaderBinder == null) { Log_OC.d(TAG, "requestForDownload called without binder to download service"); - } else if (!file.isDownloading()) { + } else if (!mDownloaderBinder.isDownloading(getAccount(), file)) { Intent i = new Intent(this, FileDownloader.class); i.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount()); i.putExtra(FileDownloader.EXTRA_FILE, file);