/*
* Licensed Materials - Property of IBM
* © Copyright IBM Corporation 2015. All Rights Reserved.
*/
package com.ibm.mil.readyapps.telco.offers;
import android.content.Context;
import com.google.gson.reflect.TypeToken;
import com.ibm.mil.readyapps.telco.utils.JsonUtils;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.subjects.PublishSubject;
/**
* Implementation of methods in OfferModel interface
*/
public class OfferModelImpl implements OfferModel {
private static List<Offer> offers;
private static List<Offer> appOffers;
private static List<Offer> acceptedOffers;
private static final PublishSubject<Offer> futureAcceptedOffers = PublishSubject.create();
private static final PublishSubject<Offer> appOfferStream = PublishSubject.create();
private static final PublishSubject<Offer> undoOfferAcceptStream = PublishSubject.create();
private static final PublishSubject<Offer> undoOfferRemoveStream = PublishSubject.create();
@Override
public Observable<Offer> getAppOffers(Context context) {
return Observable.from(createAppOffers(context));
}
@Override
public Observable<Offer> getAcceptedOffers() {
return Observable.from(createAcceptedOffers());
}
@Override
public Observable<Offer> getOffers(Context context) {
return Observable.from(createUnacceptedOffers(context));
}
@Override public Observable<Offer> getFutureAcceptedOffers() {
return futureAcceptedOffers;
}
@Override
public Observable<Offer> getUndoOfferAcceptStream() {
return undoOfferAcceptStream;
}
@Override
public Observable<Offer> getUndoOfferRemoveStream() {
return undoOfferRemoveStream;
}
@Override
public Observable<Offer> getAppOfferStream() {
return appOfferStream;
}
/**
* Add offer to the model
* @param offer to add
*/
@Override
public void addOffer(Offer offer) {
offers.add(offer);
}
/**
* Accept app offer
* Remove from app offers list
* Update corresponding app usage
*
* @param offer to accept
*/
@Override
public void acceptAppOffer(Offer offer) {
int index = getIndex(offer, appOffers);
if (index != -1) {
appOffers.remove(index);
appOfferStream.onNext(offer);
}
index = getIndex(offer, acceptedOffers);
if(index == -1) {
acceptedOffers.add(offer);
}
}
/**
* Find the index of a given offer in the given offer list
*
* @param offer to find the index
* @param offerList to look for the offer
* @return index of offer in the list
*/
private int getIndex(Offer offer, List<Offer> offerList) {
for(int i=0; i<offerList.size(); i++)
{
if((offer.getAppName()).equals(offerList.get(i).getAppName())) {
return i;
}
}
return -1;
}
/**
* Accept offer
* Remove from offers list
* Update corresponding app usage
*
* @param offer to accept
*/
@Override
public void acceptOffer(Offer offer) {
futureAcceptedOffers.onNext(offer);
offers.remove(offer);
acceptedOffers.add(offer);
}
/**
* Undo offer removal
* Add back to accepted offers list
*
* @param offer to undo removal
*/
@Override
public void undoRemove(Offer offer) {
offers.remove(offer);
acceptedOffers.add(offer);
undoOfferRemoveStream.onNext(offer);
}
/**
* Undo offer accept
*
* @param offer to undo accept
*/
@Override
public void undoAccept(Offer offer) {
acceptedOffers.remove(offer);
undoOfferAcceptStream.onNext(offer);
}
/**
* Dismiss offer
*
* @param offer to dismiss
*/
@Override
public void dismissOffer(Offer offer) {
offers.remove(offer);
}
/**
* Add offer from recharge
*
* @param offer to add
*/
@Override
public void addCardFromManualRecharge(Offer offer) {
acceptedOffers.add(offer);
futureAcceptedOffers.onNext(offer);
}
/**
* Remove accepted offer
*
* @param offer to remove
*/
@Override
public void removeAcceptedOffer(Offer offer) {
acceptedOffers.remove(offer);
}
/**
* Add app offer
*
* @param offer to add
*/
@Override
public void addAppOffer(Offer offer) {
appOffers.add(offer);
}
/**
* @return boolean indicating if offers list is empty
*/
@Override
public boolean noOffers() {
return offers.isEmpty();
}
/**
* @return boolean indicating if appOffers list is empty
*/
@Override
public boolean noAppOffers() {
return appOffers.isEmpty();
}
/**
* @return boolean indicating if acceptedOffers list is empty
*/
@Override
public boolean noAcceptedOffers(){
return acceptedOffers.isEmpty();
}
/**
* Get offers from the json file and save in cache
*
* @param ctx used in the JsonUtils
* @return offers either from the json file or from cache
*/
private List<Offer> createUnacceptedOffers(Context ctx) {
if(offers != null) {
return offers;
}
TypeToken<List<Offer>> token = new TypeToken<List<Offer>>() {
};
List<Offer> initialOffers = JsonUtils.parseJsonFile(ctx, "offers.json", token);
for(Offer offer: initialOffers){
int resId = ctx.getResources().getIdentifier(offer.getIcon(), "drawable", ctx.getPackageName());
offer.setCardIcon(resId);
}
offers = initialOffers;
return offers;
}
/**
* Create an accepted offer list and save in cache
*
* @return app offers either new list or from cache
*/
private List<Offer> createAcceptedOffers() {
if (acceptedOffers != null) {
return acceptedOffers;
}
acceptedOffers = new ArrayList<>();
return acceptedOffers;
}
/**
* Get app offers from the json file and save in cache
*
* @param context used in the JsonUtils
* @return app offers either from the json file or from cache
*/
private List<Offer> createAppOffers(Context context) {
if (appOffers != null) {
return appOffers;
}
TypeToken<List<Offer>> token = new TypeToken<List<Offer>>() {
};
List<Offer> initialOffers = JsonUtils.parseJsonFile(context, "app_offers.json", token);
for(Offer offer: initialOffers){
int resId = context.getResources().getIdentifier(offer.getIcon(), "drawable", context.getPackageName());
offer.setCardIcon(resId);
}
appOffers = initialOffers;
return appOffers;
}
}