package com.aincc.seoulexcursion.ui.scene.assets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
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.http.HttpParam;
import com.aincc.lib.ui.widget.list.section.AmazingListView;
import com.aincc.seoulexcursion.util.Logger;
import com.aincc.lib.util.PreferencesUtil;
import com.aincc.seoulexcursion.App;
import com.aincc.seoulexcursion.R;
import com.aincc.seoulexcursion.ui.Constants;
import com.aincc.seoulexcursion.ui.SeoulBaseActivity;
import com.aincc.seoulexcursion.ui.control.OneSectionAdapter;
import com.aincc.seoulexcursion.ui.widget.Navibar;
import com.aincc.seoulexcursion.ui.widget.Navisheet.OptionSelected;
import com.aincc.seoulexcursion.util.SeoulFont;
import com.aincc.seoulopenapi.LangCode;
import com.aincc.seoulopenapi.OpenAPI;
import com.aincc.seoulopenapi.ServiceExecutor;
import com.aincc.seoulopenapi.model.AssetsSimpleInfo;
import com.aincc.seoulopenapi.model.CodeInfo;
import com.aincc.seoulopenapi.network.OpenBase;
import com.aincc.seoulopenapi.openapi.culture.OpenAssetsInfo;
import com.aincc.seoulopenapi.openapi.culture.OpenAssetsSearchBy;
/**
*
* <h3><b>AssetsActivity</b></h3></br>
*
* 문화재 목록 표시
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
public class AssetsActivity extends SeoulBaseActivity implements OptionSelected
{
/**
* 상단 네비게이션 바
*/
@InjectView
private Navibar navibar;
/**
* 옵션정보
*/
private List<Pair<String, List<String>>> options;
/**
* 옵션 1 문화재대분류
*/
private int optionSelected1 = 0;
/**
* 옵션 2 문화재세부분류
*/
private int optionSelected2 = 0;
/**
* 섹션명
*/
private String sectionName = "";
/**
* 섹션코드
*/
private String sectionCode = null;
/**
* 리스트뷰
*/
@InjectView
private AmazingListView listview;
/**
* 어댑터
*/
private AssetsAdapter<AssetsSimpleInfo> adapter;
/**
* 리스트
*/
private List<AssetsSimpleInfo> listdata = new ArrayList<AssetsSimpleInfo>();
/**
* 언어선택
*/
private int language = 0;
/**
* 언어
*/
private LangCode langCode = LangCode.KOREAN;
@Override
protected void onCreate(Bundle savedInstanceState)
{
Logger.d1(LOG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_assets);
mappingViews(this);
initializeUI();
}
@Override
protected void initializeUI()
{
super.initializeUI();
sectionName = string(R.string.total);
if (null == adapter)
{
adapter = new AssetsAdapter<AssetsSimpleInfo>();
adapter.setList(listdata);
listview.setAdapter(adapter);
}
listview.setPinnedHeaderView(LayoutInflater.from(this).inflate(R.layout.cell_header_assets, listview, false));
listview.setOnScrollListener(new OnScrollListener()
{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (isLoading() || isNoMoreData.get() || listdata.isEmpty() || 0 == totalItemCount)
{
return;
}
// 마지막 항목이 표시 중이면
if ((firstVisibleItem + visibleItemCount) == totalItemCount)
{
requestAssetsInfo(listdata.size() + 1, listdata.size() + Constants.FETCH_COUNT, sectionCode);
}
}
});
}
@Override
protected void initializeNavibar()
{
super.initializeNavibar();
navibar.setTypeface(SeoulFont.getInstance().getSeoulHangang());
navibar.setActionBack(new OnClickListener()
{
@Override
public void onClick(View v)
{
finish();
}
});
navibar.setActionFunc(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(context, AssetsSearchActivity.class);
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
});
navibar.setActionFuncIcon(drawable(R.drawable.ic_action_search));
// // 문화재 설명 언어 설정
// navibar.setActionFunc(new OnClickListener()
// {
// @Override
// public void onClick(View v)
// {
// alertSelectLanguage();
// }
// });
// navibar.setActionFuncIcon(drawable(R.drawable.navigation_lang));
// navibar.setActionFuncVisible(View.INVISIBLE);
// 제목 설정
navibar.setTitle(string(R.string.main_menu_assets));
if (null == options)
{
options = new ArrayList<Pair<String, List<String>>>();
options.add(new Pair<String, List<String>>(string(R.string.total), Arrays.asList(string(R.string.assets))));
Iterator<CodeInfo> it = App.assetsCode.iterator();
while (it.hasNext())
{
CodeInfo maincode = it.next();
List<String> subcodes = new ArrayList<String>();
Iterator<Pair<String, List<CodeInfo>>> it2 = App.assetsDetailCode.iterator();
while (it2.hasNext())
{
Pair<String, List<CodeInfo>> pair = it2.next();
if (pair.first.equals(maincode.CODE))
{
List<CodeInfo> codes = pair.second;
for (int ii = 0; ii < codes.size(); ii++)
{
subcodes.add(codes.get(ii).CODENAME);
}
break;
}
}
options.add(new Pair<String, List<String>>(maincode.CODENAME, subcodes));
}
optionSelected1 = PreferencesUtil.getInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT1, Constants.OPTION_START_INDEX);
optionSelected2 = PreferencesUtil.getInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT2, Constants.OPTION_START_INDEX);
navibar.setOptionData(options, optionSelected1, optionSelected2);
navibar.setOptionListener(this);
navibar.setOptionText(optionSelected1, optionSelected2);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
initializeUI();
}
@Override
protected void onResume()
{
super.onResume();
if (listdata.isEmpty())
{
request();
}
}
@Override
protected void onPause()
{
super.onPause();
ServiceExecutor.getInstance().cancelAll();
}
@Override
public void finish()
{
super.finish();
}
@Override
public void OnOptionSelected(int optionSelected1, int optionSelected2)
{
this.optionSelected1 = optionSelected1;
this.optionSelected2 = optionSelected2;
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT1, optionSelected1);
PreferencesUtil.setInt(context, Constants.PREFS_SETTING_FILE, Constants.PREFS_KEY_LAST_ASSETOPT2, optionSelected2);
request();
}
/**
* 로딩표시
*
* @since 1.0.0
*/
private void showLoading()
{
startProgress("", true, new OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
ServiceExecutor.getInstance().cancelAll();
loadingAccCount.set(ATOMIC_LOADING_INIT);
}
}, Constants.COLOR_BLACK);
}
/**
* 문화재 분류 코드명 가져오기
*
* @since 1.0.0
* @param code1
* @param code2
* @return
*/
private String getAssetsCode(String code1, String code2)
{
if (null != code2 && 0 < code2.length())
{
return App.assetsMap.get(code1).first + " > " + App.assetsMap.get(code1).second.get(code2);
}
return App.assetsMap.get(code1).first;
}
/**
* 데이터 초기화 후 갱신
*
* @since 1.0.0
*/
private void clearData()
{
adapter.clear();
isNoMoreData.set(false);
refreshData();
}
/**
* 데이터 갱신
*
* @since 1.0.0
*/
synchronized private void refreshData()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
adapter.notifyDataSetChanged();
}
});
}
/**
*
* @since 1.0.0
*/
@SuppressWarnings("unused")
private void alertSelectLanguage()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.alert_title_language);
builder.setNegativeButton(R.string.alert_btn_cancel, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.setSingleChoiceItems(Constants.LANGUAGES, language, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dlg, int which)
{
language = which;
switch (which)
{
case 0:
langCode = LangCode.KOREAN;
break;
case 1:
langCode = LangCode.ENGLISH;
break;
case 2:
langCode = LangCode.JAPANESE;
break;
case 3:
langCode = LangCode.CHINAB;
break;
case 4:
langCode = LangCode.CHINAG;
break;
}
clearData();
requestAssetsInfo(Constants.INIT_START_INDEX, Constants.FETCH_COUNT, sectionCode);
dlg.dismiss();
}
});
builder.show();
}
/**
*
* <h3><b>AssetsAdapter</b></h3></br>
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
class AssetsAdapter<T> extends OneSectionAdapter<T>
{
@SuppressWarnings("unchecked")
@Override
public View getAmazingView(final int position, View convertView, ViewGroup parent)
{
View view = convertView;
ViewHolder viewHolder = null;
if (null == convertView)
{
view = getLayoutInflater().inflate(R.layout.cell_assets, null);
viewHolder = new ViewHolder();
viewHolder.cellSelector = (LinearLayout) view.findViewById(R.id.cellSelector);
viewHolder.CULTASSTK = (TextView) view.findViewById(R.id.CULTASSTK);
viewHolder.CULTASSTH = (TextView) view.findViewById(R.id.CULTASSTH);
viewHolder.CLSSCODE = (TextView) view.findViewById(R.id.CLSSCODE);
switch (langCode)
{
case KOREAN:
case ENGLISH:
viewHolder.CULTASSTK.setTypeface(SeoulFont.getInstance().getSeoulHangang());
viewHolder.CLSSCODE.setTypeface(SeoulFont.getInstance().getSeoulHangang());
break;
case JAPANESE:
case CHINAB:
case CHINAG:
default:
viewHolder.CULTASSTK.setTypeface(Typeface.DEFAULT);
viewHolder.CLSSCODE.setTypeface(Typeface.DEFAULT);
break;
}
view.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.cellSelector.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(context, AssetsDetailActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.EXTRA_KEY_ASSETS_SIMPLE_INFO, (AssetsSimpleInfo) getItem(position));
bundle.putInt(Constants.EXTRA_KEY_ASSETS_LANGUAGE, language);
intent.putExtras(bundle);
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
});
AssetsSimpleInfo item = (AssetsSimpleInfo) getItem(position);
viewHolder.CULTASSTK.setText(item.CULTASSTK);
if (null != item.CULTASSTH && 0 < item.CULTASSTH.length())
{
viewHolder.CULTASSTH.setText("(" + item.CULTASSTH + ")");
}
else
{
viewHolder.CULTASSTH.setText("");
}
viewHolder.CLSSCODE.setText(string(R.string.assets_clss) + " " + getAssetsCode(item.CLSSCODE1, item.CLSSCODE2));
return view;
}
@Override
public String[] getSections()
{
String[] res = new String[1];
res[0] = sectionName;
return res;
}
/**
*
* <h3><b>ViewHolder</b></h3></br>
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
class ViewHolder
{
LinearLayout cellSelector;
TextView CULTASSTK;
TextView CULTASSTH;
TextView CLSSCODE;
}
}
// ///////////////////////////////////////////////////////////////////////////////////////////
// 이하 OpenAPI 연동
// ///////////////////////////////////////////////////////////////////////////////////////////
/**
* 요청 누적 계수
*/
private AtomicInteger requestAccCount = new AtomicInteger(0);
/**
* 더보기 데이터 존재여부
*/
private AtomicBoolean isNoMoreData = new AtomicBoolean(false);
@Override
public void iNetEnabled()
{
super.iNetEnabled();
}
@Override
public void iNetDisabled()
{
}
@Override
public boolean iNetListenedTransaction(BaseTrans tr)
{
if (0 < requestAccCount.get())
{
requestAccCount.decrementAndGet();
}
HttpParam param = (HttpParam) tr.getParam();
if (((OpenBase) tr).isError())
{
handleError(tr);
return false;
}
switch (OpenAPI.valueOf(param.getRequestKey()))
{
case CULTURE_ASSETS_INFO:
handleOpenAssetsInfo(tr);
break;
case CULTURE_ASSETS_SEARCH_BY_CODE:
handleOpenAssetsInfoSearchBy(tr);
break;
case UNKNOWN:
default:
break;
}
return super.iNetListenedTransaction(tr);
}
@Override
public boolean iNetListenedError(BaseTransEx ex)
{
if (0 < requestAccCount.get())
{
requestAccCount.decrementAndGet();
}
return super.iNetListenedError(ex);
}
/**
* 최초 요청 및 옵션변경시 요청
*
* @since 1.0.0
*/
private void request()
{
// 전체
if (0 == optionSelected1)
{
sectionName = string(R.string.total);
sectionCode = null;
clearData();
requestAssetsInfo(Constants.INIT_START_INDEX, Constants.FETCH_COUNT, sectionCode);
}
else if (0 < optionSelected1)
{
CodeInfo maincode = App.assetsCode.get(optionSelected1 - 1);
CodeInfo subcode = null;
Iterator<Pair<String, List<CodeInfo>>> it = App.assetsDetailCode.iterator();
while (it.hasNext())
{
Pair<String, List<CodeInfo>> pair = it.next();
if (pair.first.equals(maincode.CODE))
{
List<CodeInfo> codes = pair.second;
subcode = codes.get(optionSelected2);
break;
}
}
if (null != subcode)
{
sectionName = maincode.CODENAME + " : " + subcode.CODENAME;
sectionCode = subcode.CODE;
}
else
{
sectionName = maincode.CODENAME;
sectionCode = maincode.CODE;
}
clearData();
requestAssetsInfo(Constants.INIT_START_INDEX, Constants.FETCH_COUNT, sectionCode);
}
}
/**
* 문화재정보 조회 요청
*
* @since 1.0.0
* @param start
* @param end
* @param code
* 세부분류코드 (분류가 선택된 경우만 사용)
*/
private void requestAssetsInfo(int start, int end, String code)
{
showLoading();
requestAccCount.incrementAndGet();
if (null == code)
{
ServiceExecutor.getInstance().getAssetsInfo(OpenAPI.CULTURE_ASSETS_INFO.name(), listener, OpenAPI.CULTURE_ASSETS_INFO, langCode, null, start, end);
}
else
{
ServiceExecutor.getInstance().getAssetsSearchBy(OpenAPI.CULTURE_ASSETS_SEARCH_BY_CODE.name(), listener, OpenAPI.CULTURE_ASSETS_SEARCH_BY_CODE, langCode, null, code, start, end);
}
}
/**
* 문화재정보 처리
*
* @since 1.0.0
* @param tr
*/
private void handleOpenAssetsInfo(BaseTrans tr)
{
OpenAssetsInfo item = (OpenAssetsInfo) tr;
if (!item.infos.isEmpty())
{
if (Constants.FETCH_COUNT > item.infos.size())
{
isNoMoreData.set(true);
}
listdata.addAll(item.infos);
refreshData();
}
else
{
isNoMoreData.set(true);
Toast.makeText(context, string(R.string.empty_data), Toast.LENGTH_SHORT).show();
}
}
/**
* 문화재정보 처리
*
* @since 1.0.0
* @param tr
*/
private void handleOpenAssetsInfoSearchBy(BaseTrans tr)
{
OpenAssetsSearchBy item = (OpenAssetsSearchBy) tr;
if (!item.infos.isEmpty())
{
if (Constants.FETCH_COUNT > item.infos.size())
{
isNoMoreData.set(true);
}
listdata.addAll(item.infos);
refreshData();
}
else
{
isNoMoreData.set(true);
Toast.makeText(context, string(R.string.empty_data), Toast.LENGTH_SHORT).show();
}
}
/**
*
* @since 1.0.0
* @param tr
*/
private void handleError(BaseTrans tr)
{
OpenBase item = (OpenBase) tr;
Logger.d1(LOG, "error >> " + item.getErrorInfoType().getCode());
Logger.d1(LOG, " " + item.getErrorInfoType().getTitle(this));
Logger.d1(LOG, " " + item.getErrorInfoType().getMsg(this));
Toast.makeText(context, string(R.string.failed_request), Toast.LENGTH_SHORT).show();
}
}