1 /* ownCloud Android client application
2 * Copyright (C) 2012-2013 ownCloud Inc.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 package com
.owncloud
.android
.ui
.activity
;
21 import android
.accounts
.Account
;
22 import android
.app
.Activity
;
23 import android
.app
.AlertDialog
;
24 import android
.content
.DialogInterface
;
25 import android
.content
.Intent
;
26 import android
.media
.MediaPlayer
;
27 import android
.media
.MediaPlayer
.OnCompletionListener
;
28 import android
.media
.MediaPlayer
.OnErrorListener
;
29 import android
.media
.MediaPlayer
.OnPreparedListener
;
30 import android
.net
.Uri
;
31 import android
.os
.Bundle
;
32 import android
.util
.Log
;
33 import android
.view
.MotionEvent
;
34 import android
.widget
.MediaController
;
35 import android
.widget
.VideoView
;
37 import com
.owncloud
.android
.AccountUtils
;
38 import com
.owncloud
.android
.R
;
39 import com
.owncloud
.android
.datamodel
.OCFile
;
40 import com
.owncloud
.android
.media
.MediaService
;
43 * Activity implementing a basic video player.
45 * Used as an utility to preview video files contained in an ownCloud account.
47 * Currently, it always plays in landscape mode, full screen. When the playback ends,
48 * the activity is finished.
50 * @author David A. Velasco
52 public class VideoActivity
extends Activity
implements OnCompletionListener
, OnPreparedListener
, OnErrorListener
{
54 /** Key to receive an {@link OCFile} to play as an extra value in an {@link Intent} */
55 public static final String EXTRA_FILE
= "FILE";
56 /** Key to receive the ownCloud {@link Account} where the file to play is saved as an extra value in an {@link Intent} */
57 public static final String EXTRA_ACCOUNT
= "ACCOUNT";
59 private static final String TAG
= null
;
61 private OCFile mFile
; // video file to play
62 private Account mAccount
; // ownCloud account holding mFile
63 private VideoView mVideoPlayer
; // view to play the file; both performs and show the playback
64 private MediaController mMediaController
; // panel control used by the user to control the playback
67 * Called when the activity is first created.
69 * Searches for an {@link OCFile} and ownCloud {@link Account} holding it in the starting {@link Intent}.
71 * The {@link Account} is unnecessary if the file is downloaded; else, the {@link Account} is used to
72 * try to stream the remote file - TODO get the streaming works
77 public void onCreate(Bundle savedInstanceState
) {
78 super.onCreate(savedInstanceState
);
80 setContentView(R
.layout
.video_layout
);
82 mFile
= getIntent().getExtras().getParcelable(EXTRA_FILE
);
83 mAccount
= getIntent().getExtras().getParcelable(EXTRA_ACCOUNT
);
85 mVideoPlayer
= (VideoView
) findViewById(R
.id
.videoPlayer
);
87 // set listeners to get more contol on the playback
88 mVideoPlayer
.setOnPreparedListener(this);
89 mVideoPlayer
.setOnCompletionListener(this);
90 mVideoPlayer
.setOnErrorListener(this);
92 // keep the screen on while the playback is performed (prevents screen off by battery save)
93 mVideoPlayer
.setKeepScreenOn(true
);
97 mVideoPlayer
.setVideoPath(mFile
.getStoragePath());
99 } else if (mAccount
!= null
) {
100 String url
= AccountUtils
.constructFullURLForAccount(this, mAccount
) + mFile
.getRemotePath();
101 mVideoPlayer
.setVideoURI(Uri
.parse(url
));
104 onError(null
, MediaService
.OC_MEDIA_ERROR
, R
.string
.media_err_no_account
);
107 // create and prepare control panel for the user
108 mMediaController
= new MediaController(this);
109 mMediaController
.setMediaPlayer(mVideoPlayer
);
110 mMediaController
.setAnchorView(mVideoPlayer
);
111 mVideoPlayer
.setMediaController(mMediaController
);
114 onError(null
, MediaService
.OC_MEDIA_ERROR
, R
.string
.media_err_nothing_to_play
);
120 * Called when the file is ready to be played.
122 * Just starts the playback.
124 * @param mp {@link MediaPlayer} instance performing the playback.
127 public void onPrepared(MediaPlayer vp
) {
128 mVideoPlayer
.start();
129 mMediaController
.show(5000);
134 * Called when the file is finished playing.
136 * Finishes the activity.
138 * @param mp {@link MediaPlayer} instance performing the playback.
141 public void onCompletion(MediaPlayer mp
) {
147 * Called when an error in playback occurs.
149 * @param mp {@link MediaPlayer} instance performing the playback.
150 * @param what Type of error
151 * @param extra Extra code specific to the error
154 public boolean onError(MediaPlayer mp
, int what
, int extra
) {
155 Log
.e(TAG
, "Error in video playback, what = " + what
+ ", extra = " + extra
);
157 if (mMediaController
!= null
) {
158 mMediaController
.hide();
161 if (mVideoPlayer
.getWindowToken() != null
) {
162 String message
= MediaService
.getMessageForMediaError(this, what
, extra
);
163 new AlertDialog
.Builder(this)
165 .setPositiveButton(android
.R
.string
.VideoView_error_button
,
166 new DialogInterface
.OnClickListener() {
167 public void onClick(DialogInterface dialog
, int whichButton
) {
168 VideoActivity
.this.onCompletion(null
);
171 .setCancelable(false
)
179 * Screen touches trigger the appearance of the control panel for a limited time.
184 public boolean onTouchEvent (MotionEvent ev
){
185 if (ev
.getAction() == MotionEvent
.ACTION_DOWN
) {
186 mMediaController
.show(MediaService
.MEDIA_CONTROL_SHORT_LIFE
);