/*
* Licensed Materials - Property of IBM
* © Copyright IBM Corporation 2015. All Rights Reserved.
*/
package com.ibm.mil.readyapps.telco.mytext;
import android.content.Context;
import com.ibm.mil.readyapps.telco.cycles.Cycle;
import com.ibm.mil.readyapps.telco.cycles.CycleModel;
import com.ibm.mil.readyapps.telco.cycles.CycleModelImpl;
import com.ibm.mil.readyapps.telco.offers.Offer;
import com.ibm.mil.readyapps.telco.offers.OfferModel;
import com.ibm.mil.readyapps.telco.offers.OfferModelImpl;
import com.ibm.mil.readyapps.telco.usage.Usage;
import com.ibm.mil.readyapps.telco.usage.UsageModel;
import com.ibm.mil.readyapps.telco.usage.UsageModelImpl;
import java.util.List;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
/**
* Presenter for Text tab responsible for setting up subscriptions to
* desired streams and acting on those streams emitting new values.
*/
public class TextPresenterImpl implements TextPresenter {
private final TextView view;
private final CycleModel cycleModel;
private final UsageModel usageModel;
private final OfferModel offerModel;
private final Context context;
/**
* Constructor for initializing necessary class properties.
*
* @param view the view implemented by TalkFragment.
*/
public TextPresenterImpl(TextView view, Context context) {
this.view = view;
this.cycleModel = new CycleModelImpl();
this.usageModel = new UsageModelImpl();
this.offerModel = new OfferModelImpl();
this.context = context;
}
/**
* Subscribe to Text cycle update stream and
* call display cycle on the view each time a
* new cycle is emitted from the stream.
*/
@Override
public void getCycle() {
cycleModel.getTextCycleUpdates()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Cycle>() {
@Override
public void call(Cycle cycle) {
view.displayCycle(cycle);
}
});
}
/**
* Subscribe to text usage stream and update
* the view as new items are emitted.
*/
@Override
public void getUsage() {
usageModel.getTextUsage(context)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Usage>() {
@Override
public void call(Usage usage) {
view.displayUsage(usage);
}
});
}
/**
* Subscribe to accepted offers stream and display new
* offers as they are emitted from stream.
*/
@Override
public void getAcceptedOffers() {
offerModel.getAcceptedOffers()
.subscribeOn(Schedulers.io())
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Offer>>() {
@Override
public void call(List<Offer> offers) {
view.displayAcceptedOffers(offers);
}
});
offerModel.getFutureAcceptedOffers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Offer>() {
@Override
public void call(Offer offer) {
view.displayAcceptedOffer(offer);
}
});
}
/**
* Subscribe to stream for undoing accepted offers
* and remove the offers from the view.
*/
@Override
public void listenForUndoAccept() {
offerModel.getUndoOfferAcceptStream()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Offer>() {
@Override
public void call(Offer offer) {
view.removeAcceptedOffer(offer);
}
});
}
/**
* Subscribe to stream for updating cycle and update model
* and view as new objects emitted.
*
* @param cycleObservable the stream to subscribe to
*/
@Override
public void updateTextPlan(Observable<Cycle> cycleObservable) {
cycleObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Cycle>() {
@Override
public void call(Cycle cycle) {
cycleModel.updateTextCycle(cycle);
view.updateCycleView(cycle);
}
});
}
/**
* Subscribe to stream for removing offers and update
* model and view as new objects emitted.
*
* @param removeOfferStream the stream to subscribe to
*/
@Override
public void removeOffer(Observable<Offer> removeOfferStream) {
removeOfferStream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Offer>() {
@Override
public void call(Offer offer) {
offerModel.removeAcceptedOffer(offer);
view.removeAcceptedOffer(offer);
}
});
}
/**
* Subscribe to stream for undoing removal of an offer
* and update view when it happens.
*
* @param observable the stream to subscribe to
*/
@Override
public void undoRemoveOffer(Observable<Offer> observable) {
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Offer>() {
@Override
public void call(Offer offer) {
view.displayAcceptedOffer(offer);
}
});
}
}