package com.kickstarter.ui.fragments; import android.content.Intent; 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.kickstarter.R; import com.kickstarter.libs.ActivityRequestCodes; import com.kickstarter.libs.BaseFragment; import com.kickstarter.libs.RecyclerViewPaginator; import com.kickstarter.libs.RefTag; import com.kickstarter.libs.qualifiers.RequiresFragmentViewModel; import com.kickstarter.models.Activity; import com.kickstarter.models.Category; import com.kickstarter.models.Project; import com.kickstarter.services.DiscoveryParams; import com.kickstarter.ui.ArgumentsKey; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.activities.ActivityFeedActivity; import com.kickstarter.ui.activities.LoginToutActivity; import com.kickstarter.ui.activities.ProjectActivity; import com.kickstarter.ui.activities.WebViewActivity; import com.kickstarter.ui.adapters.DiscoveryAdapter; import com.kickstarter.ui.data.LoginReason; import com.kickstarter.viewmodels.DiscoveryFragmentViewModel; import java.util.List; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; import static com.kickstarter.libs.utils.TransitionUtils.slideInFromRight; import static com.kickstarter.libs.utils.TransitionUtils.transition; @RequiresFragmentViewModel(DiscoveryFragmentViewModel.class) public final class DiscoveryFragment extends BaseFragment<DiscoveryFragmentViewModel> { private RecyclerView recyclerView; private RecyclerViewPaginator recyclerViewPaginator; public DiscoveryFragment() {} public static @NonNull DiscoveryFragment newInstance(final int position) { final DiscoveryFragment fragment = new DiscoveryFragment(); final Bundle bundle = new Bundle(); bundle.putInt(ArgumentsKey.DISCOVERY_SORT_POSITION, position); fragment.setArguments(bundle); return fragment; } @Override public @Nullable View onCreateView(final @NonNull LayoutInflater inflater, final @Nullable ViewGroup container, final @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); recyclerView = (RecyclerView) inflater.inflate(R.layout.discovery_recycler_view, container, false); final DiscoveryAdapter adapter = new DiscoveryAdapter(viewModel.inputs); recyclerView.setAdapter(adapter); final LinearLayoutManager layoutManager = new LinearLayoutManager(recyclerView.getContext()); recyclerView.setLayoutManager(layoutManager); recyclerViewPaginator = new RecyclerViewPaginator(recyclerView, viewModel.inputs::nextPage); viewModel.outputs.activity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(adapter::takeActivity); viewModel.outputs.projects() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(adapter::takeProjects); viewModel.outputs.shouldShowOnboardingView() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(adapter::setShouldShowOnboardingView); viewModel.outputs.showActivityFeed() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> startActivityFeedActivity()); viewModel.outputs.showActivityUpdate() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::startActivityUpdateActivity); viewModel.outputs.showProject() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(projectAndRefTag -> this.startProjectActivity(projectAndRefTag.first, projectAndRefTag.second)); viewModel.outputs.showLoginTout() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.startLoginToutActivity()); return recyclerView; } @Override public void onDetach() { super.onDetach(); if (recyclerView != null) { recyclerView.setAdapter(null); } if (recyclerViewPaginator != null) { recyclerViewPaginator.stop(); } } public boolean isInstantiated() { return this.recyclerView != null; } private void startActivityUpdateActivity(final @NonNull Activity activity) { final Intent intent = new Intent(getActivity(), WebViewActivity.class) .putExtra(IntentKey.URL, activity.projectUpdateUrl()); startActivity(intent); transition(getActivity(), slideInFromRight()); } private void startActivityFeedActivity() { startActivity(new Intent(getActivity(), ActivityFeedActivity.class)); } private void startLoginToutActivity() { final Intent intent = new Intent(getActivity(), LoginToutActivity.class) .putExtra(IntentKey.LOGIN_REASON, LoginReason.DEFAULT); startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW); transition(getActivity(), slideInFromRight()); } private void startProjectActivity(final @NonNull Project project, final @NonNull RefTag refTag) { final Intent intent = new Intent(getActivity(), ProjectActivity.class) .putExtra(IntentKey.PROJECT, project) .putExtra(IntentKey.REF_TAG, refTag); startActivity(intent); transition(getActivity(), slideInFromRight()); } public void takeCategories(final @NonNull List<Category> categories) { viewModel.inputs.rootCategories(categories); } public void updateParams(final @NonNull DiscoveryParams params) { viewModel.inputs.paramsFromActivity(params); } public void clearPage() { viewModel.inputs.clearPage(); } }