package com.aincc.seoulexcursion;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import android.app.Application;
import android.content.Context;
import android.util.Pair;
import com.aincc.lib.util.ImageLoader;
import com.aincc.lib.util.ImageWorker.ImageWorkerAdapter;
import com.aincc.lib.util.PreferencesUtil;
import com.aincc.seoulexcursion.ui.Constants;
import com.aincc.seoulopenapi.model.CodeInfo;
/**
*
* <h3><b>BaruChatApp</b></h3></br>
*
* 공통데이터 관리 어플리케이션
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
public class App extends Application
{
/**
* 컨텍스트
*/
private static Context context;
/**
* 이미지 로더
*/
private static ImageLoader imageLoader;
/**
* 문화시설 테마 코드
*/
public static List<CodeInfo> facilThemeCode = new ArrayList<CodeInfo>();
/**
* 문화시설 주제 코드
*/
public static List<CodeInfo> facilSubjectCode = new ArrayList<CodeInfo>();
/**
* 문화재 분류 코드
*/
public static List<CodeInfo> assetsCode = new ArrayList<CodeInfo>();
/**
* 문화재 세부분류 코드
* List<Pair<문화재분류코드, List<CodeInfo>>>
*/
public static List<Pair<String, List<CodeInfo>>> assetsDetailCode = new ArrayList<Pair<String, List<CodeInfo>>>();
/**
* 문화재 분류 맵
* Map<메인코드번호, Pair<메인코드명, Map<세부코드번호, 세부코드명>>>
*/
public static Map<String, Pair<String, Map<String, String>>> assetsMap = new HashMap<String, Pair<String, Map<String, String>>>();
/**
* 공연행사 주제분류 코드
*/
public static List<CodeInfo> playCode = new ArrayList<CodeInfo>();
@Override
public void onCreate()
{
super.onCreate();
// Logger.v("onCreate");
// 어플리케이션 컨텍스트 저장
context = this;
// 최초 실행인 경우 설정값 초기화
if (!PreferencesUtil.getBoolean(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_FIRST_EXCUTE))
{
PreferencesUtil.setBoolean(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_FIRST_EXCUTE, true);
PreferencesUtil.setBoolean(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_DISKCACHE, true);
PreferencesUtil.setBoolean(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_ACCESS_LOCATION, false);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT1, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT2, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_PARKOPT1, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_PARKOPT2, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_PARKOPT3, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_PLAYOPT1, Constants.OPTION_START_INDEX);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_PLAYOPT2, Constants.OPTION_START_INDEX);
}
// Preference 에 저장된 분류 코드 정보 로딩
setFacilThemeCode(PreferencesUtil.getString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_FACILITY_THEME));
setFacilSubjectCode(PreferencesUtil.getString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_FACILITY_SUBJECT));
setAssetsCode(PreferencesUtil.getString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_ASSETS));
Iterator<CodeInfo> it = assetsCode.iterator();
while (it.hasNext())
{
CodeInfo code = it.next();
setAssetsDetailCode(code, PreferencesUtil.getString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_ASSETS_DETAIL + code.CODE));
}
setPlayCode(PreferencesUtil.getString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_PLAY));
// 이미지 로더 초기화
setImageLoader(PreferencesUtil.getBoolean(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_DISKCACHE));
}
/**
* 컨텍스트 정보 가져오기
*
* @since 1.0.0
* @return context
*/
public static Context getContext()
{
return context;
}
/**
* 공용 이미지로더 가져오기
*
* @since 1.0.0
* @param adapter
* 지정할 어댑터
* @return imageLoader
*/
public static ImageLoader getImageLoader(ImageWorkerAdapter adapter)
{
imageLoader.setAdapter(adapter);
return imageLoader;
}
/**
* 이미지로더 디스크 캐시 설정 변경
*
* @since 1.0.0
* @param enableDiskCache
* 디스크 캐시 사용 여부
*/
public static void setImageLoader(boolean enableDiskCache)
{
imageLoader = new ImageLoader(getContext(), null, Constants.CACHE_DIR, R.drawable.border_thumbnail, R.dimen.thumbnail_size, true, enableDiskCache, false);
imageLoader.setImageFadeIn(true);
}
/**
* 시설 테마 코드 설정
*
* @since 1.0.0
* @param data
*/
public static void setFacilThemeCode(String data)
{
if (null != data && 0 != data.length())
{
facilThemeCode.clear();
Matcher matcher = Constants.PATTERN_CODE.matcher(data);
while (matcher.find())
{
String group = matcher.group();
String[] codeArray = group.split("\\|");
CodeInfo code = new CodeInfo();
code.CODE = codeArray[0];
code.CODENAME = codeArray[1];
facilThemeCode.add(code);
// Logger.d("theme code : " + code.toString());
}
Collections.sort(facilThemeCode, new CodeInfo());
}
}
/**
* 시설 주제 코드 설정
*
* @since 1.0.0
* @param data
*/
public static void setFacilSubjectCode(String data)
{
if (null != data && 0 != data.length())
{
facilSubjectCode.clear();
Matcher matcher = Constants.PATTERN_CODE.matcher(data);
while (matcher.find())
{
String group = matcher.group();
String[] codeArray = group.split("\\|");
CodeInfo code = new CodeInfo();
code.CODE = codeArray[0];
code.CODENAME = codeArray[1];
facilSubjectCode.add(code);
// Logger.d("subject code : " + code.toString());
}
Collections.sort(facilSubjectCode, new CodeInfo());
}
}
/**
* 문화재 분류 코드 설정
*
* @since 1.0.0
* @param data
*/
public static void setAssetsCode(String data)
{
if (null != data && 0 != data.length())
{
assetsCode.clear();
Matcher matcher = Constants.PATTERN_CODE.matcher(data);
while (matcher.find())
{
String group = matcher.group();
String[] codeArray = group.split("\\|");
CodeInfo code = new CodeInfo();
code.CODE = codeArray[0];
code.CODENAME = codeArray[1];
assetsCode.add(code);
assetsMap.put(code.CODE, new Pair<String, Map<String, String>>(code.CODENAME, new HashMap<String, String>()));
// Logger.d("assets code : " + code.toString());
}
Collections.sort(assetsCode, new CodeInfo());
}
}
/**
* 문화재 세부분류 코드 설정
*
* @since 1.0.0
* @param data
*/
public static void setAssetsDetailCode(CodeInfo assetsCode, String data)
{
if (null != data && 0 != data.length())
{
Iterator<Pair<String, List<CodeInfo>>> it = assetsDetailCode.iterator();
int ii = -1;
boolean exist = false;
while (it.hasNext())
{
ii++;
Pair<String, List<CodeInfo>> pair = it.next();
if (pair.first.equalsIgnoreCase(assetsCode.CODE))
{
exist = true;
break;
}
}
// 최초 데이터 추가이거나 없는 데이터를 추가하는 경우
if (-1 == ii || !exist)
{
assetsDetailCode.add(new Pair<String, List<CodeInfo>>(assetsCode.CODE, new ArrayList<CodeInfo>()));
ii = assetsDetailCode.size() - 1;
}
assetsDetailCode.get(ii).second.clear();
Matcher matcher = Constants.PATTERN_CODE.matcher(data);
while (matcher.find())
{
String group = matcher.group();
String[] codeArray = group.split("\\|");
CodeInfo code = new CodeInfo();
code.CODE = codeArray[0];
code.CODENAME = codeArray[1];
assetsDetailCode.get(ii).second.add(code);
assetsMap.get(assetsCode.CODE).second.put(code.CODE, code.CODENAME);
// Logger.d("assets [" + assetsCode.CODENAME + "] code : " + code.CODE + ", " + code.CODENAME);
}
Collections.sort(assetsDetailCode.get(ii).second, new CodeInfo());
}
}
/**
* 공연코드 설정
*
* @since 1.0.0
* @param data
*/
public static void setPlayCode(String data)
{
if (null != data && 0 != data.length())
{
playCode.clear();
Matcher matcher = Constants.PATTERN_CODE.matcher(data);
while (matcher.find())
{
String group = matcher.group();
String[] codeArray = group.split("\\|");
CodeInfo code = new CodeInfo();
code.CODE = codeArray[0];
code.CODENAME = codeArray[1];
playCode.add(code);
// Logger.d("play code : " + code.toString());
}
Collections.sort(playCode, new CodeInfo());
}
}
/*
* (non-Javadoc)
*
* @see android.app.Application#onLowMemory()
*/
@Override
public void onLowMemory()
{
super.onLowMemory();
// Logger.v("onLowMemory");
}
/*
* (non-Javadoc)
*
* @see android.app.Application#onTerminate()
*/
@Override
public void onTerminate()
{
super.onTerminate();
// Logger.v("onTerminate");
}
}