/* * 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.credits; 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.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.jobqueue.Job; import net.simonvt.cathode.scheduler.MovieTaskScheduler; import net.simonvt.cathode.scheduler.PersonTaskScheduler; import net.simonvt.cathode.scheduler.ShowTaskScheduler; import net.simonvt.cathode.ui.NavigationListener; import net.simonvt.cathode.ui.fragment.RefreshableToolbarFragment; import net.simonvt.cathode.util.Ids; import net.simonvt.cathode.widget.RemoteImageView; public class CreditsFragment extends RefreshableToolbarFragment { private static final String TAG = "net.simonvt.cathode.ui.credits.CreditsFragment"; private static final String ARG_TYPE = "net.simonvt.cathode.ui.credits.CreditsFragment.itemType"; private static final String ARG_ITEM_ID = "net.simonvt.cathode.ui.credits.CreditsFragment.itemId"; private static final String ARG_TITLE = "net.simonvt.cathode.ui.credits.CreditsFragment.title"; private static final int LOADER_CREDITS = 1; @Inject ShowTaskScheduler showScheduler; @Inject MovieTaskScheduler movieScheduler; @Inject PersonTaskScheduler personScheduler; private NavigationListener navigationListener; private ItemType itemType; private long itemId; private String title; private Credits credits; private int itemCount; @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; public static String getTag(long itemId) { return TAG + "/" + itemId + "/" + Ids.newId(); } public static Bundle getArgs(ItemType itemType, long itemId, String title) { Bundle args = new Bundle(); args.putSerializable(ARG_TYPE, itemType); args.putLong(ARG_ITEM_ID, itemId); args.putString(ARG_TITLE, title); 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(getContext(), this); Bundle args = getArguments(); itemId = args.getLong(ARG_ITEM_ID); title = args.getString(ARG_TITLE); itemType = (ItemType) args.getSerializable(ARG_TYPE); setTitle(title); itemCount = getResources().getInteger(R.integer.creditColumns); getLoaderManager().initLoader(LOADER_CREDITS, null, creditsLoader); } @Override public void onRefresh() { if (itemType == ItemType.SHOW) { showScheduler.syncCredits(itemId, onDoneListener); } else { movieScheduler.syncCredits(itemId, 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_credits, container, false); } @Override public void onViewCreated(View view, Bundle inState) { super.onViewCreated(view, inState); updateView(credits); } @OnClick(R.id.cast_header) void onDisplayCastCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.CAST); } @OnClick(R.id.production_header) void onDisplayProductionCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.PRODUCTION); } @OnClick(R.id.art_header) void onDisplayArtCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.ART); } @OnClick(R.id.crew_header) void onDisplayCrewCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.CREW); } @OnClick(R.id.costume_makeup_header) void onDisplayCostumeMakeUpCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.COSTUME_AND_MAKEUP); } @OnClick(R.id.directing_header) void onDisplayDirectingCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.DIRECTING); } @OnClick(R.id.writing_header) void onDisplayWritingCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.WRITING); } @OnClick(R.id.sound_header) void onDisplaySoundCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.SOUND); } @OnClick(R.id.camera_header) void onDisplayCameraCredits() { navigationListener.onDisplayCredit(itemType, itemId, Department.CAMERA); } private void updateView(Credits credits) { this.credits = credits; if (credits != null && getView() != null) { updateItems(castHeader, castItems, credits.getCast()); updateItems(productionHeader, productionItems, credits.getProduction()); updateItems(artHeader, artItems, credits.getArt()); updateItems(crewHeader, crewItems, credits.getCrew()); updateItems(costumeMakeupHeader, costumeMakeupItems, credits.getCostumeAndMakeUp()); updateItems(directingHeader, directingItems, credits.getDirecting()); updateItems(writingHeader, writingItems, credits.getWriting()); updateItems(soundHeader, soundItems, credits.getSound()); updateItems(cameraHeader, cameraItems, credits.getCamera()); } } private void updateItems(View header, ViewGroup items, List<Credit> 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 Credit credit = credits.get(i); View view = LayoutInflater.from(getContext()).inflate(R.layout.credit_item_credit, items, false); RemoteImageView headshot = ButterKnife.findById(view, R.id.headshot); TextView name = ButterKnife.findById(view, R.id.name); TextView job = ButterKnife.findById(view, R.id.job); headshot.setImage(credit.getHeadshot()); name.setText(credit.getName()); if (credit.getJob() != null) { job.setText(credit.getJob()); } else { job.setText(credit.getCharacter()); } view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { navigationListener.onDisplayPerson(credit.getPersonId()); } }); items.addView(view); } } else { header.setVisibility(View.GONE); items.setVisibility(View.GONE); } } private LoaderManager.LoaderCallbacks<Credits> creditsLoader = new LoaderManager.LoaderCallbacks<Credits>() { @Override public Loader<Credits> onCreateLoader(int id, Bundle args) { return new CreditsLoader(getContext(), itemType, itemId); } @Override public void onLoadFinished(Loader<Credits> loader, Credits data) { updateView(data); } @Override public void onLoaderReset(Loader<Credits> loader) { } }; }