This commit is contained in:
Martin Fietz 2016-01-10 17:17:12 +01:00
parent ee031843ef
commit 937feddafa
4 changed files with 122 additions and 159 deletions

View File

@ -672,12 +672,13 @@ public abstract class MediaplayerActivity extends AppCompatActivity implements O
return; return;
} }
String length;
if (showTimeLeft) { if (showTimeLeft) {
txtvLength.setText("-" + Converter.getDurationStringLong((media length = "-" + Converter.getDurationStringLong(media.getDuration() - media.getPosition());
.getDuration() - media.getPosition())));
} else { } else {
txtvLength.setText(Converter.getDurationStringLong((media.getDuration()))); length = Converter.getDurationStringLong(media.getDuration());
} }
txtvLength.setText(length);
SharedPreferences.Editor editor = prefs.edit(); SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(PREF_SHOW_TIME_LEFT, showTimeLeft); editor.putBoolean(PREF_SHOW_TIME_LEFT, showTimeLeft);
@ -765,8 +766,7 @@ public abstract class MediaplayerActivity extends AppCompatActivity implements O
if (rewindSecs == values[i]) { if (rewindSecs == values[i]) {
checked = i; checked = i;
} }
choices[i] = String.valueOf(values[i]) + " " choices[i] = String.valueOf(values[i]) + " " + getString(R.string.time_seconds);
+ getString(R.string.time_seconds);
} }
choice = values[checked]; choice = values[checked];
AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this); AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this);
@ -807,8 +807,7 @@ public abstract class MediaplayerActivity extends AppCompatActivity implements O
if (rewindSecs == values[i]) { if (rewindSecs == values[i]) {
checked = i; checked = i;
} }
choices[i] = String.valueOf(values[i]) + " " choices[i] = String.valueOf(values[i]) + " " + getString(R.string.time_seconds);
+ getString(R.string.time_seconds);
} }
choice = values[checked]; choice = values[checked];
AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this); AlertDialog.Builder builder = new AlertDialog.Builder(MediaplayerActivity.this);
@ -854,15 +853,13 @@ public abstract class MediaplayerActivity extends AppCompatActivity implements O
float prog; float prog;
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, public void onProgressChanged (SeekBar seekBar,int progress, boolean fromUser) {
boolean fromUser) {
if (controller != null) { if (controller != null) {
prog = controller.onSeekBarProgressChanged(seekBar, progress, fromUser, prog = controller.onSeekBarProgressChanged(seekBar, progress, fromUser, txtvPosition);
txtvPosition);
if (showTimeLeft && prog != 0) { if (showTimeLeft && prog != 0) {
int duration = controller.getDuration(); int duration = controller.getDuration();
txtvLength.setText("-" + Converter String length = "-" + Converter.getDurationStringLong(duration - (int) (prog * duration));
.getDurationStringLong(duration - (int) (prog * duration))); txtvLength.setText(length);
} }
} }
} }

View File

