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.util.Pair;
import android.view.View;
import android.webkit.WebView;
import com.kickstarter.R;
import com.kickstarter.libs.BaseActivity;
import com.kickstarter.libs.KSString;
import com.kickstarter.libs.RefTag;
import com.kickstarter.libs.qualifiers.RequiresActivityViewModel;
import com.kickstarter.libs.utils.AnimationUtils;
import com.kickstarter.libs.utils.NumberUtils;
import com.kickstarter.models.Project;
import com.kickstarter.models.Update;
import com.kickstarter.services.KSUri;
import com.kickstarter.services.KSWebViewClient;
import com.kickstarter.services.RequestHandler;
import com.kickstarter.ui.IntentKey;
import com.kickstarter.ui.toolbars.KSToolbar;
import com.kickstarter.ui.views.KSWebView;
import com.kickstarter.viewmodels.UpdateViewModel;
import java.util.Arrays;
import butterknife.Bind;
import butterknife.BindString;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.Request;
import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI;
import static com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft;
@RequiresActivityViewModel(UpdateViewModel.ViewModel.class)
public class UpdateActivity extends BaseActivity<UpdateViewModel.ViewModel> implements KSWebViewClient.Delegate {
protected @Bind(R.id.update_web_view) KSWebView ksWebView;
protected @Bind(R.id.loading_indicator_view) View loadingIndicatorView;
protected @Bind(R.id.update_toolbar) KSToolbar toolbar;
protected @BindString(R.string.social_update_number) String updateNumberString;
protected @BindString(R.string.activity_project_update_update_count) String shareUpdateCountString;
private KSString ksString;
@Override
protected void onCreate(final @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_layout);
ButterKnife.bind(this);
this.ksString = environment().ksString();
this.ksWebView.client().setDelegate(this);
this.ksWebView.client().registerRequestHandlers(
Arrays.asList(
new RequestHandler(KSUri::isProjectUpdateUri, this::handleProjectUpdateUriRequest),
new RequestHandler(KSUri::isProjectUpdateCommentsUri, this::handleProjectUpdateCommentsUriRequest),
new RequestHandler(KSUri::isProjectUri, this::handleProjectUriRequest)
)
);
this.viewModel.outputs.startCommentsActivity()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::startCommentsActivity);
this.viewModel.outputs.startProjectActivity()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(projectAndRefTag -> this.startProjectActivity(projectAndRefTag.first, projectAndRefTag.second));
this.viewModel.outputs.startShareIntent()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::startShareIntent);
this.viewModel.outputs.updateSequence()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this::setToolbarTitle);
}
@Override
protected void onResume() {
super.onResume();
this.viewModel.outputs.webViewUrl()
.compose(bindToLifecycle())
.compose(observeForUI())
.subscribe(this.ksWebView::loadUrl);
}
private boolean handleProjectUpdateCommentsUriRequest(final @NonNull Request request, final @NonNull WebView webView) {
this.viewModel.inputs.goToCommentsRequest(request);
return true;
}
private boolean handleProjectUpdateUriRequest(final @NonNull Request request, final @NonNull WebView webView) {
this.viewModel.inputs.goToUpdateRequest(request);
return false;
}
private boolean handleProjectUriRequest(final @NonNull Request request, final @NonNull WebView webView) {
this.viewModel.inputs.goToProjectRequest(request);
return true;
}
private void setToolbarTitle(final @NonNull String updateSequence) {
this.toolbar.setTitle(ksString.format(updateNumberString, "update_number", updateSequence));
}
private void startCommentsActivity(final @NonNull Update update) {
final Intent intent = new Intent(this, CommentsActivity.class)
.putExtra(IntentKey.UPDATE, update);
startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left);
}
private void startProjectActivity(final @NonNull Project project, final @NonNull RefTag refTag) {
final Intent intent = new Intent(this, ProjectActivity.class)
.putExtra(IntentKey.PROJECT, project)
.putExtra(IntentKey.REF_TAG, refTag);
startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left);
}
private void startShareIntent(final @NonNull Update update) {
final String shareMessage = ksString.format(shareUpdateCountString, "update_count", NumberUtils.format(update.sequence()))
+ ": " + update.title();
final Intent intent = new Intent(Intent.ACTION_SEND)
.setType("text/plain")
.putExtra(Intent.EXTRA_TEXT, shareMessage + " " + update.urls().web().update());
startActivity(intent);
}
@Override
protected @Nullable Pair<Integer, Integer> exitTransition() {
return slideInFromLeft();
}
@OnClick(R.id.share_icon_button)
public void shareIconButtonPressed() {
this.viewModel.inputs.shareIconButtonClicked();
}
@Override
public void webViewExternalLinkActivated(final @NonNull KSWebViewClient webViewClient, final @NonNull String url) {
this.viewModel.inputs.externalLinkActivated();
}
@Override
public void webViewOnPageFinished(final @NonNull KSWebViewClient webViewClient, final @Nullable String url) {
this.loadingIndicatorView.startAnimation(AnimationUtils.INSTANCE.disappearAnimation());
}
@Override
public void webViewOnPageStarted(final @NonNull KSWebViewClient webViewClient, final @Nullable String url) {
this.loadingIndicatorView.startAnimation(AnimationUtils.INSTANCE.appearAnimation());
}
@Override
public void webViewPageIntercepted(final @NonNull KSWebViewClient webViewClient, final @NonNull String url) {}
}