package com.artemzin.qualitymatters.ui.fragments; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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 com.artemzin.qualitymatters.QualityMattersApp; import com.artemzin.qualitymatters.R; import com.artemzin.qualitymatters.api.entities.Item; import com.artemzin.qualitymatters.models.AnalyticsModel; import com.artemzin.qualitymatters.models.ItemsModel; import com.artemzin.qualitymatters.models.QualityMattersImageLoader; import com.artemzin.qualitymatters.performance.AnyThread; import com.artemzin.qualitymatters.performance.AsyncJobsObserver; import com.artemzin.qualitymatters.ui.adapters.ItemsAdapter; import com.artemzin.qualitymatters.ui.adapters.VerticalSpaceItemDecoration; import com.artemzin.qualitymatters.ui.presenters.ItemsPresenter; import com.artemzin.qualitymatters.ui.presenters.ItemsPresenterConfiguration; import com.artemzin.qualitymatters.ui.views.ItemsView; import java.util.List; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import dagger.Module; import dagger.Provides; import dagger.Subcomponent; import rx.schedulers.Schedulers; import static android.support.v7.widget.LinearLayoutManager.VERTICAL; import static android.view.View.GONE; import static android.view.View.VISIBLE; public class ItemsFragment extends BaseFragment implements ItemsView { @BindView(R.id.items_loading_ui) View loadingUiView; @BindView(R.id.items_loading_error_ui) View errorUiView; @BindView(R.id.items_content_ui) RecyclerView contentUiRecyclerView; ItemsAdapter itemsAdapter; @Inject ItemsPresenter itemsPresenter; @Inject QualityMattersImageLoader networkBitmapClient; @SuppressWarnings("NullableProblems") @NonNull private Unbinder unbinder; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); QualityMattersApp.get(getContext()).applicationComponent().plus(new ItemsFragmentModule()).inject(this); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_items, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { unbinder = ButterKnife.bind(this, view); contentUiRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), VERTICAL, false)); contentUiRecyclerView.addItemDecoration(new VerticalSpaceItemDecoration((int) getResources().getDimension(R.dimen.list_item_vertical_space_between_items))); itemsAdapter = new ItemsAdapter(getActivity().getLayoutInflater(), networkBitmapClient); contentUiRecyclerView.setAdapter(itemsAdapter); itemsPresenter.bindView(this); itemsPresenter.reloadData(); } @SuppressWarnings("ResourceType") // Lint does not understand that we shift execution on Main Thread. @Override @AnyThread public void showLoadingUi() { runOnUiThreadIfFragmentAlive(() -> { loadingUiView.setVisibility(VISIBLE); errorUiView.setVisibility(GONE); contentUiRecyclerView.setVisibility(GONE); }); } @SuppressWarnings("ResourceType") // Lint does not understand that we shift execution on Main Thread. @Override @AnyThread public void showErrorUi(@NonNull Throwable error) { runOnUiThreadIfFragmentAlive(() -> { loadingUiView.setVisibility(GONE); errorUiView.setVisibility(VISIBLE); contentUiRecyclerView.setVisibility(GONE); }); } @SuppressWarnings("ResourceType") // Lint does not understand that we shift execution on Main Thread. @Override @AnyThread public void showContentUi(@NonNull List<Item> items) { runOnUiThreadIfFragmentAlive(() -> { loadingUiView.setVisibility(GONE); errorUiView.setVisibility(GONE); contentUiRecyclerView.setVisibility(VISIBLE); if (itemsAdapter != null) { itemsAdapter.setData(items); } }); } @OnClick(R.id.items_loading_error_try_again_button) void onTryAgainButtonClick() { itemsPresenter.reloadData(); } @Override public void onDestroyView() { itemsPresenter.unbindView(this); if (unbinder != null) { unbinder.unbind(); } super.onDestroyView(); } @Subcomponent(modules = ItemsFragmentModule.class) public interface ItemsFragmentComponent { void inject(@NonNull ItemsFragment itemsFragment); } @Module public static class ItemsFragmentModule { @Provides @NonNull public ItemsPresenter provideItemsPresenter(@NonNull ItemsModel itemsModel, @NonNull AsyncJobsObserver asyncJobsObserver, @NonNull AnalyticsModel analyticsModel) { return new ItemsPresenter( ItemsPresenterConfiguration.builder().ioScheduler(Schedulers.io()).build(), itemsModel, asyncJobsObserver, analyticsModel ); } } }