package com.kickstarter.ui.activities; import android.content.Intent; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.util.Pair; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.facebook.share.model.ShareLinkContent; import com.facebook.share.model.ShareOpenGraphAction; import com.facebook.share.model.ShareOpenGraphContent; import com.facebook.share.model.ShareOpenGraphObject; import com.facebook.share.widget.ShareDialog; import com.jakewharton.rxbinding.view.RxView; import com.kickstarter.KSApplication; import com.kickstarter.R; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.KSString; import com.kickstarter.libs.RefTag; import com.kickstarter.libs.TweetComposer; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.utils.ApplicationUtils; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.Category; import com.kickstarter.models.Photo; import com.kickstarter.models.Project; import com.kickstarter.services.DiscoveryParams; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.adapters.ThanksAdapter; import com.kickstarter.viewmodels.ThanksViewModel; import java.util.List; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import butterknife.Bind; import butterknife.BindString; import butterknife.ButterKnife; import butterknife.OnClick; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static com.kickstarter.libs.rx.transformers.Transformers.ignoreValues; @RequiresActivityViewModel(ThanksViewModel.class) public final class ThanksActivity extends BaseActivity<ThanksViewModel> { protected @Inject KSString ksString; protected @Bind(R.id.backed_project) TextView backedProjectTextView; protected @Bind(R.id.recommended_projects_recycler_view) RecyclerView recommendedProjectsRecyclerView; protected @Bind(R.id.share_button) Button shareButton; protected @Bind(R.id.share_on_facebook_button) Button shareOnFacebookButton; protected @Bind(R.id.share_on_twitter_button) Button shareOnTwitterButton; protected @Bind(R.id.woohoo_background) ImageView woohooBackgroundImageView; protected @BindString(R.string.project_checkout_share_twitter_I_just_backed_project_on_kickstarter) String iJustBackedString; protected @BindString(R.string.project_accessibility_button_share_label) String shareThisProjectString; protected @BindString(R.string.project_checkout_games_alert_want_the_coolest_games_delivered_to_your_inbox) String gamesAlertMessage; protected @BindString(R.string.project_checkout_games_alert_no_thanks) String gamesAlertNo; protected @BindString(R.string.project_checkout_games_alert_yes_please) String gamesAlertYes; protected @BindString(R.string.general_alert_buttons_ok) String okString; protected @BindString(R.string.profile_settings_newsletter_games) String newsletterGamesString; protected @BindString(R.string.profile_settings_newsletter_opt_in_message) String optInMessageString; protected @BindString(R.string.profile_settings_newsletter_opt_in_title) String optInTitleString; protected @BindString(R.string.project_checkout_share_you_just_backed_project_share_this_project_html) String youJustBackedString; private ThanksAdapter adapter; private ShareDialog shareDialog; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.thanks_layout); ButterKnife.bind(this); ((KSApplication) getApplication()).component().inject(this); shareDialog = new ShareDialog(this); final LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recommendedProjectsRecyclerView.setLayoutManager(layoutManager); adapter = new ThanksAdapter(viewModel); recommendedProjectsRecyclerView.setAdapter(adapter); Observable.timer(500L, TimeUnit.MILLISECONDS, Schedulers.newThread()) .compose(ignoreValues()) .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> animateBackground()); RxView.clicks(shareButton) .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> viewModel.inputs.shareClick()); RxView.clicks(shareOnFacebookButton) .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> viewModel.inputs.shareOnFacebookClick()); RxView.clicks(shareOnTwitterButton) .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> viewModel.inputs.shareOnTwitterClick()); viewModel.outputs.projectName() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::showBackedProject); viewModel.outputs.showConfirmGamesNewsletterDialog() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> showConfirmGamesNewsletterDialog()); viewModel.outputs.showGamesNewsletterDialog() .compose(bindToLifecycle()) .take(1) .delay(700L, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> showGamesNewsletterDialog()); viewModel.outputs.showRatingDialog() .compose(bindToLifecycle()) .take(1) .delay(700L, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> showRatingDialog()); viewModel.outputs.showRecommendations() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::showRecommendations); viewModel.outputs.startDiscovery() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startDiscovery); viewModel.outputs.startProject() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startProject); viewModel.outputs.startShare() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startShare); viewModel.outputs.startShareOnFacebook() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startShareOnFacebook); viewModel.outputs.startShareOnTwitter() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startShareOnTwitter); } @Override protected void onDestroy() { super.onDestroy(); recommendedProjectsRecyclerView.setAdapter(null); } @OnClick(R.id.close_button) protected void closeButtonClick() { ApplicationUtils.resumeDiscoveryActivity(this); } private void animateBackground() { woohooBackgroundImageView.animate().setDuration(Long.parseLong(getString(R.string.woohoo_duration))).alpha(1); final Drawable drawable = woohooBackgroundImageView.getDrawable(); if (drawable instanceof Animatable) { ((Animatable) drawable).start(); } } private String shareString(final @NonNull Project project) { return ksString.format(iJustBackedString, "project_name", project.name()); } private void showBackedProject(final @NonNull String projectName) { backedProjectTextView.setText(Html.fromHtml(ksString.format(youJustBackedString, "project_name", projectName))); } private void showConfirmGamesNewsletterDialog() { final String optInDialogMessageString = ksString.format(optInMessageString, "newsletter", newsletterGamesString); final AlertDialog.Builder builder = new AlertDialog.Builder(this) .setMessage(optInDialogMessageString) .setTitle(optInTitleString) .setPositiveButton(okString, (__, ___) -> {}); builder.show(); } private void showGamesNewsletterDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this) .setMessage(gamesAlertMessage) .setPositiveButton(gamesAlertYes, (__, ___) -> { viewModel.inputs.signupToGamesNewsletterClick(); }) .setNegativeButton(gamesAlertNo, (__, ___) -> { // Nothing to do! }); builder.show(); } private void showRatingDialog() { ViewUtils.showRatingDialog(this); } private void showRecommendations(final @NonNull Pair<List<Project>, Category> projectsAndRootCategory) { adapter.data(projectsAndRootCategory.first, projectsAndRootCategory.second); } private void startDiscovery(final @NonNull DiscoveryParams params) { final Intent intent = new Intent(this, DiscoveryActivity.class) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) .putExtra(IntentKey.DISCOVERY_PARAMS, params); startActivity(intent); } private void startProject(final @NonNull Project project) { final Intent intent = new Intent(this, ProjectActivity.class) .putExtra(IntentKey.PROJECT, project) .putExtra(IntentKey.REF_TAG, RefTag.thanks()); startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } private void startShare(final @NonNull Project project) { final Intent intent = new Intent(android.content.Intent.ACTION_SEND) .setType("text/plain") .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) .putExtra(Intent.EXTRA_TEXT, shareString(project) + " " + project.webProjectUrl()); startActivity(Intent.createChooser(intent, shareThisProjectString)); } private void startShareOnFacebook(final @NonNull Project project) { if (!ShareDialog.canShow(ShareLinkContent.class)) { return; } final Photo photo = project.photo(); final ShareOpenGraphObject object = new ShareOpenGraphObject.Builder() .putString("og:type", "kickstarter:project") .putString("og:title", project.name()) .putString("og:description", project.blurb()) .putString("og:image", photo == null ? null : photo.small()) .putString("og:url", project.webProjectUrl()) .build(); final ShareOpenGraphAction action = new ShareOpenGraphAction.Builder() .setActionType("kickstarter:back") .putObject("project", object) .build(); final ShareOpenGraphContent content = new ShareOpenGraphContent.Builder() .setPreviewPropertyName("project") .setAction(action) .build(); shareDialog.show(content); } private void startShareOnTwitter(final @NonNull Project project) { new TweetComposer.Builder(this) .text(shareString(project)) .uri(Uri.parse(project.webProjectUrl())) .show(); } }