package com.boardgamegeek.ui; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.widget.ContentLoadingProgressBar; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.io.Adapter; import com.boardgamegeek.io.BggService; import com.boardgamegeek.model.Forum; import com.boardgamegeek.model.ForumListResponse; import com.boardgamegeek.provider.BggContract; import com.boardgamegeek.provider.BggContract.Games; import com.boardgamegeek.ui.adapter.ForumsRecyclerViewAdapter; import com.boardgamegeek.ui.loader.BggLoader; import com.boardgamegeek.ui.loader.SafeResponse; import com.boardgamegeek.util.ActivityUtils; import com.boardgamegeek.util.AnimationUtils; import com.boardgamegeek.util.UIUtils; import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import hugo.weaving.DebugLog; import retrofit2.Call; public class ForumsFragment extends Fragment implements LoaderManager.LoaderCallbacks<SafeResponse<ForumListResponse>> { private static final int LOADER_ID = 0; private int gameId; private String gameName; private ForumsRecyclerViewAdapter 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 @DebugLog public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent intent = UIUtils.fragmentArgumentsToIntent(getArguments()); Uri uri = intent.getData(); gameId = Games.getGameId(uri); gameName = intent.getStringExtra(ActivityUtils.KEY_GAME_NAME); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_forums, container, false); unbinder = ButterKnife.bind(this, rootView); setUpRecyclerView(); return rootView; } @Override @DebugLog public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(LOADER_ID, null, this); } @Override public void onDestroyView() { unbinder.unbind(); super.onDestroyView(); } @Override @DebugLog public Loader<SafeResponse<ForumListResponse>> onCreateLoader(int id, Bundle data) { return new ForumsLoader(getActivity(), gameId); } @Override @DebugLog public void onLoadFinished(Loader<SafeResponse<ForumListResponse>> loader, SafeResponse<ForumListResponse> data) { if (getActivity() == null) { return; } if (adapter == null) { adapter = new ForumsRecyclerViewAdapter(getActivity(), data.getBody() == null ? new ArrayList<Forum>() : data.getBody().getForums(), gameId, gameName); recyclerView.setAdapter(adapter); } if (data.hasError()) { emptyView.setText(data.getErrorMessage()); AnimationUtils.fadeIn(getActivity(), emptyView, isResumed()); } else { if (adapter.getItemCount() == 0) { AnimationUtils.fadeIn(getActivity(), emptyView, isResumed()); } else { AnimationUtils.fadeIn(getActivity(), recyclerView, isResumed()); } } progressView.hide(); } @Override @DebugLog public void onLoaderReset(Loader<SafeResponse<ForumListResponse>> loader) { } @DebugLog private void setUpRecyclerView() { final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL)); if (gameId == BggContract.INVALID_ID) { recyclerView.setPadding(recyclerView.getPaddingLeft(), 0, recyclerView.getRight(), recyclerView.getBottom()); } } private static class ForumsLoader extends BggLoader<SafeResponse<ForumListResponse>> { private final BggService bggService; private final int gameId; @DebugLog public ForumsLoader(Context context, int gameId) { super(context); bggService = Adapter.createForXml(); this.gameId = gameId; } @Override @DebugLog public SafeResponse<ForumListResponse> loadInBackground() { Call<ForumListResponse> call; if (gameId == BggContract.INVALID_ID) { call = bggService.forumList(BggService.FORUM_TYPE_REGION, BggService.FORUM_REGION_BOARDGAME); } else { call = bggService.forumList(BggService.FORUM_TYPE_THING, gameId); } return new SafeResponse<>(call); } } }