/* * Copyright (C) 2016 Simon Vig Therkildsen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this 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 net.simonvt.cathode.ui.person; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import java.util.List; import javax.inject.Inject; import net.simonvt.cathode.CathodeApp; import net.simonvt.cathode.R; import net.simonvt.cathode.api.enumeration.Department; import net.simonvt.cathode.api.enumeration.ItemType; import net.simonvt.cathode.api.util.TraktUtils; import net.simonvt.cathode.jobqueue.Job; import net.simonvt.cathode.scheduler.MovieTaskScheduler; import net.simonvt.cathode.scheduler.PersonTaskScheduler; import net.simonvt.cathode.scheduler.ShowTaskScheduler; import net.simonvt.cathode.settings.TraktTimestamps; import net.simonvt.cathode.ui.LibraryType; import net.simonvt.cathode.ui.NavigationListener; import net.simonvt.cathode.ui.fragment.RefreshableAppBarFragment; import net.simonvt.cathode.util.Ids; import net.simonvt.cathode.util.Intents; import net.simonvt.cathode.widget.RemoteImageView; public class PersonFragment extends RefreshableAppBarFragment { private static final String TAG = "net.simonvt.cathode.ui.person.PersonFragment"; private static final String ARG_PERSON_ID = "net.simonvt.cathode.ui.person.PersonFragment.personId"; private static final int LOADER_PERSON = 1; @Inject PersonTaskScheduler personScheduler; @Inject ShowTaskScheduler showScheduler; @Inject MovieTaskScheduler movieScheduler; private long personId; private Person person; private int itemCount; @BindView(R.id.headshot) RemoteImageView headshot; @BindView(R.id.bornTitle) View bornTitle; @BindView(R.id.birthday) TextView birthday; @BindView(R.id.birthplace) TextView birthplace; @BindView(R.id.deathTitle) View deathTitle; @BindView(R.id.death) TextView death; @BindView(R.id.biography) TextView biography; @BindView(R.id.cast_header) LinearLayout castHeader; @BindView(R.id.cast_items) LinearLayout castItems; @BindView(R.id.production_header) LinearLayout productionHeader; @BindView(R.id.production_items) LinearLayout productionItems; @BindView(R.id.art_header) LinearLayout artHeader; @BindView(R.id.art_items) LinearLayout artItems; @BindView(R.id.crew_header) LinearLayout crewHeader; @BindView(R.id.crew_items) LinearLayout crewItems; @BindView(R.id.costume_makeup_header) LinearLayout costumeMakeupHeader; @BindView(R.id.costume_makeup_items) LinearLayout costumeMakeupItems; @BindView(R.id.directing_header) LinearLayout directingHeader; @BindView(R.id.directing_items) LinearLayout directingItems; @BindView(R.id.writing_header) LinearLayout writingHeader; @BindView(R.id.writing_items) LinearLayout writingItems; @BindView(R.id.sound_header) LinearLayout soundHeader; @BindView(R.id.sound_items) LinearLayout soundItems; @BindView(R.id.camera_header) LinearLayout cameraHeader; @BindView(R.id.camera_items) LinearLayout cameraItems; @BindView(R.id.viewOnTrakt) View viewOnTrakt; private NavigationListener navigationListener; public static String getTag(long personId) { return TAG + "/" + personId + "/" + Ids.newId(); } public static Bundle getArgs(long personId) { Bundle args = new Bundle(); args.putLong(ARG_PERSON_ID, personId); return args; } @Override public void onAttach(Activity activity) { super.onAttach(activity); navigationListener = (NavigationListener) activity; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); CathodeApp.inject(getActivity(), this); Bundle args = getArguments(); personId = args.getLong(ARG_PERSON_ID); itemCount = getResources().getInteger(R.integer.personCreditColumns); getLoaderManager().initLoader(LOADER_PERSON, null, personLoader); } @Override public void onRefresh() { personScheduler.sync(personId, onDoneListener); } private Job.OnDoneListener onDoneListener = new Job.OnDoneListener() { @Override public void onDone(Job job) { setRefreshing(false); } }; @Override protected View createView(LayoutInflater inflater, ViewGroup container, Bundle inState) { return inflater.inflate(R.layout.fragment_person, container, false); } @Override public void onViewCreated(View view, Bundle inState) { super.onViewCreated(view, inState); updateView(person); } @OnClick(R.id.cast_header) void onDisplayCastCredits() { navigationListener.onDisplayPersonCredit(personId, Department.CAST); } @OnClick(R.id.production_header) void onDisplayProductionCredits() { navigationListener.onDisplayPersonCredit(personId, Department.PRODUCTION); } @OnClick(R.id.art_header) void onDisplayArtCredits() { navigationListener.onDisplayPersonCredit(personId, Department.ART); } @OnClick(R.id.crew_header) void onDisplayCrewCredits() { navigationListener.onDisplayPersonCredit(personId, Department.CREW); } @OnClick(R.id.costume_makeup_header) void onDisplayCostumeMakeUpCredits() { navigationListener.onDisplayPersonCredit(personId, Department.COSTUME_AND_MAKEUP); } @OnClick(R.id.directing_header) void onDisplayDirectingCredits() { navigationListener.onDisplayPersonCredit(personId, Department.DIRECTING); } @OnClick(R.id.writing_header) void onDisplayWritingCredits() { navigationListener.onDisplayPersonCredit(personId, Department.WRITING); } @OnClick(R.id.sound_header) void onDisplaySoundCredits() { navigationListener.onDisplayPersonCredit(personId, Department.SOUND); } @OnClick(R.id.camera_header) void onDisplayCameraCredits() { navigationListener.onDisplayPersonCredit(personId, Department.CAMERA); } private void updateView(final Person person) { this.person = person; if (person != null && getView() != null) { setTitle(person.getName()); setBackdrop(person.getScreenshot()); headshot.setImage(person.getHeadshot()); if (!TextUtils.isEmpty(person.getBirthday())) { bornTitle.setVisibility(View.VISIBLE); birthday.setVisibility(View.VISIBLE); birthplace.setVisibility(View.VISIBLE); birthday.setText(person.getBirthday()); birthplace.setText(person.getBirthplace()); } else { bornTitle.setVisibility(View.GONE); birthday.setVisibility(View.GONE); birthplace.setVisibility(View.GONE); } if (!TextUtils.isEmpty(person.getDeath())) { deathTitle.setVisibility(View.VISIBLE); death.setVisibility(View.VISIBLE); death.setText(person.getDeath()); } else { deathTitle.setVisibility(View.GONE); death.setVisibility(View.GONE); } biography.setText(person.getBiography()); updateItems(castHeader, castItems, person.getCredits().getCast()); updateItems(productionHeader, productionItems, person.getCredits().getProduction()); updateItems(artHeader, artItems, person.getCredits().getArt()); updateItems(crewHeader, crewItems, person.getCredits().getCrew()); updateItems(costumeMakeupHeader, costumeMakeupItems, person.getCredits().getCostumeAndMakeUp()); updateItems(directingHeader, directingItems, person.getCredits().getDirecting()); updateItems(writingHeader, writingItems, person.getCredits().getWriting()); updateItems(soundHeader, soundItems, person.getCredits().getSound()); updateItems(cameraHeader, cameraItems, person.getCredits().getCamera()); viewOnTrakt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intents.openUrl(getContext(), TraktUtils.getTraktPersonUrl(person.getTraktId())); } }); if (TraktTimestamps.shouldSyncPerson(person.getLastSync())) { personScheduler.sync(personId); } } } private void updateItems(View header, ViewGroup items, List<PersonCredit> credits) { items.removeAllViews(); final int size = credits != null ? credits.size() : 0; if (size > 0) { header.setVisibility(View.VISIBLE); items.setVisibility(View.VISIBLE); for (int i = 0; i < size && i < itemCount; i++) { final PersonCredit credit = credits.get(i); View view = LayoutInflater.from(getContext()).inflate(R.layout.person_item_credit, items, false); RemoteImageView poster = ButterKnife.findById(view, R.id.poster); TextView title = ButterKnife.findById(view, R.id.title); TextView job = ButterKnife.findById(view, R.id.job); poster.setImage(credit.getPoster()); title.setText(credit.getTitle()); if (credit.getJob() != null) { job.setText(credit.getJob()); } else { job.setText(credit.getCharacter()); } view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (credit.getItemType() == ItemType.SHOW) { navigationListener.onDisplayShow(credit.getItemId(), credit.getTitle(), credit.getOverview(), LibraryType.WATCHED); } else { navigationListener.onDisplayMovie(credit.getItemId(), credit.getTitle(), credit.getOverview()); } } }); items.addView(view); } } else { header.setVisibility(View.GONE); items.setVisibility(View.GONE); } } private LoaderManager.LoaderCallbacks<Person> personLoader = new LoaderManager.LoaderCallbacks<Person>() { @Override public Loader<Person> onCreateLoader(int id, Bundle args) { return new PersonLoader(getContext(), personId); } @Override public void onLoadFinished(Loader<Person> loader, Person data) { updateView(data); } @Override public void onLoaderReset(Loader<Person> loader) { } }; }