mirror of
https://github.com/nextcloud/android.git
synced 2024-11-27 09:39:25 +03:00
Set or clear password to protect public link in ShareFileFragment
This commit is contained in:
parent
19cf573db0
commit
729a9b7c77
12 changed files with 330 additions and 49 deletions
|
@ -288,6 +288,8 @@
|
||||||
<string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
|
<string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
|
||||||
<string name="unshare_link_file_no_exist">Unable to unshare. Please check whether the file exists</string>
|
<string name="unshare_link_file_no_exist">Unable to unshare. Please check whether the file exists</string>
|
||||||
<string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
|
<string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
|
||||||
|
<string name="update_link_file_no_exist">Unable to update. Please check whether the file exists </string>
|
||||||
|
<string name="update_link_file_error">An error occurred while trying to update the shared link</string>
|
||||||
<string name="share_link_password_title">Enter a password</string>
|
<string name="share_link_password_title">Enter a password</string>
|
||||||
<string name="share_link_empty_password">You must enter a password</string>
|
<string name="share_link_empty_password">You must enter a password</string>
|
||||||
|
|
||||||
|
@ -309,6 +311,7 @@
|
||||||
<string name="forbidden_permissions_delete">to delete this file</string>
|
<string name="forbidden_permissions_delete">to delete this file</string>
|
||||||
<string name="share_link_forbidden_permissions">to share this file</string>
|
<string name="share_link_forbidden_permissions">to share this file</string>
|
||||||
<string name="unshare_link_forbidden_permissions">to unshare this file</string>
|
<string name="unshare_link_forbidden_permissions">to unshare this file</string>
|
||||||
|
<string name="update_link_forbidden_permissions">to update this shared link</string>
|
||||||
<string name="forbidden_permissions_create">to create the file</string>
|
<string name="forbidden_permissions_create">to create the file</string>
|
||||||
<string name="uploader_upload_forbidden_permissions">to upload in this folder</string>
|
<string name="uploader_upload_forbidden_permissions">to upload in this folder</string>
|
||||||
<string name="downloader_download_file_not_found">The file is no longer available on the server</string>
|
<string name="downloader_download_file_not_found">The file is no longer available on the server</string>
|
||||||
|
|
|
@ -47,7 +47,6 @@ import android.provider.MediaStore;
|
||||||
import com.owncloud.android.MainApp;
|
import com.owncloud.android.MainApp;
|
||||||
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
|
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
|
||||||
import com.owncloud.android.lib.common.utils.Log_OC;
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
||||||
import com.owncloud.android.lib.resources.files.FileUtils;
|
|
||||||
import com.owncloud.android.lib.resources.shares.OCShare;
|
import com.owncloud.android.lib.resources.shares.OCShare;
|
||||||
import com.owncloud.android.lib.resources.shares.ShareType;
|
import com.owncloud.android.lib.resources.shares.ShareType;
|
||||||
import com.owncloud.android.lib.resources.status.CapabilityBooleanType;
|
import com.owncloud.android.lib.resources.status.CapabilityBooleanType;
|
||||||
|
@ -935,20 +934,20 @@ public class FileDataStorageManager {
|
||||||
);
|
);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
|
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getRemoteId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
||||||
|
|
||||||
if (shareExists(share.getIdRemoteShared())) {// for renamed files; no more delete and create
|
if (shareExists(share.getRemoteId())) {// for renamed files; no more delete and create
|
||||||
overriden = true;
|
overriden = true;
|
||||||
if (getContentResolver() != null) {
|
if (getContentResolver() != null) {
|
||||||
getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv,
|
getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv,
|
||||||
ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
||||||
new String[]{String.valueOf(share.getIdRemoteShared())});
|
new String[]{String.valueOf(share.getRemoteId())});
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_SHARE,
|
getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_SHARE,
|
||||||
cv, ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
cv, ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
||||||
new String[]{String.valueOf(share.getIdRemoteShared())});
|
new String[]{String.valueOf(share.getRemoteId())});
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log_OC.e(TAG,
|
Log_OC.e(TAG,
|
||||||
"Fail to insert insert file to database "
|
"Fail to insert insert file to database "
|
||||||
|
@ -981,16 +980,42 @@ public class FileDataStorageManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get first share bound to a file with a known path and given {@link ShareType}.
|
||||||
|
*
|
||||||
|
* @param path Path of the file.
|
||||||
|
* @param type Type of the share to get
|
||||||
|
* @param shareWith Target of the share. Ignored in type is {@link ShareType#PUBLIC_LINK}
|
||||||
|
* @return First {@OCShare} instance found in DB bound to the file in 'path'
|
||||||
|
*/
|
||||||
public OCShare getFirstShareByPathAndType(String path, ShareType type, String shareWith) {
|
public OCShare getFirstShareByPathAndType(String path, ShareType type, String shareWith) {
|
||||||
Cursor c = null;
|
Cursor c = null;
|
||||||
|
if (shareWith == null) {
|
||||||
|
shareWith = "";
|
||||||
|
}
|
||||||
|
|
||||||
String selection = ProviderTableMeta.OCSHARES_PATH + "=? AND "
|
String selection = ProviderTableMeta.OCSHARES_PATH + "=? AND "
|
||||||
+ ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
|
+ ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
|
||||||
+ ProviderTableMeta.OCSHARES_SHARE_WITH + "=? AND "
|
|
||||||
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" ;
|
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" ;
|
||||||
|
if (!ShareType.PUBLIC_LINK.equals(type)) {
|
||||||
|
selection += ProviderTableMeta.OCSHARES_SHARE_WITH + "=? AND ";
|
||||||
|
}
|
||||||
|
|
||||||
String [] selectionArgs = new String[]{path, Integer.toString(type.getValue()),
|
String [] selectionArgs;
|
||||||
shareWith, mAccount.name};
|
if (ShareType.PUBLIC_LINK.equals(type)) {
|
||||||
|
selectionArgs = new String[]{
|
||||||
|
path,
|
||||||
|
Integer.toString(type.getValue()),
|
||||||
|
mAccount.name
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
selectionArgs = new String[]{
|
||||||
|
path,
|
||||||
|
Integer.toString(type.getValue()),
|
||||||
|
mAccount.name,
|
||||||
|
shareWith
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if (getContentResolver() != null) {
|
if (getContentResolver() != null) {
|
||||||
c = getContentResolver().query(
|
c = getContentResolver().query(
|
||||||
|
@ -1190,16 +1215,16 @@ public class FileDataStorageManager {
|
||||||
);
|
);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
|
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getRemoteId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
||||||
|
|
||||||
if (shareExists(share.getIdRemoteShared())) {
|
if (shareExists(share.getRemoteId())) {
|
||||||
// updating an existing file
|
// updating an existing file
|
||||||
operations.add(
|
operations.add(
|
||||||
ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE).
|
ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE).
|
||||||
withValues(cv).
|
withValues(cv).
|
||||||
withSelection(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
withSelection(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
|
||||||
new String[]{String.valueOf(share.getIdRemoteShared())})
|
new String[]{String.valueOf(share.getRemoteId())})
|
||||||
.build());
|
.build());
|
||||||
} else {
|
} else {
|
||||||
// adding a new file
|
// adding a new file
|
||||||
|
@ -1463,7 +1488,7 @@ public class FileDataStorageManager {
|
||||||
);
|
);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0);
|
||||||
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
|
cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getRemoteId());
|
||||||
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
|
||||||
|
|
||||||
// adding a new share resource
|
// adding a new share resource
|
||||||
|
|
|
@ -46,6 +46,7 @@ import com.owncloud.android.services.observer.FileObserverService;
|
||||||
import com.owncloud.android.ui.activity.FileActivity;
|
import com.owncloud.android.ui.activity.FileActivity;
|
||||||
import com.owncloud.android.ui.activity.ShareActivity;
|
import com.owncloud.android.ui.activity.ShareActivity;
|
||||||
import com.owncloud.android.ui.dialog.ShareLinkToDialog;
|
import com.owncloud.android.ui.dialog.ShareLinkToDialog;
|
||||||
|
import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
|
||||||
|
|
||||||
import org.apache.http.protocol.HTTP;
|
import org.apache.http.protocol.HTTP;
|
||||||
|
|
||||||
|
@ -283,7 +284,7 @@ public class FileOperationsHelper {
|
||||||
unshareService.putExtra(OperationsService.EXTRA_SHARE_TYPE, ShareType.PUBLIC_LINK);
|
unshareService.putExtra(OperationsService.EXTRA_SHARE_TYPE, ShareType.PUBLIC_LINK);
|
||||||
unshareService.putExtra(OperationsService.EXTRA_SHARE_WITH, "");
|
unshareService.putExtra(OperationsService.EXTRA_SHARE_WITH, "");
|
||||||
|
|
||||||
unshareFile(unshareService);
|
queueShareIntent(unshareService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unshareFileWithUserOrGroup(OCFile file, ShareType shareType, String userOrGroup){
|
public void unshareFileWithUserOrGroup(OCFile file, ShareType shareType, String userOrGroup){
|
||||||
|
@ -296,15 +297,15 @@ public class FileOperationsHelper {
|
||||||
unshareService.putExtra(OperationsService.EXTRA_SHARE_TYPE, shareType);
|
unshareService.putExtra(OperationsService.EXTRA_SHARE_TYPE, shareType);
|
||||||
unshareService.putExtra(OperationsService.EXTRA_SHARE_WITH, userOrGroup);
|
unshareService.putExtra(OperationsService.EXTRA_SHARE_WITH, userOrGroup);
|
||||||
|
|
||||||
unshareFile(unshareService);
|
queueShareIntent(unshareService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void unshareFile(Intent unshareService){
|
private void queueShareIntent(Intent shareIntent){
|
||||||
if (isSharedSupported()) {
|
if (isSharedSupported()) {
|
||||||
// Unshare the file
|
// Unshare the file
|
||||||
mWaitingForOpId = mFileActivity.getOperationsServiceBinder().
|
mWaitingForOpId = mFileActivity.getOperationsServiceBinder().
|
||||||
queueNewOperation(unshareService);
|
queueNewOperation(shareIntent);
|
||||||
|
|
||||||
mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext().
|
mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext().
|
||||||
getString(R.string.wait_a_moment));
|
getString(R.string.wait_a_moment));
|
||||||
|
@ -333,6 +334,46 @@ public class FileOperationsHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a dialog that requests a password to the user to protect a share link.
|
||||||
|
*
|
||||||
|
* @param file File which public share will be protected by the requested password
|
||||||
|
*/
|
||||||
|
public void requestPasswordForShareViaLink(OCFile file) {
|
||||||
|
SharePasswordDialogFragment dialog =
|
||||||
|
SharePasswordDialogFragment.newInstance(
|
||||||
|
file,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
dialog.show(
|
||||||
|
mFileActivity.getSupportFragmentManager(),
|
||||||
|
SharePasswordDialogFragment.PASSWORD_FRAGMENT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a public share on a file to set its password.
|
||||||
|
* Starts a request to do it in {@link OperationsService}
|
||||||
|
*
|
||||||
|
* @param file File which public share will be protected with a password.
|
||||||
|
* @param password Password to set for the public link; null or empty string to clear
|
||||||
|
* the current password
|
||||||
|
*/
|
||||||
|
public void setPasswordToShareViaLink(OCFile file, String password) {
|
||||||
|
// Set password updating share
|
||||||
|
Intent updateShareIntent = new Intent(mFileActivity, OperationsService.class);
|
||||||
|
updateShareIntent.setAction(OperationsService.ACTION_UPDATE_SHARE);
|
||||||
|
updateShareIntent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
|
||||||
|
updateShareIntent.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath());
|
||||||
|
updateShareIntent.putExtra(
|
||||||
|
OperationsService.EXTRA_PASSWORD_SHARE,
|
||||||
|
(password == null) ? "" : password
|
||||||
|
);
|
||||||
|
|
||||||
|
queueShareIntent(updateShareIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 'True' if the server supports the Search Users API
|
* @return 'True' if the server supports the Search Users API
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -30,7 +30,6 @@ import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
|
||||||
import com.owncloud.android.R;
|
import com.owncloud.android.R;
|
||||||
import com.owncloud.android.datamodel.FileDataStorageManager;
|
|
||||||
import com.owncloud.android.datamodel.OCFile;
|
import com.owncloud.android.datamodel.OCFile;
|
||||||
import com.owncloud.android.lib.common.OwnCloudClient;
|
import com.owncloud.android.lib.common.OwnCloudClient;
|
||||||
import com.owncloud.android.lib.common.operations.RemoteOperation;
|
import com.owncloud.android.lib.common.operations.RemoteOperation;
|
||||||
|
@ -44,8 +43,6 @@ import com.owncloud.android.operations.common.SyncOperation;
|
||||||
|
|
||||||
public class CreateShareViaLinkOperation extends SyncOperation {
|
public class CreateShareViaLinkOperation extends SyncOperation {
|
||||||
|
|
||||||
protected FileDataStorageManager mStorageManager;
|
|
||||||
|
|
||||||
private String mPath;
|
private String mPath;
|
||||||
private String mPassword;
|
private String mPassword;
|
||||||
private Intent mSendIntent;
|
private Intent mSendIntent;
|
||||||
|
|
|
@ -69,11 +69,11 @@ public class UnshareOperation extends SyncOperation {
|
||||||
if (share != null) {
|
if (share != null) {
|
||||||
OCFile file = getStorageManager().getFileByPath(mRemotePath);
|
OCFile file = getStorageManager().getFileByPath(mRemotePath);
|
||||||
RemoveRemoteShareOperation operation =
|
RemoveRemoteShareOperation operation =
|
||||||
new RemoveRemoteShareOperation((int) share.getIdRemoteShared());
|
new RemoveRemoteShareOperation((int) share.getRemoteId());
|
||||||
result = operation.execute(client);
|
result = operation.execute(client);
|
||||||
|
|
||||||
if (result.isSuccess()) {
|
if (result.isSuccess()) {
|
||||||
Log_OC.d(TAG, "Share id = " + share.getIdRemoteShared() + " deleted");
|
Log_OC.d(TAG, "Share id = " + share.getRemoteId() + " deleted");
|
||||||
|
|
||||||
if (mShareType == ShareType.PUBLIC_LINK) {
|
if (mShareType == ShareType.PUBLIC_LINK) {
|
||||||
file.setShareViaLink(false);
|
file.setShareViaLink(false);
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
/**
|
||||||
|
* ownCloud Android client application
|
||||||
|
*
|
||||||
|
* @author David A. Velasco
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.owncloud.android.operations;
|
||||||
|
|
||||||
|
import com.owncloud.android.datamodel.OCFile;
|
||||||
|
import com.owncloud.android.lib.common.OwnCloudClient;
|
||||||
|
import com.owncloud.android.lib.common.operations.RemoteOperation;
|
||||||
|
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
|
||||||
|
import com.owncloud.android.lib.resources.files.FileUtils;
|
||||||
|
import com.owncloud.android.lib.resources.shares.GetRemoteShareOperation;
|
||||||
|
import com.owncloud.android.lib.resources.shares.OCShare;
|
||||||
|
import com.owncloud.android.lib.resources.shares.ShareType;
|
||||||
|
import com.owncloud.android.lib.resources.shares.UpdateRemoteShareOperation;
|
||||||
|
import com.owncloud.android.operations.common.SyncOperation;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an existing public share for a given file
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class UpdateShareViaLinkOperation extends SyncOperation {
|
||||||
|
|
||||||
|
private String mPath;
|
||||||
|
private String mPassword;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param path Full path of the file/folder being shared. Mandatory argument
|
||||||
|
* @param password Password to protect a public link share.
|
||||||
|
*/
|
||||||
|
public UpdateShareViaLinkOperation(
|
||||||
|
String path,
|
||||||
|
String password
|
||||||
|
) {
|
||||||
|
|
||||||
|
mPath = path;
|
||||||
|
mPassword = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected RemoteOperationResult run(OwnCloudClient client) {
|
||||||
|
|
||||||
|
OCShare publicShare = getStorageManager().getFirstShareByPathAndType(
|
||||||
|
mPath,
|
||||||
|
ShareType.PUBLIC_LINK,
|
||||||
|
""
|
||||||
|
);
|
||||||
|
|
||||||
|
if (publicShare == null) {
|
||||||
|
// TODO try to get remote?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update remote share with password
|
||||||
|
RemoteOperation operation = new UpdateRemoteShareOperation(
|
||||||
|
publicShare.getRemoteId()
|
||||||
|
);
|
||||||
|
((UpdateRemoteShareOperation)operation).setPassword(mPassword);
|
||||||
|
RemoteOperationResult result = operation.execute(client);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (!result.isSuccess() || result.getData().size() <= 0) {
|
||||||
|
operation = new CreateRemoteShareOperation(
|
||||||
|
mPath,
|
||||||
|
ShareType.PUBLIC_LINK,
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
mPassword,
|
||||||
|
OCShare.DEFAULT_PERMISSION
|
||||||
|
);
|
||||||
|
result = operation.execute(client);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (result.isSuccess()) {
|
||||||
|
// Retrieve updated share / save directly with password? -> no; the password is not be saved
|
||||||
|
operation = new GetRemoteShareOperation(publicShare.getRemoteId());
|
||||||
|
result = operation.execute(client);
|
||||||
|
if (result.isSuccess()) {
|
||||||
|
OCShare share = (OCShare) result.getData().get(0);
|
||||||
|
updateData(share);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return mPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return mPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateData(OCShare share) {
|
||||||
|
// Update DB with the response
|
||||||
|
share.setPath(mPath);
|
||||||
|
if (mPath.endsWith(FileUtils.PATH_SEPARATOR)) {
|
||||||
|
share.setIsFolder(true);
|
||||||
|
} else {
|
||||||
|
share.setIsFolder(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
getStorageManager().saveShare(share); // TODO info about having a password? ask to Gonzalo
|
||||||
|
|
||||||
|
// Update OCFile with data from share: ShareByLink and publicLink
|
||||||
|
// TODO check & remove if not needed
|
||||||
|
OCFile file = getStorageManager().getFileByPath(mPath);
|
||||||
|
if (file != null) {
|
||||||
|
file.setPublicLink(share.getShareLink());
|
||||||
|
file.setShareViaLink(true);
|
||||||
|
getStorageManager().saveFile(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -64,6 +64,7 @@ import com.owncloud.android.operations.RenameFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFileOperation;
|
import com.owncloud.android.operations.SynchronizeFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
||||||
import com.owncloud.android.operations.UnshareOperation;
|
import com.owncloud.android.operations.UnshareOperation;
|
||||||
|
import com.owncloud.android.operations.UpdateShareViaLinkOperation;
|
||||||
import com.owncloud.android.operations.common.SyncOperation;
|
import com.owncloud.android.operations.common.SyncOperation;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -97,6 +98,7 @@ public class OperationsService extends Service {
|
||||||
public static final String ACTION_CREATE_SHARE_VIA_LINK = "CREATE_SHARE_VIA_LINK";
|
public static final String ACTION_CREATE_SHARE_VIA_LINK = "CREATE_SHARE_VIA_LINK";
|
||||||
public static final String ACTION_CREATE_SHARE_WITH_SHAREE = "CREATE_SHARE_WITH_SHAREE";
|
public static final String ACTION_CREATE_SHARE_WITH_SHAREE = "CREATE_SHARE_WITH_SHAREE";
|
||||||
public static final String ACTION_UNSHARE = "UNSHARE";
|
public static final String ACTION_UNSHARE = "UNSHARE";
|
||||||
|
public static final String ACTION_UPDATE_SHARE = "UPDATE_SHARE";
|
||||||
public static final String ACTION_GET_SERVER_INFO = "GET_SERVER_INFO";
|
public static final String ACTION_GET_SERVER_INFO = "GET_SERVER_INFO";
|
||||||
public static final String ACTION_OAUTH2_GET_ACCESS_TOKEN = "OAUTH2_GET_ACCESS_TOKEN";
|
public static final String ACTION_OAUTH2_GET_ACCESS_TOKEN = "OAUTH2_GET_ACCESS_TOKEN";
|
||||||
public static final String ACTION_GET_USER_NAME = "GET_USER_NAME";
|
public static final String ACTION_GET_USER_NAME = "GET_USER_NAME";
|
||||||
|
@ -563,6 +565,13 @@ public class OperationsService extends Service {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (ACTION_UPDATE_SHARE.equals(action)) {
|
||||||
|
String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
|
||||||
|
String password = operationIntent.getStringExtra(EXTRA_PASSWORD_SHARE);
|
||||||
|
if (remotePath.length() > 0) {
|
||||||
|
operation = new UpdateShareViaLinkOperation(remotePath, password);
|
||||||
|
}
|
||||||
|
|
||||||
} else if (action.equals(ACTION_CREATE_SHARE_WITH_SHAREE)) { // Create private share with user or group
|
} else if (action.equals(ACTION_CREATE_SHARE_WITH_SHAREE)) { // Create private share with user or group
|
||||||
String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
|
String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
|
||||||
String shareeName = operationIntent.getStringExtra(EXTRA_SHARE_WITH);
|
String shareeName = operationIntent.getStringExtra(EXTRA_SHARE_WITH);
|
||||||
|
|
|
@ -73,6 +73,7 @@ import com.owncloud.android.operations.GetSharesForFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFileOperation;
|
import com.owncloud.android.operations.SynchronizeFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
||||||
import com.owncloud.android.operations.UnshareOperation;
|
import com.owncloud.android.operations.UnshareOperation;
|
||||||
|
import com.owncloud.android.operations.UpdateShareViaLinkOperation;
|
||||||
import com.owncloud.android.services.OperationsService;
|
import com.owncloud.android.services.OperationsService;
|
||||||
import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
|
import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
|
||||||
import com.owncloud.android.ui.NavigationDrawerItem;
|
import com.owncloud.android.ui.NavigationDrawerItem;
|
||||||
|
@ -735,7 +736,8 @@ public class FileActivity extends AppCompatActivity
|
||||||
} else if (operation == null ||
|
} else if (operation == null ||
|
||||||
operation instanceof CreateShareWithShareeOperation ||
|
operation instanceof CreateShareWithShareeOperation ||
|
||||||
operation instanceof UnshareOperation ||
|
operation instanceof UnshareOperation ||
|
||||||
operation instanceof SynchronizeFolderOperation
|
operation instanceof SynchronizeFolderOperation ||
|
||||||
|
operation instanceof UpdateShareViaLinkOperation
|
||||||
) {
|
) {
|
||||||
if (result.isSuccess()) {
|
if (result.isSuccess()) {
|
||||||
updateFileFromDB();
|
updateFileFromDB();
|
||||||
|
|
|
@ -154,7 +154,7 @@ public class ShareActivity extends FileActivity
|
||||||
super.onRemoteOperationFinish(operation, result);
|
super.onRemoteOperationFinish(operation, result);
|
||||||
|
|
||||||
if (result.isSuccess()) {
|
if (result.isSuccess()) {
|
||||||
Log_OC.d(TAG, "Refreshing lists on successful sync");
|
Log_OC.d(TAG, "Refreshing lists on successful operation");
|
||||||
refreshSharesFromStorageManager();
|
refreshSharesFromStorageManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,14 @@ public class SharePasswordDialogFragment extends DialogFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
// Share the file
|
// Share the file
|
||||||
((FileActivity)getActivity()).getFileOperationsHelper()
|
if (mSendIntent == null) {
|
||||||
.shareFileWithLinkToApp(mFile, password, mSendIntent);
|
((FileActivity) getActivity()).getFileOperationsHelper().
|
||||||
|
setPasswordToShareViaLink(mFile, password);
|
||||||
|
|
||||||
|
} else { // TODO remove old flow
|
||||||
|
((FileActivity) getActivity()).getFileOperationsHelper()
|
||||||
|
.shareFileWithLinkToApp(mFile, password, mSendIntent);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Disable the flag "Share again"
|
// Disable the flag "Share again"
|
||||||
|
|
|
@ -95,6 +95,9 @@ public class ShareFileFragment extends Fragment
|
||||||
/** Listener for changes on switch to share / unshare publicly */
|
/** Listener for changes on switch to share / unshare publicly */
|
||||||
private CompoundButton.OnCheckedChangeListener mOnShareViaLinkSwitchCheckedChangeListener;
|
private CompoundButton.OnCheckedChangeListener mOnShareViaLinkSwitchCheckedChangeListener;
|
||||||
|
|
||||||
|
/** Listener for changes on switch to set / clear password on public link */
|
||||||
|
private CompoundButton.OnCheckedChangeListener mOnPasswordSwitchCheckedChangeListener;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public factory method to create new ShareFileFragment instances.
|
* Public factory method to create new ShareFileFragment instances.
|
||||||
|
@ -181,15 +184,19 @@ public class ShareFileFragment extends Fragment
|
||||||
mOnShareViaLinkSwitchCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
mOnShareViaLinkSwitchCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
if (isResumed()) {
|
if (!isResumed()) {
|
||||||
if (isChecked) {
|
// very important, setCheched(...) is called automatically during
|
||||||
((FileActivity) getActivity()).getFileOperationsHelper().shareFileViaLink(mFile);
|
// Fragment recreation on device rotations
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isChecked) {
|
||||||
|
((FileActivity) getActivity()).getFileOperationsHelper().
|
||||||
|
shareFileViaLink(mFile);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
((FileActivity) getActivity()).getFileOperationsHelper().unshareFileViaLink(mFile);
|
((FileActivity) getActivity()).getFileOperationsHelper().
|
||||||
}
|
unshareFileViaLink(mFile);
|
||||||
} // else, nothing; very important, setCheched(...) is called automatically during Fragment
|
}
|
||||||
// recreation on device rotations
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Switch shareViaLinkSwitch = (Switch) view.findViewById(R.id.shareViaLinkSectionSwitch);
|
Switch shareViaLinkSwitch = (Switch) view.findViewById(R.id.shareViaLinkSectionSwitch);
|
||||||
|
@ -200,6 +207,11 @@ public class ShareFileFragment extends Fragment
|
||||||
shareViaLinkExpirationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
shareViaLinkExpirationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
if (!isResumed()) {
|
||||||
|
// very important, setCheched(...) is called automatically during
|
||||||
|
// Fragment recreation on device rotations
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
// TODO real implementation: update share with expiration date
|
// TODO real implementation: update share with expiration date
|
||||||
// show value of expiration date
|
// show value of expiration date
|
||||||
|
@ -214,23 +226,25 @@ public class ShareFileFragment extends Fragment
|
||||||
});
|
});
|
||||||
|
|
||||||
// Switch for password
|
// Switch for password
|
||||||
Switch shareViaLinkPasswordSwitch = (Switch) view.findViewById(R.id.shareViaLinkPasswordSwitch);
|
mOnPasswordSwitchCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
||||||
shareViaLinkPasswordSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
if (!isResumed()) {
|
||||||
|
// very important, setCheched(...) is called automatically during
|
||||||
|
// Fragment recreation on device rotations
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
// TODO real implementation: update share with password
|
((FileActivity) getActivity()).getFileOperationsHelper().
|
||||||
// show
|
requestPasswordForShareViaLink(mFile);
|
||||||
getExpirationPasswordValue().setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// TODO real implementation: update share without password
|
((FileActivity) getActivity()).getFileOperationsHelper().
|
||||||
// empty value
|
setPasswordToShareViaLink(mFile, ""); // "" clears
|
||||||
getExpirationPasswordValue().setVisibility(View.INVISIBLE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
Switch shareViaLinkPasswordSwitch = (Switch) view.findViewById(R.id.shareViaLinkPasswordSwitch);
|
||||||
|
shareViaLinkPasswordSwitch.setOnCheckedChangeListener(mOnShareViaLinkSwitchCheckedChangeListener);
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
@ -342,12 +356,12 @@ public class ShareFileFragment extends Fragment
|
||||||
*/
|
*/
|
||||||
private void updatePublicShareSection() {
|
private void updatePublicShareSection() {
|
||||||
if (mPublicShare != null && ShareType.PUBLIC_LINK.equals(mPublicShare.getShareType())) {
|
if (mPublicShare != null && ShareType.PUBLIC_LINK.equals(mPublicShare.getShareType())) {
|
||||||
// public share bound -> expand section
|
/// public share bound -> expand section
|
||||||
Switch shareViaLinkSwitch = getShareViaLinkSwitch();
|
Switch shareViaLinkSwitch = getShareViaLinkSwitch();
|
||||||
if (!shareViaLinkSwitch.isChecked()) {
|
if (!shareViaLinkSwitch.isChecked()) {
|
||||||
// set null listener before setChecked() to prevent infinite loop of calls
|
// set null listener before setChecked() to prevent infinite loop of calls
|
||||||
shareViaLinkSwitch.setOnCheckedChangeListener(null);
|
shareViaLinkSwitch.setOnCheckedChangeListener(null);
|
||||||
getShareViaLinkSwitch().setChecked(true);
|
shareViaLinkSwitch.setChecked(true);
|
||||||
shareViaLinkSwitch.setOnCheckedChangeListener(
|
shareViaLinkSwitch.setOnCheckedChangeListener(
|
||||||
mOnShareViaLinkSwitchCheckedChangeListener
|
mOnShareViaLinkSwitchCheckedChangeListener
|
||||||
);
|
);
|
||||||
|
@ -356,8 +370,29 @@ public class ShareFileFragment extends Fragment
|
||||||
getPasswordSection().setVisibility(View.VISIBLE);
|
getPasswordSection().setVisibility(View.VISIBLE);
|
||||||
getGetLinkButton().setVisibility(View.VISIBLE);
|
getGetLinkButton().setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
/// update state of password switch and message depending on password protection
|
||||||
|
Switch passwordSwitch = getPasswordSwitch();
|
||||||
|
// set null listener before setChecked() to prevent infinite loop of calls
|
||||||
|
passwordSwitch.setOnCheckedChangeListener(null);
|
||||||
|
if (mPublicShare.isPasswordProtected()) {
|
||||||
|
if (!passwordSwitch.isChecked()) {
|
||||||
|
passwordSwitch.toggle();
|
||||||
|
}
|
||||||
|
getPasswordValue().setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
if (passwordSwitch.isChecked()) {
|
||||||
|
passwordSwitch.toggle();
|
||||||
|
}
|
||||||
|
getPasswordValue().setVisibility(View.INVISIBLE);
|
||||||
|
}
|
||||||
|
// recover listener
|
||||||
|
passwordSwitch.setOnCheckedChangeListener(
|
||||||
|
mOnPasswordSwitchCheckedChangeListener
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// no public share -> collapse section
|
/// no public share -> collapse section
|
||||||
Switch shareViaLinkSwitch = getShareViaLinkSwitch();
|
Switch shareViaLinkSwitch = getShareViaLinkSwitch();
|
||||||
if (shareViaLinkSwitch.isChecked()) {
|
if (shareViaLinkSwitch.isChecked()) {
|
||||||
shareViaLinkSwitch.setOnCheckedChangeListener(null);
|
shareViaLinkSwitch.setOnCheckedChangeListener(null);
|
||||||
|
@ -372,6 +407,8 @@ public class ShareFileFragment extends Fragment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// BEWARE: next methods will failed with NullPointerException if called before onCreateView() finishes
|
||||||
|
|
||||||
private Switch getShareViaLinkSwitch() {
|
private Switch getShareViaLinkSwitch() {
|
||||||
return (Switch) getView().findViewById(R.id.shareViaLinkSectionSwitch);
|
return (Switch) getView().findViewById(R.id.shareViaLinkSectionSwitch);
|
||||||
}
|
}
|
||||||
|
@ -388,7 +425,11 @@ public class ShareFileFragment extends Fragment
|
||||||
return getView().findViewById(R.id.shareViaLinkPasswordSection);
|
return getView().findViewById(R.id.shareViaLinkPasswordSection);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TextView getExpirationPasswordValue() {
|
private Switch getPasswordSwitch() {
|
||||||
|
return (Switch) getView().findViewById(R.id.shareViaLinkPasswordSwitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextView getPasswordValue() {
|
||||||
return (TextView) getView().findViewById(R.id.shareViaLinkPasswordValue);
|
return (TextView) getView().findViewById(R.id.shareViaLinkPasswordValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import com.owncloud.android.R;
|
||||||
import com.owncloud.android.lib.common.operations.RemoteOperation;
|
import com.owncloud.android.lib.common.operations.RemoteOperation;
|
||||||
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
|
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
|
||||||
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
|
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
|
||||||
|
import com.owncloud.android.lib.resources.shares.UpdateRemoteShareOperation;
|
||||||
import com.owncloud.android.operations.CopyFileOperation;
|
import com.owncloud.android.operations.CopyFileOperation;
|
||||||
import com.owncloud.android.operations.CreateFolderOperation;
|
import com.owncloud.android.operations.CreateFolderOperation;
|
||||||
import com.owncloud.android.operations.CreateShareViaLinkOperation;
|
import com.owncloud.android.operations.CreateShareViaLinkOperation;
|
||||||
|
@ -38,6 +39,7 @@ import com.owncloud.android.operations.RenameFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFileOperation;
|
import com.owncloud.android.operations.SynchronizeFileOperation;
|
||||||
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
import com.owncloud.android.operations.SynchronizeFolderOperation;
|
||||||
import com.owncloud.android.operations.UnshareOperation;
|
import com.owncloud.android.operations.UnshareOperation;
|
||||||
|
import com.owncloud.android.operations.UpdateShareViaLinkOperation;
|
||||||
import com.owncloud.android.operations.UploadFileOperation;
|
import com.owncloud.android.operations.UploadFileOperation;
|
||||||
|
|
||||||
import org.apache.commons.httpclient.ConnectTimeoutException;
|
import org.apache.commons.httpclient.ConnectTimeoutException;
|
||||||
|
@ -189,7 +191,7 @@ public class ErrorMessageAdapter {
|
||||||
if (result.getData() != null && result.getData().size() > 0) {
|
if (result.getData() != null && result.getData().size() > 0) {
|
||||||
message = (String) result.getData().get(0); // share API sends its own error messages
|
message = (String) result.getData().get(0); // share API sends its own error messages
|
||||||
|
|
||||||
} else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
|
} else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
|
||||||
message = res.getString(R.string.unshare_link_file_no_exist);
|
message = res.getString(R.string.unshare_link_file_no_exist);
|
||||||
|
|
||||||
} else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
|
} else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
|
||||||
|
@ -201,6 +203,25 @@ public class ErrorMessageAdapter {
|
||||||
// Show a Message, operation finished without success
|
// Show a Message, operation finished without success
|
||||||
message = res.getString(R.string.unshare_link_file_error);
|
message = res.getString(R.string.unshare_link_file_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (operation instanceof UpdateShareViaLinkOperation) {
|
||||||
|
|
||||||
|
if (result.getData() != null && result.getData().size() > 0) {
|
||||||
|
message = (String) result.getData().get(0); // share API sends its own error messages
|
||||||
|
|
||||||
|
} else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
|
||||||
|
message = res.getString(R.string.update_link_file_no_exist);
|
||||||
|
|
||||||
|
} else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
|
||||||
|
// Error --> No permissions
|
||||||
|
message = String.format(res.getString(R.string.forbidden_permissions),
|
||||||
|
res.getString(R.string.update_link_forbidden_permissions));
|
||||||
|
|
||||||
|
} else { // Generic error
|
||||||
|
// Show a Message, operation finished without success
|
||||||
|
message = res.getString(R.string.update_link_file_error);
|
||||||
|
}
|
||||||
|
|
||||||
} else if (operation instanceof MoveFileOperation) {
|
} else if (operation instanceof MoveFileOperation) {
|
||||||
|
|
||||||
if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
|
if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
|
||||||
|
|
Loading…
Reference in a new issue