package com.kickstarter.ui.activities; 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.util.Pair; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.jakewharton.rxbinding.view.RxView; import com.kickstarter.R; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.Environment; import com.kickstarter.libs.KSString; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.transformations.CircleTransformation; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.Backing; import com.kickstarter.ui.adapters.RewardsItemAdapter; import com.kickstarter.viewmodels.ViewPledgeViewModel; import com.squareup.picasso.Picasso; import butterknife.Bind; import butterknife.BindString; import butterknife.ButterKnife; import static com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft; import static rx.android.schedulers.AndroidSchedulers.mainThread; @RequiresActivityViewModel(ViewPledgeViewModel.class) public final class ViewPledgeActivity extends BaseActivity<ViewPledgeViewModel> { protected @Bind(R.id.view_pledge_avatar_image_view) ImageView avatarImageView; protected @Bind(R.id.view_pledge_backer_name) TextView backerNameTextView; protected @Bind(R.id.view_pledge_backer_number) TextView backerNumberTextView; protected @Bind(R.id.view_pledge_backing_amount_and_date_text_view) TextView backingAmountAndDateTextView; protected @Bind(R.id.view_pledge_backing_status) TextView backingStatusTextView; protected @Bind(R.id.project_context_creator_name) TextView projectContextCreatorNameTextView; protected @Bind(R.id.project_context_image_view) ImageView projectContextPhotoImageView; protected @Bind(R.id.project_context_project_name) TextView projectContextProjectNameTextView; protected @Bind(R.id.project_context_view) View projectContextView; protected @Bind(R.id.view_pledge_reward_minimum_and_description) TextView rewardMinimumAndDescriptionTextView; protected @Bind(R.id.view_pledge_rewards_item_recycler_view) RecyclerView rewardsItemRecyclerView; protected @Bind(R.id.view_pledge_rewards_item_section) View rewardsItemSection; protected @Bind(R.id.view_pledge_shipping_amount) TextView shippingAmountTextView; protected @Bind(R.id.view_pledge_shipping_location) TextView shippingLocationTextView; protected @Bind(R.id.view_pledge_shipping_section) View shippingSection; protected @BindString(R.string.backer_modal_backer_number) String backerNumberString; protected @BindString(R.string.backer_modal_status_backing_status) String backingStatusString; protected @BindString(R.string.backer_modal_pledge_amount_on_pledge_date) String pledgeAmountPledgeDateString; protected @BindString(R.string.backer_modal_reward_amount_reward_description) String rewardAmountRewardDescriptionString; protected @BindString(R.string.project_creator_by_creator) String creatorNameString; protected @BindString(R.string.project_view_pledge_status_canceled) String statusCanceled; protected @BindString(R.string.project_view_pledge_status_collected) String statusCollected; protected @BindString(R.string.project_view_pledge_status_dropped) String statusDropped; protected @BindString(R.string.project_view_pledge_status_errored) String statusErrored; protected @BindString(R.string.project_view_pledge_status_pledged) String statusPledged; private KSString ksString; @Override public void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_pledge_layout); ButterKnife.bind(this); final RewardsItemAdapter rewardsItemAdapter = new RewardsItemAdapter(); rewardsItemRecyclerView.setAdapter(rewardsItemAdapter); final LinearLayoutManager layoutManager = new LinearLayoutManager(this); rewardsItemRecyclerView.setLayoutManager(layoutManager); final Environment environment = environment(); ksString = environment.ksString(); RxView.clicks(projectContextView) .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(__ -> viewModel.inputs.projectClicked()); viewModel.outputs.backerNameTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(backerNameTextView::setText); viewModel.outputs.backerNumberTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(this::setBackerNumberTextViewText); viewModel.outputs.backingAmountAndDateTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(ad -> setBackingAmountAndDateTextViewText(ad.first, ad.second)); viewModel.outputs.backingStatus() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(this::setBackingStatusTextViewText); viewModel.outputs.creatorNameTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(this::setCreatorNameTextViewText); viewModel.outputs.goBack() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(__ -> back()); viewModel.outputs.loadBackerAvatar() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(this::loadBackerAvatar); viewModel.outputs.loadProjectPhoto() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(url -> Picasso.with(this).load(url).into(projectContextPhotoImageView)); viewModel.outputs.projectNameTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(projectContextProjectNameTextView::setText); viewModel.outputs.rewardsItems() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(rewardsItemAdapter::rewardsItems); viewModel.outputs.rewardsItemsAreHidden() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(ViewUtils.setGone(rewardsItemSection)); viewModel.outputs.rewardMinimumAndDescriptionTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(md -> setRewardMinimumAndDescriptionTextViewText(md.first, md.second)); viewModel.outputs.shippingAmountTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(shippingAmountTextView::setText); viewModel.outputs.shippingLocationTextViewText() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(shippingLocationTextView::setText); viewModel.outputs.shippingSectionIsHidden() .compose(bindToLifecycle()) .observeOn(mainThread()) .subscribe(ViewUtils.setGone(shippingSection)); } private void loadBackerAvatar(final @NonNull String url) { Picasso.with(this).load(url) .transform(new CircleTransformation()) .into(avatarImageView); } private void setBackingAmountAndDateTextViewText(final @NonNull String amount, final @NonNull String date) { backingAmountAndDateTextView.setText(ksString.format( pledgeAmountPledgeDateString, "pledge_amount", amount, "pledge_date", date )); } private void setBackerNumberTextViewText(final @NonNull String sequence) { backerNumberTextView.setText(ksString.format( backerNumberString, "backer_number", sequence )); } private void setBackingStatusTextViewText(final @NonNull String status) { final String str; switch (status) { case Backing.STATUS_CANCELED: str = statusCanceled; break; case Backing.STATUS_COLLECTED: str = statusCollected; break; case Backing.STATUS_DROPPED: str = statusDropped; break; case Backing.STATUS_ERRORED: str = statusErrored; break; case Backing.STATUS_PLEDGED: str = statusPledged; break; default: str = ""; } backingStatusTextView.setText(ksString.format( backingStatusString, "backing_status", str )); } private void setCreatorNameTextViewText(final @NonNull String name) { projectContextCreatorNameTextView.setText(ksString.format( creatorNameString, "creator_name", name )); } private void setRewardMinimumAndDescriptionTextViewText(final @NonNull String minimum, final @NonNull String description) { rewardMinimumAndDescriptionTextView.setText(ksString.format( rewardAmountRewardDescriptionString, "reward_amount", minimum, "reward_description", description )); } @Override protected @Nullable Pair<Integer, Integer> exitTransition() { return slideInFromLeft(); } }