/*
* Licensed Materials - Property of IBM
* © Copyright IBM Corporation 2015. All Rights Reserved.
*/
package com.ibm.mil.readyapps.telco.usage;
import android.content.Context;
import com.google.gson.reflect.TypeToken;
import com.ibm.mil.readyapps.telco.offers.Offer;
import com.ibm.mil.readyapps.telco.utils.JsonUtils;
import java.util.List;
import rx.Observable;
/**
* Implementation of methods in UsageModel interface
*/
public class UsageModelImpl implements UsageModel {
private static List<Usage> usages;
private static Usage talkUsage;
private static Usage textUsage;
@Override
public Observable<Usage> getUsages(Context context) {
return Observable.from(createUsages(context));
}
@Override
public Observable<Usage> getTalkUsage(Context context) {
return Observable.just(createTalkUsage(context));
}
@Override
public Observable<Usage> getTextUsage(Context context) {
return Observable.just(createTextUsage(context));
}
/**
* Set new values for an existing usage
* Example: usage can go from limited to unlimited
*
* @param newUsage to set
*/
@Override
public void setNewUsage(Usage newUsage) {
int index = indexToReplace(newUsage.getAppName());
Usage usage = usages.get(index);
newUsage.setIsUnlimited(true);
newUsage.setLimit(usage.getLimit());
usages.set(index, newUsage);
}
/**
* Find the index of already existing app usage in usages
* @param appName name of the applcation
* @return index of the app usage
*/
private int indexToReplace(String appName) {
int index = 0;
for(int i=0; i<usages.size(); i++){
if (usages.get(i).getAppName().equals(appName)){
index = i;
}
}
return index;
}
/**
* Change an offer to a limited usage
* @param offer to change
* @return limited usage object
*/
@Override
public Usage setLimitedUsage(Offer offer){
int index = indexToReplace(offer.getAppName());
Usage usage = usages.get(index);
Usage newUsage = usage.offerToUsage(offer);
newUsage.setIsUnlimited(false);
newUsage.setLimit(usage.getLimit());
usages.set(index, newUsage);
return newUsage;
}
/**
* Get app usages from the json file and save in cache
*
* @param context used in the JsonUtils
* @return list of usages either from the json file or from cache
*/
private List<Usage> createUsages(Context context) {
if (usages != null) {
return usages;
}
TypeToken<List<Usage>> token = new TypeToken<List<Usage>>() {
};
List<Usage> initialUsages = JsonUtils.parseJsonFile(context, "app_usages.json", token);
for(Usage usage: initialUsages){
int resId = context.getResources().getIdentifier(usage.getImageName(), "drawable", context.getPackageName());
usage.setUsageImage(resId);
usage.setSeekBarProgress((int) ((usage.getUsed() * 100 )/ usage.getLimit()));
}
usages = initialUsages;
return usages;
}
/**
* Get talk incoming/outgoing info from the json file and save in cache
*
* @param context used in the JsonUtils
* @return talk usage either from the json file or from cache
*/
private Usage createTalkUsage(Context context) {
if (talkUsage != null) {
return talkUsage;
}
TypeToken<List<Usage>> token = new TypeToken<List<Usage>>() {
};
List<Usage> initTalkIO = JsonUtils.parseJsonFile(context, "talk_io.json", token);
talkUsage = initTalkIO.get(0);
return talkUsage;
}
/**
* Get text incoming/outgoing from the json file and save in cache
*
* @param context used in the JsonUtils
* @return text usage either from the json file or from cache
*/
private Usage createTextUsage(Context context) {
if (textUsage != null) {
return textUsage;
}
TypeToken<List<Usage>> token = new TypeToken<List<Usage>>() {
};
List<Usage> initTextIO = JsonUtils.parseJsonFile(context, "text_io.json", token);
textUsage = initTextIO.get(0);
return textUsage;
}
}