package com.kickstarter.ui.activities; import android.annotation.TargetApi; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.kickstarter.R; import com.kickstarter.libs.ApiCapabilities; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.RecyclerViewPaginator; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.transformations.CircleTransformation; import com.kickstarter.libs.utils.ApplicationUtils; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.Project; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.adapters.ProfileAdapter; import com.kickstarter.ui.views.IconButton; import com.kickstarter.viewmodels.ProfileViewModel; import com.squareup.picasso.Picasso; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; @RequiresActivityViewModel(ProfileViewModel.ViewModel.class) public final class ProfileActivity extends BaseActivity<ProfileViewModel.ViewModel> { private ProfileAdapter adapter; private RecyclerViewPaginator paginator; protected @Bind(R.id.avatar_image_view) ImageView avatarImageView; protected @Bind(R.id.backed_count_text_view) TextView backedCountTextView; protected @Bind(R.id.backed_text_view) TextView backedTextView; protected @Bind(R.id.created_count_text_view) TextView createdCountTextView; protected @Bind(R.id.created_text_view) TextView createdTextView; protected @Bind(R.id.divider_view) View dividerView; protected @Bind(R.id.messages_button) IconButton messagesButton; protected @Bind(R.id.recycler_view) RecyclerView recyclerView; protected @Bind(R.id.user_name_text_view) TextView userNameTextView; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.profile_layout); ButterKnife.bind(this); this.adapter = new ProfileAdapter(viewModel); final int spanCount = ViewUtils.isLandscape(this) ? 3 : 2; this.recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount)); this.recyclerView.setAdapter(this.adapter); this.paginator = new RecyclerViewPaginator(this.recyclerView, this.viewModel.inputs::nextPage); this.viewModel.outputs.avatarImageViewUrl() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(url -> Picasso.with(this).load(url).transform(new CircleTransformation()).into(this.avatarImageView)); this.viewModel.outputs.backedCountTextViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.backedCountTextView)); this.viewModel.outputs.backedCountTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.backedCountTextView::setText); this.viewModel.outputs.backedTextViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.backedTextView)); this.viewModel.outputs.createdCountTextViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.createdCountTextView)); this.viewModel.outputs.createdCountTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.createdCountTextView::setText); this.viewModel.outputs.createdTextViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.createdTextView)); this.viewModel.outputs.dividerViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.dividerView)); this.viewModel.outputs.messagesButtonHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.messagesButton)); this.viewModel.outputs.projects() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::loadProjects); this.viewModel.outputs.resumeDiscoveryActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> resumeDiscoveryActivity()); this.viewModel.outputs.startMessageThreadsActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.startMessageThreadsActivity()); this.viewModel.outputs.startProjectActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::startProjectActivity); this.viewModel.outputs.userNameTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.userNameTextView::setText); } @Override protected void onDestroy() { super.onDestroy(); this.paginator.stop(); this.recyclerView.setAdapter(null); } @OnClick(R.id.messages_button) public void messagesButtonClicked() { this.viewModel.inputs.messsagesButtonClicked(); } private void loadProjects(final @NonNull List<Project> projects) { if (projects.size() == 0) { this.recyclerView.setLayoutManager(new LinearLayoutManager(this)); this.recyclerView.setPadding( 0, this.recyclerView.getPaddingTop(), this.recyclerView.getPaddingRight(), this.recyclerView.getPaddingBottom() ); if (ViewUtils.isPortrait(this)) { disableNestedScrolling(); } } this.adapter.takeProjects(projects); } @TargetApi(21) private void disableNestedScrolling() { if (ApiCapabilities.canSetNestingScrollingEnabled()) { this.recyclerView.setNestedScrollingEnabled(false); } } private void resumeDiscoveryActivity() { ApplicationUtils.resumeDiscoveryActivity(this); } private void startMessageThreadsActivity() { final Intent intent = new Intent(this, MessageThreadsActivity.class); startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } private void startProjectActivity(final @NonNull Project project) { final Intent intent = new Intent(this, ProjectActivity.class) .putExtra(IntentKey.PROJECT, project); startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } }