>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
-
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<category android:name="android.intent.category.DEFAULT" >
</category>
- <data android:mimeType="*/*" >
+ <data android:mimeType="*/*" android:scheme="content">
</data>
- </intent-filter>
+
+ <data android:mimeType="*/*" android:scheme="file">
+ </data>
+ </intent-filter>
</activity>
<activity
android:name=".ui.activity.Preferences"
-Subproject commit c2bacf9155cd5501f084681209cf3df92df29156
+Subproject commit d96e31b5e595518dc6365e5b290dba124140dc26
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2014 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/>.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingStart="16dip"
+ android:paddingEnd="16dip"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:minWidth="196dip"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true" >
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="8dip"
+ android:layout_marginRight="8dip"
+ android:duplicateParentState="true" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLargePopupMenu"
+ android:duplicateParentState="true"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2014 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/>.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:minWidth="196dip"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true" >
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="8dip"
+ android:duplicateParentState="true" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:duplicateParentState="true"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
<string name="wait_a_moment">Wait a moment</string>
<string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>
<string name="filedisplay_no_file_selected">No file was selected</string>
+ <string name="activity_chooser_title">Send link to …</string>
<string name="oauth_check_onoff">Login with oAuth2</string>
<string name="oauth_login_connection">Connecting to oAuth2 server…</string>
<string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
<string name="failed_upload_failure_text">Failure Message: </string>
<string name="failed_upload_quota_exceeded_text">Please check your server configuration,maybe your quota is exceeded.</string>
+
+ <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your administrator.</string>
+ <string name="share_link_file_no_exist">Unable to share this file or folder. Please, make sure it exists</string>
+ <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
</resources>
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
import com.owncloud.android.lib.operations.common.OCShare;
import com.owncloud.android.lib.operations.common.ShareType;
+import com.owncloud.android.lib.utils.FileUtils;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.Log_OC;
}
}
+
+
+ public void saveSharesDB(ArrayList<OCShare> shares) {
+ saveShares(shares);
+
+ ArrayList<OCFile> sharedFiles = new ArrayList<OCFile>();
+
+ for (OCShare share : shares) {
+ // Get the path
+ String path = share.getPath();
+ if (share.isDirectory()) {
+ path = path + FileUtils.PATH_SEPARATOR;
+ }
+
+ // Update OCFile with data from share: ShareByLink ¿and publicLink?
+ OCFile file = getFileByPath(path);
+ if (file != null) {
+ if (share.getShareType().equals(ShareType.PUBLIC_LINK)) {
+ file.setShareByLink(true);
+ sharedFiles.add(file);
+ }
+ }
+ }
+
+ updateSharedFiles(sharedFiles);
+ }
}
+++ /dev/null
-/* ownCloud Android client application
- * Copyright (C) 2012-2013 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.files;
-
-import com.owncloud.android.datamodel.OCFile;
-
-public interface FileHandler {
-
- /**
- * TODO
- */
- public void openFile(OCFile file);
-
-
-}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 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.files;
+
+import org.apache.http.protocol.HTTP;
+
+import android.accounts.AccountManager;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v4.app.DialogFragment;
+import android.webkit.MimeTypeMap;
+import android.widget.Toast;
+
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.accounts.OwnCloudAccount;
+import com.owncloud.android.lib.network.webdav.WebdavUtils;
+import com.owncloud.android.lib.operations.common.ShareType;
+import com.owncloud.android.operations.CreateShareOperation;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.dialog.ActivityChooserDialog;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ *
+ * @author masensio
+ * @author David A. Velasco
+ */
+public class FileOperationsHelper {
+
+ private static final String TAG = FileOperationsHelper.class.getName();
+
+ private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG";
+
+
+ public void openFile(OCFile file, FileActivity callerActivity) {
+ if (file != null) {
+ String storagePath = file.getStoragePath();
+ String encodedStoragePath = WebdavUtils.encodePath(storagePath);
+
+ Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
+ intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
+ intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+
+ Intent intentForGuessedMimeType = null;
+ if (storagePath.lastIndexOf('.') >= 0) {
+ String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
+ if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
+ intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
+ intentForGuessedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), guessedMimeType);
+ intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ }
+ }
+
+ Intent chooserIntent = null;
+ if (intentForGuessedMimeType != null) {
+ chooserIntent = Intent.createChooser(intentForGuessedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+ } else {
+ chooserIntent = Intent.createChooser(intentForSavedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+ }
+
+ callerActivity.startActivity(chooserIntent);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+ }
+ }
+
+
+ public void shareFileWithLink(OCFile file, FileActivity callerActivity) {
+
+ if (isSharedSupported(callerActivity)) {
+ if (file != null) {
+ String link = "https://fake.url";
+ Intent intent = createShareWithLinkIntent(link);
+ String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
+ DialogFragment chooserDialog = ActivityChooserDialog.newInstance(intent, packagesToExclude, file);
+ chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
+ }
+
+ } else {
+ // Show a Message
+ Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
+ t.show();
+ }
+ }
+
+
+ public void shareFileWithLinkToApp(OCFile file, Intent sendIntent, FileActivity callerActivity) {
+
+ if (file != null) {
+ callerActivity.showLoadingDialog();
+ CreateShareOperation createShare = new CreateShareOperation(file.getRemotePath(), ShareType.PUBLIC_LINK, "", false, "", 1, sendIntent);
+ createShare.execute(callerActivity.getStorageManager(),
+ callerActivity,
+ callerActivity.getRemoteOperationListener(),
+ callerActivity.getHandler(),
+ callerActivity);
+
+ } else {
+ Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+ }
+ }
+
+
+ private Intent createShareWithLinkIntent(String link) {
+ Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
+ intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
+ intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
+ return intentToShareLink;
+ }
+
+
+ /**
+ * @return 'True' if the server supports the Share API
+ */
+ public boolean isSharedSupported(FileActivity callerActivity) {
+ if (callerActivity.getAccount() != null) {
+ AccountManager accountManager = AccountManager.get(callerActivity);
+ return Boolean.parseBoolean(accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API));
+ }
+ return false;
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2014 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;
+
+/**
+ * Creates a new share from a given file
+ *
+ * @author masensio
+ *
+ */
+
+import android.content.Intent;
+
+import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.network.OwnCloudClient;
+import com.owncloud.android.lib.operations.common.OCShare;
+import com.owncloud.android.lib.operations.common.RemoteOperationResult;
+import com.owncloud.android.lib.operations.common.ShareType;
+import com.owncloud.android.lib.operations.remote.CreateShareRemoteOperation;
+import com.owncloud.android.lib.utils.FileUtils;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+public class CreateShareOperation extends SyncOperation {
+
+ private static final String TAG = CreateShareOperation.class.getSimpleName();
+
+ protected FileDataStorageManager mStorageManager;
+
+ private String mPath;
+ private ShareType mShareType;
+ private String mShareWith;
+ private boolean mPublicUpload;
+ private String mPassword;
+ private int mPermissions;
+ private Intent mSendIntent;
+
+ /**
+ * Constructor
+ * @param path Full path of the file/folder being shared. Mandatory argument
+ * @param shareType \910\92 = user, \911\92 = group, \913\92 = Public link. Mandatory argument
+ * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType of 0 or 1
+ * @param publicUpload If \91false\92 (default) public cannot upload to a public shared folder.
+ * If \91true\92 public can upload to a shared folder. Only available for public link shares
+ * @param password Password to protect a public link share. Only available for public link shares
+ * @param permissions 1 - Read only \96 Default for \93public\94 shares
+ * 2 - Update
+ * 4 - Create
+ * 8 - Delete
+ * 16- Re-share
+ * 31- All above \96 Default for \93private\94 shares
+ * For user or group shares.
+ * To obtain combinations, add the desired values together.
+ * For instance, for \93Re-Share\94, \93delete\94, \93read\94, \93update\94, add 16+8+2+1 = 27.
+ */
+ public CreateShareOperation(String path, ShareType shareType, String shareWith, boolean publicUpload,
+ String password, int permissions, Intent sendIntent) {
+
+ mPath = path;
+ mShareType = shareType;
+ mShareWith = shareWith;
+ mPublicUpload = publicUpload;
+ mPassword = password;
+ mPermissions = permissions;
+ mSendIntent = sendIntent;
+ }
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ CreateShareRemoteOperation operation = new CreateShareRemoteOperation(mPath, mShareType, mShareWith, mPublicUpload, mPassword, mPermissions);
+ RemoteOperationResult result = operation.execute(client);
+
+ if (result.isSuccess()) {
+
+ if (result.getData().size() > 0) {
+ OCShare share = (OCShare) result.getData().get(0);
+
+ // Update DB with the response
+ if (mPath.endsWith(FileUtils.PATH_SEPARATOR)) {
+ share.setPath(mPath.substring(0, mPath.length()-1));
+ share.setIsDirectory(true);
+
+ } else {
+ share.setPath(mPath);
+ share.setIsDirectory(false);
+ }
+ share.setPermissions(mPermissions);
+
+ getStorageManager().saveShare(share);
+
+ // Update OCFile with data from share: ShareByLink and publicLink
+ OCFile file = getStorageManager().getFileByPath(mPath);
+ if (file!=null) {
+ mSendIntent.putExtra(Intent.EXTRA_TEXT, share.getShareLink());
+ file.setPublicLink(share.getShareLink());
+ file.setShareByLink(true);
+ getStorageManager().saveFile(file);
+ Log_OC.d(TAG, "Public Link = " + file.getPublicLink());
+
+ }
+ }
+ }
+
+
+ return result;
+ }
+
+
+ public Intent getSendIntent() {
+ return mSendIntent;
+ }
+
+}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 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 java.util.ArrayList;
+
+import com.owncloud.android.lib.network.OwnCloudClient;
+import com.owncloud.android.lib.operations.common.OCShare;
+import com.owncloud.android.lib.operations.common.RemoteOperationResult;
+import com.owncloud.android.lib.operations.remote.GetSharesForFileRemoteOperation;
+import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Provide a list shares for a specific file.
+ *
+ * @author masensio
+ *
+ */
+public class GetSharesForFileOperation extends SyncOperation {
+
+ private static final String TAG = GetSharesForFileOperation.class.getSimpleName();
+
+ private String mPath;
+ private boolean mReshares;
+ private boolean mSubfiles;
+
+ /**
+ * Constructor
+ *
+ * @param path Path to file or folder
+ * @param reshares If set to \91false\92 (default), only shares from the current user are returned
+ * If set to \91true\92, all shares from the given file are returned
+ * @param subfiles If set to \91false\92 (default), lists only the folder being shared
+ * If set to \91true\92, all shared files within the folder are returned.
+ */
+ public GetSharesForFileOperation(String path, boolean reshares, boolean subfiles) {
+ mPath = path;
+ mReshares = reshares;
+ mSubfiles = subfiles;
+ }
+
+ @Override
+ protected RemoteOperationResult run(OwnCloudClient client) {
+ GetSharesForFileRemoteOperation operation = new GetSharesForFileRemoteOperation(mPath, mReshares, mSubfiles);
+ RemoteOperationResult result = operation.execute(client);
+
+ if (result.isSuccess()) {
+
+ // Update DB with the response
+ Log_OC.d(TAG, "File = " + mPath + " Share list size " + result.getData().size());
+ ArrayList<OCShare> shares = new ArrayList<OCShare>();
+ for(Object obj: result.getData()) {
+ shares.add((OCShare) obj);
+ }
+
+ getStorageManager().saveSharesDB(shares);
+ }
+
+ return result;
+ }
+
+}
import java.util.ArrayList;
-import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.network.OwnCloudClient;
import com.owncloud.android.lib.operations.common.RemoteOperationResult;
import com.owncloud.android.lib.operations.common.OCShare;
-import com.owncloud.android.lib.operations.common.ShareType;
import com.owncloud.android.lib.operations.remote.GetRemoteSharesOperation;
-import com.owncloud.android.lib.utils.FileUtils;
import com.owncloud.android.operations.common.SyncOperation;
import com.owncloud.android.utils.Log_OC;
shares.add((OCShare) obj);
}
- saveSharesDB(shares);
+ getStorageManager().saveSharesDB(shares);
}
return result;
}
- private void saveSharesDB(ArrayList<OCShare> shares) {
- // Save share file
- getStorageManager().saveShares(shares);
-
- ArrayList<OCFile> sharedFiles = new ArrayList<OCFile>();
-
- for (OCShare share : shares) {
- // Get the path
- String path = share.getPath();
- if (share.isDirectory()) {
- path = path + FileUtils.PATH_SEPARATOR;
- }
-
- // Update OCFile with data from share: ShareByLink ¿and publicLink?
- OCFile file = getStorageManager().getFileByPath(path);
- if (file != null) {
- if (share.getShareType().equals(ShareType.PUBLIC_LINK)) {
- file.setShareByLink(true);
- sharedFiles.add(file);
- }
- }
- }
-
- getStorageManager().updateSharedFiles(sharedFiles);
- }
-
}
Log_OC.e(TAG, "Error while trying to get autorization for " + mLastTarget.mAccount.name, e);
}
result = new RemoteOperationResult(e);
-
+ } catch (Exception e) {
+ if (mLastTarget.mAccount == null) {
+ Log_OC.e(TAG, "Unexpected error for a NULL account", e);
+ } else {
+ Log_OC.e(TAG, "Unexpected error for " + mLastTarget.mAccount.name, e);
+ }
+ result = new RemoteOperationResult(e);
+
} finally {
synchronized(mPendingOperations) {
mPendingOperations.poll();
package com.owncloud.android.ui.activity;
import com.actionbarsherlock.app.ActionBar;
-import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.ui.dialog.ConflictsResolveDialog;
@Override
protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
OCFile file = getFile();
if (getFile() == null) {
finish();
} else {
/// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
- FileDataStorageManager storageManager = new FileDataStorageManager(getAccount(), getContentResolver());
- file = storageManager.getFileByPath(file.getRemotePath()); // file = null if not in the current Account
+ file = getStorageManager().getFileByPath(file.getRemotePath()); // file = null if not in the current Account
if (file != null) {
setFile(file);
ConflictsResolveDialog d = ConflictsResolveDialog.newInstance(file.getRemotePath(), this);
}
} else {
- Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
finish();
}
import android.accounts.AccountManagerFuture;
import android.accounts.OperationCanceledException;
import android.content.Intent;
-import android.net.Uri;
import android.os.Bundle;
-import android.webkit.MimeTypeMap;
+import android.os.Handler;
+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.operations.common.RemoteOperationResult.ResultCode;
+import com.owncloud.android.operations.CreateShareOperation;
-import com.owncloud.android.lib.accounts.OwnCloudAccount;
-import com.owncloud.android.lib.network.webdav.WebdavUtils;
-
+import com.owncloud.android.ui.dialog.LoadingDialog;
import com.owncloud.android.utils.Log_OC;
*
* @author David A. Velasco
*/
-public abstract class FileActivity extends SherlockFragmentActivity {
+public class FileActivity extends SherlockFragmentActivity implements OnRemoteOperationListener {
public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
- public static final String TAG = FileActivity.class.getSimpleName();
+ 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. */
/** Flag to signal if the activity is launched by a notification */
private boolean mFromNotification;
+ /** Messages handler associated to the main thread and the life cycle of the activity */
+ private Handler mHandler;
+
+ /** Access point to the cached database for the current ownCloud {@link Account} */
+ private FileDataStorageManager mStorageManager = null;
+
+ private FileOperationsHelper mFileOperationsHelper;
/**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mHandler = new Handler();
+ mFileOperationsHelper = new FileOperationsHelper();
Account account;
if(savedInstanceState != null) {
account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
/**
- * @return 'True' if the server supports the Share API
- */
- public boolean isSharedSupported() {
- if (getAccount() != null) {
- AccountManager accountManager = AccountManager.get(this);
- return Boolean.parseBoolean(accountManager.getUserData(getAccount(), OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API));
- }
- return false;
- }
-
- /**
* Helper class handling a callback from the {@link AccountManager} after the creation of
* a new ownCloud {@link Account} finished, successfully or not.
*
*
* Child classes must grant that state depending on the {@link Account} is updated.
*/
- protected abstract void onAccountSet(boolean stateWasRecovered);
+ protected void onAccountSet(boolean stateWasRecovered) {
+ if (getAccount() != null) {
+ mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
+
+ } else {
+ Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
+ }
+ }
+
+
+ public FileDataStorageManager getStorageManager() {
+ return mStorageManager;
+ }
+
+
+ public OnRemoteOperationListener getRemoteOperationListener() {
+ return this;
+ }
+
+
+ public Handler getHandler() {
+ return mHandler;
+ }
+ public FileOperationsHelper getFileOperationsHelper() {
+ return mFileOperationsHelper;
+ }
+ /**
+ *
+ * @param operation Removal operation performed.
+ * @param result Result of the removal.
+ */
+ @Override
+ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities ");
+ if (operation instanceof CreateShareOperation) {
+ onCreateShareOperationFinish((CreateShareOperation) operation, result);
+ }
+ }
- public void openFile(OCFile file) {
- if (file != null) {
- String storagePath = file.getStoragePath();
- String encodedStoragePath = WebdavUtils.encodePath(storagePath);
-
- Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
- intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
- intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
-
- Intent intentForGuessedMimeType = null;
- if (storagePath.lastIndexOf('.') >= 0) {
- String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
- if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
- intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
- intentForGuessedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), guessedMimeType);
- intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- }
- }
-
- Intent chooserIntent = null;
- if (intentForGuessedMimeType != null) {
- chooserIntent = Intent.createChooser(intentForGuessedMimeType, getString(R.string.actionbar_open_with));
- } else {
- chooserIntent = Intent.createChooser(intentForSavedMimeType, getString(R.string.actionbar_open_with));
- }
-
- startActivity(chooserIntent);
+ private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ dismissLoadingDialog();
+ if (result.isSuccess()) {
+ Intent sendIntent = operation.getSendIntent();
+ startActivity(sendIntent);
- } else {
- Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+ } else if (result.getCode() == ResultCode.FILE_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();
+ }
+ }
+
+
+ /**
+ * 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();
}
}
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Handler;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.actionbarsherlock.view.Window;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
-import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
import com.owncloud.android.files.services.FileObserverService;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.operations.CreateFolderOperation;
-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.operations.common.RemoteOperationResult.ResultCode;
-
+import com.owncloud.android.operations.CreateShareOperation;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.syncadapter.FileSyncAdapter;
import com.owncloud.android.ui.dialog.EditNameDialog;
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
-import com.owncloud.android.ui.dialog.LoadingDialog;
import com.owncloud.android.ui.dialog.SslValidatorDialog;
import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;
import com.owncloud.android.ui.fragment.FileDetailFragment;
*/
public class FileDisplayActivity extends HookActivity implements
-OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, OnRemoteOperationListener, EditNameDialogListener {
+OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, EditNameDialogListener {
private ArrayAdapter<String> mDirectories;
- /** Access point to the cached database for the current ownCloud {@link Account} */
- private FileDataStorageManager mStorageManager = null;
-
private SyncBroadcastReceiver mSyncBroadcastReceiver;
private UploadFinishReceiver mUploadFinishReceiver;
private DownloadFinishReceiver mDownloadFinishReceiver;
private static final int DIALOG_SSL_VALIDATOR = 2;
private static final int DIALOG_CERT_NOT_SAVED = 3;
- private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
-
public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS";
private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
private OCFile mWaitingToPreview;
- private Handler mHandler;
private boolean mSyncInProgress = false;
private boolean mRefreshSharesInProgress = false;
super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
- mHandler = new Handler();
-
/// bindings to transference services
mUploadConnection = new ListServiceConnection();
mDownloadConnection = new ListServiceConnection();
*/
@Override
protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
- mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
-
/// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
OCFile file = getFile();
// get parent from path
// upload in progress - right now, files are not inserted in the local cache until the upload is successful
// get parent from path
parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
- if (mStorageManager.getFileByPath(parentPath) == null)
+ if (getStorageManager().getFileByPath(parentPath) == null)
file = null; // not able to know the directory where the file is uploading
} else {
- file = mStorageManager.getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account
+ file = getStorageManager().getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account
}
}
if (file == null) {
// fall back to root folder
- file = mStorageManager.getFileByPath(OCFile.ROOT_PATH); // never returns null
+ file = getStorageManager().getFileByPath(OCFile.ROOT_PATH); // never returns null
}
setFile(file);
setNavigationListWithFolder(file);
updateFragmentsVisibility(!file.isFolder());
updateNavigationElementsInActionBar(file.isFolder() ? null : file);
}
-
-
- } else {
- Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
}
}
if (fileIt.isFolder()) {
mDirectories.add(fileIt.getFileName());
}
- //fileIt = mStorageManager.getFileById(fileIt.getParentId());
// get parent from path
parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName()));
- fileIt = mStorageManager.getFileByPath(parentPath);
+ fileIt = getStorageManager().getFileByPath(parentPath);
}
mDirectories.add(OCFile.PATH_SEPARATOR);
}
boolean detailsFragmentChanged = false;
if (waitedPreview) {
if (success) {
- mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
+ mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
startMediaPreview(mWaitingToPreview, 0, true);
detailsFragmentChanged = true;
} else {
- openFile(mWaitingToPreview);
+ getFileOperationsHelper().openFile(mWaitingToPreview, this);
}
}
mWaitingToPreview = null;
}
}
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSherlock().getMenuInflater();
targetPath = mDirectories.getItem(i) + OCFile.PATH_SEPARATOR + targetPath;
}
targetPath = OCFile.PATH_SEPARATOR + targetPath;
- OCFile targetFolder = mStorageManager.getFileByPath(targetPath);
+ OCFile targetFolder = getStorageManager().getFileByPath(targetPath);
if (targetFolder != null) {
browseTo(targetFolder);
}
/**
- * 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();
- }
- }
-
-
- /**
* Translates a content URI of an image to a physical path
* on the disk
* @param uri The URI to resolve
String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME);
String synchFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
RemoteOperationResult synchResult = (RemoteOperationResult)intent.getSerializableExtra(FileSyncAdapter.EXTRA_RESULT);
- boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && mStorageManager != null);
+ boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && getStorageManager() != null);
if (sameAccount) {
if (!FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) {
-
- OCFile currentFile = (getFile() == null) ? null : mStorageManager.getFileByPath(getFile().getRemotePath());
- OCFile currentDir = (getCurrentDir() == null) ? null : mStorageManager.getFileByPath(getCurrentDir().getRemotePath());
+ OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath());
+ OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().getFileByPath(getCurrentDir().getRemotePath());
if (currentDir == null) {
// current folder was removed from the server
synchResult.isSuccess() &&
(SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) ||
FileSyncAdapter.EVENT_FOLDER_CONTENTS_SYNCED.equals(event)
- )
+ ) &&
+ !mRefreshSharesInProgress &&
+ getFileOperationsHelper().isSharedSupported(FileDisplayActivity.this)
) {
startGetShares();
}
Account account = intent.getParcelableExtra(OperationsService.EXTRA_ACCOUNT);
RemoteOperationResult getSharesResult = (RemoteOperationResult)intent.getSerializableExtra(OperationsService.EXTRA_RESULT);
if (getAccount() != null && account.name.equals(getAccount().name)
- && mStorageManager != null
+ && getStorageManager() != null
) {
refeshListOfFilesFragment();
}
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public FileDataStorageManager getStorageManager() {
- return mStorageManager;
- }
-
-
public void browseToRoot() {
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) { // should never be null, indeed
while (mDirectories.getCount() > 1) {
popDirname();
}
- OCFile root = mStorageManager.getFileByPath(OCFile.ROOT_PATH);
+ OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
listOfFiles.listDirectory(root);
setFile(listOfFiles.getCurrentFile());
startSyncFolderOperation(root);
*/
@Override
public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+ super.onRemoteOperationFinish(operation, result);
+
if (operation instanceof RemoveFileOperation) {
onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
} else if (operation instanceof CreateFolderOperation) {
onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
+
+ } else if (operation instanceof CreateShareOperation) {
+ onCreateShareOperationFinish((CreateShareOperation) operation, result);
}
+
}
+ private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ if (result.isSuccess()) {
+ refeshListOfFilesFragment();
+ }
+ }
+
+
/**
* Updates the view associated to the activity after the finish of an operation trying to remove a
* file.
if (second != null && removedFile.equals(second.getFile())) {
cleanSecondFragment();
}
- if (mStorageManager.getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
+ if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
refeshListOfFilesFragment();
}
((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
}
}
- if (mStorageManager.getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
+ if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
refeshListOfFilesFragment();
}
// Create directory
path += newDirectoryName + OCFile.PATH_SEPARATOR;
- RemoteOperation operation = new CreateFolderOperation(path, false, mStorageManager);
+ RemoteOperation operation = new CreateFolderOperation(path, false, getStorageManager());
operation.execute( getAccount(),
FileDisplayActivity.this,
FileDisplayActivity.this,
- mHandler,
+ getHandler(),
FileDisplayActivity.this);
showLoadingDialog();
if (file != null) {
if (file.isFolder()) {
return file;
- } else if (mStorageManager != null) {
+ } else if (getStorageManager() != null) {
String parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
- return mStorageManager.getFileByPath(parentPath);
+ return getStorageManager().getFileByPath(parentPath);
}
}
return null;
mRefreshSharesInProgress = true;
}
-
+
}
@Override
protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
if (!mAccountOnCreation.equals(getAccount())) {
setResult(RESULT_CANCELED);
}
} else {
- Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
setResult(RESULT_CANCELED);
finish();
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2014 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.ui.dialog;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.actionbarsherlock.app.SherlockDialogFragment;
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.FileOperationsHelper;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.utils.Log_OC;
+
+/**
+ * Dialog showing a list activities able to resolve a given Intent,
+ * filtering out the activities matching give package names.
+ *
+ * @author David A. Velasco
+ */
+public class ActivityChooserDialog extends SherlockDialogFragment {
+
+ private final static String TAG = ActivityChooserDialog.class.getSimpleName();
+ private final static String ARG_INTENT = ActivityChooserDialog.class.getSimpleName() + ".ARG_INTENT";
+ private final static String ARG_PACKAGES_TO_EXCLUDE = ActivityChooserDialog.class.getSimpleName() + ".ARG_PACKAGES_TO_EXCLUDE";
+ private final static String ARG_FILE_TO_SHARE = ActivityChooserDialog.class.getSimpleName() + ".FILE_TO_SHARE";
+
+ private ActivityAdapter mAdapter;
+ private OCFile mFile;
+ private Intent mIntent;
+
+ public static ActivityChooserDialog newInstance(Intent intent, String[] packagesToExclude, OCFile fileToShare) {
+ ActivityChooserDialog f = new ActivityChooserDialog();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_INTENT, intent);
+ args.putStringArray(ARG_PACKAGES_TO_EXCLUDE, packagesToExclude);
+ args.putParcelable(ARG_FILE_TO_SHARE, fileToShare);
+ f.setArguments(args);
+ return f;
+ }
+
+ public ActivityChooserDialog() {
+ super();
+ Log_OC.d(TAG, "constructor");
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ mIntent = getArguments().getParcelable(ARG_INTENT);
+ String[] packagesToExclude = getArguments().getStringArray(ARG_PACKAGES_TO_EXCLUDE);
+ List<String> packagesToExcludeList = Arrays.asList(packagesToExclude != null ? packagesToExclude : new String[0]);
+ mFile = getArguments().getParcelable(ARG_FILE_TO_SHARE);
+
+ PackageManager pm= getSherlockActivity().getPackageManager();
+ List<ResolveInfo> activities = pm.queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY);
+ Iterator<ResolveInfo> it = activities.iterator();
+ ResolveInfo resolveInfo;
+ while (it.hasNext()) {
+ resolveInfo = it.next();
+ if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase())) {
+ it.remove();
+ }
+ }
+ Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm));
+ mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities);
+
+ return new AlertDialog.Builder(getSherlockActivity())
+ .setTitle(R.string.activity_chooser_title)
+ .setAdapter(mAdapter, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Add the information of the chosen activity to the intent to send
+ ResolveInfo chosen = mAdapter.getItem(which);
+ ActivityInfo actInfo = chosen.activityInfo;
+ ComponentName name=new ComponentName(actInfo.applicationInfo.packageName, actInfo.name);
+ mIntent.setComponent(name);
+
+ // Create a new share resource
+ FileOperationsHelper foh = new FileOperationsHelper();
+ foh.shareFileWithLinkToApp(mFile, mIntent, (FileActivity)getSherlockActivity());
+ }
+ })
+ .create();
+ }
+
+
+ class ActivityAdapter extends ArrayAdapter<ResolveInfo> {
+
+ private PackageManager mPackageManager;
+
+ ActivityAdapter(Context context, PackageManager pm, List<ResolveInfo> apps) {
+ super(context, R.layout.activity_row, apps);
+ this.mPackageManager = pm;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = newView(parent);
+ }
+ bindView(position, convertView);
+ return convertView;
+ }
+
+ private View newView(ViewGroup parent) {
+ return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_row, parent, false));
+ }
+
+ private void bindView(int position, View row) {
+ TextView label = (TextView) row.findViewById(R.id.title);
+ label.setText(getItem(position).loadLabel(mPackageManager));
+ ImageView icon = (ImageView) row.findViewById(R.id.icon);
+ icon.setImageDrawable(getItem(position).loadIcon(mPackageManager));
+ }
+ }
+
+}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+ return true;
+ }
case R.id.action_open_file_with: {
- mContainerActivity.openFile(getFile());
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().openFile(getFile(), activity);
return true;
}
case R.id.action_remove_file: {
return false;
}
}
-
+
@Override
public void onClick(View v) {
switch (v.getId()) {
}
}
-
private void removeFile() {
OCFile file = getFile();
ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
import com.actionbarsherlock.app.SherlockFragment;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.FileHandler;
import com.owncloud.android.ui.activity.TransferServiceGetter;
*
* @author David A. Velasco
*/
- public interface ContainerActivity extends TransferServiceGetter, FileHandler {
+ public interface ContainerActivity extends TransferServiceGetter {
/**
* Callback method invoked when the detail fragment wants to notice its container
* @param file File to show details
*/
public void showDetails(OCFile file);
-
-
+
}
}
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.FileHandler;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.lib.operations.common.OnRemoteOperationListener;
// media preview
mContainerActivity.startMediaPreview(file, 0, true);
} else {
- // open with
- mContainerActivity.openFile(file);
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().openFile(file, activity);
}
} else {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mTargetFile = (OCFile) mAdapter.getItem(info.position);
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+ activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity);
+ return true;
+ }
case R.id.action_rename_file: {
String fileName = mTargetFile.getFileName();
int extensionStart = mTargetFile.isFolder() ? -1 : fileName.lastIndexOf(".");
*
* @author David A. Velasco
*/
- public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener, FileHandler {
+ public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener {
/**
* Callback method invoked when a the user browsed into a different folder through the list of files
private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
- private FileDataStorageManager mStorageManager;
-
private ViewPager mViewPager;
private PreviewImagePagerAdapter mPreviewImagePagerAdapter;
private void initViewPager() {
// get parent from path
String parentPath = getFile().getRemotePath().substring(0, getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
- OCFile parentFolder = mStorageManager.getFileByPath(parentPath);
- //OCFile parentFolder = mStorageManager.getFileById(getFile().getParentId());
+ OCFile parentFolder = getStorageManager().getFileByPath(parentPath);
if (parentFolder == null) {
// should not be necessary
- parentFolder = mStorageManager.getFileByPath(OCFile.ROOT_PATH);
+ parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
}
- mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), mStorageManager);
+ mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager());
mViewPager = (ViewPager) findViewById(R.id.fragmentPager);
int position = mPreviewImagePagerAdapter.getFilePosition(getFile());
position = (position >= 0) ? position : 0;
if (getAccount().name.equals(accountName) &&
downloadedRemotePath != null) {
- OCFile file = mStorageManager.getFileByPath(downloadedRemotePath);
+ OCFile file = getStorageManager().getFileByPath(downloadedRemotePath);
int position = mPreviewImagePagerAdapter.getFilePosition(file);
boolean downloadWasFine = intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
//boolean isOffscreen = Math.abs((mViewPager.getCurrentItem() - position)) <= mViewPager.getOffscreenPageLimit();
@Override
protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
OCFile file = getFile();
/// Validate handled file (first image to preview)
if (!file.isImage()) {
throw new IllegalArgumentException("Non-image file passed as argument");
}
- mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
// Update file according to DB file, if it is possible
if (file.getFileId() > FileDataStorageManager.ROOT_PARENT_ID)
- file = mStorageManager.getFileById(file.getFileId());
+ file = getStorageManager().getFileById(file.getFileId());
if (file != null) {
/// Refresh the activity according to the Account and OCFile set
- setFile(file); // reset after getting it fresh from mStorageManager
+ setFile(file); // reset after getting it fresh from storageManager
getSupportActionBar().setTitle(getFile().getFileName());
//if (!stateWasRecovered) {
initViewPager();
// handled file not in the current Account
finish();
}
-
- } else {
- Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
}
}
startActivity(i);
}
}
-
+
}
import com.owncloud.android.lib.operations.common.RemoteOperation;
import com.owncloud.android.lib.operations.common.RemoteOperationResult;
import com.owncloud.android.operations.RemoveFileOperation;
+import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.Log_OC;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ FileActivity act = (FileActivity)getSherlockActivity();
+ act.getFileOperationsHelper().shareFileWithLink(getFile(), act);
+ return true;
+ }
case R.id.action_open_file_with: {
openFile();
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.action_share_file: {
+ shareFileWithLink();
+ return true;
+ }
case R.id.action_open_file_with: {
openFile();
return true;
}
+ private void shareFileWithLink() {
+ stopPreview(false);
+ FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
+ activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+
+ }
+
+
private void seeDetails() {
stopPreview(false);
((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());
package com.owncloud.android.ui.preview;
import com.owncloud.android.R;
-import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.media.MediaService;
import com.owncloud.android.ui.activity.FileActivity;
private static final String TAG = PreviewVideoActivity.class.getSimpleName();
- private FileDataStorageManager mStorageManager;
-
private int mSavedPlaybackPosition; // in the unit time handled by MediaPlayer.getCurrentPosition()
private boolean mAutoplay; // when 'true', the playback starts immediately with the activity
private VideoView mVideoPlayer; // view to play the file; both performs and show the playback
@Override
protected void onAccountSet(boolean stateWasRecovered) {
+ super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
OCFile file = getFile();
/// Validate handled file (first image to preview)
if (!file.isVideo()) {
throw new IllegalArgumentException("Non-video file passed as argument");
}
- mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
- file = mStorageManager.getFileById(file.getFileId());
+ file = getStorageManager().getFileById(file.getFileId());
if (file != null) {
if (file.isDown()) {
mVideoPlayer.setVideoPath(file.getStoragePath());
finish();
}
} else {
- Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
finish();
}
}