package cn.scau.scautreasure.ui;
import android.content.Context;
import android.support.v7.app.ActionBar;
import android.view.View;
import android.widget.LinearLayout;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.App;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.rest.RestService;
import org.springframework.web.client.HttpStatusCodeException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import cn.scau.scautreasure.AppConstant;
import cn.scau.scautreasure.AppContext;
import cn.scau.scautreasure.R;
import cn.scau.scautreasure.api.EdusysApi;
import cn.scau.scautreasure.helper.UIHelper;
import cn.scau.scautreasure.impl.ServerOnChangeListener;
import cn.scau.scautreasure.model.ParamModel;
import cn.scau.scautreasure.util.CacheUtil;
import cn.scau.scautreasure.widget.ParamWidget;
import cn.scau.scautreasure.widget.ParamWidget_;
/**
* 条件选择
* User: Special Leung
* Date: 13-8-15
* Time: 下午4:13
* Mail: specialcyci@gmail.com
*/
@EActivity(R.layout.param)
public class Param extends CommonActivity implements ServerOnChangeListener {
@App AppContext app;
@RestService EdusysApi api;
@ViewById LinearLayout linear_parent;
@Extra("target")
String target;
@Extra("targetActivity")
String targetActivity;
private List<ParamWidget> wheelList;
private ArrayList<ParamModel> paramList;
@AfterInject
void init(){
wheelList = new ArrayList<ParamWidget>();
UIHelper.getDialog(R.string.tips_loading_params).show();
loadData();
}
@Override
@AfterViews
void initActionBar(){
super.initActionBar();
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(R.string.title_params);
}
/**
* 继续查询按钮点击事件;
*/
@Click
void btn_continue(){
try {
startNextActivity();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过函数反射手段实例出目标的Activity并且传递参数,
* 最后运行之
*
* @throws Exception
*/
private void startNextActivity() throws Exception {
Class cls = Class.forName(targetActivity);
Method buildMethod = cls.getMethod("intent", Context.class);
Object obj = buildMethod.invoke(cls, this);
Method putMethod = obj.getClass().getMethod("value", ArrayList.class);
obj = putMethod.invoke(obj, buildParamsValue());
Method startMethod = obj.getClass().getMethod("start");
startMethod.invoke(obj);
}
private ArrayList<String> buildParamsValue(){
ArrayList<String> value = new ArrayList<String>();
for(int i = 0 ; i < wheelList.size(); i++)
value.add(wheelList.get(i).getSelectedParam());
return value;
}
/**
* 动态生成参数选择wheel控件;
*/
@UiThread
void showParams(){
UIHelper.getDialog().dismiss();
wheelList.clear();
for(ParamModel p : paramList){
ParamWidget paramWidget = buildParamViews(p.getKey(),p.getValue());
linear_parent.addView(paramWidget);
}
}
private ParamWidget buildParamViews(String key,String[] values){
ParamWidget paramWidget = ParamWidget_.build(getSherlockActivity());
paramWidget.initView(key,values,wheelList.size());
paramWidget.setSeparatorVisable(View.VISIBLE);
wheelList.add(paramWidget);
return paramWidget;
}
@Background( id = UIHelper.CANCEL_FLAG )
void loadData(Object... params) {
paramList = getCacheParamsList();
// load param from cache, load from network if not existed
if(paramList == null){
try{
paramList = api.getParams(AppContext.userName, app.getEncodeEduSysPassword(), AppContext.server, target).getParams();
saveCacheParamsList(paramList);
}catch (HttpStatusCodeException e){
showErrorResult(this, e.getStatusCode().value(), this);
return;
}catch (Exception e){
handleNoNetWorkError(getSherlockActivity());
}
}
showParams();
}
private ArrayList<ParamModel> getCacheParamsList(){
CacheUtil cacheUtil = CacheUtil.get(getSherlockActivity());
String cacheKey = getCacheKey();
return (ArrayList<ParamModel>) cacheUtil.getAsObject(cacheKey);
}
private void saveCacheParamsList(ArrayList<ParamModel> paramList){
CacheUtil cacheUtil = CacheUtil.get(getSherlockActivity());
if(paramList.size() != 0)
cacheUtil.put(getCacheKey(),paramList, AppConstant.PARAMS_CACHE_TIME);
}
private String getCacheKey(){
return "param_" + target;
}
@Override
public void onChangeServer() {
UIHelper.getDialog(R.string.tips_loading_params).show();
loadData();
}
}