Skip to content

Instantly share code, notes, and snippets.

@tranngoclam
Created September 27, 2016 16:24
Show Gist options
  • Save tranngoclam/287bc72671bda7e4b327dcad94e4d7d6 to your computer and use it in GitHub Desktop.
Save tranngoclam/287bc72671bda7e4b327dcad94e4d7d6 to your computer and use it in GitHub Desktop.

Revisions

  1. tranngoclam created this gist Sep 27, 2016.
    117 changes: 117 additions & 0 deletions QueryBillViewModel.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,117 @@
    package net.lamtran.rxjava2.bill;

    import android.text.TextUtils;

    import java.util.List;

    import rx.Observable;
    import rx.android.schedulers.AndroidSchedulers;
    import rx.schedulers.Schedulers;

    /**
    * Created by lam on 9/27/16.
    */

    public class QueryBillViewModel {

    private BillSharedData billSharedData;

    private String customerCode;

    private QueryBillUseCase mQueryBillUseCase;

    private QueryBillRequest mRequest;

    private List<Provider> providers;

    private Provider selectedProvider;

    private Service selectedService;

    private List<Service> services;

    public Observable<QueryBillRequest> buildRequest(RecentTransaction item) {
    return Observable.just(new QueryBillRequest.Builder())
    .flatMap(builder -> Observable.from(services)
    .filter(service -> TextUtils.equals(service.serviceId, item.serviceId))
    .doOnNext(service -> {
    billSharedData.service = service;
    builder.setServiceId(service.serviceId);
    })
    .flatMap(service -> Observable.from(service.providers)
    .filter(provider -> TextUtils.equals(provider.providerId, item.providerId))
    .doOnNext(provider -> {
    billSharedData.provider = provider;
    billSharedData.customerCode = item.customerId;
    builder.setProviderId(provider.providerId);
    builder.setCustomerId(item.customerId);
    }))
    .flatMap(provider -> Observable.just(builder.build())));
    }

    public void query(QueryBillRequest queryBillRequest) {
    Observable.just(queryBillRequest)
    .flatMap(request -> {
    if (request.equals(mRequest)) {
    return Observable.just(request);
    } else {
    billSharedData.service = selectedService;
    billSharedData.provider = selectedProvider;
    billSharedData.customerCode = customerCode;
    QueryBillRequest billRequest = new QueryBillRequest.Builder()
    .setServiceId(selectedService.serviceId)
    .setProviderId(selectedProvider.providerId)
    .setCustomerId(customerCode)
    .build();
    return Observable.just(billRequest);
    }
    })
    .doOnNext(request -> {
    mQueryBillUseCase.setRequest(request);
    billSharedData.queryBillRequest = request;
    })
    .flatMap(request -> mQueryBillUseCase.execute())
    .doOnNext(response -> billSharedData.queryBillResponse = response)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(response -> {

    }, throwable -> {

    });
    }

    private static class BillSharedData {

    public String customerCode;

    public Provider provider;

    public QueryBillRequest queryBillRequest;

    public QueryBillResponse queryBillResponse;

    public Service service;
    }

    private static class Provider {

    public String providerId;
    }

    private static class RecentTransaction {

    public String customerId;

    public String providerId;

    public String serviceId;
    }

    private static class Service {

    public List<Provider> providers;

    public String serviceId;
    }
    }