Skip to content

Commit

Permalink
Improved the fast forward and rewind function in the Android TV (#247)
Browse files Browse the repository at this point in the history
Moved the fragments to the FragmentBuilders to util.Fragments

Fixed some performace issues and added subtitles support using the libvlc.
  • Loading branch information
octacode authored and cpg committed Jul 22, 2017
1 parent 4dce959 commit defc83e
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

package org.amahi.anywhere.tv.fragment;

import android.app.Fragment;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
Expand Down Expand Up @@ -61,6 +60,7 @@
import org.amahi.anywhere.task.AudioMetadataRetrievingTask;
import org.amahi.anywhere.tv.presenter.AudioDetailsDescriptionPresenter;
import org.amahi.anywhere.tv.presenter.MainTVPresenter;
import org.amahi.anywhere.util.Fragments;
import org.amahi.anywhere.util.Intents;
import org.amahi.anywhere.util.Mimes;

Expand All @@ -73,33 +73,45 @@ public class TvPlaybackAudioFragment extends PlaybackFragment {

private static final int DEFAULT_UPDATE_PERIOD = 1000;
private static final int UPDATE_PERIOD = 16;
@Inject
ServerClient serverClient;

private ArrayObjectAdapter mRowsAdapter;
private PlaybackControlsRow mPlaybackControlsRow;
private ArrayObjectAdapter mPrimaryActionsAdapter;

private PlaybackControlsRow mPlaybackControlsRow;
private PlaybackControlsRow.PlayPauseAction mPlayPauseAction;
private PlaybackControlsRow.SkipNextAction mSkipNextAction;
private PlaybackControlsRow.SkipPreviousAction mSkipPreviousAction;
private PlaybackControlsRow.FastForwardAction mFastForwardAction;
private PlaybackControlsRow.RewindAction mRewindAction;
private int mCurrentPlaybackState;

private int mCurrentPlaybackState;
private Handler mHandler;
private Runnable mRunnable;

private MediaPlayer mediaPlayer;
private ArrayList<ServerFile> mAudioList;

@Inject
ServerClient serverClient;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setFadingEnabled(false);

setBackgroundType(BG_DARK);

setUpInjections();

mHandler = new Handler(Looper.getMainLooper());

setUpRows();

getAllAudioFiles();

AudioMetadataRetrievingTask.execute(getFileUri(), getAudioFile());

mediaPlayer = new MediaPlayer();

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
Expand All @@ -111,17 +123,10 @@ public void onCompletion(MediaPlayer mp) {

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

try {
mediaPlayer.setDataSource(getActivity(), getFileUri());
} catch (IOException e) {
e.printStackTrace();
}
setDataSource();

prepareAudio();

try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();

setOnItemViewClickedListener(new OnItemViewClickedListener() {
Expand All @@ -135,24 +140,14 @@ public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, RowP
});
}

private void replaceFragment(ServerFile serverFile) {
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, buildAudioFragment(serverFile)).commit();
}

private Fragment buildAudioFragment(ServerFile serverFile) {
Fragment fragment = new TvPlaybackAudioFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE, getAudioShare());
bundle.putParcelable(Intents.Extras.SERVER_FILE, serverFile);
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES, getAudioFiles());
fragment.setArguments(bundle);
return fragment;
}

private void setUpInjections() {
AmahiApplication.from(getActivity()).inject(this);
}

private void replaceFragment(ServerFile serverFile) {
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, Fragments.Builder.buildAudioFragment(serverFile,getAudioShare(),getAudioFiles())).commit();
}

