package com.battlelancer.seriesguide.ui;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import com.battlelancer.seriesguide.R;
import com.battlelancer.seriesguide.SgApp;
import com.battlelancer.seriesguide.loaders.PersonLoader;
import com.battlelancer.seriesguide.util.ServiceUtils;
import com.battlelancer.seriesguide.util.TmdbTools;
import com.uwetrottmann.androidutils.AndroidUtils;
import com.uwetrottmann.tmdb2.entities.Person;
/**
* Displays details about a crew or cast member and their work.
*/
public class PersonFragment extends Fragment {
private static final String TAG = "Person Details";
@BindView(R.id.progressBarPerson) ProgressBar progressBar;
@BindView(R.id.imageViewPersonHeadshot) ImageView imageViewHeadshot;
@BindView(R.id.textViewPersonName) TextView textViewName;
@BindView(R.id.textViewPersonBiography) TextView textViewBiography;
private Person person;
private Unbinder unbinder;
public static PersonFragment newInstance(int tmdbId) {
PersonFragment f = new PersonFragment();
Bundle args = new Bundle();
args.putInt(InitBundle.PERSON_TMDB_ID, tmdbId);
f.setArguments(args);
return f;
}
public interface InitBundle {
String PERSON_TMDB_ID = "person_tmdb_id";
}
public PersonFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_person, container, false);
unbinder = ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(PeopleActivity.PERSON_LOADER_ID, null,
mPersonLoaderCallbacks);
setHasOptionsMenu(true);
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (person != null) {
inflater.inflate(R.menu.person_menu, menu);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.menu_action_person_tmdb) {
TmdbTools.openTmdbPerson(getActivity(), person.id, TAG);
return true;
}
if (itemId == R.id.menu_action_person_web_search) {
ServiceUtils.performWebSearch(getActivity(), person.name, TAG);
return true;
}
return super.onOptionsItemSelected(item);
}
private void populatePersonViews(Person person) {
if (person == null) {
// TODO display empty message
if (!AndroidUtils.isNetworkConnected(getActivity())) {
Toast.makeText(getActivity(), R.string.offline, Toast.LENGTH_SHORT).show();
}
return;
}
this.person = person;
textViewName.setText(person.name);
textViewBiography.setText(
TextUtils.isEmpty(person.biography) ? getString(R.string.not_available)
: person.biography);
if (!TextUtils.isEmpty(person.profile_path)) {
ServiceUtils.loadWithPicasso(getActivity(),
TmdbTools.buildProfileImageUrl(getActivity(), person.profile_path,
TmdbTools.ProfileImageSize.H632))
.placeholder(
new ColorDrawable(
ContextCompat.getColor(getContext(), R.color.protection_dark)))
.into(imageViewHeadshot);
}
// show actions
getActivity().invalidateOptionsMenu();
}
/**
* Shows or hides a custom indeterminate progress indicator inside this activity layout.
*/
private void setProgressVisibility(boolean isVisible) {
if (progressBar.getVisibility() == (isVisible ? View.VISIBLE : View.GONE)) {
// already in desired state, avoid replaying animation
return;
}
progressBar.startAnimation(AnimationUtils.loadAnimation(progressBar.getContext(),
isVisible ? R.anim.fade_in : R.anim.fade_out));
progressBar.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
private LoaderManager.LoaderCallbacks<Person> mPersonLoaderCallbacks
= new LoaderManager.LoaderCallbacks<Person>() {
@Override
public Loader<Person> onCreateLoader(int id, Bundle args) {
setProgressVisibility(true);
int tmdbId = getArguments().getInt(InitBundle.PERSON_TMDB_ID);
return new PersonLoader((SgApp) getActivity().getApplication(), tmdbId);
}
@Override
public void onLoadFinished(Loader<Person> loader, Person data) {
if (!isAdded()) {
return;
}
setProgressVisibility(false);
populatePersonViews(data);
}
@Override
public void onLoaderReset(Loader<Person> loader) {
// do nothing, preferring stale data over no data
}
};
}