package com.boardgamegeek.ui; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.ContentLoadingProgressBar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.model.GeekListItem; import com.boardgamegeek.provider.BggContract; import com.boardgamegeek.ui.model.GeekList; import com.boardgamegeek.util.ActivityUtils; import com.boardgamegeek.util.AnimationUtils; import com.boardgamegeek.util.ImageUtils; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import hugo.weaving.DebugLog; import timber.log.Timber; public class GeekListItemsFragment extends Fragment { private GeekListRecyclerViewAdapter adapter; Unbinder unbinder; @BindView(android.R.id.progress) ContentLoadingProgressBar progressView; @BindView(android.R.id.empty) TextView emptyView; @BindView(android.R.id.list) RecyclerView recyclerView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_thread, container, false); unbinder = ButterKnife.bind(this, rootView); setUpRecyclerView(); return rootView; } @Override public void onDestroy() { super.onDestroy(); if (unbinder != null) unbinder.unbind(); } @DebugLog private void setUpRecyclerView() { recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); recyclerView.setHasFixedSize(true); } public void setData(GeekList geekList, List<GeekListItem> geekListItems) { if (geekList == null || geekListItems == null) return; if (adapter == null) { adapter = new GeekListRecyclerViewAdapter(getActivity(), geekList, geekListItems); recyclerView.setAdapter(adapter); } AnimationUtils.fadeIn(recyclerView, isResumed()); progressView.hide(); } public void setError() { setError(getString(R.string.empty_geeklist)); } public void setError(String message) { emptyView.setText(message); AnimationUtils.fadeIn(emptyView, isResumed()); progressView.hide(); } public static class GeekListRecyclerViewAdapter extends RecyclerView.Adapter<GeekListRecyclerViewAdapter.GeekListViewHolder> { private final LayoutInflater inflater; private final GeekList geekList; private final List<GeekListItem> geekListItems; public GeekListRecyclerViewAdapter(Context context, GeekList geekList, List<GeekListItem> geekListItems) { inflater = LayoutInflater.from(context); this.geekList = geekList; this.geekListItems = geekListItems; setHasStableIds(true); } @Override public int getItemCount() { return geekListItems == null ? 0 : geekListItems.size(); } @Override public long getItemId(int position) { return position; } @Override public GeekListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = inflater.inflate(R.layout.row_geeklist_item, parent, false); return new GeekListItemViewHolder(itemView); } @Override public void onBindViewHolder(GeekListViewHolder holder, int position) { try { GeekListItem item = geekListItems.get(position); ((GeekListItemViewHolder) holder).bind(item, position + 1); } catch (ArrayIndexOutOfBoundsException e) { Timber.w(e, "Didn't find a GeekList item as expected"); } } public abstract class GeekListViewHolder extends RecyclerView.ViewHolder { public GeekListViewHolder(View itemView) { super(itemView); } } public class GeekListItemViewHolder extends GeekListViewHolder { @BindView(R.id.order) TextView orderView; @BindView(R.id.thumbnail) ImageView thumbnailView; @BindView(R.id.game_name) TextView itemNameView; @BindView(R.id.username) TextView usernameView; public GeekListItemViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } public void bind(final GeekListItem item, final int order) { if (item == null) return; final Context context = itemView.getContext(); orderView.setText(String.valueOf(order)); ImageUtils.loadThumbnail(item.imageId(), thumbnailView); itemNameView.setText(item.getObjectName()); if (item.getUsername().equals(geekList.username())) { usernameView.setVisibility(View.GONE); } else { usernameView.setText(item.getUsername()); usernameView.setVisibility(View.VISIBLE); } itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (item.getObjectId() != BggContract.INVALID_ID) { Intent intent = new Intent(context, GeekListItemActivity.class); intent.putExtra(ActivityUtils.KEY_ID, geekList.id()); intent.putExtra(ActivityUtils.KEY_TITLE, geekList.title()); intent.putExtra(ActivityUtils.KEY_ORDER, order); intent.putExtra(ActivityUtils.KEY_NAME, item.getObjectName()); if (item.getObjectTypeResId() != GeekListItem.INVALID_OBJECT_TYPE_RES_ID) { intent.putExtra(ActivityUtils.KEY_TYPE, context.getString(item.getObjectTypeResId())); } intent.putExtra(ActivityUtils.KEY_IMAGE_ID, item.imageId()); intent.putExtra(ActivityUtils.KEY_USERNAME, item.getUsername()); intent.putExtra(ActivityUtils.KEY_THUMBS, item.getThumbCount()); intent.putExtra(ActivityUtils.KEY_POSTED_DATE, item.getPostDate()); intent.putExtra(ActivityUtils.KEY_EDITED_DATE, item.getEditDate()); intent.putExtra(ActivityUtils.KEY_BODY, item.getBody()); intent.putExtra(ActivityUtils.KEY_OBJECT_URL, item.getObjectUrl()); intent.putExtra(ActivityUtils.KEY_OBJECT_ID, item.getObjectId()); intent.putExtra(ActivityUtils.KEY_IS_BOARD_GAME, item.isBoardGame()); intent.putParcelableArrayListExtra(ActivityUtils.KEY_COMMENTS, item.getComments()); context.startActivity(intent); } } }); } } } }