projects
/
pub
/
Android
/
ownCloud.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #1048 from owncloud/shareWithYou_icon_in_fileList
[pub/Android/ownCloud.git]
/
src
/
com
/
owncloud
/
android
/
media
/
MediaService.java
diff --git
a/src/com/owncloud/android/media/MediaService.java
b/src/com/owncloud/android/media/MediaService.java
index
30558cd
..
e53c635
100644
(file)
--- a/
src/com/owncloud/android/media/MediaService.java
+++ b/
src/com/owncloud/android/media/MediaService.java
@@
-1,10
+1,12
@@
-/* ownCloud Android client application
- * Copyright 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
*
* This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * 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
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@
-34,25
+36,22
@@
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.IBinder;
import android.os.PowerManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.IBinder;
import android.os.PowerManager;
-import android.util.Log;
-import android.widget.MediaController;
import android.widget.Toast;
import java.io.IOException;
import android.widget.Toast;
import java.io.IOException;
-import com.owncloud.android.AccountUtils;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.ui.activity.FileDetailActivity;
-import com.owncloud.android.ui.fragment.FileDetailFragment;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
+
/**
* Service that handles media playback, both audio and video.
*
* Waits for Intents which signal the service to perform specific operations: Play, Pause,
* Rewind, etc.
/**
* Service that handles media playback, both audio and video.
*
* Waits for Intents which signal the service to perform specific operations: Play, Pause,
* Rewind, etc.
- *
- * @author David A. Velasco
*/
public class MediaService extends Service implements OnCompletionListener, OnPreparedListener,
OnErrorListener, AudioManager.OnAudioFocusChangeListener {
*/
public class MediaService extends Service implements OnCompletionListener, OnPreparedListener,
OnErrorListener, AudioManager.OnAudioFocusChangeListener {
@@
-62,17
+61,24
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
private static final String MY_PACKAGE = MediaService.class.getPackage() != null ? MediaService.class.getPackage().getName() : "com.owncloud.android.media";
/// Intent actions that we are prepared to handle
private static final String MY_PACKAGE = MediaService.class.getPackage() != null ? MediaService.class.getPackage().getName() : "com.owncloud.android.media";
/// Intent actions that we are prepared to handle
- public static final String ACTION_PLAY_FILE = MY_PACKAGE + ".android.media.action.PLAY_FILE";
+ public static final String ACTION_PLAY_FILE = MY_PACKAGE + ".action.PLAY_FILE";
+ public static final String ACTION_STOP_ALL = MY_PACKAGE + ".action.STOP_ALL";
/// Keys to add extras to the action
public static final String EXTRA_FILE = MY_PACKAGE + ".extra.FILE";
public static final String EXTRA_ACCOUNT = MY_PACKAGE + ".extra.ACCOUNT";
/// Keys to add extras to the action
public static final String EXTRA_FILE = MY_PACKAGE + ".extra.FILE";
public static final String EXTRA_ACCOUNT = MY_PACKAGE + ".extra.ACCOUNT";
+ public static String EXTRA_START_POSITION = MY_PACKAGE + ".extra.START_POSITION";
+ public static final String EXTRA_PLAY_ON_LOAD = MY_PACKAGE + ".extra.PLAY_ON_LOAD";
+
/** Error code for specific messages - see regular error codes at {@link MediaPlayer} */
public static final int OC_MEDIA_ERROR = 0;
/** Time To keep the control panel visible when the user does not use it */
/** Error code for specific messages - see regular error codes at {@link MediaPlayer} */
public static final int OC_MEDIA_ERROR = 0;
/** Time To keep the control panel visible when the user does not use it */
- public static final int MEDIA_CONTROL_LIFE = 5000;
+ public static final int MEDIA_CONTROL_SHORT_LIFE = 4000;
+
+ /** Time To keep the control panel visible when the user does not use it */
+ public static final int MEDIA_CONTROL_PERMANENT = 0;
/** Volume to set when audio focus is lost and ducking is allowed */
private static final float DUCK_VOLUME = 0.1f;
/** Volume to set when audio focus is lost and ducking is allowed */
private static final float DUCK_VOLUME = 0.1f;
@@
-125,11
+131,17
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
/** Account holding the file being played */
private Account mAccount;
/** Account holding the file being played */
private Account mAccount;
+ /** Flag signaling if the audio should be played immediately when the file is prepared */
+ protected boolean mPlayOnPrepared;
+
+ /** Position, in miliseconds, where the audio should be started */
+ private int mStartPosition;
+
/** Interface to access the service through binding */
private IBinder mBinder;
/** Control panel shown to the user to control the playback, to register through binding */
/** Interface to access the service through binding */
private IBinder mBinder;
/** Control panel shown to the user to control the playback, to register through binding */
- private MediaControl
ler
mMediaController;
+ private MediaControl
View
mMediaController;
@@
-207,7
+219,8
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
*/
@Override
public void onCreate() {
*/
@Override
public void onCreate() {
- Log.d(TAG, "Creating ownCloud media service");
+ super.onCreate();
+ Log_OC.d(TAG, "Creating ownCloud media service");
mWifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)).
createWifiLock(WifiManager.WIFI_MODE_FULL, MEDIA_WIFI_LOCK_TAG);
mWifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)).
createWifiLock(WifiManager.WIFI_MODE_FULL, MEDIA_WIFI_LOCK_TAG);
@@
-228,6
+241,9
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
String action = intent.getAction();
if (action.equals(ACTION_PLAY_FILE)) {
processPlayFileRequest(intent);
String action = intent.getAction();
if (action.equals(ACTION_PLAY_FILE)) {
processPlayFileRequest(intent);
+
+ } else if (action.equals(ACTION_STOP_ALL)) {
+ processStopRequest(true);
}
return START_NOT_STICKY; // don't want it to restart in case it's killed.
}
return START_NOT_STICKY; // don't want it to restart in case it's killed.
@@
-245,6
+261,8
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
if (mState != State.PREPARING) {
mFile = intent.getExtras().getParcelable(EXTRA_FILE);
mAccount = intent.getExtras().getParcelable(EXTRA_ACCOUNT);
if (mState != State.PREPARING) {
mFile = intent.getExtras().getParcelable(EXTRA_FILE);
mAccount = intent.getExtras().getParcelable(EXTRA_ACCOUNT);
+ mPlayOnPrepared = intent.getExtras().getBoolean(EXTRA_PLAY_ON_LOAD, false);
+ mStartPosition = intent.getExtras().getInt(EXTRA_START_POSITION, 0);
tryToGetAudioFocus();
playMedia();
}
tryToGetAudioFocus();
playMedia();
}
@@
-275,7
+293,7
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
/**
* Makes sure the media player exists and has been reset. This will create the media player
/**
* Makes sure the media player exists and has been reset. This will create the media player
- * if needed
, or
reset the existing media player if one already exists.
+ * if needed
.
reset the existing media player if one already exists.
*/
protected void createMediaPlayerIfNeeded() {
if (mPlayer == null) {
*/
protected void createMediaPlayerIfNeeded() {
if (mPlayer == null) {
@@
-450,22
+468,22
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
}
} catch (SecurityException e) {
}
} catch (SecurityException e) {
- Log.e(TAG, "SecurityException playing " + mAccount.name + mFile.getRemotePath(), e);
+ Log
_OC
.e(TAG, "SecurityException playing " + mAccount.name + mFile.getRemotePath(), e);
Toast.makeText(this, String.format(getString(R.string.media_err_security_ex), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IOException e) {
Toast.makeText(this, String.format(getString(R.string.media_err_security_ex), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IOException e) {
- Log.e(TAG, "IOException playing " + mAccount.name + mFile.getRemotePath(), e);
+ Log
_OC
.e(TAG, "IOException playing " + mAccount.name + mFile.getRemotePath(), e);
Toast.makeText(this, String.format(getString(R.string.media_err_io_ex), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IllegalStateException e) {
Toast.makeText(this, String.format(getString(R.string.media_err_io_ex), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IllegalStateException e) {
- Log.e(TAG, "IllegalStateException " + mAccount.name + mFile.getRemotePath(), e);
+ Log
_OC
.e(TAG, "IllegalStateException " + mAccount.name + mFile.getRemotePath(), e);
Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IllegalArgumentException e) {
Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
} catch (IllegalArgumentException e) {
- Log.e(TAG, "IllegalArgumentException " + mAccount.name + mFile.getRemotePath(), e);
+ Log
_OC
.e(TAG, "IllegalArgumentException " + mAccount.name + mFile.getRemotePath(), e);
Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
}
Toast.makeText(this, String.format(getString(R.string.media_err_unexpected), mFile.getFileName()), Toast.LENGTH_LONG).show();
processStopRequest(true);
}
@@
-474,11
+492,16
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
/** Called when media player is done playing current song. */
public void onCompletion(MediaPlayer player) {
/** Called when media player is done playing current song. */
public void onCompletion(MediaPlayer player) {
+ Toast.makeText(this, String.format(getString(R.string.media_event_done, mFile.getFileName())), Toast.LENGTH_LONG).show();
if (mMediaController != null) {
if (mMediaController != null) {
- mMediaController.hide();
+ // somebody is still bound to the service
+ player.seekTo(0);
+ processPauseRequest();
+ mMediaController.updatePausePlay();
+ } else {
+ // nobody is bound
+ processStopRequest(true);
}
}
- Toast.makeText(this, String.format(getString(R.string.media_event_done, mFile.getFileName())), Toast.LENGTH_LONG).show();
- processStopRequest(true);
return;
}
return;
}
@@
-494,9
+517,14
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
if (mMediaController != null) {
mMediaController.setEnabled(true);
}
if (mMediaController != null) {
mMediaController.setEnabled(true);
}
+ player.seekTo(mStartPosition);
configAndStartMediaPlayer();
configAndStartMediaPlayer();
+ if (!mPlayOnPrepared) {
+ processPauseRequest();
+ }
+
if (mMediaController != null) {
if (mMediaController != null) {
- mMediaController.
show(MEDIA_CONTROL_LIFE
);
+ mMediaController.
updatePausePlay(
);
}
}
}
}
@@
-507,9
+535,9
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
@SuppressWarnings("deprecation")
private void updateNotification(String content) {
// TODO check if updating the Intent is really necessary
@SuppressWarnings("deprecation")
private void updateNotification(String content) {
// TODO check if updating the Intent is really necessary
- Intent showDetailsIntent = new Intent(this, FileD
etail
Activity.class);
- showDetailsIntent.putExtra(File
DetailFragment
.EXTRA_FILE, mFile);
- showDetailsIntent.putExtra(File
DetailFragment
.EXTRA_ACCOUNT, mAccount);
+ Intent showDetailsIntent = new Intent(this, FileD
isplay
Activity.class);
+ showDetailsIntent.putExtra(File
Activity
.EXTRA_FILE, mFile);
+ showDetailsIntent.putExtra(File
Activity
.EXTRA_ACCOUNT, mAccount);
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
@@
-544,9
+572,9
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
/// includes a pending intent in the notification showing the details view of the file
/// includes a pending intent in the notification showing the details view of the file
- Intent showDetailsIntent = new Intent(this, FileD
etail
Activity.class);
- showDetailsIntent.putExtra(File
DetailFragment
.EXTRA_FILE, mFile);
- showDetailsIntent.putExtra(File
DetailFragment
.EXTRA_ACCOUNT, mAccount);
+ Intent showDetailsIntent = new Intent(this, FileD
isplay
Activity.class);
+ showDetailsIntent.putExtra(File
Activity
.EXTRA_FILE, mFile);
+ showDetailsIntent.putExtra(File
Activity
.EXTRA_ACCOUNT, mAccount);
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
(int)System.currentTimeMillis(),
@@
-567,12
+595,8
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
* Warns the user about the error and resets the media player.
*/
public boolean onError(MediaPlayer mp, int what, int extra) {
* Warns the user about the error and resets the media player.
*/
public boolean onError(MediaPlayer mp, int what, int extra) {
- Log.e(TAG, "Error in audio playback, what = " + what + ", extra = " + extra);
+ Log
_OC
.e(TAG, "Error in audio playback, what = " + what + ", extra = " + extra);
- if (mMediaController != null) {
- mMediaController.hide();
- }
-
String message = getMessageForMediaError(this, what, extra);
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
String message = getMessageForMediaError(this, what, extra);
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
@@
-615,6
+639,7
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
mState = State.STOPPED;
releaseResources(true);
giveUpAudioFocus();
mState = State.STOPPED;
releaseResources(true);
giveUpAudioFocus();
+ super.onDestroy();
}
}
@@
-673,15
+698,11
@@
public class MediaService extends Service implements OnCompletionListener, OnPre
}
}
- protected void setMediaContoller(MediaController mediaController) {
- if (mMediaController != null) {
- mMediaController.hide();
- }
+ protected void setMediaContoller(MediaControlView mediaController) {
mMediaController = mediaController;
mMediaController = mediaController;
-
}
}
- protected MediaControl
ler
getMediaController() {
+ protected MediaControl
View
getMediaController() {
return mMediaController;
}
return mMediaController;
}