/* * Copyright(c) 2017 lizhaotailang * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.github.marktony.espresso.mvp.addpackage; import android.support.annotation.NonNull; import io.github.marktony.espresso.data.Company; import io.github.marktony.espresso.data.CompanyRecognition; import io.github.marktony.espresso.data.Package; import io.github.marktony.espresso.data.PackageWithCompany; import io.github.marktony.espresso.data.source.CompaniesDataSource; import io.github.marktony.espresso.data.source.PackagesDataSource; import io.github.marktony.espresso.retrofit.RetrofitClient; import io.github.marktony.espresso.retrofit.RetrofitService; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.functions.BiFunction; import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; /** * Created by lizhaotailang on 2017/2/10. */ public class AddPackagePresenter implements AddPackageContract.Presenter{ @NonNull private final AddPackageContract.View view; @NonNull private final PackagesDataSource packagesDataSource; @NonNull private final CompaniesDataSource companiesDataSource; @NonNull private CompositeDisposable compositeDisposable; public AddPackagePresenter(@NonNull PackagesDataSource dataSource, @NonNull CompaniesDataSource companiesDataSource, @NonNull AddPackageContract.View view) { this.view = view; this.view.setPresenter(this); this.packagesDataSource = dataSource; this.companiesDataSource = companiesDataSource; compositeDisposable = new CompositeDisposable(); } @Override public void subscribe() {} @Override public void unsubscribe() { compositeDisposable.clear(); } @Override public void savePackage(String number, String name, int color) { compositeDisposable.clear(); checkNumber(number, name, color); } private void checkNumber(final String number, final String name, final int color) { if (packagesDataSource.isPackageExist(number)) { view.showNumberExistError(); return; } view.setProgressIndicator(true); Disposable disposable = RetrofitClient.getInstance() .create(RetrofitService.class) .query(number) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<CompanyRecognition>() { @Override public void onNext(CompanyRecognition value) { if (value.getAuto().size() > 0 && value.getAuto().get(0).getCompanyCode() != null) { checkPackageLatestStatus(value.getAuto().get(0).getCompanyCode(), number, name, color); } else { view.showNumberError(); view.setProgressIndicator(false); } } @Override public void onError(Throwable e) { view.showNumberError(); view.setProgressIndicator(false); view.showNetworkError(); } @Override public void onComplete() { } }); compositeDisposable.add(disposable); } private void checkPackageLatestStatus(final String type, final String number, final String name, final int color) { Observable<Company> companyObservable = companiesDataSource .getCompany(type) .subscribeOn(Schedulers.io()); Observable<Package> packageObservable = RetrofitClient .getInstance() .create(RetrofitService.class) .getPackageState(type, number) .subscribeOn(Schedulers.io()); Disposable disposable = Observable .zip(packageObservable, companyObservable, new BiFunction<Package, Company, PackageWithCompany>() { @Override public PackageWithCompany apply(Package aPackage, Company company) throws Exception { return new PackageWithCompany(aPackage, company); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<PackageWithCompany>() { @Override public void onNext(PackageWithCompany value) { if (value != null) { Package p = value.getPkg(); if (p.getData() != null && p.getData().size() > 0) { p.setReadable(true); p.setPushable(true); } // Set the company p.setCompany(type); // Set the company's Chinese name p.setCompanyChineseName(value.getCompany().getName()); // Set the name of package p.setName(name); // Some package numbers, which are unable to get the latest status // has no number value after converted to a gson value // We need to set the number manually. p.setNumber(number); // Set a random color value for the package p.setColorAvatar(color); // Set the add-time(timestamp) of package p.setTimestamp(System.currentTimeMillis()); packagesDataSource.savePackage(p); } view.showPackagesList(); } @Override public void onError(Throwable e) { view.showNumberError(); view.setProgressIndicator(false); } @Override public void onComplete() { view.setProgressIndicator(false); } }); compositeDisposable.add(disposable); } }