package pct.droid.fragments; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.text.Layout; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.Arrays; import java.util.Locale; import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import pct.droid.R; import pct.droid.activities.TrailerPlayerActivity; import pct.droid.activities.VideoPlayerActivity; import pct.droid.base.content.preferences.DefaultQuality; import pct.droid.base.content.preferences.Prefs; import pct.droid.base.providers.media.models.Movie; import pct.droid.base.providers.subs.SubsProvider; import pct.droid.base.torrent.Magnet; import pct.droid.base.torrent.StreamInfo; import pct.droid.base.torrent.TorrentHealth; import pct.droid.base.utils.LocaleUtils; import pct.droid.base.utils.PixelUtils; import pct.droid.base.utils.PrefUtils; import pct.droid.base.utils.SortUtils; import pct.droid.base.utils.StringUtils; import pct.droid.base.utils.ThreadUtils; import pct.droid.base.utils.VersionUtils; import pct.droid.base.youtube.YouTubeData; import pct.droid.fragments.dialog.SynopsisDialogFragment; import pct.droid.fragments.base.BaseDetailFragment; import pct.droid.widget.OptionSelector; public class MovieDetailFragment extends BaseDetailFragment { private static Movie sMovie; private String mSelectedSubtitleLanguage, mSelectedQuality; private Boolean mAttached = false; private Magnet mMagnet; @Bind(R.id.play_button) ImageButton mPlayButton; @Bind(R.id.title) TextView mTitle; @Bind(R.id.health) ImageView mHealth; @Bind(R.id.meta) TextView mMeta; @Bind(R.id.synopsis) TextView mSynopsis; @Bind(R.id.read_more) Button mReadMore; @Bind(R.id.watch_trailer) Button mWatchTrailer; @Bind(R.id.magnet) ImageButton mOpenMagnet; @Bind(R.id.rating) RatingBar mRating; @Bind(R.id.subtitles) OptionSelector mSubtitles; @Bind(R.id.quality) OptionSelector mQuality; @Nullable @Bind(R.id.cover_image) ImageView mCoverImage; public static MovieDetailFragment newInstance(Movie movie) { sMovie = movie; return new MovieDetailFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mRoot = inflater.inflate(R.layout.fragment_moviedetail, container, false); if (VersionUtils.isJellyBean() && container != null) { mRoot.setMinimumHeight(container.getMinimumHeight()); } ButterKnife.bind(this, mRoot); if(sMovie != null) { if (!VersionUtils.isJellyBean()) { mPlayButton.setBackgroundDrawable(PixelUtils.changeDrawableColor(mPlayButton.getContext(), R.drawable.play_button_circle, sMovie.color)); } else { mPlayButton.setBackground(PixelUtils.changeDrawableColor(mPlayButton.getContext(), R.drawable.play_button_circle, sMovie.color)); } mTitle.setText(sMovie.title); if (!sMovie.rating.equals("-1")) { Double rating = Double.parseDouble(sMovie.rating); mRating.setProgress(rating.intValue()); mRating.setContentDescription("Rating: " + rating.intValue() + " out of 10"); mRating.setVisibility(View.VISIBLE); } else { mRating.setVisibility(View.GONE); } String metaDataStr = sMovie.year; if (!TextUtils.isEmpty(sMovie.runtime)) { metaDataStr += " • "; metaDataStr += sMovie.runtime + " " + getString(R.string.minutes); } if (!TextUtils.isEmpty(sMovie.genre)) { metaDataStr += " • "; metaDataStr += sMovie.genre; } mMeta.setText(metaDataStr); if (!TextUtils.isEmpty(sMovie.synopsis)) { mSynopsis.setText(sMovie.synopsis); mSynopsis.post(new Runnable() { @Override public void run() { boolean ellipsized = false; Layout layout = mSynopsis.getLayout(); if (layout == null) return; int lines = layout.getLineCount(); if (lines > 0) { int ellipsisCount = layout.getEllipsisCount(lines - 1); if (ellipsisCount > 0) { ellipsized = true; } } mReadMore.setVisibility(ellipsized ? View.VISIBLE : View.GONE); } }); } else { mSynopsis.setClickable(false); mReadMore.setVisibility(View.GONE); } mWatchTrailer.setVisibility(sMovie.trailer == null || sMovie.trailer.isEmpty() ? View.GONE : View.VISIBLE); mSubtitles.setFragmentManager(getFragmentManager()); mQuality.setFragmentManager(getFragmentManager()); mSubtitles.setTitle(R.string.subtitles); mQuality.setTitle(R.string.quality); mSubtitles.setText(R.string.loading_subs); mSubtitles.setClickable(false); if (sMovie.getSubsProvider() != null) { sMovie.getSubsProvider().getList(sMovie, new SubsProvider.Callback() { @Override public void onSuccess(Map<String, String> subtitles) { if (!mAttached) return; if (subtitles == null) { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { mSubtitles.setText(R.string.no_subs_available); } }); return; } sMovie.subtitles = subtitles; String[] languages = subtitles.keySet().toArray(new String[subtitles.size()]); Arrays.sort(languages); final String[] adapterLanguages = new String[languages.length + 1]; adapterLanguages[0] = "no-subs"; System.arraycopy(languages, 0, adapterLanguages, 1, languages.length); String[] readableNames = new String[adapterLanguages.length]; for (int i = 0; i < readableNames.length; i++) { String language = adapterLanguages[i]; if (language.equals("no-subs")) { readableNames[i] = getString(R.string.no_subs); } else { Locale locale = LocaleUtils.toLocale(language); readableNames[i] = locale.getDisplayName(locale); } } mSubtitles.setListener(new OptionSelector.SelectorListener() { @Override public void onSelectionChanged(int position, String value) { onSubtitleLanguageSelected(adapterLanguages[position]); } }); mSubtitles.setData(readableNames); ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { mSubtitles.setClickable(true); } }); String defaultSubtitle = PrefUtils.get(mSubtitles.getContext(), Prefs.SUBTITLE_DEFAULT, null); if (subtitles.containsKey(defaultSubtitle)) { onSubtitleLanguageSelected(defaultSubtitle); mSubtitles.setDefault(Arrays.asList(adapterLanguages).indexOf(defaultSubtitle)); } else { onSubtitleLanguageSelected("no-subs"); mSubtitles.setDefault(Arrays.asList(adapterLanguages).indexOf("no-subs")); } } @Override public void onFailure(Exception e) { mSubtitles.setData(new String[0]); mSubtitles.setClickable(true); } }); } else { mSubtitles.setClickable(false); mSubtitles.setText(R.string.no_subs_available); } if (sMovie.torrents.size() > 0) { final String[] qualities = sMovie.torrents.keySet().toArray(new String[sMovie.torrents.size()]); SortUtils.sortQualities(qualities); mQuality.setData(qualities); mQuality.setListener(new OptionSelector.SelectorListener() { @Override public void onSelectionChanged(int position, String value) { mSelectedQuality = value; renderHealth(); updateMagnet(); } }); String quality = DefaultQuality.get(mActivity, Arrays.asList(qualities)); int qualityIndex = Arrays.asList(qualities).indexOf(quality); mSelectedQuality = quality; mQuality.setText(mSelectedQuality); mQuality.setDefault(qualityIndex); renderHealth(); updateMagnet(); } if (mCoverImage != null) { Picasso.with(mCoverImage.getContext()).load(sMovie.image).into(mCoverImage); } } return mRoot; } @Override public void onAttach(Activity activity) { super.onAttach(activity); mAttached = true; if (activity instanceof FragmentListener) mCallback = (FragmentListener) activity; } @Override public void onDetach() { super.onDetach(); mAttached = false; } private void renderHealth() { if(mHealth.getVisibility() == View.GONE) { mHealth.setVisibility(View.VISIBLE); } TorrentHealth health = TorrentHealth.calculate(sMovie.torrents.get(mSelectedQuality).seeds, sMovie.torrents.get(mSelectedQuality).peers); mHealth.setImageResource(health.getImageResource()); } private void updateMagnet() { if(mMagnet == null) { mMagnet = new Magnet(mActivity, sMovie.torrents.get(mSelectedQuality).url); } mMagnet.setUrl(sMovie.torrents.get(mSelectedQuality).url); if(!mMagnet.canOpen()) { mOpenMagnet.setVisibility(View.GONE); } else { mOpenMagnet.setVisibility(View.VISIBLE); } } @OnClick(R.id.read_more) public void openReadMore(View v) { if (getFragmentManager().findFragmentByTag("overlay_fragment") != null) return; SynopsisDialogFragment synopsisDialogFragment = new SynopsisDialogFragment(); Bundle b = new Bundle(); b.putString("text", sMovie.synopsis); synopsisDialogFragment.setArguments(b); synopsisDialogFragment.show(getFragmentManager(), "overlay_fragment"); } @OnClick(R.id.watch_trailer) public void openTrailer(View v) { if (!YouTubeData.isYouTubeUrl(sMovie.trailer)) { VideoPlayerActivity.startActivity(mActivity, new StreamInfo(sMovie, null, null, null, null, sMovie.trailer)); } else { TrailerPlayerActivity.startActivity(mActivity, sMovie.trailer, sMovie); } } @OnClick(R.id.play_button) public void play() { String streamUrl = sMovie.torrents.get(mSelectedQuality).url; StreamInfo streamInfo = new StreamInfo(sMovie, streamUrl, mSelectedSubtitleLanguage, mSelectedQuality); mCallback.playStream(streamInfo); } @OnClick(R.id.magnet) public void openMagnet() { mMagnet.open(mActivity); } @OnClick(R.id.health) public void clickHealth() { int seeds = sMovie.torrents.get(mSelectedQuality).seeds; int peers = sMovie.torrents.get(mSelectedQuality).peers; TorrentHealth health = TorrentHealth.calculate(seeds, peers); final Snackbar snackbar = Snackbar.make(mRoot, getString(R.string.health_info, getString(health.getStringResource()), seeds, peers), Snackbar.LENGTH_LONG); snackbar.setAction(R.string.close, new View.OnClickListener() { @Override public void onClick(View v) { snackbar.dismiss(); } }); snackbar.show(); } private void onSubtitleLanguageSelected(String language) { mSelectedSubtitleLanguage = language; if (!language.equals("no-subs")) { final Locale locale = LocaleUtils.toLocale(language); ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { mSubtitles.setText(StringUtils.uppercaseFirst(locale.getDisplayName(locale))); } }); } else { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { mSubtitles.setText(R.string.no_subs); } }); } } }