123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- /**
- * ownCloud Android client application
- *
- * @author masensio
- * @author David A. Velasco
- * @author Juan Carlos González Cabrero
- * Copyright (C) 2015 ownCloud Inc.
- * <p/>
- * 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.
- * <p/>
- * 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.
- * <p/>
- * 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.ui.activity;
- import android.app.SearchManager;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.support.v4.app.DialogFragment;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentTransaction;
- import android.widget.Toast;
- import com.owncloud.android.R;
- import com.owncloud.android.datamodel.OCFile;
- import com.owncloud.android.lib.common.accounts.AccountUtils;
- import com.owncloud.android.lib.common.operations.RemoteOperation;
- import com.owncloud.android.lib.common.operations.RemoteOperationResult;
- import com.owncloud.android.lib.common.utils.Log_OC;
- import com.owncloud.android.lib.resources.shares.OCShare;
- import com.owncloud.android.lib.resources.shares.ShareType;
- import com.owncloud.android.lib.resources.status.OwnCloudVersion;
- import com.owncloud.android.operations.CreateShareViaLinkOperation;
- import com.owncloud.android.operations.GetSharesForFileOperation;
- import com.owncloud.android.operations.UnshareOperation;
- import com.owncloud.android.operations.UpdateSharePermissionsOperation;
- import com.owncloud.android.ui.dialog.ShareLinkToDialog;
- import com.owncloud.android.ui.fragment.EditShareFragment;
- import com.owncloud.android.ui.fragment.SearchShareesFragment;
- import com.owncloud.android.ui.fragment.ShareFileFragment;
- import com.owncloud.android.ui.fragment.ShareFragmentListener;
- import com.owncloud.android.utils.ErrorMessageAdapter;
- import com.owncloud.android.utils.GetShareWithUsersAsyncTask;
- import org.nextcloud.providers.UsersAndGroupsSearchProvider;
- import java.util.ArrayList;
- /**
- * Activity for sharing files
- */
- public class ShareActivity extends FileActivity
- implements ShareFragmentListener {
- private static final String TAG = ShareActivity.class.getSimpleName();
- private static final String TAG_SHARE_FRAGMENT = "SHARE_FRAGMENT";
- private static final String TAG_SEARCH_FRAGMENT = "SEARCH_USER_AND_GROUPS_FRAGMENT";
- private static final String TAG_EDIT_SHARE_FRAGMENT = "EDIT_SHARE_FRAGMENT";
- private static final String TAG_PUBLIC_LINK = "PUBLIC_LINK";
- /// Tags for dialog fragments
- private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG";
- private static final String FTAG_SHARE_PASSWORD_DIALOG = "SHARE_PASSWORD_DIALOG";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.share_activity);
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- if (savedInstanceState == null) {
- // Add Share fragment on first creation
- Fragment fragment = ShareFileFragment.newInstance(getFile(), getAccount());
- ft.replace(R.id.share_fragment_container, fragment, TAG_SHARE_FRAGMENT);
- ft.commit();
- }
- }
- protected void onAccountSet(boolean stateWasRecovered) {
- super.onAccountSet(stateWasRecovered);
- // Load data into the list
- Log_OC.d(TAG, "Refreshing lists on account set");
- refreshSharesFromStorageManager();
- // Request for a refresh of the data through the server (starts an Async Task)
- refreshUsersOrGroupsListFromServer();
- }
- @Override
- protected void onNewIntent(Intent intent) {
- // Verify the action and get the query
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query = intent.getStringExtra(SearchManager.QUERY);
- Log_OC.w(TAG, "Ignored Intent requesting to query for " + query);
- } else if (UsersAndGroupsSearchProvider.ACTION_SHARE_WITH.equals(intent.getAction())) {
- Uri data = intent.getData();
- String dataString = intent.getDataString();
- String shareWith = dataString.substring(dataString.lastIndexOf('/') + 1);
- ArrayList<String> shareeNames = new ArrayList<>();
- for (OCShare share : getStorageManager().getSharesWithForAFile(getFile().getRemotePath(), getAccount().name)) {
- shareeNames.add(share.getShareWith());
- }
- if (!shareeNames.contains(shareWith)) {
- doShareWith(
- shareWith,
- data.getAuthority()
- );
- }
- } else {
- Log_OC.e(TAG, "Unexpected intent " + intent.toString());
- }
- }
- private void doShareWith(String shareeName, String dataAuthority) {
- ShareType shareType = UsersAndGroupsSearchProvider.getShareType(dataAuthority);
- getFileOperationsHelper().shareFileWithSharee(
- getFile(),
- shareeName,
- shareType,
- getAppropiatePermissions(shareType)
- );
- }
- private int getAppropiatePermissions(ShareType shareType) {
- // check if the Share is FERERATED
- boolean isFederated = ShareType.FEDERATED.equals(shareType);
- if (getFile().isSharedWithMe()) {
- return OCShare.READ_PERMISSION_FLAG; // minimum permissions
- } else if (isFederated) {
- OwnCloudVersion serverVersion =
- com.owncloud.android.authentication.AccountUtils.getServerVersion(getAccount());
- if (serverVersion != null && serverVersion.isNotReshareableFederatedSupported()) {
- return (
- getFile().isFolder() ?
- OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 :
- OCShare.FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9
- );
- } else {
- return (
- getFile().isFolder() ?
- OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 :
- OCShare.FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9
- );
- }
- } else {
- return (
- getFile().isFolder() ?
- OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER :
- OCShare.MAXIMUM_PERMISSIONS_FOR_FILE
- );
- }
- }
- @Override
- public void showSearchUsersAndGroups() {
- // replace ShareFragment with SearchFragment on demand
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- Fragment searchFragment = SearchShareesFragment.newInstance(getFile(), getAccount());
- ft.replace(R.id.share_fragment_container, searchFragment, TAG_SEARCH_FRAGMENT);
- ft.addToBackStack(null); // BACK button will recover the ShareFragment
- ft.commit();
- }
- @Override
- public void showEditShare(OCShare share) {
- // replace current fragment with EditShareFragment on demand
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- Fragment editShareFragment = EditShareFragment.newInstance(share, getFile(), getAccount());
- ft.replace(R.id.share_fragment_container, editShareFragment, TAG_EDIT_SHARE_FRAGMENT);
- ft.addToBackStack(null); // BACK button will recover the previous fragment
- ft.commit();
- }
- @Override
- // Call to Unshare operation
- public void unshareWith(OCShare share) {
- OCFile file = getFile();
- getFileOperationsHelper().unshareFileWithUserOrGroup(file, share.getShareType(), share.getShareWith());
- }
- /**
- * Get users and groups from the server to fill in the "share with" list
- */
- @Override
- public void refreshUsersOrGroupsListFromServer() {
- // Show loading
- showLoadingDialog(getString(R.string.common_loading));
- // Get Users and Groups
- GetShareWithUsersAsyncTask getTask = new GetShareWithUsersAsyncTask(this);
- Object[] params = {getFile(), getAccount(), getStorageManager()};
- getTask.execute(params);
- }
- /**
- * Updates the view associated to the activity after the finish of some operation over files
- * in the current account.
- *
- * @param operation Removal operation performed.
- * @param result Result of the removal.
- */
- @Override
- public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
- super.onRemoteOperationFinish(operation, result);
- if (result.isSuccess() ||
- (operation instanceof GetSharesForFileOperation &&
- result.getCode() == RemoteOperationResult.ResultCode.SHARE_NOT_FOUND
- )
- ) {
- Log_OC.d(TAG, "Refreshing view on successful operation or finished refresh");
- refreshSharesFromStorageManager();
- }
- if (operation instanceof CreateShareViaLinkOperation) {
- onCreateShareViaLinkOperationFinish((CreateShareViaLinkOperation) operation, result);
- }
- if (operation instanceof UnshareOperation && result.isSuccess() && getEditShareFragment() != null) {
- getSupportFragmentManager().popBackStack();
- }
- if (operation instanceof UpdateSharePermissionsOperation
- && getEditShareFragment() != null && getEditShareFragment().isAdded()) {
- getEditShareFragment().onUpdateSharePermissionsFinished(result);
- }
- }
- /**
- * Updates the view, reading data from {@link com.owncloud.android.datamodel.FileDataStorageManager}
- */
- private void refreshSharesFromStorageManager() {
- ShareFileFragment shareFileFragment = getShareFileFragment();
- if (shareFileFragment != null
- && shareFileFragment.isAdded()) { // only if added to the view hierarchy!!
- shareFileFragment.refreshCapabilitiesFromDB();
- shareFileFragment.refreshUsersOrGroupsListFromDB();
- shareFileFragment.refreshPublicShareFromDB();
- }
- SearchShareesFragment searchShareesFragment = getSearchFragment();
- if (searchShareesFragment != null &&
- searchShareesFragment.isAdded()) { // only if added to the view hierarchy!!
- searchShareesFragment.refreshUsersOrGroupsListFromDB();
- }
- EditShareFragment editShareFragment = getEditShareFragment();
- if (editShareFragment != null &&
- editShareFragment.isAdded()) {
- editShareFragment.refreshUiFromDB();
- }
- }
- /**
- * Shortcut to get access to the {@link ShareFileFragment} instance, if any
- *
- * @return A {@link ShareFileFragment} instance, or null
- */
- private ShareFileFragment getShareFileFragment() {
- return (ShareFileFragment) getSupportFragmentManager().findFragmentByTag(TAG_SHARE_FRAGMENT);
- }
- /**
- * Shortcut to get access to the {@link SearchShareesFragment} instance, if any
- *
- * @return A {@link SearchShareesFragment} instance, or null
- */
- private SearchShareesFragment getSearchFragment() {
- return (SearchShareesFragment) getSupportFragmentManager().findFragmentByTag(TAG_SEARCH_FRAGMENT);
- }
- /**
- * Shortcut to get access to the {@link EditShareFragment} instance, if any
- *
- * @return A {@link EditShareFragment} instance, or null
- */
- private EditShareFragment getEditShareFragment() {
- return (EditShareFragment) getSupportFragmentManager().findFragmentByTag(TAG_EDIT_SHARE_FRAGMENT);
- }
- private void onCreateShareViaLinkOperationFinish(CreateShareViaLinkOperation operation,
- RemoteOperationResult result) {
- if (result.isSuccess()) {
- updateFileFromDB();
- // Create dialog to allow the user choose an app to send the link
- Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
- // if share to user and share via link multiple ocshares are returned,
- // therefore filtering for public_link
- String link = "";
- for (Object object : result.getData()) {
- OCShare shareLink = (OCShare) object;
- if (TAG_PUBLIC_LINK.equalsIgnoreCase(shareLink.getShareType().name())) {
- link = shareLink.getShareLink();
- break;
- }
- }
- intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
- intentToShareLink.setType("text/plain");
- String username = AccountUtils.getUsernameForAccount(getAccount());
- if (username != null) {
- intentToShareLink.putExtra(
- Intent.EXTRA_SUBJECT,
- getString(
- R.string.subject_user_shared_with_you,
- username,
- getFile().getFileName()
- )
- );
- } else {
- intentToShareLink.putExtra(
- Intent.EXTRA_SUBJECT,
- getString(
- R.string.subject_shared_with_you,
- getFile().getFileName()
- )
- );
- }
- String[] packagesToExclude = new String[]{getPackageName()};
- DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intentToShareLink, packagesToExclude);
- chooserDialog.show(getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
- } else {
- // Detect Failure (403) --> maybe needs password
- String password = operation.getPassword();
- if (result.getCode() == RemoteOperationResult.ResultCode.SHARE_FORBIDDEN &&
- (password == null || password.length() == 0) &&
- getCapabilities().getFilesSharingPublicEnabled().isUnknown()) {
- // Was tried without password, but not sure that it's optional.
- // Try with password before giving up; see also ShareFileFragment#OnShareViaLinkListener
- ShareFileFragment shareFileFragment = getShareFileFragment();
- if (shareFileFragment != null
- && shareFileFragment.isAdded()) { // only if added to the view hierarchy!!
- shareFileFragment.requestPasswordForShareViaLink(true);
- }
- } else {
- Toast t = Toast.makeText(this,
- ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
- Toast.LENGTH_LONG);
- t.show();
- }
- }
- }
- }
|