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.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.utils.AnimationUtils; 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.ProjectUpdatesViewModel; import java.util.Arrays; import butterknife.Bind; import butterknife.BindString; import butterknife.ButterKnife; import okhttp3.Request; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; import static com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft; @RequiresActivityViewModel(ProjectUpdatesViewModel.ViewModel.class) public class ProjectUpdatesActivity extends BaseActivity<ProjectUpdatesViewModel.ViewModel> implements KSWebViewClient.Delegate { protected @Bind(R.id.web_view) KSWebView ksWebView; protected @Bind(R.id.loading_indicator_view) View loadingIndicatorView; protected @Bind(R.id.web_view_toolbar) KSToolbar webViewToolbar; protected @BindString(R.string.project_subpages_menu_buttons_updates) String updatesTitleString; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web_view_layout); ButterKnife.bind(this); this.webViewToolbar.setTitle(updatesTitleString); this.ksWebView.client().setDelegate(this); this.ksWebView.client().registerRequestHandlers( Arrays.asList( new RequestHandler(KSUri::isProjectUpdatesUri, this::handleProjectUpdatesUriRequest), new RequestHandler(KSUri::isProjectUpdateCommentsUri, this::handleProjectUpdateCommentsUriRequest), new RequestHandler(KSUri::isProjectUpdateUri, this::handleProjectUpdateUriRequest) ) ); this.viewModel.outputs.startCommentsActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::startCommentsActivity); this.viewModel.outputs.startUpdateActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(pu -> this.startUpdateActivity(pu.first, pu.second)); } @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 true; } private boolean handleProjectUpdatesUriRequest(final @NonNull Request request, final @NonNull WebView webView) { this.viewModel.inputs.goToUpdatesRequest(request); return false; } 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 startUpdateActivity(final @NonNull Project project, final @NonNull Update update) { final Intent intent = new Intent(this, UpdateActivity.class) .putExtra(IntentKey.PROJECT, project) .putExtra(IntentKey.UPDATE, update); startActivityWithTransition(intent, R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } @Override protected @Nullable Pair<Integer, Integer> exitTransition() { return slideInFromLeft(); } @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) {} }