package com.kickstarter.viewmodels; import android.support.annotation.NonNull; import com.kickstarter.libs.ActivityViewModel; import com.kickstarter.libs.Environment; import com.kickstarter.models.ProjectNotification; import com.kickstarter.services.ApiClientType; import com.kickstarter.ui.viewholders.ProjectNotificationViewHolder; import com.kickstarter.viewmodels.errors.ProjectNotificationViewModelErrors; import com.kickstarter.viewmodels.inputs.ProjectNotificationViewModelInputs; import com.kickstarter.viewmodels.outputs.ProjectNotificationViewModelOutputs; import rx.Notification; import rx.Observable; import rx.subjects.BehaviorSubject; import rx.subjects.PublishSubject; import static com.kickstarter.libs.rx.transformers.Transformers.errors; import static com.kickstarter.libs.rx.transformers.Transformers.takePairWhen; import static com.kickstarter.libs.rx.transformers.Transformers.values; public class ProjectNotificationViewModel extends ActivityViewModel<ProjectNotificationViewHolder> implements ProjectNotificationViewModelInputs, ProjectNotificationViewModelOutputs, ProjectNotificationViewModelErrors { public ProjectNotificationViewModel(final @NonNull Environment environment) { super(environment); final ApiClientType client = environment.apiClient(); // When the enable switch is clicked, update the project notification. final Observable<Notification<ProjectNotification>> updateNotification = projectNotification .compose(takePairWhen(enabledSwitchClick)) .switchMap(ne -> client .updateProjectNotifications(ne.first, ne.second) .materialize() ) .share(); updateNotification .compose(values()) .compose(bindToLifecycle()) .subscribe(projectNotification::onNext); updateNotification .compose(errors()) .compose(bindToLifecycle()) .subscribe(__ -> showUnableToSaveProjectNotificationError.onNext(null)); // Update the project name when a project notification emits. projectNotification .map(n -> n.project().name()) .compose(bindToLifecycle()) .subscribe(projectName::onNext); // Update the enabled switch when a project notification emits. projectNotification .map(n -> n.email() && n.mobile()) .compose(bindToLifecycle()) .subscribe(enabledSwitch::onNext); } private PublishSubject<Boolean> enabledSwitchClick = PublishSubject.create(); private PublishSubject<ProjectNotification> projectNotification = PublishSubject.create(); private BehaviorSubject<String> projectName = BehaviorSubject.create(); private BehaviorSubject<Boolean> enabledSwitch = BehaviorSubject.create(); private PublishSubject<Void> showUnableToSaveProjectNotificationError = PublishSubject.create(); public ProjectNotificationViewModelInputs inputs = this; public ProjectNotificationViewModelOutputs outputs = this; public ProjectNotificationViewModelErrors errors = this; @Override public void enabledSwitchClick(final boolean enabled) { enabledSwitchClick.onNext(enabled); } @Override public void projectNotification(final @NonNull ProjectNotification projectNotification) { this.projectNotification.onNext(projectNotification); } @Override public @NonNull Observable<String> projectName() { return projectName; } @Override public @NonNull Observable<Boolean> enabledSwitch() { return enabledSwitch; } @Override public @NonNull Observable<Void> showUnableToSaveProjectNotificationError() { return showUnableToSaveProjectNotificationError; } }