X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/3eb043caf03305a7a4f4d8dc51d87a1e56b1c42a..901b6ac61e4a84d281e86b4989aa099801b28de7:/src/com/owncloud/android/ui/activity/FileActivity.java diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index f43ee8d7..42b90aec 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -23,19 +23,35 @@ import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.accounts.OperationCanceledException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.owncloud.android.MainApp; +import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileOperationsHelper; -import com.owncloud.android.lib.operations.common.OnRemoteOperationListener; -import com.owncloud.android.lib.operations.common.RemoteOperation; -import com.owncloud.android.lib.operations.common.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; +import com.owncloud.android.operations.CreateShareOperation; +import com.owncloud.android.operations.UnshareLinkOperation; +import com.owncloud.android.services.OperationsService; +import com.owncloud.android.services.OperationsService.OperationsServiceBinder; +import com.owncloud.android.ui.dialog.LoadingDialog; import com.owncloud.android.utils.Log_OC; @@ -53,6 +69,8 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp public static final String TAG = FileActivity.class.getSimpleName(); + private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; + /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */ private Account mAccount; @@ -79,6 +97,10 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp private FileDataStorageManager mStorageManager = null; private FileOperationsHelper mFileOperationsHelper; + + private ServiceConnection mOperationsServiceConnection = null; + + private OperationsServiceBinder mOperationsServiceBinder = null; /** @@ -105,7 +127,9 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp } setAccount(account, savedInstanceState != null); - + + mOperationsServiceConnection = new OperationsServiceConnection(); + bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE); } @@ -121,7 +145,6 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp if (!validAccount) { swapToDefaultAccount(); } - } @@ -131,6 +154,28 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp if (mAccountWasSet) { onAccountSet(mAccountWasRestored); } + if (mOperationsServiceBinder != null) { + mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler); + } + } + + + @Override + protected void onStop() { + super.onStop(); + if (mOperationsServiceBinder != null) { + mOperationsServiceBinder.removeOperationListener(this); + } + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mOperationsServiceConnection != null) { + unbindService(mOperationsServiceConnection); + mOperationsServiceBinder = null; + } } @@ -339,9 +384,114 @@ public class FileActivity extends SherlockFragmentActivity implements OnRemoteOp */ @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - // does nothing ; to override in child classes - Log_OC.d(TAG, "Received result of operation in FileActivity"); + Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities "); + if (operation instanceof CreateShareOperation) { + onCreateShareOperationFinish((CreateShareOperation) operation, result); + + } else if (operation instanceof UnshareLinkOperation) { + onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result); + + } + } + + private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { + dismissLoadingDialog(); + if (result.isSuccess()) { + updateFileFromDB(); + + Intent sendIntent = operation.getSendIntent(); + startActivity(sendIntent); + + } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND + Toast t = Toast.makeText(this, getString(R.string.share_link_file_no_exist), Toast.LENGTH_LONG); + t.show(); + } else { // Generic error + // Show a Message, operation finished without success + Toast t = Toast.makeText(this, getString(R.string.share_link_file_error), Toast.LENGTH_LONG); + t.show(); + } + } + + + private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) { + dismissLoadingDialog(); + + if (result.isSuccess()){ + updateFileFromDB(); + + } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND + Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_no_exist), Toast.LENGTH_LONG); + t.show(); + } else { // Generic error + // Show a Message, operation finished without success + Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_error), Toast.LENGTH_LONG); + t.show(); + } + + } + + + private void updateFileFromDB(){ + OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath()); + if (file != null) { + setFile(file); + } + } + + /** + * Show loading dialog + */ + public void showLoadingDialog() { + // Construct dialog + LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_TAG); + } + + /** + * Dismiss loading dialog + */ + public void dismissLoadingDialog(){ + Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + if (frag != null) { + LoadingDialog loading = (LoadingDialog) frag; + loading.dismiss(); + } + } + + /** + * Implements callback methods for service binding. Passed as a parameter to { + */ + private class OperationsServiceConnection implements ServiceConnection { + + @Override + public void onServiceConnected(ComponentName component, IBinder service) { + if (component.equals(new ComponentName(FileActivity.this, OperationsService.class))) { + Log_OC.d(TAG, "Operations service connected"); + mOperationsServiceBinder = (OperationsServiceBinder) service; + mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler); + if (!mOperationsServiceBinder.isPerformingBlockingOperation()) { + dismissLoadingDialog(); + } + + } else { + return; + } + } + + + @Override + public void onServiceDisconnected(ComponentName component) { + if (component.equals(new ComponentName(FileActivity.this, OperationsService.class))) { + Log_OC.d(TAG, "Operations service disconnected"); + mOperationsServiceBinder = null; + // TODO whatever could be waiting for the service is unbound + } + } + }; + }