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) { } }