From: purigarcia Date: Mon, 9 Mar 2015 08:21:38 +0000 (+0100) Subject: Merge branch 'develop' into share_password_support X-Git-Tag: oc-android-1.7.1_signed^2~27^2~6 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/151c70c4437f1210171a5c76501d609aeefb93e9?hp=eac3e1ddf1456472ff9c03d441924c2b49ade870 Merge branch 'develop' into share_password_support --- diff --git a/res/layout/password_dialog.xml b/res/layout/password_dialog.xml new file mode 100644 index 00000000..b81e40b4 --- /dev/null +++ b/res/layout/password_dialog.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 1ad9d8d3..fac026e1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -275,6 +275,8 @@ An error occurred while trying to share this file or folder Unable to unshare. Please check whether the file exists An error occurred while trying to unshare this file or folder + Enter a password + Password is empty Send diff --git a/src/com/owncloud/android/files/FileOperationsHelper.java b/src/com/owncloud/android/files/FileOperationsHelper.java index 46588114..b2f74f2f 100644 --- a/src/com/owncloud/android/files/FileOperationsHelper.java +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@ -119,7 +119,7 @@ public class FileOperationsHelper { } - public void shareFileWithLinkToApp(OCFile file, Intent sendIntent) { + public void shareFileWithLinkToApp(OCFile file, String password, Intent sendIntent) { if (file != null) { mFileActivity.showLoadingDialog(); @@ -128,6 +128,7 @@ public class FileOperationsHelper { service.setAction(OperationsService.ACTION_CREATE_SHARE); service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); service.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath()); + service.putExtra(OperationsService.EXTRA_PASSWORD_SHARE, password); service.putExtra(OperationsService.EXTRA_SEND_INTENT, sendIntent); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); diff --git a/src/com/owncloud/android/operations/CreateShareOperation.java b/src/com/owncloud/android/operations/CreateShareOperation.java index 01059c9e..70d6bf7b 100644 --- a/src/com/owncloud/android/operations/CreateShareOperation.java +++ b/src/com/owncloud/android/operations/CreateShareOperation.java @@ -44,7 +44,6 @@ import com.owncloud.android.operations.common.SyncOperation; public class CreateShareOperation extends SyncOperation { private static final String TAG = CreateShareOperation.class.getSimpleName(); - protected FileDataStorageManager mStorageManager; @@ -76,8 +75,9 @@ public class CreateShareOperation extends SyncOperation { * To obtain combinations, add the desired values together. * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ - public CreateShareOperation(Context context, String path, ShareType shareType, String shareWith, boolean publicUpload, - String password, int permissions, Intent sendIntent) { + public CreateShareOperation(Context context, String path, ShareType shareType, String shareWith, + boolean publicUpload, String password, int permissions, + Intent sendIntent) { mContext = context; mPath = path; @@ -98,7 +98,8 @@ public class CreateShareOperation extends SyncOperation { RemoteOperationResult result = ((GetRemoteSharesForFileOperation)operation).execute(client); if (!result.isSuccess() || result.getData().size() <= 0) { - operation = new CreateRemoteShareOperation(mPath, mShareType, mShareWith, mPublicUpload, mPassword, mPermissions); + operation = new CreateRemoteShareOperation(mPath, mShareType, mShareWith, mPublicUpload, + mPassword, mPermissions); result = ((CreateRemoteShareOperation)operation).execute(client); } @@ -112,7 +113,30 @@ public class CreateShareOperation extends SyncOperation { return result; } - + public String getPath() { + return mPath; + } + + public ShareType getShareType() { + return mShareType; + } + + public String getShareWith() { + return mShareWith; + } + + public boolean getPublicUpload() { + return mPublicUpload; + } + + public String getPassword() { + return mPassword; + } + + public int getPermissions() { + return mPermissions; + } + public Intent getSendIntent() { return mSendIntent; } diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index a4bc8f6c..6a32af06 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -85,6 +85,7 @@ public class OperationsService extends Service { public static final String EXTRA_RESULT = "RESULT"; public static final String EXTRA_NEW_PARENT_PATH = "NEW_PARENT_PATH"; public static final String EXTRA_FILE = "FILE"; + public static final String EXTRA_PASSWORD_SHARE = "PASSWORD_SHARE"; public static final String EXTRA_COOKIE = "COOKIE"; @@ -525,10 +526,12 @@ public class OperationsService extends Service { String action = operationIntent.getAction(); if (action.equals(ACTION_CREATE_SHARE)) { // Create Share String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH); + String password = operationIntent.getStringExtra(EXTRA_PASSWORD_SHARE); Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT); if (remotePath.length() > 0) { - operation = new CreateShareOperation(OperationsService.this, remotePath, ShareType.PUBLIC_LINK, - "", false, "", 1, sendIntent); + operation = new CreateShareOperation(OperationsService.this, remotePath, + ShareType.PUBLIC_LINK, + "", false, password, 1, sendIntent); } } else if (action.equals(ACTION_UNSHARE)) { // Unshare file diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index e92474b7..8eb20e4d 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -61,7 +61,9 @@ import com.owncloud.android.operations.SynchronizeFolderOperation; 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.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.LoadingDialog; +import com.owncloud.android.ui.dialog.SharePasswordDialogFragment; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -80,6 +82,7 @@ public class FileActivity extends SherlockFragmentActivity private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID"; + private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD"; protected static final long DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS = 200; @@ -450,7 +453,8 @@ public class FileActivity extends SherlockFragmentActivity if (result.getCode() == ResultCode.UNAUTHORIZED) { dismissLoadingDialog(); - Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, + operation, getResources()), Toast.LENGTH_LONG); t.show(); } @@ -478,7 +482,8 @@ public class FileActivity extends SherlockFragmentActivity } - private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { + private void onCreateShareOperationFinish(CreateShareOperation operation, + RemoteOperationResult result) { dismissLoadingDialog(); if (result.isSuccess()) { updateFileFromDB(); @@ -486,10 +491,19 @@ public class FileActivity extends SherlockFragmentActivity Intent sendIntent = operation.getSendIntent(); startActivity(sendIntent); - } else { - Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), - Toast.LENGTH_LONG); - t.show(); + } else { + // Detect Failure (403) --> needs Password + if (result.getCode() == ResultCode.SHARE_FORBIDDEN) { + SharePasswordDialogFragment dialog = + SharePasswordDialogFragment.newInstance( new OCFile(operation.getPath()), + operation.getSendIntent()); + dialog.show(getSupportFragmentManager(), DIALOG_SHARE_PASSWORD); + } else { + Toast t = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + t.show(); + } } } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 16c09edd..9c6f6dc5 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -23,13 +23,10 @@ package com.owncloud.android.ui.activity; import java.io.File; -import java.io.IOException; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; diff --git a/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java b/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java index e05f2165..fc88e5d1 100644 --- a/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java +++ b/src/com/owncloud/android/ui/dialog/ShareLinkToDialog.java @@ -147,7 +147,7 @@ public class ShareLinkToDialog extends SherlockDialogFragment { } else { // Create a new share resource ((ComponentsGetter)getSherlockActivity()).getFileOperationsHelper() - .shareFileWithLinkToApp(mFile, mIntent); + .shareFileWithLinkToApp(mFile, "", mIntent); } } }) diff --git a/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java b/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java new file mode 100644 index 00000000..a7e71b5b --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java @@ -0,0 +1,118 @@ +/** + * ownCloud Android client application + * @author masensio + * 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.ui.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.activity.FileActivity; + +/** + * Dialog to input the password for sharing a file/folder. + * + * Triggers the share when the password is introduced. + */ + +public class SharePasswordDialogFragment extends SherlockDialogFragment + implements DialogInterface.OnClickListener { + + private static final String ARG_FILE = "FILE"; + private static final String ARG_SEND_INTENT = "SEND_INTENT"; + + public static final String PASSWORD_FRAGMENT = "PASSWORD_FRAGMENT"; + + private OCFile mFile; + private Intent mSendIntent; + + /** + * Public factory method to create new SharePasswordDialogFragment instances. + * + * @param file + * @param sendIntent + * @return Dialog ready to show. + */ + public static SharePasswordDialogFragment newInstance(OCFile file, Intent sendIntent) { + SharePasswordDialogFragment frag = new SharePasswordDialogFragment(); + Bundle args = new Bundle(); + args.putParcelable(ARG_FILE, file); + args.putParcelable(ARG_SEND_INTENT, sendIntent); + frag.setArguments(args); + return frag; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + mFile = getArguments().getParcelable(ARG_FILE); + mSendIntent = getArguments().getParcelable(ARG_SEND_INTENT); + + // Inflate the layout for the dialog + LayoutInflater inflater = getActivity().getLayoutInflater(); + View v = inflater.inflate(R.layout.password_dialog, null); + + // Setup layout + EditText inputText = ((EditText)v.findViewById(R.id.share_password)); + inputText.setText(""); + inputText.requestFocus(); + + // Build the dialog + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setView(v) + .setPositiveButton(R.string.common_ok, this) + .setNegativeButton(R.string.common_cancel, this) + .setTitle(R.string.share_link_password_title); + Dialog d = builder.create(); + d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + return d; + } + + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == AlertDialog.BUTTON_POSITIVE) { + String password = + ((TextView)(getDialog().findViewById(R.id.share_password))) + .getText().toString(); + + if (password.length() <= 0) { + Toast.makeText( + getActivity(), + R.string.share_link_empty_password, + Toast.LENGTH_LONG).show(); + return; + } + + // Share the file + ((FileActivity)getSherlockActivity()).getFileOperationsHelper() + .shareFileWithLinkToApp(mFile, password, mSendIntent); + + } + } +}