X-Git-Url: https://git.mdrn.pl/wl-app.git/blobdiff_plain/48b2fe9f7c2dc3d9aeaaa6dbfb27c7da4f3235ff..269195b3729c1bdc22e9053ee4ebca667ea8549d:/Android/app/src/main/java/com/moiseum/wolnelektury/view/player/PlayerFragment.java diff --git a/Android/app/src/main/java/com/moiseum/wolnelektury/view/player/PlayerFragment.java b/Android/app/src/main/java/com/moiseum/wolnelektury/view/player/PlayerFragment.java new file mode 100644 index 0000000..ca92d2c --- /dev/null +++ b/Android/app/src/main/java/com/moiseum/wolnelektury/view/player/PlayerFragment.java @@ -0,0 +1,243 @@ +package com.moiseum.wolnelektury.view.player; + +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; +import android.view.View; +import android.widget.ImageButton; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.moiseum.wolnelektury.R; +import com.moiseum.wolnelektury.base.mvp.PresenterFragment; +import com.moiseum.wolnelektury.connection.models.BookDetailsModel; +import com.moiseum.wolnelektury.utils.StringUtils; +import com.moiseum.wolnelektury.view.player.header.PlayerHeaderFragment; +import com.moiseum.wolnelektury.view.player.playlist.PlayerPlaylistFragment; + +import org.parceler.Parcels; + +import butterknife.BindView; +import butterknife.OnClick; + +import static com.moiseum.wolnelektury.view.player.PlayerActivity.PlayerIntent.BOOK_KEY; +import static com.moiseum.wolnelektury.view.player.PlayerActivity.PlayerIntent.BOOK_SLUG_KEY; + + +/** + * Created by Piotr Ostrowski on 22.05.2018. + */ +public class PlayerFragment extends PresenterFragment implements PlayerView { + + private static final String TAG = PlayerFragment.class.getSimpleName(); + private AlertDialog errorDialog; + + public static PlayerFragment newInstance(BookDetailsModel book, String slug) { + PlayerFragment playerFragment = new PlayerFragment(); + Bundle args = new Bundle(); + args.putParcelable(BOOK_KEY, Parcels.wrap(book)); + args.putString(BOOK_SLUG_KEY, slug); + playerFragment.setArguments(args); + return playerFragment; + } + + private static final String HEADER_FRAGMENT_TAG = "HeaderFragmentTag"; + private static final String LIST_FRAGMENT_TAG = "ListFragmentTag"; + + int userSelectedPosition = 0; + private boolean mUserIsSeeking = false; + + private PlayerHeaderFragment headerFragment; + private PlayerPlaylistFragment playlistFragment; + + private SeekBar.OnSeekBarChangeListener listener = new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + tvCurrentProgress.setText(getPresenter().getCurrentTimerText(progress)); + if (fromUser) { + userSelectedPosition = progress; + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + mUserIsSeeking = true; + getPresenter().playOrPause(true); + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + mUserIsSeeking = false; + getPresenter().seekTo(userSelectedPosition); + getPresenter().playOrPause(false); + } + }; + + @BindView(R.id.sbPlayerProgress) + SeekBar sbPlayerProgress; + @BindView(R.id.tvCurrentProgress) + TextView tvCurrentProgress; + @BindView(R.id.tvTotalProgress) + TextView tvTotalProgress; + @BindView(R.id.tvChapterTitle) + TextView tvChapterTitle; + @BindView(R.id.tvArtist) + TextView tvArtist; + @BindView(R.id.ibToggleList) + ImageButton ibToggleList; + @BindView(R.id.ibPlayPause) + ImageButton ibPlayPause; + @BindView(R.id.ibPrevious) + ImageButton ibPrevious; + @BindView(R.id.ibNext) + ImageButton ibNext; + + @Override + protected PlayerPresenter createPresenter() { + if (getArguments() == null || getArguments().getParcelable(BOOK_KEY) == null) { + throw new IllegalStateException("Book object is required at this point."); + } + return new PlayerPresenter( + Parcels.unwrap(getArguments().getParcelable(BOOK_KEY)), + getArguments().getString(BOOK_SLUG_KEY), + this, + getContext() + ); + } + + @Override + public int getLayoutResourceId() { + return R.layout.fragment_player; + } + + @Override + public void prepareView(View view, Bundle savedInstanceState) { + if (getArguments() == null || getArguments().getParcelable(BOOK_KEY) == null) { + throw new IllegalStateException("Book object is required at this point."); + } + BookDetailsModel book = Parcels.unwrap(getArguments().getParcelable(BOOK_KEY)); + initializeHeaderAndPlaylistFragments(book); + sbPlayerProgress.setOnSeekBarChangeListener(listener); + + int visibility = book.getAudiobookMediaModels().size() > 1 ? View.VISIBLE : View.GONE; + tvArtist.setVisibility(visibility); + ibToggleList.setVisibility(visibility); + ibPrevious.setVisibility(visibility); + ibNext.setVisibility(visibility); + } + + @OnClick(R.id.ibToggleList) + public void onToggleListClicked() { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager == null) { + return; + } + + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + if (playlistFragment.isHidden()) { + fragmentTransaction.show(playlistFragment); + fragmentTransaction.hide(headerFragment); + } else { + fragmentTransaction.hide(playlistFragment); + fragmentTransaction.show(headerFragment); + } + fragmentTransaction.commit(); + } + + @OnClick(R.id.ibPrevious) + public void onPreviousClicked() { + getPresenter().changeChapter(false); + } + + @OnClick(R.id.ibNext) + public void onNextClicked() { + getPresenter().changeChapter(true); + } + + @OnClick(R.id.ibRewind) + public void onRewindClicked() { + getPresenter().seekToButton(false); + } + + @OnClick(R.id.ibPlayPause) + public void onPauseClicked() { + getPresenter().playOrPause(false); + } + + @OnClick(R.id.ibFastForward) + public void onFastForwardClicked() { + getPresenter().seekToButton(true); + } + + @Override + public void setTrackDuration(int trackDuration, String totalProgress) { + sbPlayerProgress.setMax(trackDuration); + tvTotalProgress.setText(totalProgress); + } + + @Override + public void setTrackPosition(int position, String currentProgress) { + if (!mUserIsSeeking) { + sbPlayerProgress.setProgress(position); + tvCurrentProgress.setText(currentProgress); + } + } + + @Override + public void setTrackTexts(String title, int chapter) { + tvArtist.setText(getString(R.string.player_chapter_number, (chapter + 1))); + tvChapterTitle.setText(title); + } + + @Override + public void setPlayButtonState(boolean playing) { + if (getContext() != null) { + Drawable drawable = ContextCompat.getDrawable(getContext(), playing ? R.drawable.pause_selector : R.drawable.play_selector); + ibPlayPause.setImageDrawable(drawable); + } + } + + @Override + public void onPlayerError() { + if (getActivity() != null && errorDialog == null) { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + dialogBuilder.setMessage(getString(R.string.load_player_failed)); + dialogBuilder.setCancelable(false); + dialogBuilder.setPositiveButton(getString(R.string.close), (dialog, id) -> { + getActivity().finish(); + dialog.dismiss(); + }); + dialogBuilder.setOnDismissListener(dialog -> errorDialog = null); + errorDialog = dialogBuilder.create(); + errorDialog.show(); + } + } + + private void initializeHeaderAndPlaylistFragments(BookDetailsModel book) { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager == null) { + return; + } + + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + headerFragment = (PlayerHeaderFragment) fragmentManager.findFragmentByTag(HEADER_FRAGMENT_TAG); + if (headerFragment == null) { + headerFragment = PlayerHeaderFragment.newInstance(StringUtils.joinCategory(book.getAuthors(), ", "), book.getTitle(), book.getCoverThumb()); + fragmentTransaction.add(R.id.flPlayerFragmentContainer, headerFragment, HEADER_FRAGMENT_TAG); + } + playlistFragment = (PlayerPlaylistFragment) fragmentManager.findFragmentByTag(LIST_FRAGMENT_TAG); + if (playlistFragment == null) { + playlistFragment = PlayerPlaylistFragment.newInstance(book.getAudiobookMediaModels()); + fragmentTransaction.add(R.id.flPlayerFragmentContainer, playlistFragment, LIST_FRAGMENT_TAG); + } + fragmentTransaction.hide(playlistFragment); + fragmentTransaction.commit(); + } +} + + +