package com.markjmind.uni;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.markjmind.uni.common.Store;
import com.markjmind.uni.mapper.UniMapper;
import com.markjmind.uni.mapper.annotiation.LayoutInjector;
import com.markjmind.uni.mapper.annotiation.adapter.GetViewAdapter;
import com.markjmind.uni.mapper.annotiation.adapter.OnClickAdapter;
import com.markjmind.uni.mapper.annotiation.adapter.ParamAdapter;
import com.markjmind.uni.mapper.annotiation.adapter.ProgressAdapter;
import com.markjmind.uni.progress.ProgressBuilder;
import com.markjmind.uni.thread.CancelAdapter;
import com.markjmind.uni.thread.CancelObservable;
import com.markjmind.uni.thread.LoadEvent;
/**
* <br>捲土重來<br>
*
* @author 오재웅(JaeWoong-Oh)
* @email markjmind@gmail.com
* @since 2016-03-04
*/
public class UniTask implements UniInterface {
private UniLayout uniLayout;
public UniMapper mapper;
public Store<?> param;
public ProgressBuilder progressBuilder;
private Context context;
private boolean isAsync;
private TaskController taskController;
private CancelObservable cancelObservable;
private boolean enableMapping; //매필을 할수 있는지 여부(UniAsyncTask는 매핑을 안함)
private boolean binded = false;
private LayoutInflater inflater;
private ViewGroup container;
public UniTask() {
this(false);
}
/**
* Bind를 거치지 않고 내부적으로 UniTask를 생성해서 할 경우
* enbaleMapping true로 설정
* @param enableMapping
*/
UniTask(boolean enableMapping) {
uniLayout = null;
setEnableMapping(enableMapping);
mapper = new UniMapper();
isAsync = true;
param = new Store<>();
progressBuilder = new ProgressBuilder();
cancelObservable = new CancelObservable();
taskController = new TaskController(this);
}
private void beforeBind(){
mapper.addSubscriptionOnInit(new ParamAdapter(param));
if(enableMapping) {
mapper.addSubscriptionOnInit(new ProgressAdapter(progressBuilder));
mapper.addSubscriptionOnInit(new LayoutInjector(inflater, uniLayout, container));
}
mapper.injectSubscriptionOnInit();
}
private void afterBind(){
mapper.addSubscriptionOnStart(new GetViewAdapter());
mapper.addSubscriptionOnStart(new OnClickAdapter());
mapper.injectSubscriptionOnStart();
}
private void binding(){
if(!binded) {
beforeBind();
taskController.getUniInterface().onBind();
afterBind();
binded = true;
}
}
/**
* Execute는 여러번 일어날수있다는것에 주의
*/
void beforeExecute() {
binding();
}
void beforeOnPre(){
}
void afterOnPre(){
}
void beforeOnLoad(){
}
void afterOnLoad(){
}
void beforeOnPost(){
}
void afterOnPost(){
}
void beforeOnCancel(){
}
void afterOnCancel(){
}
void beforeOnException(){
}
void afterOnException(){
}
void setBindInfo(Object mappingObj, UniLayout uniLayout, LayoutInflater inflater, ViewGroup container){
this.uniLayout = uniLayout;
this.context = uniLayout.getContext();
this.mapper.reset(this.uniLayout, mappingObj);
// this.uniLayout.setUniTask(this);
if (inflater == null) {
inflater = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE));
}
if(container==null){
container = uniLayout;
}
this.progressBuilder.setParents(uniLayout);
this.inflater = inflater;
this.container = container;
}
void initAtrribute(UniLayout uniLayout, UniInterface uniInterface){
uniLayout.param = param;
uniLayout.progressBuilder = progressBuilder;
mapper.setInjectParents(UniLayout.class);
setUniInterface(uniInterface);
}
void initAtrribute(UniFragment uniFragment, UniInterface uniInterface){
uniFragment.param = this.param;
uniFragment.progressBuilder = this.progressBuilder;
mapper.setInjectParents(UniFragment.class);
setUniInterface(uniInterface);
}
void initAtrribute(UniDialog uniDialog, UniInterface uniInterface){
uniDialog.param = this.param;
uniDialog.progressBuilder = this.progressBuilder;
mapper.setInjectParents(UniDialog.class);
setUniInterface(uniInterface);
}
void syncUniLayout(UniLayout uniLayout){
uniLayout.param = param;
uniLayout.progressBuilder = progressBuilder;
uniLayout.setUniTask(this);
}
// public void bindFragment(UniFragment uniFragment) {
// setEnableMapping(true); //바인드가 되면 매핑을 할수있다.
// uniLayout.param = param;
// uniLayout.progressBuilder = progressBuilder;
// uniFragment.setUniTask(this);
// //UniFragment에서 새로감싼 uniInterface가 필요하다.
// setUniInterface(uniFragment.getUniInterface(this));
// mapper.setInjectParents(UniTask.class);
// //setBindInfo는 onCreateView에서 동적으로 호출
// }
/**
* UniLayout에다 task를 입히는 방법
* @param uniLayout
*/
public void bind(UniLayout uniLayout) {
setEnableMapping(true); //바인드가 되면 매핑을 할수있다.
syncUniLayout(uniLayout); // property와 Unitask를 변경한다.
mapper.setInjectParents(UniTask.class); //Injection 클래스를 UniTask고정
this.setBindInfo(this, uniLayout, null, null);
binding();
}
CancelObservable getCancelObservable() {
return cancelObservable;
}
void setEnableMapping(boolean enable) {
this.enableMapping = enable;
}
/***************************************************************************************************************
* Uni 외부지원 함수 관련
**************************************************************************************************************/
public View findViewById(int id) {
return uniLayout.findViewById(id);
}
public View findViewWithTag(Object tag) {
return uniLayout.findViewWithTag(tag);
}
public UniLayout getUniLayout() {
return uniLayout;
}
public void setAsync(boolean isAsync) {
this.isAsync = isAsync;
}
public boolean isAsync() {
return this.isAsync;
}
/***************************************************************************************************************
* Context 함수 관련
**************************************************************************************************************/
public Context getContext() {
return context;
}
public Resources getResource() {
return context.getResources();
}
public Context getApplicationContext() {
return context.getApplicationContext();
}
public PackageManager getPackageManager() {
return context.getPackageManager();
}
/***************************************************************************************************************
* execute 관련
**************************************************************************************************************/
public TaskController getTask() {
if (enableMapping) {
taskController.init(this, cancelObservable);
} else {
taskController.init(null, cancelObservable);
}
return taskController;
}
public void setUniInterface(UniInterface uniInterface) {
taskController.setUniInterface(uniInterface);
}
public UniInterface getUniInterface() {
return taskController.getUniInterface();
}
/***************************************************************************************************************
* UniTask Interface 관련
**************************************************************************************************************/
@Override
public void onBind() {
}
@Override
public void onPre() {
}
@Override
public void onLoad(LoadEvent event, CancelAdapter cancelAdapter) throws Exception {
}
@Override
public void onUpdate(Object value, CancelAdapter cancelAdapter) {
}
@Override
public void onPost() {
}
@Override
public void onPostFail(String message, Object arg) {
}
@Override
public void onException(Exception e) {
}
@Override
public void onCancelled(boolean attached) {
}
}