From 9645d187e91e9a7398f0e71e590891e2dca44acf Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 25 Oct 2015 08:13:38 +0100 Subject: [PATCH 01/14] wip --- .../owncloud/android/media/MediaService.java | 40 ++++- .../ui/fragment/OCFileListFragment.java | 122 +++++++++++++- .../ui/preview/PreviewMediaFragment.java | 154 +++++++++++++++--- .../ui/preview/PreviewVideoActivity.java | 11 +- src/main/res/menu/file_actions_menu.xml | 5 + src/main/res/values/strings.xml | 2 + 6 files changed, 288 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index e91a4fd4f48c..45f4705332a5 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -21,25 +21,31 @@ package com.owncloud.android.media; import android.accounts.Account; +import android.app.Activity; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; +import android.net.Uri; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.WifiLock; import android.os.IBinder; import android.os.PowerManager; +import android.support.v7.app.AlertDialog; import android.support.v7.app.NotificationCompat; import android.widget.Toast; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; @@ -214,6 +220,24 @@ public static String getMessageForMediaError(Context context, int what, int extr return context.getString(messageId); } + public static AlertDialog.Builder streamWithExternalApp(final String uri, final Activity activity){ + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("May expose password?") + .setPositiveButton("Stream", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse(uri)); + activity.startActivity(i); + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // User cancelled the dialog + } + }); + return builder; + } + /** @@ -435,12 +459,12 @@ protected void playMedia() { releaseResources(false); // release everything except MediaPlayer try { - if (mFile == null) { - Toast.makeText(this, R.string.media_err_nothing_to_play, Toast.LENGTH_LONG).show(); - processStopRequest(true); - return; +// if (mFile == null) { +// Toast.makeText(this, R.string.media_err_nothing_to_play, Toast.LENGTH_LONG).show(); +// processStopRequest(true); +// return; - } else if (mAccount == null) { + if (mAccount == null) { Toast.makeText(this, R.string.media_err_not_in_owncloud, Toast.LENGTH_LONG).show(); processStopRequest(true); return; @@ -449,12 +473,12 @@ protected void playMedia() { createMediaPlayerIfNeeded(); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); String url = mFile.getStoragePath(); - /* Streaming is not possible right now + // Streaming is not possible right now if (url == null || url.length() <= 0) { url = AccountUtils.constructFullURLForAccount(this, mAccount) + mFile.getRemotePath(); } mIsStreaming = url.startsWith("http:") || url.startsWith("https:"); - */ + mIsStreaming = false; mPlayer.setDataSource(url); @@ -495,6 +519,8 @@ protected void playMedia() { Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show(); processStopRequest(true); + } catch (AccountUtils.AccountNotFoundException e) { + e.printStackTrace(); } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 00738fbca37c..33206fde91e1 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -26,7 +26,17 @@ import android.accounts.OperationCanceledException; import android.app.Activity; import android.content.Context; +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; +import android.net.Uri; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; @@ -37,8 +47,9 @@ import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; -import android.util.SparseBooleanArray; -import android.view.ActionMode; +import android.support.v7.app.AlertDialog; +import android.view.ContextMenu; +import android.util.SparseBooleanArray;import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -54,7 +65,9 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudBasicCredentials; +import com.owncloud.android.lib.common.OwnCloudCredentials; +import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -801,15 +814,13 @@ public void onItemClick(AdapterView l, View v, int position, long id) { ((FileDisplayActivity) mContainerActivity).startImagePreview(file); } else if (PreviewTextFragment.canBePreviewed(file)) { ((FileDisplayActivity) mContainerActivity).startTextPreview(file); - } else if (file.isDown()) { - if (PreviewMediaFragment.canBePreviewed(file)) { + } else if (PreviewMediaFragment.canBePreviewed(file)) { // media preview ((FileDisplayActivity) mContainerActivity).startMediaPreview(file, 0, true); - } else { + } else if (file.isDown()) { mContainerActivity.getFileOperationsHelper().openFile(file); } - - } else { + else { // automatic download, preview on finish ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file); } @@ -896,6 +907,99 @@ public boolean onFileActionChosen(int menuId) { mContainerActivity.getFileOperationsHelper().toogleOfflineFiles(checkedFiles, false); return true; } + case R.id.action_send_file: { + // Obtain the file +// if (!mTargetFile.isDown()) { // Download the file +// Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); +// ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); +// +// } else { + // mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + +// String url = "https://test:teddy03@192.168.0.100/owncloud/remote.php/webdav/2/1.ogg"; +// String url = "https://test:test@demo.owncloud.org/remote.php/webdav/Demo%20Movie%20OGG%20-%20Big%20Buck%20Bunny%20Trailer.ogg"; + + +// try{ +// Intent i = new Intent(Intent.ACTION_VIEW); +// i.setComponent(new ComponentName("org.videolan.vlc.betav7neon", "org.videolan.vlc.betav7neon.gui.video.VideoPlayerActivity")); +// i.setData(Uri.parse(url)); +// startActivity(i); +// } +// catch (ActivityNotFoundException e){ +// Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=org.videolan.vlc.betav7neon"); +// Intent intent = new Intent (Intent.ACTION_VIEW, uri); +// startActivity(intent); +// } +// + + // TODO TOBI neuer Menüpunkt: Stream + + try { + Context context = MainApp.getAppContext(); + Account account = mContainerActivity.getStorageManager().getAccount(); + String url = AccountUtils.constructFullURLForAccount(context, account) + mTargetFile.getRemotePath(); + + OwnCloudCredentials credentials = AccountUtils.getCredentialsForAccount(context, account); + + url = url.replace("//", "//" + credentials.getUsername() + ":" + credentials.getAuthToken() + "@"); + + Log_OC.d(TAG, "Streaming url: " + url); + // VLC + Intent i = new Intent(Intent.ACTION_VIEW); + i.setComponent(new ComponentName("org.videolan.vlc.betav7neon", "org.videolan.vlc.betav7neon.gui.video.VideoPlayerActivity")); + i.setData(Uri.parse(url)); + startActivity(i); + + // MX +// Intent i = new Intent(android.content.Intent.ACTION_VIEW); +// i.setData(Uri.parse(url)); +// startActivity(i); + } catch (AccountUtils.AccountNotFoundException e) { + e.printStackTrace(); + } catch (ActivityNotFoundException e) { + // VLC + Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=org.videolan.vlc.betav7neon"); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + startActivity(intent); + } catch (AuthenticatorException e) { + e.printStackTrace(); + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } +// } + return true; + } + case R.id.action_stream_file: { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage("May expose password?") + .setPositiveButton("Stream", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + Account account = ((FileActivity)mContainerActivity).getAccount(); + Context context = MainApp.getAppContext(); + String uri = PreviewMediaFragment.generateUrlWithCredentials(account, context, mTargetFile); + + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse(uri)); + startActivity(i); + +// Intent i = new Intent(Intent.ACTION_VIEW); +// i.setComponent(new ComponentName("org.videolan.vlc", "org.videolan.vlc.gui.video.VideoPlayerActivity")); +// i.setData(Uri.parse(uri)); +// startActivity(i); + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // User cancelled the dialog + } + }); + builder.show(); + + return true; + } case R.id.action_favorite: { mContainerActivity.getFileOperationsHelper().toggleFavoriteFiles(checkedFiles, true); return true; @@ -1028,7 +1132,7 @@ private void updateLayout() { if (!mJustFolders) { updateFooter(); // decide grid vs list view - OwnCloudVersion version = AccountUtils.getServerVersion( + OwnCloudVersion version = com.owncloud.android.authentication.AccountUtils.getServerVersion( ((FileActivity) mContainerActivity).getAccount()); if (version != null && version.supportsRemoteThumbnails() && isGridViewPreferred(mFile)) { diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 77786561a50d..eba6cef7006f 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -20,7 +20,15 @@ package com.owncloud.android.ui.preview; import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.MediaMetadataRetriever; +import android.os.AsyncTask; +import android.support.v7.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -50,9 +58,16 @@ import android.widget.Toast; import android.widget.VideoView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.files.FileMenuFilter; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.OwnCloudCredentials; +import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.media.MediaControlView; import com.owncloud.android.media.MediaService; @@ -63,6 +78,9 @@ import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.MimeTypeUtil; +import java.io.IOException; +import java.util.concurrent.ExecutionException; + /** * This fragment shows a preview of a downloaded media file (audio or video). @@ -86,6 +104,7 @@ public class PreviewMediaFragment extends FileFragment implements private ImageView mImagePreview; private VideoView mVideoPreview; private int mSavedPlaybackPosition; + private String mUri; private MediaServiceBinder mMediaServiceBinder = null; private MediaControlView mMediaController = null; @@ -183,9 +202,9 @@ public void onActivityCreated(Bundle savedInstanceState) { if (mAccount == null) { throw new IllegalStateException("Instanced with a NULL ownCloud Account"); } - if (!file.isDown()) { - throw new IllegalStateException("There is no local file to preview"); - } +// if (!file.isDown()) { +// throw new IllegalStateException("There is no local file to preview"); +// } } else { @@ -197,7 +216,7 @@ public void onActivityCreated(Bundle savedInstanceState) { mAutoplay = savedInstanceState.getBoolean(PreviewMediaFragment.EXTRA_PLAYING); } - if (file != null && file.isDown()) { + if (file != null) { if (MimeTypeUtil.isVideo(file)) { mVideoPreview.setVisibility(View.VISIBLE); mImagePreview.setVisibility(View.GONE); @@ -274,7 +293,7 @@ public void onStart() { Log_OC.v(TAG, "onStart"); OCFile file = getFile(); - if (file != null && file.isDown()) { + if (file != null) { if (MimeTypeUtil.isAudio(file)) { bindMediaService(); @@ -439,7 +458,65 @@ private void playVideo() { // load the video file in the video player ; // when done, VideoHelper#onPrepared() will be called - mVideoPreview.setVideoURI(getFile().getStorageUri()); + if (getFile().isDown()) { + mUri = getFile().getStorageUri(); + } else { + Context context = MainApp.getAppContext(); + Account account = mContainerActivity.getStorageManager().getAccount(); + + mUri = generateUrlWithCredentials(account, context, getFile()); + } + + mVideoPreview.setVideoURI(mUri); + } + + public static String generateUrlWithCredentials(Account account, Context context, OCFile file){ + OwnCloudAccount ocAccount = null; + try { + ocAccount = new OwnCloudAccount(account, context); + + final ClientGenerationTask task = new ClientGenerationTask(); + task.execute(ocAccount); + + OwnCloudClient mClient = task.get(); + String url = AccountUtils.constructFullURLForAccount(context, account) + Uri.encode(file.getRemotePath(), "/"); + OwnCloudCredentials credentials = mClient.getCredentials(); + + return url.replace("//", "//" + credentials.getUsername() + ":" + credentials.getAuthToken() + "@"); + + } catch (AccountUtils.AccountNotFoundException e) { + e.printStackTrace(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + return ""; + } + + public static class ClientGenerationTask extends AsyncTask { + @Override + protected OwnCloudClient doInBackground(Object... params) { + Object account = params[0]; + if (account instanceof OwnCloudAccount){ + try { + OwnCloudAccount ocAccount = (OwnCloudAccount) account; + return OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, MainApp.getAppContext()); + } catch (AccountUtils.AccountNotFoundException e) { + e.printStackTrace(); + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (AuthenticatorException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } } @@ -450,7 +527,7 @@ private class VideoHelper implements OnCompletionListener, OnPreparedListener, O *

* Just starts the playback. * - * @param vp {@link MediaPlayer} instance performing the playback. + * @param vp {@link MediaPlayer} instance performing the playback. */ @Override public void onPrepared(MediaPlayer vp) { @@ -477,6 +554,21 @@ public void onCompletion(MediaPlayer mp) { Log_OC.v(TAG, "completed"); if (mp != null) { mVideoPreview.seekTo(0); + // next lines are necessary to work around undesired video loops + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD) { + mVideoPreview.pause(); + + } else { + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) { + // mVideePreview.pause() is not enough + + mMediaController.setEnabled(false); + mVideoPreview.stopPlayback(); + mAutoplay = false; + mSavedPlaybackPosition = 0; + mVideoPreview.setVideoPath(getFile().getStoragePath()); + } + } } // else : called from onError() mMediaController.updatePausePlay(); } @@ -491,28 +583,40 @@ public void onCompletion(MediaPlayer mp) { */ @Override public boolean onError(MediaPlayer mp, int what, int extra) { - Log_OC.e(TAG, "Error in video playback, what = " + what + ", extra = " + extra); - if (mVideoPreview.getWindowToken() != null) { - String message = MediaService.getMessageForMediaError( - getActivity(), what, extra); - new AlertDialog.Builder(getActivity()) - .setMessage(message) - .setPositiveButton(android.R.string.VideoView_error_button, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - VideoHelper.this.onCompletion(null); - } - }) - .setCancelable(false) - .show(); - } +// if (mVideoPreview.getWindowToken() != null) { + // try to open with another app +// try{ +// AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); +// builder.setMessage("May expose password?") +// .setPositiveButton("Stream", new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog, int id) { +// Intent i = new Intent(android.content.Intent.ACTION_VIEW); +// i.setData(Uri.parse(mUri)); +// startActivity(i); +// } +// }) +// .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog, int id) { +// // User cancelled the dialog +// } +// }); +// builder.show(); + + MediaService.streamWithExternalApp(mUri, getActivity()).show(); + +// } +// catch (ActivityNotFoundException e){ +// Intent i = new Intent(android.content.Intent.ACTION_VIEW); +// i.setData(Uri.parse(mUri)); +// startActivity(i); +// } +// } +// } return true; - } + } } - @Override public void onPause() { Log_OC.v(TAG, "onPause"); diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 1ef2cc62d34b..8d02acb26780 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -210,12 +210,13 @@ protected void onAccountSet(boolean stateWasRecovered) { } else { // not working yet String url; - try { - url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath(); +// try { +// url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath(); + url = PreviewMediaFragment.generateUrlWithCredentials(getAccount(), getApplicationContext(), getFile()); mVideoPlayer.setVideoURI(Uri.parse(url)); - } catch (AccountNotFoundException e) { - onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); - } +// } catch (AccountNotFoundException e) { +// onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); +// } } // create and prepare control panel for the user diff --git a/src/main/res/menu/file_actions_menu.xml b/src/main/res/menu/file_actions_menu.xml index 0b0b5dff5343..4126decf217c 100644 --- a/src/main/res/menu/file_actions_menu.xml +++ b/src/main/res/menu/file_actions_menu.xml @@ -29,6 +29,11 @@ app:showAsAction="never" android:showAsAction="never" android:orderInCategory="1" /> + Move file Select all + Stream file with external player + kept in original folder moved to app folder deleted From 30858d7da91b6a140aa802da2e8792230a1d5589 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 25 Oct 2015 12:50:54 +0100 Subject: [PATCH 02/14] wip --- .../owncloud/android/media/MediaService.java | 19 ++++++++++--------- src/main/res/values/strings.xml | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index 45f4705332a5..03181efa9c02 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -222,15 +222,16 @@ public static String getMessageForMediaError(Context context, int what, int extr public static AlertDialog.Builder streamWithExternalApp(final String uri, final Activity activity){ AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setMessage("May expose password?") - .setPositiveButton("Stream", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - Intent i = new Intent(android.content.Intent.ACTION_VIEW); - i.setData(Uri.parse(uri)); - activity.startActivity(i); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + builder.setMessage(activity.getString(R.string.stream_expose_password)) + .setPositiveButton(activity.getString(R.string.common_yes), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(uri)); + activity.startActivity(i); + } + }) + .setNegativeButton(activity.getString(R.string.common_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index f3a6290eacbb..361c8230cfae 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -483,6 +483,7 @@ Select all Stream file with external player + May expose password? kept in original folder moved to app folder From a981ac42e7ec6c5d27a014423554da7c4ec714d1 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 1 Nov 2015 08:28:59 +0100 Subject: [PATCH 03/14] tidy up --- .../ui/fragment/OCFileListFragment.java | 64 ++----------------- 1 file changed, 7 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 33206fde91e1..6e2d098b0372 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -27,12 +27,7 @@ import android.app.Activity; import android.content.Context; import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -65,9 +60,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.lib.common.OwnCloudBasicCredentials; -import com.owncloud.android.lib.common.OwnCloudCredentials; -import com.owncloud.android.lib.common.accounts.AccountUtils; +import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; @@ -109,7 +102,6 @@ import org.parceler.Parcels; import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -909,54 +901,12 @@ public boolean onFileActionChosen(int menuId) { } case R.id.action_send_file: { // Obtain the file -// if (!mTargetFile.isDown()) { // Download the file -// Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); -// ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); -// -// } else { - // mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); - -// String url = "https://test:teddy03@192.168.0.100/owncloud/remote.php/webdav/2/1.ogg"; -// String url = "https://test:test@demo.owncloud.org/remote.php/webdav/Demo%20Movie%20OGG%20-%20Big%20Buck%20Bunny%20Trailer.ogg"; - - -// try{ -// Intent i = new Intent(Intent.ACTION_VIEW); -// i.setComponent(new ComponentName("org.videolan.vlc.betav7neon", "org.videolan.vlc.betav7neon.gui.video.VideoPlayerActivity")); -// i.setData(Uri.parse(url)); -// startActivity(i); -// } -// catch (ActivityNotFoundException e){ -// Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=org.videolan.vlc.betav7neon"); -// Intent intent = new Intent (Intent.ACTION_VIEW, uri); -// startActivity(intent); -// } -// + if (!mTargetFile.isDown()) { // Download the file + Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); + ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); - // TODO TOBI neuer Menüpunkt: Stream - - try { - Context context = MainApp.getAppContext(); - Account account = mContainerActivity.getStorageManager().getAccount(); - String url = AccountUtils.constructFullURLForAccount(context, account) + mTargetFile.getRemotePath(); - - OwnCloudCredentials credentials = AccountUtils.getCredentialsForAccount(context, account); - - url = url.replace("//", "//" + credentials.getUsername() + ":" + credentials.getAuthToken() + "@"); - - Log_OC.d(TAG, "Streaming url: " + url); - // VLC - Intent i = new Intent(Intent.ACTION_VIEW); - i.setComponent(new ComponentName("org.videolan.vlc.betav7neon", "org.videolan.vlc.betav7neon.gui.video.VideoPlayerActivity")); - i.setData(Uri.parse(url)); - startActivity(i); - - // MX -// Intent i = new Intent(android.content.Intent.ACTION_VIEW); -// i.setData(Uri.parse(url)); -// startActivity(i); - } catch (AccountUtils.AccountNotFoundException e) { - e.printStackTrace(); + } else { + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); } catch (ActivityNotFoundException e) { // VLC Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=org.videolan.vlc.betav7neon"); @@ -1132,7 +1082,7 @@ private void updateLayout() { if (!mJustFolders) { updateFooter(); // decide grid vs list view - OwnCloudVersion version = com.owncloud.android.authentication.AccountUtils.getServerVersion( + OwnCloudVersion version = AccountUtils.getServerVersion( ((FileActivity) mContainerActivity).getAccount()); if (version != null && version.supportsRemoteThumbnails() && isGridViewPreferred(mFile)) { From f8a55777a383260693eb90a1e28d6f5693fb084e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 1 Nov 2015 08:52:04 +0100 Subject: [PATCH 04/14] tidy up once more --- .../owncloud/android/media/MediaService.java | 7 +--- .../ui/fragment/OCFileListFragment.java | 31 +++----------- .../ui/preview/PreviewMediaFragment.java | 40 ++----------------- .../ui/preview/PreviewVideoActivity.java | 10 +---- src/main/res/values/strings.xml | 2 +- 5 files changed, 14 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index 03181efa9c02..4fddcbade2f1 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -460,11 +460,6 @@ protected void playMedia() { releaseResources(false); // release everything except MediaPlayer try { -// if (mFile == null) { -// Toast.makeText(this, R.string.media_err_nothing_to_play, Toast.LENGTH_LONG).show(); -// processStopRequest(true); -// return; - if (mAccount == null) { Toast.makeText(this, R.string.media_err_not_in_owncloud, Toast.LENGTH_LONG).show(); processStopRequest(true); @@ -474,7 +469,7 @@ protected void playMedia() { createMediaPlayerIfNeeded(); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); String url = mFile.getStoragePath(); - // Streaming is not possible right now + if (url == null || url.length() <= 0) { url = AccountUtils.constructFullURLForAccount(this, mAccount) + mFile.getRemotePath(); } diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 6e2d098b0372..8d3739e2079c 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -73,6 +73,7 @@ import com.owncloud.android.lib.resources.files.ToggleFavoriteOperation; import com.owncloud.android.lib.resources.shares.GetRemoteSharesOperation; import com.owncloud.android.lib.resources.status.OwnCloudVersion; +import com.owncloud.android.media.MediaService; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.FolderPickerActivity; @@ -923,30 +924,10 @@ public boolean onFileActionChosen(int menuId) { return true; } case R.id.action_stream_file: { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage("May expose password?") - .setPositiveButton("Stream", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - Account account = ((FileActivity)mContainerActivity).getAccount(); - Context context = MainApp.getAppContext(); - String uri = PreviewMediaFragment.generateUrlWithCredentials(account, context, mTargetFile); - - Intent i = new Intent(android.content.Intent.ACTION_VIEW); - i.setData(Uri.parse(uri)); - startActivity(i); - -// Intent i = new Intent(Intent.ACTION_VIEW); -// i.setComponent(new ComponentName("org.videolan.vlc", "org.videolan.vlc.gui.video.VideoPlayerActivity")); -// i.setData(Uri.parse(uri)); -// startActivity(i); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // User cancelled the dialog - } - }); - builder.show(); + Account account = ((FileActivity)mContainerActivity).getAccount(); + Context context = MainApp.getAppContext(); + String uri = PreviewMediaFragment.generateUrlWithCredentials(account, context, mTargetFile); + MediaService.streamWithExternalApp(uri, getActivity()).show(); return true; } @@ -1083,7 +1064,7 @@ private void updateLayout() { updateFooter(); // decide grid vs list view OwnCloudVersion version = AccountUtils.getServerVersion( - ((FileActivity) mContainerActivity).getAccount()); + ((FileActivity)mContainerActivity).getAccount()); if (version != null && version.supportsRemoteThumbnails() && isGridViewPreferred(mFile)) { switchToGridView(); diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index eba6cef7006f..27520d33b20c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -202,10 +202,6 @@ public void onActivityCreated(Bundle savedInstanceState) { if (mAccount == null) { throw new IllegalStateException("Instanced with a NULL ownCloud Account"); } -// if (!file.isDown()) { -// throw new IllegalStateException("There is no local file to preview"); -// } - } else { file = savedInstanceState.getParcelable(PreviewMediaFragment.EXTRA_FILE); @@ -527,7 +523,7 @@ private class VideoHelper implements OnCompletionListener, OnPreparedListener, O *

* Just starts the playback. * - * @param vp {@link MediaPlayer} instance performing the playback. + * @param vp {@link MediaPlayer} instance performing the playback. */ @Override public void onPrepared(MediaPlayer vp) { @@ -558,7 +554,8 @@ public void onCompletion(MediaPlayer mp) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD) { mVideoPreview.pause(); - } else { + } + else { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) { // mVideePreview.pause() is not enough @@ -583,37 +580,8 @@ public void onCompletion(MediaPlayer mp) { */ @Override public boolean onError(MediaPlayer mp, int what, int extra) { -// if (mVideoPreview.getWindowToken() != null) { - // try to open with another app -// try{ -// AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); -// builder.setMessage("May expose password?") -// .setPositiveButton("Stream", new DialogInterface.OnClickListener() { -// public void onClick(DialogInterface dialog, int id) { -// Intent i = new Intent(android.content.Intent.ACTION_VIEW); -// i.setData(Uri.parse(mUri)); -// startActivity(i); -// } -// }) -// .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { -// public void onClick(DialogInterface dialog, int id) { -// // User cancelled the dialog -// } -// }); -// builder.show(); - - MediaService.streamWithExternalApp(mUri, getActivity()).show(); - -// } -// catch (ActivityNotFoundException e){ -// Intent i = new Intent(android.content.Intent.ACTION_VIEW); -// i.setData(Uri.parse(mUri)); -// startActivity(i); -// } -// } -// } + MediaService.streamWithExternalApp(mUri, getActivity()).show(); return true; - } } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 8d02acb26780..0a13867df93f 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -208,15 +208,9 @@ protected void onAccountSet(boolean stateWasRecovered) { mVideoPlayer.setVideoURI(file.getStorageUri()); } else { - // not working yet String url; -// try { -// url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath(); - url = PreviewMediaFragment.generateUrlWithCredentials(getAccount(), getApplicationContext(), getFile()); - mVideoPlayer.setVideoURI(Uri.parse(url)); -// } catch (AccountNotFoundException e) { -// onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); -// } + url = PreviewMediaFragment.generateUrlWithCredentials(getAccount(), getApplicationContext(), getFile()); + mVideoPlayer.setVideoURI(Uri.parse(url)); } // create and prepare control panel for the user diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 361c8230cfae..ef04b09b836c 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -483,7 +483,7 @@ Select all Stream file with external player - May expose password? + Do you want to stream this file with an external app?\n\nCAUTION: This may expose your password! kept in original folder moved to app folder From c4ab4a203bc57c88b6525794992abd98a136b3d5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 1 Nov 2015 08:59:34 +0100 Subject: [PATCH 05/14] add missing check for context menu --- .../java/com/owncloud/android/files/FileMenuFilter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index b3cbb988c4f1..04331c800cc6 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -257,6 +257,12 @@ private void filter(List toShow, List toHide) { toShow.add(R.id.action_unset_favorite); } + // STREAM + if (mFile != null && (mFile.isAudio() || mFile.isVideo())){ + toShow.add(R.id.action_stream_file); + } else { + toHide.add(R.id.action_stream_file); + } } From ffd3aa07d9cef8ece7548b1dc43a2e251c34440d Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 1 Nov 2015 09:16:33 +0100 Subject: [PATCH 06/14] show external streaming only for not downloaded files --- src/main/java/com/owncloud/android/files/FileMenuFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 04331c800cc6..506944790991 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -258,7 +258,7 @@ private void filter(List toShow, List toHide) { } // STREAM - if (mFile != null && (mFile.isAudio() || mFile.isVideo())){ + if (mFile != null && !mFile.isDown() && (mFile.isAudio() || mFile.isVideo())){ toShow.add(R.id.action_stream_file); } else { toHide.add(R.id.action_stream_file); From e2ec3dba9e6b4cd0e2c04beedcf5753c4cd465e6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 6 Nov 2015 15:39:42 +0100 Subject: [PATCH 07/14] show error message again. Stream with external app is now only possible via menu item --- .../android/ui/preview/PreviewMediaFragment.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 27520d33b20c..19d4c1a05716 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -580,7 +580,21 @@ public void onCompletion(MediaPlayer mp) { */ @Override public boolean onError(MediaPlayer mp, int what, int extra) { - MediaService.streamWithExternalApp(mUri, getActivity()).show(); + if (mVideoPreview.getWindowToken() != null) { + String message = MediaService.getMessageForMediaError( + getActivity(), what, extra); + new AlertDialog.Builder(getActivity()) + .setMessage(message) + .setPositiveButton(android.R.string.VideoView_error_button, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + VideoHelper.this.onCompletion(null); + } + }) + .setCancelable(false) + .show(); + } return true; } } From 5b96e7ebc7dcd817fec80820f4033237bbea9fc5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 23 Dec 2015 18:25:43 +0100 Subject: [PATCH 08/14] try to fix #1348 --- .../com/owncloud/android/ui/preview/PreviewMediaFragment.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 19d4c1a05716..bf2e1aa954b3 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -458,9 +458,7 @@ private void playVideo() { mUri = getFile().getStorageUri(); } else { Context context = MainApp.getAppContext(); - Account account = mContainerActivity.getStorageManager().getAccount(); - - mUri = generateUrlWithCredentials(account, context, getFile()); + mUri = generateUrlWithCredentials(mAccount, context, getFile()); } mVideoPreview.setVideoURI(mUri); From c7ce23af7b080b39662a9b04514b5aeef7fa2178 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sun, 13 Mar 2016 08:47:17 +0100 Subject: [PATCH 09/14] update warning message --- src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index ef04b09b836c..ff106ae7b9bf 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -483,7 +483,7 @@ Select all Stream file with external player - Do you want to stream this file with an external app?\n\nCAUTION: This may expose your password! + Do you want to stream this file with an external app?\n\nCAUTION: This may expose your password locally on the display! kept in original folder moved to app folder From ad0b3cbd65bb16c00471c8c14b0f90064b9e8d55 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Mon, 15 Aug 2016 17:57:03 +0200 Subject: [PATCH 10/14] minor code changes after rebase --- .../android/files/FileMenuFilter.java | 21 +++- .../owncloud/android/media/MediaService.java | 5 +- .../ui/fragment/OCFileListFragment.java | 45 ++------- .../ui/preview/PreviewMediaFragment.java | 99 ++++++------------- .../ui/preview/PreviewVideoActivity.java | 6 +- src/main/res/menu/file_actions_menu.xml | 3 +- 6 files changed, 64 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 506944790991..52ec618a6e3f 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -258,12 +258,11 @@ private void filter(List toShow, List toHide) { } // STREAM - if (mFile != null && !mFile.isDown() && (mFile.isAudio() || mFile.isVideo())){ + if (isSingleFile() && !anyFileDown() && (anyFileAudio() || anyFileVideo())){ toShow.add(R.id.action_stream_file); } else { toHide.add(R.id.action_stream_file); } - } private boolean anyFileSynchronizing() { @@ -341,6 +340,24 @@ private boolean anyFileDown() { return false; } + private boolean anyFileAudio() { + for(OCFile file: mFiles) { + if(file.isAudio()) { + return true; + } + } + return false; + } + + private boolean anyFileVideo() { + for(OCFile file: mFiles) { + if(file.isVideo()) { + return true; + } + } + return false; + } + private boolean allKeptAvailableOffline() { for(OCFile file: mFiles) { if(!file.isAvailableOffline()) { diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index 4fddcbade2f1..d4f413e155bf 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -22,7 +22,6 @@ import android.accounts.Account; import android.app.Activity; -import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -220,14 +219,14 @@ public static String getMessageForMediaError(Context context, int what, int extr return context.getString(messageId); } - public static AlertDialog.Builder streamWithExternalApp(final String uri, final Activity activity){ + public static AlertDialog.Builder streamWithExternalApp(final Uri uri, final Activity activity){ AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(activity.getString(R.string.stream_expose_password)) .setPositiveButton(activity.getString(R.string.common_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse(uri)); + i.setData(uri); activity.startActivity(i); } }) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 8d3739e2079c..c93ba368ee1f 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -27,12 +27,10 @@ import android.app.Activity; import android.content.Context; import android.accounts.Account; -import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; -import android.net.Uri; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -42,8 +40,6 @@ import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AlertDialog; -import android.view.ContextMenu; import android.util.SparseBooleanArray;import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; @@ -873,6 +869,14 @@ public boolean onFileActionChosen(int menuId) { } return true; } + case R.id.action_stream_file: { + Account account = ((FileActivity)mContainerActivity).getAccount(); + Context context = MainApp.getAppContext(); + Uri uri = PreviewMediaFragment.generateUrlWithCredentials(account, context, singleFile); + MediaService.streamWithExternalApp(uri, getActivity()).show(); + + return true; + } } } @@ -900,37 +904,6 @@ public boolean onFileActionChosen(int menuId) { mContainerActivity.getFileOperationsHelper().toogleOfflineFiles(checkedFiles, false); return true; } - case R.id.action_send_file: { - // Obtain the file - if (!mTargetFile.isDown()) { // Download the file - Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); - ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); - - } else { - mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); - } catch (ActivityNotFoundException e) { - // VLC - Uri uri = Uri.parse("http://play.google.com/store/apps/details?id=org.videolan.vlc.betav7neon"); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - startActivity(intent); - } catch (AuthenticatorException e) { - e.printStackTrace(); - } catch (OperationCanceledException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } -// } - return true; - } - case R.id.action_stream_file: { - Account account = ((FileActivity)mContainerActivity).getAccount(); - Context context = MainApp.getAppContext(); - String uri = PreviewMediaFragment.generateUrlWithCredentials(account, context, mTargetFile); - MediaService.streamWithExternalApp(uri, getActivity()).show(); - - return true; - } case R.id.action_favorite: { mContainerActivity.getFileOperationsHelper().toggleFavoriteFiles(checkedFiles, true); return true; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index bf2e1aa954b3..8e70d5afa2f6 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -23,12 +23,6 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.media.MediaMetadataRetriever; -import android.os.AsyncTask; -import android.support.v7.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -43,6 +37,9 @@ import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.support.v7.app.AlertDialog; @@ -61,7 +58,6 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.files.FileMenuFilter; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.OwnCloudClient; @@ -79,7 +75,6 @@ import com.owncloud.android.utils.MimeTypeUtil; import java.io.IOException; -import java.util.concurrent.ExecutionException; /** @@ -91,8 +86,7 @@ * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is * generated on instantiation too. */ -public class PreviewMediaFragment extends FileFragment implements - OnTouchListener { +public class PreviewMediaFragment extends FileFragment implements OnTouchListener { public static final String EXTRA_FILE = "FILE"; public static final String EXTRA_ACCOUNT = "ACCOUNT"; @@ -104,7 +98,6 @@ public class PreviewMediaFragment extends FileFragment implements private ImageView mImagePreview; private VideoView mVideoPreview; private int mSavedPlaybackPosition; - private String mUri; private MediaServiceBinder mMediaServiceBinder = null; private MediaControlView mMediaController = null; @@ -153,7 +146,6 @@ public PreviewMediaFragment() { mAutoplay = true; } - /** * {@inheritDoc} */ @@ -163,7 +155,6 @@ public void onCreate(Bundle savedInstanceState) { setHasOptionsMenu(true); } - /** * {@inheritDoc} */ @@ -185,7 +176,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return mView; } - /** * {@inheritDoc} */ @@ -251,7 +241,6 @@ private void extractAndSetCoverArt(OCFile file) { } } - /** * {@inheritDoc} */ @@ -282,7 +271,6 @@ public void onSaveInstanceState(Bundle outState) { } } - @Override public void onStart() { super.onStart(); @@ -303,14 +291,12 @@ public void onStart() { } } - private void stopAudio() { Intent i = new Intent(getActivity(), MediaService.class); i.setAction(MediaService.ACTION_STOP_ALL); getActivity().startService(i); } - /** * {@inheritDoc} */ @@ -320,7 +306,6 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.file_actions_menu, menu); } - /** * {@inheritDoc} */ @@ -376,7 +361,6 @@ public void onPrepareOptionsMenu(Menu menu) { } - /** * {@inheritDoc} */ @@ -413,7 +397,6 @@ public boolean onOptionsItemSelected(MenuItem item) { } } - /** * Update the file of the fragment with file value * @@ -452,19 +435,21 @@ private void playVideo() { // create and prepare control panel for the user mMediaController.setMediaPlayer(mVideoPreview); + Uri videoUri; + // load the video file in the video player ; // when done, VideoHelper#onPrepared() will be called if (getFile().isDown()) { - mUri = getFile().getStorageUri(); + videoUri = getFile().getStorageUri(); } else { Context context = MainApp.getAppContext(); - mUri = generateUrlWithCredentials(mAccount, context, getFile()); + videoUri = generateUrlWithCredentials(mAccount, context, getFile()); } - mVideoPreview.setVideoURI(mUri); + mVideoPreview.setVideoURI(videoUri); } - public static String generateUrlWithCredentials(Account account, Context context, OCFile file){ + public static Uri generateUrlWithCredentials(Account account, Context context, OCFile file){ OwnCloudAccount ocAccount = null; try { ocAccount = new OwnCloudAccount(account, context); @@ -473,20 +458,19 @@ public static String generateUrlWithCredentials(Account account, Context context task.execute(ocAccount); OwnCloudClient mClient = task.get(); - String url = AccountUtils.constructFullURLForAccount(context, account) + Uri.encode(file.getRemotePath(), "/"); + String url = AccountUtils.constructFullURLForAccount(context, account) + + Uri.encode(file.getRemotePath(), "/"); OwnCloudCredentials credentials = mClient.getCredentials(); - return url.replace("//", "//" + credentials.getUsername() + ":" + credentials.getAuthToken() + "@"); - + return Uri.parse(url.replace("//", "//" + credentials.getUsername() + ":" + credentials.getAuthToken() + + "@")); } catch (AccountUtils.AccountNotFoundException e) { - e.printStackTrace(); - - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); + Log_OC.e(TAG,"Couldn't create streaming URI - Account missing", e); + } catch (Exception e) { + Log_OC.e(TAG,"Couldn't create streaming URI", e); } - return ""; + + return null; } public static class ClientGenerationTask extends AsyncTask { @@ -499,13 +483,13 @@ protected OwnCloudClient doInBackground(Object... params) { return OwnCloudClientManagerFactory.getDefaultSingleton(). getClientFor(ocAccount, MainApp.getAppContext()); } catch (AccountUtils.AccountNotFoundException e) { - e.printStackTrace(); + Log_OC.e(TAG,"Couldn't create Nc client - Account missing", e); } catch (OperationCanceledException e) { - e.printStackTrace(); + Log_OC.e(TAG,"Couldn't create Nc client - Operation canceled", e); } catch (AuthenticatorException e) { - e.printStackTrace(); + Log_OC.e(TAG,"Couldn't create Nc client - Authentication error", e); } catch (IOException e) { - e.printStackTrace(); + Log_OC.e(TAG,"Couldn't create Nc client - I/O error", e); } } @@ -513,7 +497,6 @@ protected OwnCloudClient doInBackground(Object... params) { } } - private class VideoHelper implements OnCompletionListener, OnPreparedListener, OnErrorListener { /** @@ -535,7 +518,6 @@ public void onPrepared(MediaPlayer vp) { mPrepared = true; } - /** * Called when the file is finished playing. *

@@ -548,27 +530,10 @@ public void onCompletion(MediaPlayer mp) { Log_OC.v(TAG, "completed"); if (mp != null) { mVideoPreview.seekTo(0); - // next lines are necessary to work around undesired video loops - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD) { - mVideoPreview.pause(); - - } - else { - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) { - // mVideePreview.pause() is not enough - - mMediaController.setEnabled(false); - mVideoPreview.stopPlayback(); - mAutoplay = false; - mSavedPlaybackPosition = 0; - mVideoPreview.setVideoPath(getFile().getStoragePath()); - } - } } // else : called from onError() mMediaController.updatePausePlay(); } - /** * Called when an error in playback occurs. * @@ -645,7 +610,6 @@ public boolean onTouch(View v, MotionEvent event) { return false; } - private void startFullScreenVideo() { Intent i = new Intent(getActivity(), PreviewVideoActivity.class); i.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount); @@ -678,7 +642,6 @@ private void playAudio() { if (!mMediaServiceBinder.isPlaying(file)) { Log_OC.d(TAG, "starting playback of " + file.getStoragePath()); mMediaServiceBinder.start(mAccount, file, mAutoplay, mSavedPlaybackPosition); - } else { if (!mMediaServiceBinder.isPlaying() && mAutoplay) { @@ -694,11 +657,12 @@ private void bindMediaService() { if (mMediaServiceConnection == null) { mMediaServiceConnection = new MediaServiceConnection(); } - getActivity().bindService( new Intent(getActivity(), - MediaService.class), - mMediaServiceConnection, - Context.BIND_AUTO_CREATE); - // follow the flow in MediaServiceConnection#onServiceConnected(...) + getActivity().bindService( + new Intent(getActivity(), MediaService.class), + mMediaServiceConnection, + Context.BIND_AUTO_CREATE + ); + // follow the flow in MediaServiceConnection#onServiceConnected(...) } /** Defines callbacks for service binding, passed to bindService() */ @@ -750,7 +714,6 @@ public void onServiceDisconnected(ComponentName component) { } } - /** * Opens the previewed file with an external application. */ @@ -771,7 +734,6 @@ public static boolean canBePreviewed(OCFile file) { return (file != null && (MimeTypeUtil.isAudio(file) || MimeTypeUtil.isVideo(file))); } - public void stopPreview(boolean stopAudio) { OCFile file = getFile(); if (MimeTypeUtil.isAudio(file) && stopAudio) { @@ -785,7 +747,6 @@ public void stopPreview(boolean stopAudio) { } } - /** * Finishes the preview */ @@ -793,7 +754,6 @@ private void finish() { getActivity().onBackPressed(); } - public int getPosition() { if (mPrepared) { mSavedPlaybackPosition = mVideoPreview.getCurrentPosition(); @@ -808,5 +768,4 @@ public boolean isPlaying() { } return mAutoplay; } - } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java index 0a13867df93f..f8a8994fec05 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@ -208,9 +208,9 @@ protected void onAccountSet(boolean stateWasRecovered) { mVideoPlayer.setVideoURI(file.getStorageUri()); } else { - String url; - url = PreviewMediaFragment.generateUrlWithCredentials(getAccount(), getApplicationContext(), getFile()); - mVideoPlayer.setVideoURI(Uri.parse(url)); + Uri uri = PreviewMediaFragment.generateUrlWithCredentials(getAccount(), getApplicationContext(), + getFile()); + mVideoPlayer.setVideoURI(uri); } // create and prepare control panel for the user diff --git a/src/main/res/menu/file_actions_menu.xml b/src/main/res/menu/file_actions_menu.xml index 4126decf217c..0103cdc704da 100644 --- a/src/main/res/menu/file_actions_menu.xml +++ b/src/main/res/menu/file_actions_menu.xml @@ -32,7 +32,8 @@ Date: Mon, 15 Aug 2016 18:01:18 +0200 Subject: [PATCH 11/14] removed printStackTrace --- src/main/java/com/owncloud/android/media/MediaService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/media/MediaService.java b/src/main/java/com/owncloud/android/media/MediaService.java index d4f413e155bf..baf2e98e8bf3 100644 --- a/src/main/java/com/owncloud/android/media/MediaService.java +++ b/src/main/java/com/owncloud/android/media/MediaService.java @@ -515,7 +515,7 @@ protected void playMedia() { Toast.LENGTH_LONG).show(); processStopRequest(true); } catch (AccountUtils.AccountNotFoundException e) { - e.printStackTrace(); + Log_OC.e(TAG, "playMedia - Account missing",e); } } From 998bd4575e73d2a80543b8b15188a12d6def8a80 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 2 Nov 2016 16:11:44 +0100 Subject: [PATCH 12/14] fix API calls after rebase --- src/main/java/com/owncloud/android/files/FileMenuFilter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 52ec618a6e3f..571d15e69bd1 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -32,6 +32,7 @@ import com.owncloud.android.lib.resources.status.OCCapability; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; import com.owncloud.android.ui.activity.ComponentsGetter; +import com.owncloud.android.utils.MimeTypeUtil; import java.util.ArrayList; import java.util.Arrays; @@ -342,7 +343,7 @@ private boolean anyFileDown() { private boolean anyFileAudio() { for(OCFile file: mFiles) { - if(file.isAudio()) { + if(MimeTypeUtil.isAudio(file)) { return true; } } @@ -351,7 +352,7 @@ private boolean anyFileAudio() { private boolean anyFileVideo() { for(OCFile file: mFiles) { - if(file.isVideo()) { + if(MimeTypeUtil.isVideo(file)) { return true; } } From 63c53b51e69568e092468bb06406eb8035fb353b Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 8 Nov 2016 07:48:38 +0100 Subject: [PATCH 13/14] ortganize imports --- .../com/owncloud/android/ui/preview/PreviewMediaFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 8e70d5afa2f6..5b701adc1195 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -39,7 +39,6 @@ import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.support.v7.app.AlertDialog; From de30246f992129f893df654e9e261e74d70e3ef8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 3 Apr 2017 22:45:08 +0200 Subject: [PATCH 14/14] fix import --- .../owncloud/android/ui/fragment/OCFileListFragment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index c93ba368ee1f..bd90a76c4cbe 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -26,8 +26,6 @@ import android.accounts.OperationCanceledException; import android.app.Activity; import android.content.Context; -import android.accounts.Account; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; @@ -40,7 +38,8 @@ import android.support.design.widget.BottomNavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; -import android.util.SparseBooleanArray;import android.view.ActionMode; +import android.util.SparseBooleanArray; +import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -99,6 +98,7 @@ import org.parceler.Parcels; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List;