@ -3,9 +3,9 @@ package de.danoeh.antennapod.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.WindowCompat; import android.support.v4.view.WindowCompat;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
@ -19,7 +19,8 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.SeekBar; import android.widget.SeekBar;
import de.danoeh.antennapod.BuildConfig; import java.lang.ref.WeakReference;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.service.playback.PlaybackService;
@ -39,7 +40,8 @@ public class VideoplayerActivity extends MediaplayerActivity {
*/ */
private boolean videoControlsShowing = true; private boolean videoControlsShowing = true;
private boolean videoSurfaceCreated = false; private boolean videoSurfaceCreated = false;
private VideoControlsHider videoControlsToggler;
private VideoControlsHider videoControlsHider = new VideoControlsHider(this);
private LinearLayout videoOverlay; private LinearLayout videoOverlay;
private AspectRatioVideoView videoview; private AspectRatioVideoView videoview;
@ -60,26 +62,13 @@ public class VideoplayerActivity extends MediaplayerActivity {
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(0x80000000)); getSupportActionBar().setBackgroundDrawable(new ColorDrawable(0x80000000));
} }
@Override
protected void onPause() {
super.onPause();
if (videoControlsToggler != null) {
videoControlsToggler.cancel(true);
}
if (controller != null && controller.getStatus() == PlayerStatus.PLAYING) {
controller.pause();
}
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (getIntent().getAction() != null if (getIntent().getAction() != null
&& getIntent().getAction().equals(Intent.ACTION_VIEW)) { && getIntent().getAction().equals(Intent.ACTION_VIEW)) {
Intent intent = getIntent(); Intent intent = getIntent();
if (BuildConfig.DEBUG) Log.d(TAG, "Received VIEW intent: " + intent.getData().getPath());
Log.d(TAG, "Received VIEW intent: "
+ intent.getData().getPath());
ExternalMedia media = new ExternalMedia(intent.getData().getPath(), ExternalMedia media = new ExternalMedia(intent.getData().getPath(),
MediaType.VIDEO); MediaType.VIDEO);
Intent launchIntent = new Intent(this, PlaybackService.class); Intent launchIntent = new Intent(this, PlaybackService.class);
@ -93,6 +82,22 @@ public class VideoplayerActivity extends MediaplayerActivity {
} }
} }
@Override
protected void onPause() {
super.onPause();
videoControlsHider.stop();
if (controller != null && controller.getStatus() == PlayerStatus.PLAYING) {
controller.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
videoControlsHider.stop();
videoControlsHider = null;
}
@Override @Override
protected boolean loadMediaInfo() { protected boolean loadMediaInfo() {
if (!super.loadMediaInfo()) { if (!super.loadMediaInfo()) {
@ -104,7 +109,6 @@ public class VideoplayerActivity extends MediaplayerActivity {
getSupportActionBar().setTitle(media.getFeedTitle()); getSupportActionBar().setTitle(media.getFeedTitle());
return true; return true;
} }
return false; return false;
} }
@ -133,14 +137,11 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
protected void onAwaitingVideoSurface() { protected void onAwaitingVideoSurface() {
if (videoSurfaceCreated) { if (videoSurfaceCreated) {
if (BuildConfig.DEBUG) Log.d(TAG, "Videosurface already created, setting videosurface now");
Log.d(TAG,
"Videosurface already created, setting videosurface now");
Pair<Integer, Integer> videoSize = controller.getVideoSize(); Pair<Integer, Integer> videoSize = controller.getVideoSize();
if (videoSize != null && videoSize.first > 0 && videoSize.second > 0) { if (videoSize != null && videoSize.first > 0 && videoSize.second > 0) {
if (BuildConfig.DEBUG) Log.d(TAG, "Width,height of video: " + videoSize.first + ", " + videoSize.second);
Log.d(TAG, "Width,height of video: " + videoSize.first + ", " + videoSize.second);
videoview.setVideoSize(videoSize.first, videoSize.second); videoview.setVideoSize(videoSize.first, videoSize.second);
} else { } else {
Log.e(TAG, "Could not determine video size"); Log.e(TAG, "Could not determine video size");
@ -156,7 +157,6 @@ public class VideoplayerActivity extends MediaplayerActivity {
} else { } else {
progressIndicator.setVisibility(View.INVISIBLE); progressIndicator.setVisibility(View.INVISIBLE);
} }
} }
@Override @Override
@ -164,38 +164,23 @@ public class VideoplayerActivity extends MediaplayerActivity {
progressIndicator.setVisibility(View.INVISIBLE); progressIndicator.setVisibility(View.INVISIBLE);
} }
View.OnTouchListener onVideoviewTouched = new View.OnTouchListener() { View.OnTouchListener onVideoviewTouched = (v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
@Override videoControlsHider.stop();
public boolean onTouch(View v, MotionEvent event) { toggleVideoControlsVisibility();
if (event.getAction() == MotionEvent.ACTION_DOWN) { if (videoControlsShowing) {
if (videoControlsToggler != null) { setupVideoControlsToggler();
videoControlsToggler.cancel(true);
}
toggleVideoControlsVisibility();
if (videoControlsShowing) {
setupVideoControlsToggler();
}
return true;
} else {
return false;
} }
return true;
} else {
return false;
} }
}; };
@SuppressLint("NewApi") @SuppressLint("NewApi")
void setupVideoControlsToggler() { void setupVideoControlsToggler() {
if (videoControlsToggler != null) { videoControlsHider.stop();
videoControlsToggler.cancel(true); videoControlsHider.start();
}
videoControlsToggler = new VideoControlsHider();
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
videoControlsToggler
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
videoControlsToggler.execute();
}
} }
private void toggleVideoControlsVisibility() { private void toggleVideoControlsVisibility() {
@ -209,46 +194,6 @@ public class VideoplayerActivity extends MediaplayerActivity {
videoControlsShowing = !videoControlsShowing; videoControlsShowing = !videoControlsShowing;
} }
/**
* Hides the videocontrols after a certain period of time.
*/
public class VideoControlsHider extends AsyncTask<Void, Void, Void> {
@Override
protected void onCancelled() {
videoControlsToggler = null;
}
@Override
protected void onPostExecute(Void result) {
videoControlsToggler = null;
}
private static final int WAITING_INTERVALL = 5000;
private static final String TAG = "VideoControlsToggler";
@Override
protected void onProgressUpdate(Void... values) {
if (videoControlsShowing) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Hiding video controls");
getSupportActionBar().hide();
hideVideoControls();
videoControlsShowing = false;
}
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(WAITING_INTERVALL);
} catch (InterruptedException e) {
return null;
}
publishProgress();
return null;
}
}
private final SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() { private final SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() {
@Override @Override
@ -259,15 +204,13 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
if (BuildConfig.DEBUG) Log.d(TAG, "Videoview holder created");
Log.d(TAG, "Videoview holder created");
videoSurfaceCreated = true; videoSurfaceCreated = true;
if (controller.getStatus() == PlayerStatus.PLAYING) { if (controller.getStatus() == PlayerStatus.PLAYING) {
if (controller.serviceAvailable()) { if (controller.serviceAvailable()) {
controller.setVideoSurface(holder); controller.setVideoSurface(holder);
} else { } else {
Log.e(TAG, Log.e(TAG, "Could'nt attach surface to mediaplayer - reference to service was null");
"Could'nt attach surface to mediaplayer - reference to service was null");
} }
} }
@ -275,8 +218,7 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
if (BuildConfig.DEBUG) Log.d(TAG, "Videosurface was destroyed");
Log.d(TAG, "Videosurface was destroyed");
videoSurfaceCreated = false; videoSurfaceCreated = false;
controller.notifyVideoSurfaceAbandoned(); controller.notifyVideoSurfaceAbandoned();
} }
@ -286,9 +228,7 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
protected void onReloadNotification(int notificationCode) { protected void onReloadNotification(int notificationCode) {
if (notificationCode == PlaybackService.EXTRA_CODE_AUDIO) { if (notificationCode == PlaybackService.EXTRA_CODE_AUDIO) {
if (BuildConfig.DEBUG) Log.d(TAG, "ReloadNotification received, switching to Audioplayer now");
Log.d(TAG,
"ReloadNotification received, switching to Audioplayer now");
finish(); finish();
startActivity(new Intent(this, AudioplayerActivity.class)); startActivity(new Intent(this, AudioplayerActivity.class));
} }
@ -297,9 +237,7 @@ public class VideoplayerActivity extends MediaplayerActivity {
@Override @Override
public void onStartTrackingTouch(SeekBar seekBar) { public void onStartTrackingTouch(SeekBar seekBar) {
super.onStartTrackingTouch(seekBar); super.onStartTrackingTouch(seekBar);
if (videoControlsToggler != null) { videoControlsHider.stop();
videoControlsToggler.cancel(true);
}
} }
@Override @Override
@ -356,7 +294,6 @@ public class VideoplayerActivity extends MediaplayerActivity {
return R.layout.videoplayer_activity; return R.layout.videoplayer_activity;
} }
@Override @Override
protected void setScreenOn(boolean enable) { protected void setScreenOn(boolean enable) {
super.setScreenOn(enable); super.setScreenOn(enable);
@ -366,4 +303,38 @@ public class VideoplayerActivity extends MediaplayerActivity {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} }
} }
private static class VideoControlsHider extends Handler {
private static final int DELAY = 5000;
private WeakReference<VideoplayerActivity> activity;
public VideoControlsHider(VideoplayerActivity activity) {
this.activity = new WeakReference<>(activity);
}
private final Runnable hideVideoControls = () -> {
VideoplayerActivity vpa = activity.get();
if(vpa == null) {
return;
}
if (vpa.videoControlsShowing) {
Log.d(TAG, "Hiding video controls");
vpa.getSupportActionBar().hide();
vpa.hideVideoControls();
vpa.videoControlsShowing = false;
}
};
public void start() {
this.postDelayed(hideVideoControls, DELAY);
}
public void stop() {
this.removeCallbacks(hideVideoControls);
}
}
} }

