Added Android code
[wl-app.git] / 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 (file)
index 0000000..ca92d2c
--- /dev/null
@@ -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<PlayerPresenter> 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();
+       }
+}
+
+
+