/* * 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.packagedetails; import android.support.annotation.NonNull; import io.github.marktony.espresso.R; import io.github.marktony.espresso.data.Package; import io.github.marktony.espresso.data.source.PackagesRepository; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; /** * Created by lizhaotailang on 2017/2/10. */ public class PackageDetailsPresenter implements PackageDetailsContract.Presenter { @NonNull private PackageDetailsContract.View view; @NonNull private PackagesRepository packagesRepository; @NonNull private CompositeDisposable compositeDisposable; private String packageName; @NonNull private String packageId; public PackageDetailsPresenter(@NonNull String packageId, @NonNull PackagesRepository packagesRepository, @NonNull PackageDetailsContract.View packageDetailView) { this.packageId = packageId; this.view = packageDetailView; this.packagesRepository = packagesRepository; compositeDisposable = new CompositeDisposable(); this.view.setPresenter(this); } @Override public void subscribe() { openDetail(); } @Override public void unsubscribe() { compositeDisposable.clear(); } /** * Load data from repository. */ private void openDetail() { Disposable disposable = packagesRepository .getPackage(packageId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<Package>() { @Override public void onNext(Package value) { packageName = value.getName(); view.showPackageDetails(value); int state = Integer.parseInt(value.getState()); if (state == Package.STATUS_FAILED) { view.setToolbarBackground(R.drawable.banner_background_error); } else if (state == Package.STATUS_DELIVERED) { view.setToolbarBackground(R.drawable.banner_background_delivered); } else { view.setToolbarBackground(R.drawable.banner_background_on_the_way); } packagesRepository.setPackageReadable(packageId, false); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); compositeDisposable.add(disposable); } /** * Set the current package is unread new. * Once the user enter the package details page, * the package will be marked as read(NOT unread new). * So here is only one option to set the package unread. */ @Override public void setPackageUnread() { packagesRepository.setPackageReadable(packageId, true); view.exit(); } /** * Refresh the package by access the network. * No matter the refresh is successful or failed, * Do not forget to stop the indicator. */ @Override public void refreshPackage() { Disposable disposable = packagesRepository .refreshPackage(packageId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<Package>() { @Override public void onNext(Package value) { view.showPackageDetails(value); } @Override public void onError(Throwable e) { view.setLoadingIndicator(false); view.showNetworkError(); } @Override public void onComplete() { view.setLoadingIndicator(false); } }); compositeDisposable.add(disposable); } /** * Delete the package from repository(both in cache and database). */ @Override public void deletePackage() { packagesRepository.deletePackage(packageId); view.exit(); } /** * Copy the current package number to clipboard. */ @Override public void copyPackageNumber() { view.copyPackageNumber(packageId); } /** * Share the package data. */ @Override public void shareTo() { Disposable disposable = packagesRepository .getPackage(packageId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<Package>() { @Override public void onNext(Package value) { view.shareTo(value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); compositeDisposable.add(disposable); } /** * Get the current package name. * @return Package name. See at {@link Package#name} */ @Override public String getPackageName() { return packageName; } /** * Set the current package a new name(both in cache and database). * @param newName The new name of package. * See at {@link Package#name} */ @Override public void updatePackageName(String newName) { packagesRepository.updatePackageName(packageId, newName); openDetail(); } }