package com.kickstarter.ui.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.kickstarter.KSApplication;
import com.kickstarter.R;
import com.kickstarter.libs.ActivityRequestCodes;
import com.kickstarter.libs.BaseActivity;
import com.kickstarter.libs.CurrentUserType;
import com.kickstarter.libs.RecyclerViewPaginator;
import com.kickstarter.libs.RefTag;
import com.kickstarter.libs.SwipeRefresher;
import com.kickstarter.libs.qualifiers.RequiresActivityViewModel;
import com.kickstarter.libs.utils.ApplicationUtils;
import com.kickstarter.libs.utils.ObjectUtils;
import com.kickstarter.models.Activity;
import com.kickstarter.models.Project;
import com.kickstarter.models.SurveyResponse;
import com.kickstarter.ui.IntentKey;
import com.kickstarter.ui.adapters.ActivityFeedAdapter;
import com.kickstarter.ui.data.LoginReason;
import com.kickstarter.viewmodels.ActivityFeedViewModel;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI;
@RequiresActivityViewModel(ActivityFeedViewModel.ViewModel.class)
public final class ActivityFeedActivity extends BaseActivity<ActivityFeedViewModel.ViewModel> {
private ActivityFeedAdapter adapter;
protected @Bind(R.id.recycler_view) RecyclerView recyclerView;
protected @Bind(R.id.activity_feed_swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout;
@Inject CurrentUserType currentUser;
private RecyclerViewPaginator recyclerViewPaginator;
private SwipeRefresher swipeRefresher;
@Override
protected void onCreate(final @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((KSApplication) getApplication()).component().inject(this);
setContentView(R.layout.activity_feed_layout);
ButterKnife.bind(this);
adapter = new ActivityFeedAdapter(viewModel.inputs);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerViewPaginator = new RecyclerViewPaginator(recyclerView, viewModel.inputs::nextPage);
swipeRefresher = new SwipeRefresher(this, swipeRefreshLayout, viewModel.inputs::refresh, viewModel.outputs::isFetchingActivities);
// Only allow refreshing if there's a current user
currentUser.observable()
.map(ObjectUtils::isNotNull)
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(swipeRefreshLayout::setEnabled);
viewModel.outputs.activities()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::showActivities);
viewModel.outputs.goToDiscovery()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(__ -> resumeDiscoveryActivity());
viewModel.outputs.goToLogin()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(__ -> startActivityFeedLogin());
viewModel.outputs.goToProject()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::startProjectActivity);
viewModel.outputs.goToProjectUpdate()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::startProjectUpdateActivity);
/*viewModel.outputs.goToSurvey()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::startSurveyWebView);*/
viewModel.outputs.loggedOutEmptyStateIsVisible()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(adapter::showLoggedOutEmptyState);
viewModel.outputs.loggedInEmptyStateIsVisible()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(adapter::showLoggedInEmptyState);
viewModel.outputs.surveys()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::showSurveys);
}
@Override
protected void onResume() {
super.onResume();
viewModel.inputs.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
recyclerViewPaginator.stop();
recyclerView.setAdapter(null);
}
private void showActivities(final @NonNull List<Activity> activities) {
adapter.takeActivities(activities);
}
private void showSurveys(final @NonNull List<SurveyResponse> surveyResponses) {
adapter.takeSurveys(surveyResponses);
}
private void resumeDiscoveryActivity() {
ApplicationUtils.resumeDiscoveryActivity(this);
}
private void startActivityFeedLogin() {
final Intent intent = new Intent(this, LoginToutActivity.class)
.putExtra(IntentKey.LOGIN_REASON, LoginReason.ACTIVITY_FEED);
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW);
}
private void startProjectActivity(final @NonNull Project project) {
final Intent intent = new Intent(this, ProjectActivity.class)
.putExtra(IntentKey.PROJECT, project)
.putExtra(IntentKey.REF_TAG, RefTag.activity());
startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left);
}
private void startProjectUpdateActivity(final @NonNull Activity activity) {
final Intent intent = new Intent(this, WebViewActivity.class)
.putExtra(IntentKey.URL, activity.projectUpdateUrl());
startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left);
}
// private void startSurveyWebView(final @NonNull SurveyResponse surveyResponse) {
// try {
// final Intent intent = new Intent(this, WebViewActivity.class)
// .putExtra(IntentKey.URL, surveyResponse.urls().web().survey());
// startActivityWithTransition(intent, R.anim.slide_in_bottom, R.anim.com_mixpanel_android_slide_down);
// } catch (final NullPointerException npe) {
// npe.printStackTrace();
// Timber.e("Missing url for survey!");
// // missing a url to go to for the survey
// }
// }
}