From: masensio Date: Wed, 5 Feb 2014 10:25:39 +0000 (+0100) Subject: Merge branch 'share_link__new_share' into share_link__unshare_file X-Git-Tag: oc-android-1.5.5~35^2~28 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/e437d8320db116025aab1549ff7bd9ec53aa64d6?hp=09bb7bce234cf9fc22d23a598ab4f9aec46909ec Merge branch 'share_link__new_share' into share_link__unshare_file --- diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ca11c81b..465dec84 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -54,7 +54,6 @@ > - @@ -81,9 +80,12 @@ - + - + + + + = 3.1.1) in your environment path. Current Android 'platforms-tools' need to be installed. -* Download/install Android plugin for Maven, then build ownCloud with mvn: -* "cd .." -* "git clone https://github.com/mosabua/maven-android-sdk-deployer.git" -* "cd maven-android-sdk-deployer" -* "mvn -pl com.simpligility.android.sdk-deployer:android-19 -am install" -* "cd ../android/oc_framework" -* "mvn install" -* "cd .." -* Now you can create ownCloud APK using "mvn package" +Download/install Android plugin for Maven, install oc_framework, then build ownCloud with mvn: + +* cd .. +* git clone https://github.com/mosabua/maven-android-sdk-deployer.git +* cd maven-android-sdk-deployer +* mvn -pl com.simpligility.android.sdk-deployer:android-19 -am install +* cd ../android/oc_framework +* mvn install +* cd .. + +Now you can create ownCloud APK using "mvn package" ### 4. Building with Eclipse: @@ -70,6 +72,16 @@ NOTE: You must sign the [Contributor Agreement][1] before your changes can be ac * Again, click "Edit" and set "compare:develop" * Enter description and send pull request. +### 6. Create another pull request: + +To make sure your new pull request does not contain commits which are already contained in previous PRs, create a new branch which is a clone of upstream/develop. + +* git fetch upstream +* git checkout -b my_new_develop_branch upstream/develop +* If you want to rename that branch later: "git checkout -b my_new_develop_branch_with_new_name" +* Push branch to server: "git push -u origin name_of_local_develop_branch" +* Use Github to issue PR + [0]: https://github.com/owncloud/android/blob/master/CONTRIBUTING.md [1]: http://owncloud.org/about/contributor-agreement/ diff --git a/res/layout-v11/activity_row.xml b/res/layout-v11/activity_row.xml new file mode 100644 index 00000000..95c7dfc5 --- /dev/null +++ b/res/layout-v11/activity_row.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/activity_row.xml b/res/layout/activity_row.xml new file mode 100644 index 00000000..b917600c --- /dev/null +++ b/res/layout/activity_row.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-es-rCL/strings.xml b/res/values-es-rCL/strings.xml index 6fc2efb7..a6b3cbb3 100644 --- a/res/values-es-rCL/strings.xml +++ b/res/values-es-rCL/strings.xml @@ -13,4 +13,20 @@ Subir No se encuentra la cuenta Subiendo + Seleccione un archivo para desplegar información adicional. + Tamaño: + Tipo: + Creado: + Modificado: + Descargar + Si + No + OK + Cancelar + Error + Nombre del directorio + Elija una cuenta + Por favor, ingreses su PIN de aplicación + Ingrese su PIN de aplicación + Por favor, reingrese su PIN de aplicación diff --git a/res/values-ja-rJP/strings.xml b/res/values-ja-rJP/strings.xml index 3870de62..3a701ca8 100644 --- a/res/values-ja-rJP/strings.xml +++ b/res/values-ja-rJP/strings.xml @@ -18,9 +18,9 @@ クライアントを保護する 自動アップロードを有効 カメラで撮影した画像を自動アップロード - 記録を有効化 - これは問題を記録するのにつかわれます。 - 記録している履歴 + ログを有効にする + これは問題をログに記録するのに使用します。 + ログ履歴 これは記録されたログを表示します 履歴を削除 ヘルプ @@ -46,7 +46,7 @@ コンテンツを受信しませんでした。アップロードするものはありません。 %1$sで共有コンテンツへのアクセスが許可されていません。 アップロード中 - このフォルダにはファイルがありません。\n\"アップロード\" メニューで新しいファイルを追加することができます。 + このフォルダーにはファイルがありません。\n\"アップロード\" メニューで新しいファイルを追加することができます。 ファイルをタップすると追加情報が表示されます。 サイズ: タイプ: @@ -92,16 +92,16 @@ %1$d 同期ファイルを同期できませんでした ファイルの同期に失敗しました %1$d ファイルのコンテンツを同期できませんでした(%2$d の競合) - いくつかのローカルファイルが忘れられています + 一部のローカルファイルが忘れられています %2$s ディレクトリ内の %1$d ファイルはコピーすることができませんでした - \"バージョン 1.3.16から、このデバイスからアップロードされたファイルは、単独のファイルが複数のアカウントと同期される時にデータの損失を防ぐため、ローカルの%1$sのフォルダにコピーされます。\n\nこの変更により、このアプリの以前のバージョンでアップロードされたすべてのファイルが%2$s フォルダにコピーされます。ただし、アカウント同期の際に、エラーがこの操作の完了を阻止しました。このままファイルを残し、%3$sへのリンクを削除するか、あるいは%1$s ディレクトリのファイルを移動し、%4$sへのリンクを維持することができます。\n\n以下にローカルのファイルと、それにリンクしていた%5$sのリモートファイルがリストされています - フォルダ %1$s はもう存在しません + \"バージョン 1.3.16から、このデバイスからアップロードされたファイルは、単独のファイルが複数のアカウントと同期される時にデータの損失を防ぐため、ローカルの%1$sのフォルダーにコピーされます。\n\nこの変更により、このアプリの以前のバージョンでアップロードされたすべてのファイルが%2$s フォルダーにコピーされます。ただし、アカウント同期の際に、エラーがこの操作の完了を阻止しました。このままファイルを残し、%3$sへのリンクを削除するか、あるいは%1$s ディレクトリのファイルを移動し、%4$sへのリンクを維持することができます。\n\n以下にローカルのファイルと、それにリンクしていた%5$sのリモートファイルがリストされています + フォルダー %1$s はもう存在しません 全て移動 全てのファイルは移動されました - いくつかのファイルは移動出来ませんでした + 一部のファイルは移動できませんでした ローカル: %1$s リモート: %1$s - %1$s フォルダに選択されたファイルをコピーするのに十分なスペースがありません。コピーする代わりに、それらを移動させますか? + %1$s フォルダーに選択されたファイルをコピーするのに十分な空き領域がありません。コピーする代わりに、それらを移動させますか? アプリのパスワードを入力してください アプリのパスワードを入力してください アプリ開始時に毎回PINが要求されます。 @@ -123,29 +123,29 @@ メディアファイルが正確にエンコードされていません 再生中にタイムアウトが発生しました メディアファイルをストリーミングできません - メディアファイルをStock Media Playerでプレイ出来ません - プレイに際してセキュリティエラー %1$s - プレイに際して入力エラー %1$s - プレイに際して予期しないエラー %1$s + メディアファイルをStock Media Playerで再生できません + 再生時にセキュリティエラー %1$s + 再生時に入力エラー %1$s + 再生時に予期しないエラー %1$s 巻き戻しボタン - プレイ/ポーズボタン + 再生/一時停止ボタン 早送りボタン ログイン中... ネットワークに接続されていません 暗号化通信が利用できません。 接続が確立しました 接続をテスト中... - サーバーの間違った設定 - 同じユーザとサーバのアカウントがデバイス上にすでに存在します - 入力されたユーザはこのアカウントのユーザと一致しません + サーバー設定が間違っています + 同じユーザーとサーバーのアカウントがデバイス上にすでに存在します + 入力されたユーザーはこのアカウントのユーザーと一致しません 不明なエラーに発生しました ホストが見つかりませんでした - のインスタンスが見つかりませんでした - サーバーからの反応がありません。 + サーバーのインスタンスが見つかりません + サーバーからの反応がありません 不明なURL形式 SSLの初期化に失敗しました - SSL サーバ識別子を確認できませんでした - 認識出来ないサーバのバージョンです + SSLサーバー識別子を確認できませんでした + 認識できないサーバーのバージョンです 接続を確立できませんでした 暗号化通信を確立しました 間違ったユーザー名もしくはパスワード @@ -155,8 +155,8 @@ 認証情報は有効期限切れです。再度認証を行ってください。 現在のパスワードを入力してください セッションの有効期限切れです。再度接続してください。 - 認証サーバに接続中 ... - サーバはこの認証方式をサポートしていません + 認証サーバーに接続中 ... + サーバーはこの認証方式をサポートしていません %1$s は複数アカウントをサポートしていません ファイルを最新に保つ 名前を変更 @@ -165,7 +165,7 @@ 本当に %1$s およびそのコンテンツを削除してもよろしいですか? ローカルのみ ローカルコンテンツのみ - サーバから削除 + サーバーから削除 リモートとローカルの両方 削除に成功しました 削除を完了できませんでした @@ -179,12 +179,12 @@ しばらくお待ちください 予期せぬ問題;他のアプリでファイルを選択してみてください。 ファイルは選択されていません - oAuth2 でログイン + oAuth2でログイン oAuth2サーバーに接続中... サイトの識別子を確認できませんでした - - サーバ証明書は信頼されていません - - サーバ証明書は有効期限切れです - - サーバ証明書は若すぎます + - サーバー証明書は信頼されていません + - サーバー証明書は有効期限切れです + - サーバー証明書の有効期限は未来のものです - URLは証明書内のホスト名と一致しません この証明書を信頼してもよろしいですか? 証明書は保存できませんでした @@ -211,14 +211,14 @@ 12:23:45 WiFi経由でのみ写真をアップロード /InstantUpload - 更新の競合 - リモートファイル %s はローカルファイルと同期していません。続行すると、サーバ上のファイルを置き換えます。 + 更新が競合 + リモートファイル %s はローカルファイルと同期していません。続行すると、サーバー上のファイルを置き換えます。 両方を保持 上書き アップロードしない イメージプレビュー この画像は表示できません - %1$s は %2$s ローカルディレクトリにコピー出来ませんでした + %1$s は %2$s ローカルディレクトリにコピーできませんでした インスタントアップロードに失敗 インスタントアップロードに失敗 全ての失敗したインスタントアップロードの要約 @@ -229,5 +229,5 @@ 更に画像を読み込む オンラインでなく、インスタントアップロードのために何もしません 失敗メッセージ: - サーバーの設定を確認してください。許容を超過している可能性があります。 + サーバー設定を確認してください。クォータサイズを超えている可能性があります。 diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml new file mode 100644 index 00000000..c757504a --- /dev/null +++ b/res/values-ml/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml new file mode 100644 index 00000000..c757504a --- /dev/null +++ b/res/values-mn/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/res/values-nb-rNO/strings.xml b/res/values-nb-rNO/strings.xml index 48b731b7..471b4319 100644 --- a/res/values-nb-rNO/strings.xml +++ b/res/values-nb-rNO/strings.xml @@ -35,6 +35,7 @@ Avbryt Lagre og avslutt Feil + Ukjent feil Om Endre passord Slett konto diff --git a/res/values/strings.xml b/res/values/strings.xml index 2c4dd7ce..0ecaadf4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -188,6 +188,7 @@ Wait a moment "Unexpected problem ; please select the file from a different app" No file was selected + Send link to … Login with oAuth2 Connecting to oAuth2 server… @@ -248,4 +249,5 @@ Sorry, sharing is not enabled on your server. Please contact your administrator. Unable to share this file or folder. Please, make sure it exists + An error occurred while trying to share this file or folder diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index 7b5380f7..181a7d49 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -29,6 +29,7 @@ import com.owncloud.android.MainApp; 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; @@ -1114,4 +1115,29 @@ public class FileDataStorageManager { getContentResolver().delete(share_uri, where, whereArgs); } } + + public void saveSharesDB(ArrayList shares) { + saveShares(shares); + + ArrayList sharedFiles = new ArrayList(); + + 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); + } } diff --git a/src/com/owncloud/android/files/FileHandler.java b/src/com/owncloud/android/files/FileHandler.java deleted file mode 100644 index 2eb754dd..00000000 --- a/src/com/owncloud/android/files/FileHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -/* 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.files; - -import com.owncloud.android.datamodel.OCFile; - -public interface FileHandler { - - /** - * TODO - */ - public void openFile(OCFile file); - - -} diff --git a/src/com/owncloud/android/files/FileOperationsHelper.java b/src/com/owncloud/android/files/FileOperationsHelper.java new file mode 100644 index 00000000..1c0db87b --- /dev/null +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@ -0,0 +1,165 @@ +/* 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.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.operations.UnshareLinkOperation; +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; + } + + + public void unshareFileWithLink(OCFile file, FileActivity callerActivity) { + + if (isSharedSupported(callerActivity)) { + // Unshare the file + UnshareLinkOperation unshare = new UnshareLinkOperation(file); + unshare.execute(callerActivity.getStorageManager(), + callerActivity, + callerActivity.getRemoteOperationListener(), + callerActivity.getHandler(), + callerActivity); + + callerActivity.showLoadingDialog(); + + } else { + // Show a Message + Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG); + t.show(); + + } + } +} diff --git a/src/com/owncloud/android/operations/CreateShareOperation.java b/src/com/owncloud/android/operations/CreateShareOperation.java new file mode 100644 index 00000000..3376a9e2 --- /dev/null +++ b/src/com/owncloud/android/operations/CreateShareOperation.java @@ -0,0 +1,129 @@ +/* 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 . + * + */ + +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 ‘0’ = user, ‘1’ = group, ‘3’ = 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 ‘false’ (default) public cannot upload to a public shared folder. + * If ‘true’ 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 – Default for “public” shares + * 2 - Update + * 4 - Create + * 8 - Delete + * 16- Re-share + * 31- All above – Default for “private” shares + * For user or group shares. + * To obtain combinations, add the desired values together. + * For instance, for “Re-Share”, “delete”, “read”, “update”, 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; + } + +} diff --git a/src/com/owncloud/android/operations/GetSharesForFileOperation.java b/src/com/owncloud/android/operations/GetSharesForFileOperation.java new file mode 100644 index 00000000..fd2dab74 --- /dev/null +++ b/src/com/owncloud/android/operations/GetSharesForFileOperation.java @@ -0,0 +1,79 @@ +/* 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.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 ‘false’ (default), only shares from the current user are returned + * If set to ‘true’, all shares from the given file are returned + * @param subfiles If set to ‘false’ (default), lists only the folder being shared + * If set to ‘true’, 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 shares = new ArrayList(); + for(Object obj: result.getData()) { + shares.add((OCShare) obj); + } + + getStorageManager().saveSharesDB(shares); + } + + return result; + } + +} diff --git a/src/com/owncloud/android/operations/GetSharesOperation.java b/src/com/owncloud/android/operations/GetSharesOperation.java index 7129a213..eb221598 100644 --- a/src/com/owncloud/android/operations/GetSharesOperation.java +++ b/src/com/owncloud/android/operations/GetSharesOperation.java @@ -19,13 +19,10 @@ package com.owncloud.android.operations; 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; @@ -55,36 +52,10 @@ public class GetSharesOperation extends SyncOperation { shares.add((OCShare) obj); } - saveSharesDB(shares); + getStorageManager().saveSharesDB(shares); } return result; } - private void saveSharesDB(ArrayList shares) { - // Save share file - getStorageManager().saveShares(shares); - - ArrayList sharedFiles = new ArrayList(); - - 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); - } - } diff --git a/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java b/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java index 5b22c341..fbbc5dff 100644 --- a/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java +++ b/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java @@ -19,7 +19,6 @@ 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; @@ -77,6 +76,7 @@ public class ConflictsResolveActivity extends FileActivity implements OnConflict @Override protected void onAccountSet(boolean stateWasRecovered) { + super.onAccountSet(stateWasRecovered); if (getAccount() != null) { OCFile file = getFile(); if (getFile() == null) { @@ -84,8 +84,7 @@ public class ConflictsResolveActivity extends FileActivity implements OnConflict 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); @@ -98,7 +97,6 @@ public class ConflictsResolveActivity extends FileActivity implements OnConflict } } else { - Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); finish(); } diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index 3a9297ec..3c8a2011 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -24,19 +24,27 @@ import android.accounts.AccountManagerCallback; 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; @@ -45,14 +53,16 @@ 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. */ @@ -73,6 +83,13 @@ public abstract class FileActivity extends SherlockFragmentActivity { /** 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; /** @@ -85,6 +102,8 @@ public abstract class FileActivity extends SherlockFragmentActivity { @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); @@ -250,17 +269,6 @@ public abstract class FileActivity extends SherlockFragmentActivity { /** - * @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. * @@ -307,40 +315,85 @@ public abstract class FileActivity extends SherlockFragmentActivity { * * 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(); } } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 02da64ef..5691401d 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -38,12 +38,10 @@ import android.content.res.Resources.NotFoundException; 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; @@ -61,7 +59,6 @@ import com.actionbarsherlock.view.MenuItem; 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; @@ -70,11 +67,10 @@ 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.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; @@ -84,7 +80,6 @@ import com.owncloud.android.services.OperationsService; 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; @@ -105,13 +100,10 @@ import com.owncloud.android.utils.Log_OC; */ public class FileDisplayActivity extends FileActivity implements -OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, OnRemoteOperationListener, EditNameDialogListener { +OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, EditNameDialogListener { private ArrayAdapter 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; @@ -134,8 +126,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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; @@ -147,7 +137,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT"; private OCFile mWaitingToPreview; - private Handler mHandler; private boolean mSyncInProgress = false; private boolean mRefreshSharesInProgress = false; @@ -159,8 +148,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid - mHandler = new Handler(); - /// bindings to transference services mUploadConnection = new ListServiceConnection(); mDownloadConnection = new ListServiceConnection(); @@ -231,9 +218,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa */ @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 @@ -243,15 +229,15 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa // 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); @@ -267,10 +253,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa updateFragmentsVisibility(!file.isFolder()); updateNavigationElementsInActionBar(file.isFolder() ? null : file); } - - - } else { - Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); } } @@ -283,10 +265,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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); } @@ -448,12 +429,12 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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; @@ -465,7 +446,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } } - @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSherlock().getMenuInflater(); @@ -544,7 +524,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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); } @@ -838,30 +818,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa /** - * 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 @@ -939,14 +895,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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 @@ -972,13 +927,17 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa setFile(currentFile); } - mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event)); + mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && + !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) && + (synchResult == null || synchResult.isSuccess())) ; if (synchResult != null && synchResult.isSuccess() && (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) || FileSyncAdapter.EVENT_FOLDER_CONTENTS_SYNCED.equals(event) - ) + ) && + !mRefreshSharesInProgress && + getFileOperationsHelper().isSharedSupported(FileDisplayActivity.this) ) { startGetShares(); } @@ -1073,7 +1032,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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(); } @@ -1090,23 +1049,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } - - /** - * {@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); @@ -1342,6 +1291,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa */ @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { + super.onRemoteOperationFinish(operation, result); + if (operation instanceof RemoveFileOperation) { onRemoveFileOperationFinish((RemoveFileOperation)operation, result); @@ -1354,12 +1305,16 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } else if (operation instanceof CreateFolderOperation) { onCreateFolderOperationFinish((CreateFolderOperation)operation, result); + } else if (operation instanceof CreateShareOperation) { + onCreateShareOperationFinish((CreateShareOperation) operation, result); + } else if (operation instanceof UnshareLinkOperation) { onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result); - } + + } + } - private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) { if (result.getCode() == ResultCode.FILE_NOT_FOUND) { // Show a Message @@ -1372,6 +1327,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa dismissLoadingDialog(); } + 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. @@ -1390,7 +1352,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa if (second != null && removedFile.equals(second.getFile())) { cleanSecondFragment(); } - if (mStorageManager.getFileById(removedFile.getParentId()).equals(getCurrentDir())) { + if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) { refeshListOfFilesFragment(); } @@ -1449,7 +1411,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount()); } } - if (mStorageManager.getFileById(renamedFile.getParentId()).equals(getCurrentDir())) { + if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) { refeshListOfFilesFragment(); } @@ -1525,11 +1487,11 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa // 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(); @@ -1554,9 +1516,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa 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; @@ -1591,21 +1553,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } - public void unshareFileWithLink(OCFile file) { - - if (isSharedSupported()) { - // Unshare the file - UnshareLinkOperation unshare = new UnshareLinkOperation(file); - unshare.execute(getStorageManager(), this, this, mHandler, this); - - showLoadingDialog(); - - } else { - // Show a Message - Toast t = Toast.makeText(this, getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG); - t.show(); - - } - } + } diff --git a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java index 7eff9b45..8b4a41d2 100644 --- a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -380,6 +380,7 @@ public class UploadFilesActivity extends FileActivity implements @Override protected void onAccountSet(boolean stateWasRecovered) { + super.onAccountSet(stateWasRecovered); if (getAccount() != null) { if (!mAccountOnCreation.equals(getAccount())) { setResult(RESULT_CANCELED); @@ -387,7 +388,6 @@ public class UploadFilesActivity extends FileActivity implements } } else { - Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); setResult(RESULT_CANCELED); finish(); } diff --git a/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java b/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java new file mode 100644 index 00000000..dc15f69a --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java @@ -0,0 +1,151 @@ +/* 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.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 packagesToExcludeList = Arrays.asList(packagesToExclude != null ? packagesToExclude : new String[0]); + mFile = getArguments().getParcelable(ARG_FILE_TO_SHARE); + + PackageManager pm= getSherlockActivity().getPackageManager(); + List activities = pm.queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY); + Iterator 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 { + + private PackageManager mPackageManager; + + ActivityAdapter(Context context, PackageManager pm, List 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)); + } + } + +} diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 09d31c43..8f6a232a 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -340,8 +340,14 @@ public class FileDetailFragment extends FileFragment implements @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: { @@ -363,7 +369,7 @@ public class FileDetailFragment extends FileFragment implements return false; } } - + @Override public void onClick(View v) { switch (v.getId()) { @@ -404,7 +410,6 @@ public class FileDetailFragment extends FileFragment implements } } - private void removeFile() { OCFile file = getFile(); ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance( diff --git a/src/com/owncloud/android/ui/fragment/FileFragment.java b/src/com/owncloud/android/ui/fragment/FileFragment.java index b6c65749..2f1a49b1 100644 --- a/src/com/owncloud/android/ui/fragment/FileFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileFragment.java @@ -21,7 +21,6 @@ import android.support.v4.app.Fragment; import com.actionbarsherlock.app.SherlockFragment; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.files.FileHandler; import com.owncloud.android.ui.activity.TransferServiceGetter; @@ -73,7 +72,7 @@ public class FileFragment extends SherlockFragment { * * @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 @@ -95,8 +94,7 @@ public class FileFragment extends SherlockFragment { * @param file File to show details */ public void showDetails(OCFile file); - - + } } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index a1ff5d4e..810602a8 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -25,7 +25,6 @@ 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.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; @@ -183,8 +182,8 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName // media preview mContainerActivity.startMediaPreview(file, 0, true); } else { - // open with - mContainerActivity.openFile(file); + FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity(); + activity.getFileOperationsHelper().openFile(file, activity); } } else { @@ -283,9 +282,15 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName public boolean onContextItemSelected (MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); mTargetFile = (OCFile) mAdapter.getItem(info.position); - switch (item.getItemId()) { + switch (item.getItemId()) { + case R.id.action_share_file: { + FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity(); + activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity); + return true; + } case R.id.action_unshare_file: { - mContainerActivity.unshareFileWithLink(mTargetFile); + FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity(); + activity.getFileOperationsHelper().unshareFileWithLink(mTargetFile, activity); return true; } case R.id.action_rename_file: { @@ -414,7 +419,7 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName * * @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 @@ -422,8 +427,6 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName * @param file */ public void onBrowsedDownTo(OCFile folder); - - public void unshareFileWithLink(OCFile mTargetFile); public void startDownloadForPreview(OCFile file); diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index edafa65d..374a53b7 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -70,8 +70,6 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; - private FileDataStorageManager mStorageManager; - private ViewPager mViewPager; private PreviewImagePagerAdapter mPreviewImagePagerAdapter; @@ -115,13 +113,12 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C 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; @@ -385,7 +382,7 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C 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(); @@ -433,6 +430,7 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C @Override protected void onAccountSet(boolean stateWasRecovered) { + super.onAccountSet(stateWasRecovered); if (getAccount() != null) { OCFile file = getFile(); /// Validate handled file (first image to preview) @@ -442,15 +440,14 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C 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(); @@ -460,9 +457,6 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C // handled file not in the current Account finish(); } - - } else { - Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); } } @@ -480,5 +474,5 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C startActivity(i); } } - + } diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index c6d9825d..69fc1f85 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -57,6 +57,7 @@ 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.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; @@ -252,6 +253,11 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper @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; diff --git a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java index d68332e1..9215f7dd 100644 --- a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -312,6 +312,10 @@ public class PreviewMediaFragment extends FileFragment implements @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; @@ -339,6 +343,14 @@ public class PreviewMediaFragment extends FileFragment implements } + 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()); diff --git a/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 9e6a2803..5e5999b4 100644 --- a/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -18,7 +18,6 @@ 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; @@ -60,8 +59,6 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi 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 @@ -194,6 +191,7 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi @Override protected void onAccountSet(boolean stateWasRecovered) { + super.onAccountSet(stateWasRecovered); if (getAccount() != null) { OCFile file = getFile(); /// Validate handled file (first image to preview) @@ -203,8 +201,7 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi 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()); @@ -230,7 +227,6 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi finish(); } } else { - Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); finish(); } }