/*
* Copyright (C) 2014 Michell Bak
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use mContext file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.miz.mizuu.fragments;
import android.animation.Animator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.melnykov.fab.FloatingActionButton;
import com.miz.abstractclasses.MovieApiService;
import com.miz.apis.trakt.Trakt;
import com.miz.base.MizActivity;
import com.miz.db.DbAdapterMovies;
import com.miz.functions.Actor;
import com.miz.functions.FileSource;
import com.miz.functions.Filepath;
import com.miz.functions.IntentKeys;
import com.miz.functions.MizLib;
import com.miz.functions.Movie;
import com.miz.functions.PaletteLoader;
import com.miz.functions.SimpleAnimatorListener;
import com.miz.mizuu.EditMovie;
import com.miz.mizuu.IdentifyMovie;
import com.miz.mizuu.Main;
import com.miz.mizuu.MizuuApplication;
import com.miz.mizuu.MovieCoverFanartBrowser;
import com.miz.mizuu.R;
import com.miz.service.DeleteFile;
import com.miz.utils.IntentUtils;
import com.miz.utils.LocalBroadcastUtils;
import com.miz.utils.MovieDatabaseUtils;
import com.miz.utils.TypefaceUtils;
import com.miz.utils.VideoUtils;
import com.miz.utils.ViewUtils;
import com.miz.views.HorizontalCardLayout;
import com.miz.views.ObservableScrollView;
import com.miz.views.ObservableScrollView.OnScrollChangedListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static com.miz.functions.PreferenceKeys.ALWAYS_DELETE_FILE;
import static com.miz.functions.PreferenceKeys.SHOW_FILE_LOCATION;
public class MovieDetailsFragment extends Fragment {
private Activity mContext;
private Movie mMovie;
private DbAdapterMovies mDatabase;
private TextView mTitle, mPlot, mSrc, mGenre, mRuntime, mReleaseDate, mRating, mTagline, mCertification;
private View mDetailsArea;
private ObservableScrollView mScrollView;
private HorizontalCardLayout mActorsLayout;
private boolean mShowFileLocation;
private ImageView mBackground, mCover;
private Picasso mPicasso;
private Typeface mLight, mMediumItalic, mMedium, mBold, mCondensedRegular;
private int mImageThumbSize, mImageThumbSpacing, mToolbarColor = 0;
private long mVideoPlaybackStarted, mVideoPlaybackEnded;
private Toolbar mToolbar;
private FloatingActionButton mFab;
private PaletteLoader mPaletteLoader;
/**
* Empty constructor as per the Fragment documentation
*/
public MovieDetailsFragment() {}
public static MovieDetailsFragment newInstance(String tmdbId) {
MovieDetailsFragment pageFragment = new MovieDetailsFragment();
Bundle bundle = new Bundle();
bundle.putString("tmdbId", tmdbId);
pageFragment.setArguments(bundle);
return pageFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
mContext = getActivity();
mShowFileLocation = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(SHOW_FILE_LOCATION, true);
mLight = TypefaceUtils.getRobotoLight(mContext);
mMediumItalic = TypefaceUtils.getRobotoMediumItalic(mContext);
mMedium = TypefaceUtils.getRobotoMedium(mContext);
mBold = TypefaceUtils.getRobotoBold(mContext);
mCondensedRegular = TypefaceUtils.getRobotoCondensedRegular(mContext);
mPicasso = MizuuApplication.getPicasso(mContext);
mDatabase = MizuuApplication.getMovieAdapter();
Cursor cursor = mDatabase.fetchMovie(getArguments().getString("tmdbId"));
try {
mMovie = new Movie(mContext,
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_TITLE)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_PLOT)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_TAGLINE)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_TMDB_ID)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_IMDB_ID)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_RATING)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_RELEASEDATE)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_CERTIFICATION)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_RUNTIME)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_TRAILER)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_GENRES)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_FAVOURITE)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_ACTORS)),
MizuuApplication.getCollectionsAdapter().getCollection(cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_COLLECTION_ID))),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_COLLECTION_ID)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_TO_WATCH)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_HAS_WATCHED)),
cursor.getString(cursor.getColumnIndex(DbAdapterMovies.KEY_DATE_ADDED))
);
} catch (Exception e) {} finally {
if (cursor != null) {
cursor.close();
} else { // Cursor is null, yikes!
getActivity().finish();
return;
}
}
LocalBroadcastManager.getInstance(mContext).registerReceiver(mMessageReceiver, new IntentFilter(LocalBroadcastUtils.CLEAR_IMAGE_CACHE));
}
@Override
public void onResume() {
super.onResume();
mVideoPlaybackEnded = System.currentTimeMillis();
if (mVideoPlaybackStarted > 0 && mVideoPlaybackEnded - mVideoPlaybackStarted > (1000 * 60 * 5)) {
if (!mMovie.hasWatched())
watched(false); // Mark it as watched
}
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
loadImages();
}
};
@Override
public void onDestroy() {
super.onDestroy();
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(mMessageReceiver);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.movie_and_tv_show_details, container, false);
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
mToolbar.setBackgroundResource(android.R.color.transparent);
ViewUtils.setProperToolbarSize(mContext, mToolbar);
((MizActivity) getActivity()).setSupportActionBar(mToolbar);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// This needs to be re-initialized here and not in onCreate()
mImageThumbSize = getResources().getDimensionPixelSize(R.dimen.horizontal_grid_item_width);
mImageThumbSpacing = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_spacing);
mDetailsArea = view.findViewById(R.id.details_area);
mBackground = (ImageView) view.findViewById(R.id.imageBackground);
mTitle = (TextView) view.findViewById(R.id.movieTitle);
mPlot = (TextView) view.findViewById(R.id.textView2);
mSrc = (TextView) view.findViewById(R.id.textView3);
mGenre = (TextView) view.findViewById(R.id.textView7);
mRuntime = (TextView) view.findViewById(R.id.textView9);
mReleaseDate = (TextView) view.findViewById(R.id.textReleaseDate);
mRating = (TextView) view.findViewById(R.id.textView12);
mTagline = (TextView) view.findViewById(R.id.textView6);
mCertification = (TextView) view.findViewById(R.id.textView11);
mCover = (ImageView) view.findViewById(R.id.traktIcon);
mActorsLayout = (HorizontalCardLayout) view.findViewById(R.id.horizontal_card_layout);
mScrollView = (ObservableScrollView) view.findViewById(R.id.observableScrollView);
mFab = (FloatingActionButton) view.findViewById(R.id.fab);
mFab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ViewUtils.animateFabJump(v, new SimpleAnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
playMovie();
}
});
}
});
if (MizLib.isTablet(mContext))
mFab.setType(FloatingActionButton.TYPE_NORMAL);
final int height = MizLib.getActionBarAndStatusBarHeight(mContext);
mScrollView.setOnScrollChangedListener(new OnScrollChangedListener() {
@Override
public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
ViewUtils.handleOnScrollChangedEvent(
getActivity(), view, mBackground, mMovie.getTitle(),
height, t, mToolbar, mToolbarColor);
}
});
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewUtils.setLayoutParamsForDetailsEmptyView(mContext, view,
mBackground, mScrollView, this);
}
});
// Set the movie title
mTitle.setVisibility(View.VISIBLE);
mTitle.setText(mMovie.getTitle());
mTitle.setTypeface(mCondensedRegular);
mPlot.setTypeface(mCondensedRegular);
mRuntime.setTypeface(mMedium);
mCertification.setTypeface(mMedium);
mRating.setTypeface(mMedium);
// Set the movie plot
mPlot.setBackgroundResource(R.drawable.selectable_background);
if (!mMovie.getTagline().isEmpty())
mPlot.setMaxLines(mContext.getResources().getInteger(R.integer.movie_details_max_lines));
else
mPlot.setMaxLines(mContext.getResources().getInteger(R.integer.show_details_max_lines));
mPlot.setTag(true); // true = collapsed
mPlot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((Boolean) mPlot.getTag())) {
// Animate
ViewUtils.animateTextViewMaxLines(mPlot, 50); // It seems highly unlikely that there would every be more than 50 lines
// Reverse the tag
mPlot.setTag(false);
} else {
// Animate
ViewUtils.animateTextViewMaxLines(mPlot, mMovie.getTagline().isEmpty() ?
getResources().getInteger(R.integer.show_details_max_lines) : getResources().getInteger(R.integer.movie_details_max_lines));
// Reverse the tag
mPlot.setTag(true);
}
}
});
mPlot.setEllipsize(TextUtils.TruncateAt.END);
mPlot.setFocusable(true);
if (MizLib.isTablet(mContext))
mPlot.setLineSpacing(0, 1.15f);
mPlot.setText(mMovie.getPlot());
// Set the movie file source
mSrc.setTypeface(mCondensedRegular);
if (mShowFileLocation) {
mSrc.setText(mMovie.getAllFilepaths());
} else {
mSrc.setVisibility(View.GONE);
}
// Set movie tag line
mTagline.setTypeface(mBold);
if (mMovie.getTagline().isEmpty())
mTagline.setVisibility(TextView.GONE);
else
mTagline.setText(mMovie.getTagline());
// Set the movie genre
mGenre.setTypeface(mMediumItalic);
if (!TextUtils.isEmpty(mMovie.getGenres())) {
mGenre.setText(mMovie.getGenres());
} else {
mGenre.setVisibility(View.GONE);
}
// Set the movie runtime
mRuntime.setText(MizLib.getPrettyRuntime(mContext, Integer.parseInt(mMovie.getRuntime())));
// Set the movie release date
mReleaseDate.setTypeface(mMedium);
mReleaseDate.setText(MizLib.getPrettyDate(mContext, mMovie.getReleasedate()));
// Set the movie rating
if (!mMovie.getRating().equals("0.0")) {
try {
int rating = (int) (Double.parseDouble(mMovie.getRating()) * 10);
mRating.setText(Html.fromHtml(+ rating + "<small> %</small>"));
} catch (NumberFormatException e) {
mRating.setText(mMovie.getRating());
}
} else {
mRating.setText(R.string.stringNA);
}
// Set the movie certification
if (!TextUtils.isEmpty(mMovie.getCertification())) {
mCertification.setText(mMovie.getCertification());
} else {
mCertification.setText(R.string.stringNA);
}
mActorsLayout.setTitle(R.string.detailsActors);
mActorsLayout.setSeeMoreVisibility(true);
mActorsLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mActorsLayout.getWidth() > 0) {
final int numColumns = (int) Math.floor(mActorsLayout.getWidth() / (mImageThumbSize + mImageThumbSpacing));
mImageThumbSize = (mActorsLayout.getWidth() - (numColumns * mImageThumbSpacing)) / numColumns;
loadActors(numColumns);
MizLib.removeViewTreeObserver(mActorsLayout.getViewTreeObserver(), this);
}
}
});
mActorsLayout.setSeeMoreOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(IntentUtils.getActorBrowserMovies(mContext, mMovie.getTitle(), mMovie.getTmdbId(), mToolbarColor));
}
});
ViewUtils.updateToolbarBackground(getActivity(), mToolbar, 0, mMovie.getTitle(), mToolbarColor);
loadImages();
}
private void loadActors(final int capacity) {
// Show ProgressBar
new AsyncTask<Void, Void, Void>() {
private List<Actor> mActors;
@Override
protected Void doInBackground(Void... params) {
MovieApiService service = MizuuApplication.getMovieService(mContext);
mActors = service.getActors(mMovie.getTmdbId());
return null;
}
@Override
protected void onPostExecute(Void result) {
mActorsLayout.loadItems(mContext, mPicasso, capacity, mImageThumbSize, mActors, HorizontalCardLayout.ACTORS, mToolbarColor);
}
}.execute();
}
private void loadImages() {
// Cover image
mPicasso.load(mMovie.getThumbnail()).error(R.drawable.loading_image).placeholder(R.drawable.loading_image).into(mCover, new Callback() {
@Override
public void onSuccess() {
if (mPaletteLoader == null) {
mPaletteLoader = new PaletteLoader(mPicasso, Uri.fromFile(mMovie.getThumbnail()), new PaletteLoader.OnPaletteLoadedCallback() {
@Override
public void onPaletteLoaded(int swatchColor) {
mToolbarColor = swatchColor;
}
});
mPaletteLoader.addView(mDetailsArea);
mPaletteLoader.addView(mActorsLayout.getSeeMoreView());
mPaletteLoader.setFab(mFab);
mPaletteLoader.execute();
} else {
// Clear old views after configuration change
mPaletteLoader.clearViews();
// Add views after configuration change
mPaletteLoader.addView(mDetailsArea);
mPaletteLoader.addView(mActorsLayout.getSeeMoreView());
mPaletteLoader.setFab(mFab);
// Re-color the views
mPaletteLoader.colorViews();
}
}
@Override
public void onError() {}
});
if (!MizLib.isPortrait(mContext)) {
mPicasso.load(mMovie.getBackdrop()).skipMemoryCache().error(R.drawable.bg).placeholder(R.drawable.bg).into(mBackground);
} else {
mPicasso.load(mMovie.getBackdrop()).skipMemoryCache().placeholder(R.drawable.bg).into(mBackground, new Callback() {
@Override
public void onError() {
if (!isAdded())
return;
mPicasso.load(mMovie.getThumbnail()).skipMemoryCache().placeholder(R.drawable.bg).error(R.drawable.bg).into(mBackground);
}
@Override
public void onSuccess() {}
});
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.movie_details, menu);
// If this is a tablet, we have more room to display icons
if (MizLib.isTablet(mContext)) {
menu.findItem(R.id.movie_fav).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.findItem(R.id.share).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.findItem(R.id.watch_list).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
// Favourite
menu.findItem(R.id.movie_fav).setIcon(mMovie.isFavourite() ?
R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp)
.setTitle(mMovie.isFavourite() ?
R.string.menuFavouriteTitleRemove : R.string.menuFavouriteTitle);
// Watchlist
menu.findItem(R.id.watch_list).setIcon(mMovie.toWatch() ?
R.drawable.ic_video_collection_white_24dp : R.drawable.ic_queue_white_24dp)
.setTitle(mMovie.toWatch() ?
R.string.removeFromWatchlist : R.string.watchLater);
// Watched / unwatched
menu.findItem(R.id.watched).setTitle(mMovie.hasWatched() ?
R.string.stringMarkAsUnwatched : R.string.stringMarkAsWatched);
// Only allow the user to browse artwork if it's a valid TMDb movie
menu.findItem(R.id.change_cover).setVisible(MizLib.isValidTmdbId(mMovie.getTmdbId()));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (getActivity().getIntent().getExtras().getBoolean("isFromWidget")) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.putExtra("startup", String.valueOf(Main.MOVIES));
i.setClass(mContext, Main.class);
startActivity(i);
}
getActivity().finish();
return true;
case R.id.share:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.imdb.com/title/" + mMovie.getImdbId());
startActivity(intent);
return true;
case R.id.change_cover:
searchCover();
return true;
case R.id.editMovie:
editMovie();
return true;
case R.id.identify:
identifyMovie();
return true;
case R.id.watched:
watched(true);
return true;
case R.id.trailer:
VideoUtils.playTrailer(getActivity(), mMovie);
return true;
case R.id.watch_list:
watchList();
return true;
case R.id.movie_fav:
favAction();
return true;
case R.id.delete_movie:
deleteMovie();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@SuppressLint("InflateParams")
public void deleteMovie() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
View dialogLayout = LayoutInflater.from(mContext).inflate(R.layout.delete_file_dialog_layout, null);
final CheckBox cb = (CheckBox) dialogLayout.findViewById(R.id.deleteFile);
if (mMovie.getFilepaths().size() == 1 && mMovie.getFilepaths().get(0).getType() == FileSource.UPNP)
cb.setEnabled(false);
else
cb.setChecked(PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(ALWAYS_DELETE_FILE, false));
builder.setTitle(getString(R.string.removeMovie))
.setView(dialogLayout)
.setCancelable(false)
.setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MovieDatabaseUtils.deleteMovie(getActivity(), mMovie.getTmdbId());
if (cb.isChecked()) {
for (Filepath path : mMovie.getFilepaths()) {
Intent deleteIntent = new Intent(mContext, DeleteFile.class);
deleteIntent.putExtra("filepath", path.getFilepath());
mContext.startService(deleteIntent);
}
}
boolean movieExists = mDatabase.movieExists(mMovie.getTmdbId());
// We only want to delete movie images, if there are no other versions of the same movie
if (!movieExists) {
try { // Delete cover art image
File coverArt = mMovie.getPoster();
if (coverArt.exists() && coverArt.getAbsolutePath().contains("com.miz.mizuu")) {
MizLib.deleteFile(coverArt);
}
} catch (NullPointerException e) {} // No file to delete
try { // Delete thumbnail image
File thumbnail = mMovie.getThumbnail();
if (thumbnail.exists() && thumbnail.getAbsolutePath().contains("com.miz.mizuu")) {
MizLib.deleteFile(thumbnail);
}
} catch (NullPointerException e) {} // No file to delete
try { // Delete backdrop image
File backdrop = mMovie.getBackdrop();
if (backdrop.exists() && backdrop.getAbsolutePath().contains("com.miz.mizuu")) {
MizLib.deleteFile(backdrop);
}
} catch (NullPointerException e) {} // No file to delete
}
notifyDatasetChanges();
getActivity().finish();
}
})
.setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.create().show();
}
public void identifyMovie() {
if (mMovie.getFilepaths().size() == 1) {
getActivity().startActivityForResult(getIdentifyIntent(mMovie.getFilepaths().get(0).getFullFilepath()), 0);
} else {
MizLib.showSelectFileDialog(mContext, mMovie.getFilepaths(), new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(getIdentifyIntent(mMovie.getFilepaths().get(which).getFullFilepath()));
// Dismiss the dialog
dialog.dismiss();
}
});
}
}
private Intent getIdentifyIntent(String filepath) {
Intent intent = new Intent(mContext, IdentifyMovie.class);
intent.putExtra("fileName", filepath);
intent.putExtra("currentMovieId", mMovie.getTmdbId());
intent.putExtra(IntentKeys.TOOLBAR_COLOR, mToolbarColor);
return intent;
}
public void favAction() {
mMovie.setFavourite(!mMovie.isFavourite()); // Reverse the favourite boolean
boolean success = mDatabase.updateMovieSingleItem(mMovie.getTmdbId(), DbAdapterMovies.KEY_FAVOURITE, mMovie.getFavourite());
if (success) {
getActivity().invalidateOptionsMenu();
if (mMovie.isFavourite()) {
Toast.makeText(mContext, getString(R.string.addedToFavs), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, getString(R.string.removedFromFavs), Toast.LENGTH_SHORT).show();
getActivity().setResult(2); // Favorite removed
}
notifyDatasetChanges();
} else Toast.makeText(mContext, getString(R.string.errorOccured), Toast.LENGTH_SHORT).show();
new Thread() {
@Override
public void run() {
ArrayList<Movie> movie = new ArrayList<Movie>();
movie.add(mMovie);
Trakt.movieFavorite(movie, mContext);
}
}.start();
}
private void watched(boolean showToast) {
mMovie.setHasWatched(!mMovie.hasWatched()); // Reverse the hasWatched boolean
boolean success = mDatabase.updateMovieSingleItem(mMovie.getTmdbId(), DbAdapterMovies.KEY_HAS_WATCHED, mMovie.getHasWatched());
if (success) {
getActivity().invalidateOptionsMenu();
if (showToast)
if (mMovie.hasWatched()) {
Toast.makeText(mContext, getString(R.string.markedAsWatched), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, getString(R.string.markedAsUnwatched), Toast.LENGTH_SHORT).show();
}
notifyDatasetChanges();
} else Toast.makeText(mContext, getString(R.string.errorOccured), Toast.LENGTH_SHORT).show();
// Remove from watchlist when watched
removeFromWatchlist();
new Thread() {
@Override
public void run() {
ArrayList<Movie> watchedMovies = new ArrayList<Movie>();
watchedMovies.add(mMovie);
Trakt.markMovieAsWatched(watchedMovies, mContext);
}
}.start();
}
public void watchList() {
mMovie.setToWatch(!mMovie.toWatch()); // Reverse the toWatch boolean
boolean success = mDatabase.updateMovieSingleItem(mMovie.getTmdbId(), DbAdapterMovies.KEY_TO_WATCH, mMovie.getToWatch());
if (success) {
getActivity().invalidateOptionsMenu();
if (mMovie.toWatch()) {
Toast.makeText(mContext, getString(R.string.addedToWatchList), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, getString(R.string.removedFromWatchList), Toast.LENGTH_SHORT).show();
}
notifyDatasetChanges();
} else Toast.makeText(mContext, getString(R.string.errorOccured), Toast.LENGTH_SHORT).show();
new Thread() {
@Override
public void run() {
ArrayList<Movie> watchlist = new ArrayList<Movie>();
watchlist.add(mMovie);
Trakt.movieWatchlist(watchlist, mContext);
}
}.start();
}
public void removeFromWatchlist() {
mMovie.setToWatch(false); // Remove it
boolean success = mDatabase.updateMovieSingleItem(mMovie.getTmdbId(), DbAdapterMovies.KEY_TO_WATCH, mMovie.getToWatch());
if (success) {
getActivity().invalidateOptionsMenu();
notifyDatasetChanges();
}
new Thread() {
@Override
public void run() {
ArrayList<Movie> watchlist = new ArrayList<Movie>();
watchlist.add(mMovie);
Trakt.movieWatchlist(watchlist, mContext);
}
}.start();
}
public void searchCover() {
if (MizLib.isOnline(mContext)) { // Make sure that the device is connected to the web
Intent intent = new Intent(mContext, MovieCoverFanartBrowser.class);
intent.putExtra("tmdbId", mMovie.getTmdbId());
intent.putExtra("collectionId", mMovie.getCollectionId());
intent.putExtra(IntentKeys.TOOLBAR_COLOR, mToolbarColor);
startActivity(intent); // Start the intent for result
} else {
// No movie ID / Internet connection
Toast.makeText(mContext, getString(R.string.coverSearchFailed), Toast.LENGTH_LONG).show();
}
}
private void notifyDatasetChanges() {
LocalBroadcastUtils.updateMovieLibrary(mContext);
}
private void checkIn() {
new Thread() {
@Override
public void run() {
Trakt.performMovieCheckin(mMovie, getActivity());
}
}.start();
}
private void playMovie() {
ArrayList<Filepath> paths = mMovie.getFilepaths();
if (paths.size() == 1) {
Filepath path = paths.get(0);
if (mMovie.hasOfflineCopy(path)) {
boolean playbackStarted = VideoUtils.playVideo(getActivity(), mMovie.getOfflineCopyUri(path), FileSource.FILE, mMovie);
if (playbackStarted) {
mVideoPlaybackStarted = System.currentTimeMillis();
checkIn();
}
} else {
playMovie(paths.get(0).getFilepath(), paths.get(0).getType());
}
} else {
boolean hasOfflineCopy = false;
for (Filepath path : paths) {
if (mMovie.hasOfflineCopy(path)) {
boolean playbackStarted = VideoUtils.playVideo(getActivity(), mMovie.getOfflineCopyUri(path), FileSource.FILE, mMovie);
if (playbackStarted) {
mVideoPlaybackStarted = System.currentTimeMillis();
checkIn();
}
hasOfflineCopy = true;
break;
}
}
if (!hasOfflineCopy) {
MizLib.showSelectFileDialog(mContext, mMovie.getFilepaths(), new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Filepath path = mMovie.getFilepaths().get(which);
playMovie(path.getFilepath(), path.getType());
}
});
}
}
}
private void playMovie(String filepath, int filetype) {
if (filepath.toLowerCase(Locale.getDefault()).matches(".*(cd1|part1).*")) {
new GetSplitFiles(filepath, filetype).execute();
} else {
mVideoPlaybackStarted = System.currentTimeMillis();
boolean playbackStarted = VideoUtils.playVideo(getActivity(), filepath, filetype, mMovie);
if (playbackStarted)
checkIn();
}
}
public void editMovie() {
Intent intent = new Intent(mContext, EditMovie.class);
intent.putExtra("movieId", mMovie.getTmdbId());
intent.putExtra(IntentKeys.TOOLBAR_COLOR, mToolbarColor);
getActivity().startActivityForResult(intent, 1);
}
public void onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MEDIA_PLAY:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
playMovie();
}
}
private class GetSplitFiles extends AsyncTask<String, Void, List<SplitFile>> {
private ProgressDialog progress;
private String orig_filepath;
private int fileType;
public GetSplitFiles(String filepath, int filetype) {
this.orig_filepath = filepath;
fileType = filetype;
}
@Override
protected void onPreExecute() {
progress = new ProgressDialog(getActivity());
progress.setIndeterminate(true);
progress.setTitle(getString(R.string.loading_movie_parts));
progress.setMessage(getString(R.string.few_moments));
progress.show();
}
@Override
protected List<SplitFile> doInBackground(String... params) {
List<SplitFile> parts = new ArrayList<SplitFile>();
List<String> temp;
try {
if (fileType == FileSource.SMB)
temp = MizLib.getSplitParts(orig_filepath, MizLib.getLoginFromFilepath(MizLib.TYPE_MOVIE, orig_filepath));
else
temp = MizLib.getSplitParts(orig_filepath, null);
for (int i = 0; i < temp.size(); i++)
parts.add(new SplitFile(temp.get(i)));
} catch (Exception e) {}
return parts;
}
@Override
protected void onPostExecute(final List<SplitFile> result) {
progress.dismiss();
if (result.size() > 0)
mVideoPlaybackStarted = System.currentTimeMillis();
if (result.size() > 1) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(getString(R.string.playPart));
builder.setAdapter(new SplitAdapter(mContext, result), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
boolean playbackStarted = VideoUtils.playVideo(getActivity(), result.get(which).getFilepath(), fileType, mMovie);
if (playbackStarted)
checkIn();
}});
builder.show();
} else if (result.size() == 1) {
boolean playbackStarted = VideoUtils.playVideo(getActivity(), result.get(0).getFilepath(), fileType, mMovie);
if (playbackStarted)
checkIn();
} else {
Toast.makeText(mContext, getString(R.string.errorSomethingWentWrong), Toast.LENGTH_LONG).show();
}
}
}
private class SplitAdapter implements android.widget.ListAdapter {
private List<SplitFile> mFiles;
private Context mContext;
private LayoutInflater inflater;
public SplitAdapter(Context context, List<SplitFile> files) {
mContext = context;
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mFiles = files;
}
@Override
public int getCount() {
return mFiles.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = inflater.inflate(R.layout.split_file_item, parent, false);
// Don't care about the ViewHolder pattern here
((TextView) convertView.findViewById(R.id.title)).setText(getString(R.string.part) + " " + mFiles.get(position).getPartNumber());
((TextView) convertView.findViewById(R.id.description)).setText(mFiles.get(position).getUserFilepath());
return convertView;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isEmpty() {
return mFiles.isEmpty();
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
}
private class SplitFile {
String filepath;
public SplitFile(String filepath) {
this.filepath = filepath;
}
public String getFilepath() {
return filepath;
}
public String getUserFilepath() {
return MizLib.transformSmbPath(filepath);
}
public int getPartNumber() {
return MizLib.getPartNumberFromFilepath(getUserFilepath());
}
}
}