-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
+/**
+ * ownCloud Android client application
+ *
+ * @author David A. Velasco
+ * Copyright (C) 2015 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,
import android.accounts.Account;
import android.app.Activity;
-import android.app.AlertDialog;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.MediaMetadataRetriever;
+import android.support.v7.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Bundle;
import android.os.IBinder;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.VideoView;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.FileMenuFilter;
/**
* This fragment shows a preview of a downloaded media file (audio or video).
*
- * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will produce an {@link IllegalStateException}.
- *
- * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too.
+ * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will
+ * produce an {@link IllegalStateException}.
*
- * @author David A. Velasco
+ * 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 {
} else {
mVideoPreview.setVisibility(View.GONE);
mImagePreview.setVisibility(View.VISIBLE);
+ extractAndSetCoverArt(file);
}
}
}
-
+
+ /**
+ * tries to read the cover art from the audio file and sets it as cover art.
+ *
+ * @param file audio file with potential cover art
+ */
+ private void extractAndSetCoverArt(OCFile file) {
+ if (file.isAudio()) {
+ try {
+ MediaMetadataRetriever mmr = new MediaMetadataRetriever();
+ mmr.setDataSource(file.getStoragePath());
+ byte[] data = mmr.getEmbeddedPicture();
+ if (data != null) {
+ Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
+ mImagePreview.setImageBitmap(bitmap); //associated cover art in bitmap
+ } else {
+ mImagePreview.setImageResource(R.drawable.logo);
+ }
+ } catch (Throwable t) {
+ mImagePreview.setImageResource(R.drawable.logo);
+ }
+ }
+ }
+
/**
* {@inheritDoc}
private void stopAudio() {
- Intent i = new Intent(getSherlockActivity(), MediaService.class);
+ Intent i = new Intent(getActivity(), MediaService.class);
i.setAction(MediaService.ACTION_STOP_ALL);
- getSherlockActivity().startService(i);
+ getActivity().startService(i);
}
getFile(),
mContainerActivity.getStorageManager().getAccount(),
mContainerActivity,
- getSherlockActivity()
+ getActivity()
);
mf.filter(menu);
}
mContainerActivity.getFileOperationsHelper().syncFile(getFile());
return true;
}
-
+ case R.id.action_favorite_file:{
+ mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), true);
+ return true;
+ }
+ case R.id.action_unfavorite_file:{
+ mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), false);
+ return true;
+ }
default:
return false;
}
*
* Just starts the playback.
*
- * @param mp {@link MediaPlayer} instance performing the playback.
+ * @param vp {@link MediaPlayer} instance performing the playback.
*/
@Override
public void onPrepared(MediaPlayer vp) {
public boolean onError(MediaPlayer mp, int what, int extra) {
if (mVideoPreview.getWindowToken() != null) {
String message = MediaService.getMessageForMediaError(
- getSherlockActivity(), what, extra);
- new AlertDialog.Builder(getSherlockActivity())
+ getActivity(), what, extra);
+ new AlertDialog.Builder(getActivity())
.setMessage(message)
.setPositiveButton(android.R.string.VideoView_error_button,
new DialogInterface.OnClickListener() {
if (mMediaServiceBinder != null && mMediaController != null) {
mMediaServiceBinder.unregisterMediaController(mMediaController);
}
- getSherlockActivity().unbindService(mMediaServiceConnection);
+ getActivity().unbindService(mMediaServiceConnection);
mMediaServiceConnection = null;
mMediaServiceBinder = null;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && v == mVideoPreview) {
- startFullScreenVideo();
+ // added a margin on the left to avoid interfering with gesture to open navigation drawer
+ if (event.getX() / Resources.getSystem().getDisplayMetrics().density > 24.0) {
+ startFullScreenVideo();
+ }
return true;
}
return false;
private void startFullScreenVideo() {
- Intent i = new Intent(getSherlockActivity(), PreviewVideoActivity.class);
+ Intent i = new Intent(getActivity(), PreviewVideoActivity.class);
i.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
i.putExtra(FileActivity.EXTRA_FILE, getFile());
i.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, mVideoPreview.isPlaying());
if (mMediaServiceConnection == null) {
mMediaServiceConnection = new MediaServiceConnection();
}
- getSherlockActivity().bindService( new Intent(getSherlockActivity(),
+ getActivity().bindService( new Intent(getActivity(),
MediaService.class),
mMediaServiceConnection,
Context.BIND_AUTO_CREATE);
@Override
public void onServiceConnected(ComponentName component, IBinder service) {
- if (getSherlockActivity() != null) {
+ if (getActivity() != null) {
if (component.equals(
- new ComponentName(getSherlockActivity(), MediaService.class))) {
+ new ComponentName(getActivity(), MediaService.class))) {
Log_OC.d(TAG, "Media service connected");
mMediaServiceBinder = (MediaServiceBinder) service;
if (mMediaServiceBinder != null) {
@Override
public void onServiceDisconnected(ComponentName component) {
- if (component.equals(new ComponentName(getSherlockActivity(), MediaService.class))) {
+ if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
Log_OC.e(TAG, "Media service suddenly disconnected");
if (mMediaController != null) {
mMediaController.setMediaPlayer(null);
} else {
Toast.makeText(
- getSherlockActivity(),
+ getActivity(),
"No media controller to release when disconnected from media service",
Toast.LENGTH_SHORT).show();
}
* Finishes the preview
*/
private void finish() {
- getSherlockActivity().onBackPressed();
+ getActivity().onBackPressed();
}