From: masensio Date: Wed, 4 Feb 2015 17:38:11 +0000 (+0100) Subject: Cancel the transfers of an account when the account is deleted, part 1 X-Git-Tag: oc-android-1.7.1_signed^2~40^2~15 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/beb7d352f9e416993d29358373860863a6dd850d Cancel the transfers of an account when the account is deleted, part 1 --- diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index f56e1b57..0859cf9a 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -356,6 +356,38 @@ public class FileUploader extends Service implements OnDatatransferProgressListe } } + /** + * Cancels a pending or current upload for an account + * + * @param account Owncloud accountName where the remote file will be stored. + */ + public void cancel(Account account) { + Log_OC.d(TAG, "Account= " + account.name); + + if (mCurrentUpload != null) { + Log_OC.d(TAG, "Current Upload Account= " + mCurrentUpload.getAccount().name); + if (mCurrentUpload.getAccount().name == account.name) { + mCurrentUpload.cancel(); + } + } + // Cancel pending uploads + Iterator it = mPendingUploads.keySet().iterator(); + Log_OC.d(TAG, "Number of pending updloads= " + mPendingUploads.size()); + while (it.hasNext()) { + String key = it.next(); + Log_OC.d(TAG, "mPendingUploads CANCELLED " + key); + if (key.startsWith(account.name)) { + UploadFileOperation upload; + synchronized (mPendingUploads) { + upload = mPendingUploads.remove(key); + } + if (upload != null) { + upload.cancel(); + } + } + } + } + public void clearListeners() { mBoundListeners.clear(); } @@ -891,12 +923,13 @@ public class FileUploader extends Service implements OnDatatransferProgressListe // this can be slow if there are many uploads :( Iterator it = mPendingUploads.keySet().iterator(); Log_OC.d(TAG, "Number of pending updloads= " + mPendingUploads.size()); - boolean found; while (it.hasNext()) { String key = it.next(); - Log_OC.d(TAG, "mPendingUploads CANCELLED" + key); + Log_OC.d(TAG, "mPendingUploads CANCELLED " + key); if (key.startsWith(accountName)) { - mPendingUploads.remove(key); + synchronized (mPendingUploads) { + mPendingUploads.remove(key); + } } } } diff --git a/src/com/owncloud/android/operations/UploadFileOperation.java b/src/com/owncloud/android/operations/UploadFileOperation.java index 1536a604..c1445363 100644 --- a/src/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/com/owncloud/android/operations/UploadFileOperation.java @@ -400,7 +400,8 @@ public class UploadFileOperation extends RemoteOperation { * Checks if remotePath does not exist in the server and returns it, or adds * a suffix to it in order to avoid the server file is overwritten. * - * @param string + * @param wc + * @param remotePath * @return */ private String getAvailableRemotePath(OwnCloudClient wc, String remotePath) throws Exception { @@ -442,6 +443,7 @@ public class UploadFileOperation extends RemoteOperation { } public void cancel() { - mUploadOperation.cancel(); + if (mUploadOperation != null) + mUploadOperation.cancel(); } } diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index 536800bd..b36943f8 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -605,7 +605,7 @@ implements OnRemoteOperationListener, ComponentsGetter { @Override public FileUploaderBinder getFileUploaderBinder() { return mUploaderBinder; - }; + } } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 7e60776d..a573a3c7 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -649,6 +649,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { if (filePaths != null) { String[] remotePaths = new String[filePaths.length]; String remotePathBase = ""; + for (int j = mDirectories.getCount() - 2; j >= 0; --j) { remotePathBase += OCFile.PATH_SEPARATOR + mDirectories.getItem(j); } @@ -1892,6 +1893,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { onTransferStateChanged(file, false, false); } + public void cancelUploadsForAnAccount(Account account) { + mUploaderBinder.cancel(account); + } + @Override public void onRefresh(boolean ignoreETag) { refreshList(ignoreETag); diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 7a290738..701520c6 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -21,13 +21,17 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; @@ -50,9 +54,14 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.authentication.AuthenticatorActivity; +import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.db.DbHandler; +import com.owncloud.android.files.FileOperationsHelper; +import com.owncloud.android.files.services.FileDownloader; +import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.OperationsService; import com.owncloud.android.ui.RadioButtonPreference; import com.owncloud.android.utils.DisplayUtils; @@ -63,7 +72,8 @@ import com.owncloud.android.utils.DisplayUtils; * @author Bartek Przybylski * @author David A. Velasco */ -public class Preferences extends SherlockPreferenceActivity implements AccountManagerCallback { +public class Preferences extends SherlockPreferenceActivity + implements AccountManagerCallback, ComponentsGetter { private static final String TAG = "OwnCloudPreferences"; @@ -88,6 +98,9 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa private Preference mPrefInstantVideoUploadPathWiFi; private String mUploadVideoPath; + protected FileDownloader.FileDownloaderBinder mDownloaderBinder = null; + protected FileUploader.FileUploaderBinder mUploaderBinder = null; + private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null; @SuppressWarnings("deprecation") @Override @@ -199,13 +212,13 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa String username = currentAccount.name.substring(0, currentAccount.name.lastIndexOf('@')); String recommendSubject = String.format(getString(R.string.recommend_subject), appName); - String recommendText = String.format(getString(R.string.recommend_text), appName, downloadUrl, username); + String recommendText = String.format(getString(R.string.recommend_text), + appName, downloadUrl, username); intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject); intent.putExtra(Intent.EXTRA_TEXT, recommendText); startActivity(intent); - return(true); } @@ -337,6 +350,18 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa loadInstantUploadPath(); loadInstantUploadVideoPath(); + /* ComponentsGetter */ + mDownloadServiceConnection = newTransferenceServiceConnection(); + if (mDownloadServiceConnection != null) { + bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection, + Context.BIND_AUTO_CREATE); + } + mUploadServiceConnection = newTransferenceServiceConnection(); + if (mUploadServiceConnection != null) { + bindService(new Intent(this, FileUploader.class), mUploadServiceConnection, + Context.BIND_AUTO_CREATE); + } + } private void toggleInstantPictureOptions(Boolean value){ @@ -402,6 +427,7 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa // Remove account am.removeAccount(a, this, mHandler); + Log_OC.d(TAG, "Remove an account " + a.name); } } } @@ -412,6 +438,13 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa @Override public void run(AccountManagerFuture future) { if (future.isDone()) { + // after remove account + Account account = new Account(mAccountName, MainApp.getAccountType()); + if (!AccountUtils.exists(account, MainApp.getAppContext())) { + // Cancel tranfers + mUploaderBinder.cancel(account); + } + Account a = AccountUtils.getCurrentOwnCloudAccount(this); String accountName = ""; if (a == null) { @@ -494,6 +527,16 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa @Override protected void onDestroy() { mDbHandler.close(); + + if (mDownloadServiceConnection != null) { + unbindService(mDownloadServiceConnection); + mDownloadServiceConnection = null; + } + if (mUploadServiceConnection != null) { + unbindService(mUploadServiceConnection); + mUploadServiceConnection = null; + } + super.onDestroy(); } @@ -637,4 +680,65 @@ public class Preferences extends SherlockPreferenceActivity implements AccountMa editor.putString("instant_video_upload_path", mUploadVideoPath); editor.commit(); } + + // Methods for ComponetsGetter + @Override + public FileDownloader.FileDownloaderBinder getFileDownloaderBinder() { + return mDownloaderBinder; + } + + + @Override + public FileUploader.FileUploaderBinder getFileUploaderBinder() { + return mUploaderBinder; + } + + @Override + public OperationsService.OperationsServiceBinder getOperationsServiceBinder() { + return null; + } + + @Override + public FileDataStorageManager getStorageManager() { + return null; + } + + @Override + public FileOperationsHelper getFileOperationsHelper() { + return null; + } + + protected ServiceConnection newTransferenceServiceConnection() { + return new PreferencesServiceConnection(); + } + + /** Defines callbacks for service binding, passed to bindService() */ + private class PreferencesServiceConnection implements ServiceConnection { + + @Override + public void onServiceConnected(ComponentName component, IBinder service) { + + if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) { + mDownloaderBinder = (FileDownloader.FileDownloaderBinder) service; + + } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) { + Log_OC.d(TAG, "Upload service connected"); + mUploaderBinder = (FileUploader.FileUploaderBinder) service; + } else { + return; + } + + } + + @Override + public void onServiceDisconnected(ComponentName component) { + if (component.equals(new ComponentName(Preferences.this, FileDownloader.class))) { + Log_OC.d(TAG, "Download service suddenly disconnected"); + mDownloaderBinder = null; + } else if (component.equals(new ComponentName(Preferences.this, FileUploader.class))) { + Log_OC.d(TAG, "Upload service suddenly disconnected"); + mUploaderBinder = null; + } + } + }; }