package com.aincc.lib.common;
import java.lang.reflect.Field;
import java.util.concurrent.atomic.AtomicInteger;
import android.app.Activity;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import com.aincc.lib.common.annotation.InjectView;
import com.aincc.lib.network.common.BaseTrans;
import com.aincc.lib.network.common.BaseTransEx;
import com.aincc.lib.network.common.INetworkListener;
import com.aincc.lib.network.common.NetworkHandler;
import com.aincc.lib.ui.control.loading.LoadingDialog;
import com.aincc.lib.util.Logger;
/**
*
* <h3><b>BaseActivity</b></h3></br>
*
* 기본 액티비티
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
abstract public class BaseActivity extends Activity implements INetworkListener
{
// 스레드 정책 설정
static
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
protected static final int INVALID_IDENTIFIER = 0;
protected static final int ATOMIC_LOADING_INIT = 0;
protected LoadingDialog loadingDialog;
protected AtomicInteger loadingAccCount;
protected NetworkHandler listener;
/**
* UI Identifier 맵핑<br>
* onCreate 에서 1회만 호출하도록 한다.
*
* @since 1.0.0
* @param object
*/
protected void mappingViews(Object object)
{
if (!(object instanceof Activity))
{
return;
}
Activity activity = (Activity) object;
Field[] fields = activity.getClass().getDeclaredFields();
for (Field field : fields)
{
InjectView injectView = field.getAnnotation(InjectView.class);
if (null == injectView)
{
continue;
}
int identifier = injectView.id();
if (INVALID_IDENTIFIER == identifier)
{
String identifierString = field.getName();
identifier = activity.getResources().getIdentifier(identifierString, "id", activity.getPackageName());
}
if (INVALID_IDENTIFIER == identifier)
{
continue;
}
View view = activity.findViewById(identifier);
if (null == view)
{
continue;
}
if (field.getType() == view.getClass())
{
try
{
field.setAccessible(true);
field.set(object, view);
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
// Logger.i(field.getName() + "," + identifier + "," + view);
}
}
/**
* 공통 UI 초기화를 구현한다.
*
* @since 1.0.0
*/
protected void initializeUI()
{
// 네트워크 핸들러 생성
listener = new NetworkHandler(this);
loadingAccCount = new AtomicInteger(ATOMIC_LOADING_INIT);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
protected void onStart()
{
super.onStart();
}
@Override
protected void onRestart()
{
super.onRestart();
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
}
@Override
protected void onPause()
{
super.onPause();
}
@Override
protected void onStop()
{
super.onStop();
}
@Override
protected void onDestroy()
{
super.onDestroy();
}
synchronized public void startProgress(final String message, final boolean cancelable, final OnCancelListener l, final int fontColor)
{
if (null != loadingDialog && loadingDialog.isShowing())
{
loadingAccCount.incrementAndGet();
return;
}
runOnUiThread(new Runnable()
{
@Override
public void run()
{
loadingDialog = LoadingDialog.show(BaseActivity.this, (null != message) ? message : "", false, cancelable, l, fontColor);
loadingAccCount.incrementAndGet();
}
});
}
synchronized public void stopProgress()
{
if (null == loadingDialog)
{
loadingAccCount.set(ATOMIC_LOADING_INIT);
return;
}
if (loadingDialog.isShowing() && ATOMIC_LOADING_INIT < loadingAccCount.get())
{
loadingAccCount.decrementAndGet();
}
if (ATOMIC_LOADING_INIT == loadingAccCount.get())
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
try
{
loadingDialog.dismiss();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
loadingDialog = null;
}
}
});
}
}
synchronized public boolean isLoading()
{
// 로딩 누적 계수를 사용하여 다이얼로그 표시여부를 판단한다.
return (ATOMIC_LOADING_INIT == loadingAccCount.get() ? false : true);
}
@Override
public void iNetEnabled()
{
stopProgress();
Logger.i("iNetEnabled() loadingAccCount = " + loadingAccCount.get());
}
@Override
public void iNetDisabled()
{
startProgress("", false, null, 0xFFFFFF);
Logger.i("iNetDisabled() loadingAccCount = " + loadingAccCount.get());
}
@Override
public boolean iNetListenedTransaction(BaseTrans tr)
{
return true;
}
@Override
public boolean iNetListenedError(BaseTransEx ex)
{
return true;
}
@Override
public void iNetRejectedExecution(BaseTransEx ex)
{
}
@Override
public void iNetKeepAlive()
{
}
@Override
public void iNetKeepAlive(String param)
{
}
@Override
public void iNetConnected()
{
}
@Override
public void iNetConnected(String param)
{
}
@Override
public void iNetDisconnected()
{
}
@Override
public void iNetDisconnected(String param)
{
}
}