private void setUpRows() {
ClassPresenterSelector ps = new ClassPresenterSelector();
PlaybackControlsRowPresenter playbackControlsRowPresenter = new PlaybackControlsRowPresenter(new AudioDetailsDescriptionPresenter(getActivity()));
Expand Down Expand Up @@ -185,6 +180,22 @@ public void onActionClicked(Action action) {
setAdapter(mRowsAdapter);
}

private void setDataSource(){
try {
mediaPlayer.setDataSource(getActivity(), getFileUri());
} catch (IOException e) {
e.printStackTrace();
}
}

private void prepareAudio(){
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void togglePlayPause(boolean isPaused) {
if (isPaused) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

package org.amahi.anywhere.tv.fragment;

import android.app.Fragment;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.media.session.PlaybackState;
Expand Down Expand Up @@ -55,6 +54,7 @@
import org.amahi.anywhere.server.model.ServerShare;
import org.amahi.anywhere.tv.presenter.MainTVPresenter;
import org.amahi.anywhere.tv.presenter.VideoDetailsDescriptionPresenter;
import org.amahi.anywhere.util.Fragments;
import org.amahi.anywhere.util.Intents;
import org.amahi.anywhere.util.Mimes;
import org.videolan.libvlc.IVLCVout;
Expand All @@ -73,37 +73,54 @@ public class TvPlaybackVideoFragment extends PlaybackFragment {

private static final int DEFAULT_UPDATE_PERIOD = 1000;
private static final int UPDATE_PERIOD = 16;
@Inject
ServerClient serverClient;

private SurfaceHolder mSurfaceHolder;
private MediaPlayer mediaPlayer;
private LibVLC mLibVlc;

private Handler mHandler;
private Runnable mRunnable;

private PlaybackControlsRow mPlaybackControlsRow;

private int mCurrentPlaybackState;
private int mDuration;

private ArrayList<ServerFile> mVideoList;

private ArrayObjectAdapter mRowsAdapter;
private ArrayObjectAdapter mPrimaryActionsAdapter;

private PlaybackControlsRow.SkipPreviousAction mSkipPreviousAction;
private PlaybackControlsRow.PlayPauseAction mPlayPauseAction;
private PlaybackControlsRow.FastForwardAction mFastForwardAction;
private PlaybackControlsRow.RewindAction mRewindAction;
private PlaybackControlsRow.SkipNextAction mSkipNextAction;

@Inject
ServerClient serverClient;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpInjections();

setAllVideoFiles();

setDuration();

playVideo();

setBackgroundType(BG_DARK);

setFadingEnabled(false);

mHandler = new Handler(Looper.getMainLooper());

setUpRows();

addOtherRows();

mediaPlayer.setEventListener(new MediaPlayer.EventListener() {
@Override
public void onEvent(MediaPlayer.Event event) {
Expand Down Expand Up @@ -138,17 +155,7 @@ private ArrayList<ServerFile> setAllVideoFiles() {
}

private void replaceFragment(ServerFile serverFile) {
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, buildVideoFragment(serverFile)).commit();
}

private Fragment buildVideoFragment(ServerFile serverFile) {
Fragment fragment = new TvPlaybackVideoFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE, getVideoShare());
bundle.putParcelable(Intents.Extras.SERVER_FILE, serverFile);
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES, getVideoFiles());
fragment.setArguments(bundle);
return fragment;
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, Fragments.Builder.buildVideoFragment(serverFile,getVideoShare(),getVideoFiles())).commit();
}

private boolean isVideo(ServerFile serverFile) {
Expand Down Expand Up @@ -205,14 +212,21 @@ private void manageLayout(IVLCVout vlcVout) {

private void setUpRows() {
ClassPresenterSelector ps = new ClassPresenterSelector();

PlaybackControlsRowPresenter playbackControlsRowPresenter = new PlaybackControlsRowPresenter(new VideoDetailsDescriptionPresenter(getActivity()));

ps.addClassPresenter(PlaybackControlsRow.class, playbackControlsRowPresenter);
ps.addClassPresenter(ListRow.class, new ListRowPresenter());

mRowsAdapter = new ArrayObjectAdapter(ps);

addPlaybackControlsRow();

playbackControlsRowPresenter.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.primary));
playbackControlsRowPresenter.setProgressColor(Color.WHITE);

mPlaybackControlsRow.setTotalTime(mDuration);

playbackControlsRowPresenter.setOnActionClickedListener(new OnActionClickedListener() {
@Override
public void onActionClicked(Action action) {
Expand All @@ -237,16 +251,21 @@ public void onActionClicked(Action action) {

private void addOtherRows(){
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new MainTVPresenter(getActivity(), serverClient, getVideoShare()));
for(ServerFile serverFile:mVideoList){
adapter.add(serverFile);
}

for(ServerFile serverFile:mVideoList) adapter.add(serverFile);

mRowsAdapter.add(new ListRow(getHeader(),adapter));
}

private HeaderItem getHeader(){
HeaderItem headerItem;

if(getVideoFile().getParentFile()==null)
headerItem = new HeaderItem("Video(s) in "+getVideoShare().getName());
else
headerItem = new HeaderItem("Video(s) in "+getVideoFile().getParentFile().getName());

mRowsAdapter.add(new ListRow(headerItem,adapter));
return headerItem;
}

private void togglePlayPause(boolean isPaused) {
Expand All @@ -259,15 +278,15 @@ private void togglePlayPause(boolean isPaused) {
}

private void rewind() {
if (mediaPlayer.getTime() - (10 * 1000) > 0) {
mediaPlayer.setTime(mediaPlayer.getTime() - (10 * 1000));
if(mPlaybackControlsRow.getCurrentTime() - (10*1000)>0){
mediaPlayer.setTime(mPlaybackControlsRow.getCurrentTime() - (10 * 1000));
mPlaybackControlsRow.setCurrentTime((int) mediaPlayer.getTime());
}
}

private void fastForward() {
if (mediaPlayer.getTime() + (10 * 1000) < mDuration) {
mediaPlayer.setTime(mediaPlayer.getTime() + (10 * 1000));
if (mPlaybackControlsRow.getCurrentTime() + (10 * 1000) < mDuration) {
mediaPlayer.setTime(mPlaybackControlsRow.getCurrentTime() + (10 * 1000));
mPlaybackControlsRow.setCurrentTime((int) mediaPlayer.getTime());
}
}
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/org/amahi/anywhere/util/Fragments.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@
import org.amahi.anywhere.server.model.ServerFile;
import org.amahi.anywhere.server.model.ServerShare;
import org.amahi.anywhere.tv.fragment.ServerFileTvFragment;
import org.amahi.anywhere.tv.fragment.TvPlaybackAudioFragment;
import org.amahi.anywhere.tv.fragment.TvPlaybackVideoFragment;

import java.util.ArrayList;

/**
* Fragments accessor. Provides a factory for building fragments and an operator for placing them.
Expand Down Expand Up @@ -87,6 +91,26 @@ public static Fragment buildServerFileImageFragment(ServerShare share, ServerFil
return fileFragment;
}

public static android.app.Fragment buildVideoFragment(ServerFile serverFile, ServerShare serverShare, ArrayList<ServerFile> serverFiles) {
android.app.Fragment fragment = new TvPlaybackVideoFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE, serverShare);
bundle.putParcelable(Intents.Extras.SERVER_FILE, serverFile);
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES, serverFiles);
fragment.setArguments(bundle);
return fragment;
}

public static android.app.Fragment buildAudioFragment(ServerFile serverFile, ServerShare serverShare, ArrayList<ServerFile> serverFiles) {
android.app.Fragment fragment = new TvPlaybackAudioFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE, serverShare);
bundle.putParcelable(Intents.Extras.SERVER_FILE, serverFile);
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES, serverFiles);
fragment.setArguments(bundle);
return fragment;
}

}

public static final class Operator {
Expand Down

0 comments on commit defc83e

Please sign in to comment.