From: masensio Date: Mon, 27 Jan 2014 13:00:07 +0000 (+0100) Subject: Merge branch 'develop' into share_link_show_shared_files X-Git-Tag: oc-android-1.5.5~35^2~47 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/388fdd2265b24b78808d1e51a994cc543d2a43c8?hp=-c Merge branch 'develop' into share_link_show_shared_files --- 388fdd2265b24b78808d1e51a994cc543d2a43c8 diff --combined src/com/owncloud/android/authentication/AuthenticatorActivity.java index 2fcb5c8f,3a11ea62..4bd2bb8a --- a/src/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/com/owncloud/android/authentication/AuthenticatorActivity.java @@@ -53,23 -53,23 +53,25 @@@ import com.actionbarsherlock.app.Sherlo import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener; - import com.owncloud.android.oc_framework.accounts.AccountTypeUtils; - import com.owncloud.android.oc_framework.accounts.OwnCloudAccount; - import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory; - import com.owncloud.android.oc_framework.network.webdav.WebdavClient; + import com.owncloud.android.lib.accounts.AccountTypeUtils; + import com.owncloud.android.lib.accounts.OwnCloudAccount; + import com.owncloud.android.lib.network.OwnCloudClientFactory; + import com.owncloud.android.lib.network.OwnCloudClient; import com.owncloud.android.operations.OAuth2GetAccessToken; - import com.owncloud.android.oc_framework.operations.OnRemoteOperationListener; - import com.owncloud.android.oc_framework.operations.RemoteOperation; - import com.owncloud.android.oc_framework.operations.RemoteOperationResult; - import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; - import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation; - import com.owncloud.android.oc_framework.operations.remote.GetUserNameRemoteOperation; - import com.owncloud.android.oc_framework.operations.remote.OwnCloudServerCheckOperation; ++ + import com.owncloud.android.lib.operations.common.OnRemoteOperationListener; -import com.owncloud.android.operations.OwnCloudServerCheckOperation; ++import com.owncloud.android.lib.operations.remote.OwnCloudServerCheckOperation; + 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.lib.operations.remote.ExistenceCheckRemoteOperation; + import com.owncloud.android.lib.operations.remote.GetUserNameRemoteOperation; ++ import com.owncloud.android.ui.dialog.SamlWebViewDialog; import com.owncloud.android.ui.dialog.SslValidatorDialog; import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener; import com.owncloud.android.utils.Log_OC; - import com.owncloud.android.oc_framework.utils.OwnCloudVersion; + import com.owncloud.android.lib.utils.OwnCloudVersion; /** * This Activity is used to add an ownCloud account to the App @@@ -103,7 -103,6 +105,7 @@@ implements OnRemoteOperationListener, private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT"; private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON"; private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED"; + private static final String KEY_IS_SHARED_SUPPORTED = "KEY_IS_SHARE_SUPPORTED"; private static final String AUTH_ON = "on"; private static final String AUTH_OFF = "off"; @@@ -121,7 -120,6 +123,7 @@@ private String mHostBaseUrl; private OwnCloudVersion mDiscoveredVersion; + private boolean mIsSharedSupported; private String mAuthMessageText; private int mAuthMessageVisibility, mServerStatusText, mServerStatusIcon; @@@ -232,7 -230,6 +234,7 @@@ mServerIsChecked = false; mIsSslConn = false; mAuthStatusText = mAuthStatusIcon = 0; + mIsSharedSupported = false; /// retrieve extras from intent mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT); @@@ -245,8 -242,6 +247,8 @@@ mHostUrlInput.setText(mHostBaseUrl); String userName = mAccount.name.substring(0, mAccount.name.lastIndexOf('@')); mUsernameInput.setText(userName); + mIsSharedSupported = Boolean.getBoolean(mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API)); + } initAuthorizationMethod(); // checks intent and setup.xml to determine mCurrentAuthorizationMethod mJustCreated = true; @@@ -273,7 -268,6 +275,7 @@@ /// server data String ocVersion = savedInstanceState.getString(KEY_OC_VERSION); + mIsSharedSupported = savedInstanceState.getBoolean(KEY_IS_SHARED_SUPPORTED, false); if (ocVersion != null) { mDiscoveredVersion = new OwnCloudVersion(ocVersion); } @@@ -453,7 -447,6 +455,7 @@@ outState.putString(KEY_OC_VERSION, mDiscoveredVersion.toString()); } outState.putString(KEY_HOST_URL_TEXT, mHostBaseUrl); + outState.putBoolean(KEY_IS_SHARED_SUPPORTED, mIsSharedSupported); /// account data, if updating if (mAccount != null) { @@@ -531,8 -524,8 +533,8 @@@ getString(R.string.oauth2_redirect_uri), getString(R.string.oauth2_grant_type), queryParameters); - //WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(getString(R.string.oauth2_url_endpoint_access)), getApplicationContext()); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mOAuthTokenEndpointText.getText().toString().trim()), getApplicationContext(), true); + //OwnCloudClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(getString(R.string.oauth2_url_endpoint_access)), getApplicationContext()); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mOAuthTokenEndpointText.getText().toString().trim()), getApplicationContext(), true); operation.execute(client, this, mHandler); } @@@ -588,7 -581,6 +590,7 @@@ mServerIsValid = false; mServerIsChecked = false; + mIsSharedSupported = false; mOkButton.setEnabled(false); mDiscoveredVersion = null; hideRefreshButton(); @@@ -597,7 -589,7 +599,7 @@@ mServerStatusIcon = R.drawable.progress_small; showServerStatus(); mOcServerChkOperation = new OwnCloudServerCheckOperation(uri, this); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(uri), this, true); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(uri), this, true); mOperationThread = mOcServerChkOperation.execute(client, this, mHandler); } else { mServerStatusText = 0; @@@ -724,7 -716,7 +726,7 @@@ /// test credentials accessing the root folder mAuthCheckOperation = new ExistenceCheckRemoteOperation("", this, false); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, true); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, true); client.setBasicCredentials(username, password); mOperationThread = mAuthCheckOperation.execute(client, this, mHandler); } @@@ -773,7 -765,7 +775,7 @@@ /// test credentials accessing the root folder mAuthCheckOperation = new ExistenceCheckRemoteOperation("", this, false); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, false); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, false); mOperationThread = mAuthCheckOperation.execute(client, this, mHandler); } @@@ -898,9 -890,6 +900,9 @@@ /// allow or not the user try to access the server mOkButton.setEnabled(mServerIsValid); + + /// retrieve if is supported the Share API + mIsSharedSupported = operation.isSharedSupported(); } // else nothing ; only the last check operation is considered; // multiple can be triggered if the user amends a URL before a previous check can be triggered @@@ -1126,7 -1115,7 +1128,7 @@@ mAuthToken = ((OAuth2GetAccessToken)operation).getResultTokenMap().get(OAuth2Constants.KEY_ACCESS_TOKEN); Log_OC.d(TAG, "Got ACCESS TOKEN: " + mAuthToken); mAuthCheckOperation = new ExistenceCheckRemoteOperation("", this, false); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, true); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl + webdav_path), this, true); client.setBearerCredentials(mAuthToken); mAuthCheckOperation.execute(client, this, mHandler); @@@ -1294,7 -1283,6 +1296,7 @@@ /// add user data to the new account; TODO probably can be done in the last parameter addAccountExplicitly, or in KEY_USERDATA mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION, mDiscoveredVersion.toString()); mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_BASE_URL, mHostBaseUrl); + mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API, Boolean.toString(mIsSharedSupported)); if (isSaml) { mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); } else if (isOAuth) { @@@ -1610,7 -1598,7 +1612,7 @@@ mAuthToken = sessionCookie; GetUserNameRemoteOperation getUserOperation = new GetUserNameRemoteOperation(); - WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl), getApplicationContext(), true); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl), getApplicationContext(), true); client.setSsoSessionCookie(mAuthToken); getUserOperation.execute(client, this, mHandler); } diff --combined src/com/owncloud/android/datamodel/FileDataStorageManager.java index 313ad06f,042709a1..5709dc19 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@@ -27,7 -27,6 +27,7 @@@ import java.util.Vector import com.owncloud.android.MainApp; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; - import com.owncloud.android.oc_framework.operations.ShareType; ++import com.owncloud.android.lib.operations.common.ShareType; import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.Log_OC; @@@ -182,9 -181,7 +182,9 @@@ public class FileDataStorageManager cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData()); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag()); - + cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink()); + boolean sameRemotePath = fileExists(file.getRemotePath()); if (sameRemotePath || fileExists(file.getFileId()) ) { // for renamed files; no more delete and create @@@ -281,8 -278,6 +281,8 @@@ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData()); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag()); + cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink()); boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { @@@ -338,9 -333,6 +338,9 @@@ cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, folder.getLastSyncDateForData()); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, folder.keepInSync() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, folder.getEtag()); + cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, folder.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, folder.getPublicLink()); + operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). withValues(cv). withSelection( ProviderTableMeta._ID + "=?", @@@ -671,32 -663,6 +671,32 @@@ } return c; } + + private Cursor getShareCursorForValue(String key, String value) { + Cursor c = null; + if (getContentResolver() != null) { + c = getContentResolver() + .query(ProviderTableMeta.CONTENT_URI_SHARE, + null, + key + "=? AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + + "=?", + new String[] { value, mAccount.name }, null); + } else { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI_SHARE, + null, + key + "=? AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + + "=?", new String[] { value, mAccount.name }, + null); + } catch (RemoteException e) { + Log_OC.e(TAG, "Could not get file details: " + e.getMessage()); + c = null; + } + } + return c; + } private OCFile createFileInstance(Cursor c) { OCFile file = null; @@@ -735,221 -701,9 +735,221 @@@ file.setKeepInSync(c.getInt( c.getColumnIndex(ProviderTableMeta.FILE_KEEP_IN_SYNC)) == 1 ? true : false); file.setEtag(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_ETAG))); + file.setShareByLink(c.getInt( + c.getColumnIndex(ProviderTableMeta.FILE_SHARE_BY_LINK)) == 1 ? true : false); + file.setPublicLink(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PUBLIC_LINK))); } return file; } + + /** + * Returns if the file/folder is shared by link or not + * @param path Path of the file/folder + * @return + */ + public boolean isFileShareByLink(String path) { + Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); + OCFile file = null; + if (c.moveToFirst()) { + file = createFileInstance(c); + } + c.close(); + return file.isShareByLink(); + } + + /** + * Returns the public link of the file/folder + * @param path Path of the file/folder + * @return + */ + public String getFilePublicLink(String path) { + Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); + OCFile file = null; + if (c.moveToFirst()) { + file = createFileInstance(c); + } + c.close(); + return file.getPublicLink(); + } + + + // Methods for Share Files + public boolean saveShareFile(OCShare shareFile) { + boolean overriden = false; + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.OCSHARES_FILE_SOURCE, shareFile.getFileSource()); + cv.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE, shareFile.getItemSource()); + cv.put(ProviderTableMeta.OCSHARES_SHARE_TYPE, shareFile.getShareType().getValue()); + cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH, shareFile.getShareWith()); + cv.put(ProviderTableMeta.OCSHARES_PATH, shareFile.getPath()); + cv.put(ProviderTableMeta.OCSHARES_PERMISSIONS, shareFile.getPermissions()); + cv.put(ProviderTableMeta.OCSHARES_SHARED_DATE, shareFile.getSharedDate()); + cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, shareFile.getExpirationDate()); + cv.put(ProviderTableMeta.OCSHARES_TOKEN, shareFile.getToken()); + cv.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, shareFile.getSharedWithDisplayName()); + cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, shareFile.isDirectory() ? 1 : 0); + cv.put(ProviderTableMeta.OCSHARES_USER_ID, shareFile.getUserId()); + cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, shareFile.getIdRemoteShared()); + cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name); + + boolean samePath = fileShareExists(shareFile.getPath()); + if (samePath || + fileShareExists(shareFile.getId()) ) { // for renamed files; no more delete and create + + OCShare oldFile = null; + if (samePath) { + oldFile = getShareFileByPath(shareFile.getPath()); + shareFile.setId(oldFile.getId()); + } else { + oldFile = getShareFileById(shareFile.getId()); + } + overriden = true; + if (getContentResolver() != null) { + getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv, + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(shareFile.getId()) }); + } else { + try { + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_SHARE, + cv, ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(shareFile.getId()) }); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Fail to insert insert file to database " + + e.getMessage()); + } + } + } else { + Uri result_uri = null; + if (getContentResolver() != null) { + result_uri = getContentResolver().insert( + ProviderTableMeta.CONTENT_URI_SHARE, cv); + } else { + try { + result_uri = getContentProviderClient().insert( + ProviderTableMeta.CONTENT_URI_SHARE, cv); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Fail to insert insert file to database " + + e.getMessage()); + } + } + if (result_uri != null) { + long new_id = Long.parseLong(result_uri.getPathSegments() + .get(1)); + shareFile.setId(new_id); + } + } + + return overriden; + } + + private OCShare getShareFileById(long id) { + Cursor c = getShareCursorForValue(ProviderTableMeta._ID, String.valueOf(id)); + OCShare share = null; + if (c.moveToFirst()) { + share = createShareInstance(c); + } + c.close(); + return share; + } + + public OCShare getShareFileByPath(String path) { + Cursor c = getShareCursorForValue(ProviderTableMeta.OCSHARES_PATH, path); + OCShare share = null; + if (c.moveToFirst()) { + share = createShareInstance(c); + } + c.close(); + return share; + } + + private OCShare createShareInstance(Cursor c) { + OCShare share = null; + if (c != null) { + share = new OCShare(c.getString(c + .getColumnIndex(ProviderTableMeta.OCSHARES_PATH))); + share.setId(c.getLong(c.getColumnIndex(ProviderTableMeta._ID))); + share.setFileSource(c.getLong(c + .getColumnIndex(ProviderTableMeta.OCSHARES_ITEM_SOURCE))); + share.setShareType(ShareType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_TYPE)))); + share.setPermissions(c.getInt(c + .getColumnIndex(ProviderTableMeta.OCSHARES_PERMISSIONS))); + share.setSharedDate(c.getLong(c + .getColumnIndex(ProviderTableMeta.OCSHARES_SHARED_DATE))); + share.setExpirationDate(c.getLong(c + .getColumnIndex(ProviderTableMeta.OCSHARES_EXPIRATION_DATE))); + share.setToken(c.getString(c + .getColumnIndex(ProviderTableMeta.OCSHARES_TOKEN))); + share.setSharedWithDisplayName(c.getString(c + .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME))); + share.setIsDirectory(c.getInt( + c.getColumnIndex(ProviderTableMeta.OCSHARES_IS_DIRECTORY)) == 1 ? true : false); + share.setUserId(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_USER_ID))); + share.setIdRemoteShared(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED))); + + } + return share; + } + + private boolean fileShareExists(String cmp_key, String value) { + Cursor c; + if (getContentResolver() != null) { + c = getContentResolver() + .query(ProviderTableMeta.CONTENT_URI_SHARE, + null, + cmp_key + "=? AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + + "=?", + new String[] { value, mAccount.name }, null); + } else { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI_SHARE, + null, + cmp_key + "=? AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?", + new String[] { value, mAccount.name }, null); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Couldn't determine file existance, assuming non existance: " + + e.getMessage()); + return false; + } + } + boolean retval = c.moveToFirst(); + c.close(); + return retval; + } + + public boolean fileShareExists(long id) { + return fileShareExists(ProviderTableMeta._ID, String.valueOf(id)); + } + + public boolean fileShareExists(String path) { + return fileShareExists(ProviderTableMeta.OCSHARES_PATH, path); + } + + public void cleanShareFile() { + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false); + cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, ""); + String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?"; + String [] whereArgs = new String[]{mAccount.name}; + + if (getContentResolver() != null) { + getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); + + } else { + try { + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); + + } catch (RemoteException e) { + Log_OC.e(TAG, "Exception in cleanShareFile" + e.getMessage()); + } + } + } } diff --combined src/com/owncloud/android/datamodel/OCShare.java index 07069f90,00000000..9946ba7e mode 100644,000000..100644 --- a/src/com/owncloud/android/datamodel/OCShare.java +++ b/src/com/owncloud/android/datamodel/OCShare.java @@@ -1,284 -1,0 +1,284 @@@ +/* 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 . + * + */ + +package com.owncloud.android.datamodel; + - import com.owncloud.android.oc_framework.operations.ShareRemoteFile; - import com.owncloud.android.oc_framework.operations.ShareType; ++import com.owncloud.android.lib.operations.common.ShareRemoteFile; ++import com.owncloud.android.lib.operations.common.ShareType; +import com.owncloud.android.utils.Log_OC; + +import android.os.Parcel; +import android.os.Parcelable; + +public class OCShare implements Parcelable{ + + private static final String TAG = OCShare.class.getSimpleName(); + + private long mId; + private long mFileSource; + private long mItemSource; + private ShareType mShareType; + private String mShareWith; + private String mPath; + private int mPermissions; + private long mSharedDate; + private long mExpirationDate; + private String mToken; + private String mSharedWithDisplayName; + private boolean mIsDirectory; + private long mUserId; + private long mIdRemoteShared; + + + /** + * Create new {@link OCShare} with given path. + * + * The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'. + * + * @param path The remote path of the file. + */ + public OCShare(String path) { + resetData(); + if (path == null || path.length() <= 0 || !path.startsWith(OCFile.PATH_SEPARATOR)) { + Log_OC.e(TAG, "Trying to create a OCShare with a non valid path"); + throw new IllegalArgumentException("Trying to create a OCShare with a non valid path: " + path); + } + mPath = path; + } + + public OCShare(ShareRemoteFile remoteFile) { + mId = -1; + + String path = remoteFile.getPath(); + if (path == null || path.length() <= 0 || !path.startsWith(OCFile.PATH_SEPARATOR)) { + Log_OC.e(TAG, "Trying to create a OCShare with a non valid path"); + throw new IllegalArgumentException("Trying to create a OCShare with a non valid path: " + path); + } + mPath = path; + + mFileSource = remoteFile.getFileSource(); + mItemSource = remoteFile.getItemSource(); + mShareType = remoteFile.getShareType(); + mShareWith = remoteFile.getShareWith(); + mPermissions = remoteFile.getPermissions(); + mSharedDate = remoteFile.getSharedDate(); + mExpirationDate = remoteFile.getExpirationDate(); + mToken = remoteFile.getToken(); + mSharedWithDisplayName = remoteFile.getSharedWithDisplayName(); + mIsDirectory = remoteFile.isDirectory(); + mUserId = remoteFile.getUserId(); + mIdRemoteShared = remoteFile.getIdRemoteShared(); + } + + /** + * Used internally. Reset all file properties + */ + private void resetData() { + mId = -1; + mFileSource = 0; + mItemSource = 0; + mShareType = ShareType.NO_SHARED; + mShareWith = null; + mPath = null; + mPermissions = -1; + mSharedDate = 0; + mExpirationDate = 0; + mToken = null; + mSharedWithDisplayName = null; + mIsDirectory = false; + mUserId = -1; + mIdRemoteShared = -1; + + } + + /// Getters and Setters + public long getFileSource() { + return mFileSource; + } + + public void setFileSource(long fileSource) { + this.mFileSource = fileSource; + } + + public long getItemSource() { + return mItemSource; + } + + public void setItemSource(long itemSource) { + this.mItemSource = itemSource; + } + + public ShareType getShareType() { + return mShareType; + } + + public void setShareType(ShareType shareType) { + this.mShareType = shareType; + } + + public String getShareWith() { + return mShareWith; + } + + public void setShareWith(String shareWith) { + this.mShareWith = shareWith; + } + + public String getPath() { + return mPath; + } + + public void setPath(String path) { + this.mPath = path; + } + + public int getPermissions() { + return mPermissions; + } + + public void setPermissions(int permissions) { + this.mPermissions = permissions; + } + + public long getSharedDate() { + return mSharedDate; + } + + public void setSharedDate(long sharedDate) { + this.mSharedDate = sharedDate; + } + + public long getExpirationDate() { + return mExpirationDate; + } + + public void setExpirationDate(long expirationDate) { + this.mExpirationDate = expirationDate; + } + + public String getToken() { + return mToken; + } + + public void setToken(String token) { + this.mToken = token; + } + + public String getSharedWithDisplayName() { + return mSharedWithDisplayName; + } + + public void setSharedWithDisplayName(String sharedWithDisplayName) { + this.mSharedWithDisplayName = sharedWithDisplayName; + } + + public boolean isDirectory() { + return mIsDirectory; + } + + public void setIsDirectory(boolean isDirectory) { + this.mIsDirectory = isDirectory; + } + + public long getUserId() { + return mUserId; + } + + public void setUserId(long userId) { + this.mUserId = userId; + } + + public long getIdRemoteShared() { + return mIdRemoteShared; + } + + public void setIdRemoteShared(long idRemoteShared) { + this.mIdRemoteShared = idRemoteShared; + } + + public long getId() { + return mId; + } + + public void setId(long id){ + mId = id; + } + + /** + * Parcelable Methods + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public OCShare createFromParcel(Parcel source) { + return new OCShare(source); + } + + @Override + public OCShare[] newArray(int size) { + return new OCShare[size]; + } + }; + + /** + * Reconstruct from parcel + * + * @param source The source parcel + */ + private OCShare(Parcel source) { + mId = source.readLong(); + mFileSource = source.readLong(); + mItemSource = source.readLong(); + try { + mShareType = ShareType.valueOf(source.readString()); + } catch (IllegalArgumentException x) { + mShareType = ShareType.NO_SHARED; + } + mShareWith = source.readString(); + mPath = source.readString(); + mPermissions = source.readInt(); + mSharedDate = source.readLong(); + mExpirationDate = source.readLong(); + mToken = source.readString(); + mSharedWithDisplayName = source.readString(); + mIsDirectory = source.readInt() == 0; + mUserId = source.readLong(); + mIdRemoteShared = source.readLong(); + } + + @Override + public int describeContents() { + return this.hashCode(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(mId); + dest.writeLong(mFileSource); + dest.writeLong(mItemSource); + dest.writeString((mShareType == null) ? "" : mShareType.name()); + dest.writeString(mShareWith); + dest.writeString(mPath); + dest.writeInt(mPermissions); + dest.writeLong(mSharedDate); + dest.writeLong(mExpirationDate); + dest.writeString(mToken); + dest.writeString(mSharedWithDisplayName); + dest.writeInt(mIsDirectory ? 1 : 0); + dest.writeLong(mUserId); + dest.writeLong(mIdRemoteShared); + } +} diff --combined src/com/owncloud/android/operations/GetSharedFilesOperation.java index 68fd6ab5,00000000..174ebbc0 mode 100644,000000..100644 --- a/src/com/owncloud/android/operations/GetSharedFilesOperation.java +++ b/src/com/owncloud/android/operations/GetSharedFilesOperation.java @@@ -1,95 -1,0 +1,95 @@@ +/* 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 . + * + */ + +package com.owncloud.android.operations; + +import java.util.ArrayList; + +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.datamodel.OCShare; - import com.owncloud.android.oc_framework.network.webdav.WebdavClient; - import com.owncloud.android.oc_framework.operations.RemoteOperation; - import com.owncloud.android.oc_framework.operations.RemoteOperationResult; - import com.owncloud.android.oc_framework.operations.ShareRemoteFile; - import com.owncloud.android.oc_framework.operations.ShareType; - import com.owncloud.android.oc_framework.operations.remote.GetRemoteSharedFilesOperation; - import com.owncloud.android.oc_framework.utils.FileUtils; ++import com.owncloud.android.lib.network.OwnCloudClient; ++import com.owncloud.android.lib.operations.common.RemoteOperation; ++import com.owncloud.android.lib.operations.common.RemoteOperationResult; ++import com.owncloud.android.lib.operations.common.ShareRemoteFile; ++import com.owncloud.android.lib.operations.common.ShareType; ++import com.owncloud.android.lib.operations.remote.GetRemoteSharedFilesOperation; ++import com.owncloud.android.lib.utils.FileUtils; +import com.owncloud.android.utils.Log_OC; + +/** + * Access to remote operation to get the share files/folders + * Save the data in Database + * + * @author masensio + */ + +public class GetSharedFilesOperation extends RemoteOperation { + + private static final String TAG = GetSharedFilesOperation.class.getSimpleName(); + + private String mUrlServer; + protected FileDataStorageManager mStorageManager; + + + public GetSharedFilesOperation(String urlServer, FileDataStorageManager storageManager) { + mUrlServer = urlServer; + mStorageManager = storageManager; + } + + @Override - protected RemoteOperationResult run(WebdavClient client) { ++ protected RemoteOperationResult run(OwnCloudClient client) { + GetRemoteSharedFilesOperation operation = new GetRemoteSharedFilesOperation(mUrlServer); + RemoteOperationResult result = operation.execute(client); + + if (result.isSuccess()) { + + // Clean Share data in filelist table + mStorageManager.cleanShareFile(); + // Update DB with the response + ArrayList shareRemoteFiles = operation.getSharedFiles(); + Log_OC.d(TAG, "Share list size = " + shareRemoteFiles.size()); + for (ShareRemoteFile remoteFile: shareRemoteFiles) { + OCShare shareFile = new OCShare(remoteFile); + saveShareFileInDB(shareFile); + } + } + + return result; + } + + private void saveShareFileInDB(OCShare shareFile) { + // Save share file + mStorageManager.saveShareFile(shareFile); + + // Get the path + String path = shareFile.getPath(); + if (shareFile.isDirectory()) { + path = path + FileUtils.PATH_SEPARATOR; + } + + // Update OCFile with data from share: ShareByLink ¿and publicLink? + OCFile file = mStorageManager.getFileByPath(path); + if (file != null) { + if (shareFile.getShareType().equals(ShareType.PUBLIC_LINK)) { + file.setShareByLink(true); + mStorageManager.saveFile(file); + } + } + } + +} diff --combined src/com/owncloud/android/ui/activity/FileActivity.java index 09763edf,3d2323fb..3a9297ec --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@@ -33,8 -33,7 +33,10 @@@ import com.owncloud.android.MainApp import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; - import com.owncloud.android.oc_framework.accounts.OwnCloudAccount; - import com.owncloud.android.oc_framework.network.webdav.WebdavUtils; ++ ++import com.owncloud.android.lib.accounts.OwnCloudAccount; + import com.owncloud.android.lib.network.webdav.WebdavUtils; ++ import com.owncloud.android.utils.Log_OC; @@@ -70,7 -69,6 +72,7 @@@ public abstract class FileActivity exte /** Flag to signal if the activity is launched by a notification */ private boolean mFromNotification; + /** @@@ -83,6 -81,7 +85,6 @@@ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Account account; if(savedInstanceState != null) { account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); @@@ -95,7 -94,6 +97,7 @@@ } setAccount(account, savedInstanceState != null); + } @@@ -248,17 -246,6 +250,17 @@@ /** + * @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. * diff --combined src/com/owncloud/android/ui/activity/FileDisplayActivity.java index ee6a2ad0,04d0eeec..f3f763e8 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@@ -21,7 -21,6 +21,7 @@@ package com.owncloud.android.ui.activit import java.io.File; import android.accounts.Account; +import android.accounts.AccountManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@@ -69,12 -68,10 +69,15 @@@ import com.owncloud.android.files.servi import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.operations.CreateFolderOperation; - import com.owncloud.android.oc_framework.accounts.OwnCloudAccount; - import com.owncloud.android.oc_framework.operations.OnRemoteOperationListener; - import com.owncloud.android.oc_framework.operations.RemoteOperation; - import com.owncloud.android.oc_framework.operations.RemoteOperationResult; - import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; ++ +import com.owncloud.android.operations.GetSharedFilesOperation; ++ ++import com.owncloud.android.lib.accounts.OwnCloudAccount; + 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.RemoveFileOperation; import com.owncloud.android.operations.RenameFileOperation; import com.owncloud.android.operations.SynchronizeFileOperation; @@@ -226,7 -223,7 +229,7 @@@ OCFileListFragment.ContainerActivity, F protected void onAccountSet(boolean 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 @@@ -248,7 -245,6 +251,7 @@@ } setFile(file); setNavigationListWithFolder(file); + if (!stateWasRecovered) { Log_OC.e(TAG, "Initializing Fragments in onAccountChanged.."); initFragmentsWithFile(); @@@ -920,11 -916,6 +923,11 @@@ && mStorageManager != null ) { + /// get the shared files + if (isSharedSupported()) { + startGetSharedFiles(); + } + String synchFolderRemotePath = intent.getStringExtra(FileSyncService.SYNC_FOLDER_REMOTE_PATH); OCFile currentFile = (getFile() == null) ? null : mStorageManager.getFileByPath(getFile().getRemotePath()); @@@ -1287,24 -1278,10 +1290,24 @@@ } else if (operation instanceof CreateFolderOperation) { onCreateFolderOperationFinish((CreateFolderOperation)operation, result); - } + } else if (operation instanceof GetSharedFilesOperation) { + onGetSharedFilesOperationFinish((GetSharedFilesOperation) operation, result); + } } + /** Updates the data about shared files + * + * @param operation Get Shared Files + * @param result Result of the operation + */ + private void onGetSharedFilesOperationFinish(GetSharedFilesOperation operation, RemoteOperationResult result) { + // TODO + // Refresh the filelist with the information + refeshListOfFilesFragment(); + + } + /** * Updates the view associated to the activity after the finish of an operation trying to remove a * file. @@@ -1514,16 -1491,6 +1517,16 @@@ } + private void startGetSharedFiles() { + // Get shared files/folders + AccountManager accountMngr = AccountManager.get(this); + String urlServer = accountMngr.getUserData(getAccount(), OwnCloudAccount.Constants.KEY_OC_BASE_URL); + + RemoteOperation getSharedFiles = new GetSharedFilesOperation(urlServer, mStorageManager); + getSharedFiles.execute(getAccount(), this, this, mHandler, this); + + } + // public void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) { // int childCount = viewGroup.getChildCount(); // for (int i = 0; i < childCount; i++) {