View File

@ -77,7 +77,9 @@
android:layout_toLeftOf="@+id/txtvLength" android:layout_toLeftOf="@+id/txtvLength"
android:layout_toRightOf="@+id/txtvPosition" android:layout_toRightOf="@+id/txtvPosition"
android:max="500" /> android:max="500" />
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -18,7 +18,6 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.SeekBar; import android.widget.SeekBar;
@ -78,18 +77,18 @@ public abstract class PlaybackController {
this.activity = activity; this.activity = activity;
this.reinitOnPause = reinitOnPause; this.reinitOnPause = reinitOnPause;
schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOLSIZE, schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOLSIZE,
r -> { r -> {
Thread t = new Thread(r); Thread t = new Thread(r);
t.setPriority(Thread.MIN_PRIORITY); t.setPriority(Thread.MIN_PRIORITY);
return t; return t;
}, new RejectedExecutionHandler() { }, new RejectedExecutionHandler() {
@Override @Override
public void rejectedExecution(Runnable r, public void rejectedExecution(Runnable r,
ThreadPoolExecutor executor) { ThreadPoolExecutor executor) {
Log.w(TAG, Log.w(TAG,
"Rejected execution of runnable in schedExecutor"); "Rejected execution of runnable in schedExecutor");
}
} }
}
); );
} }
@ -415,7 +414,6 @@ public abstract class PlaybackController {
Log.d(TAG, "status: " + status.toString()); Log.d(TAG, "status: " + status.toString());
switch (status) { switch (status) {
case ERROR: case ERROR:
postStatusMsg(R.string.player_error_msg); postStatusMsg(R.string.player_error_msg);
handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN); handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN);
@ -575,37 +573,32 @@ public abstract class PlaybackController {
} }
public OnClickListener newOnPlayButtonClickListener() { public OnClickListener newOnPlayButtonClickListener() {
return new OnClickListener() { return v -> {
@Override if (playbackService == null) {
public void onClick(View v) { Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!");
if (playbackService != null) { return;
switch (status) { }
case PLAYING: switch (status) {
playbackService.pause(true, reinitOnPause); case PLAYING:
break; playbackService.pause(true, reinitOnPause);
case PAUSED: break;
case PREPARED: case PAUSED:
playbackService.resume(); case PREPARED:
break; playbackService.resume();
case PREPARING: break;
playbackService.setStartWhenPrepared(!playbackService case PREPARING:
.isStartWhenPrepared()); playbackService.setStartWhenPrepared(!playbackService
if (reinitOnPause .isStartWhenPrepared());
&& playbackService.isStartWhenPrepared() == false) { if (reinitOnPause
playbackService.reinit(); && playbackService.isStartWhenPrepared() == false) {
} playbackService.reinit();
break; }
case INITIALIZED: break;
playbackService.setStartWhenPrepared(true); case INITIALIZED:
playbackService.prepare(); playbackService.setStartWhenPrepared(true);
break; playbackService.prepare();
} break;
} else {
Log.w(TAG,
"Play/Pause button was pressed, but playbackservice was null!");
}
} }
}; };
} }