package com.aincc.seoulexcursion.ui.scene.assets; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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.PointF; import android.graphics.Typeface; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.widget.ImageButton; import android.widget.RelativeLayout; 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.anim.Animationz; import com.aincc.lib.ui.widget.page.PageIndicator; import com.aincc.lib.ui.widget.page.PageIndicator.OnPageClickListener; import com.aincc.seoulexcursion.util.Logger; import com.aincc.lib.util.Utils; 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.AssetsMediaPagerAdapter; import com.aincc.seoulexcursion.ui.control.AssetsMediaPagerAdapter.MediaPageItem; import com.aincc.seoulexcursion.ui.widget.Navibar; 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.AssetsInfo; import com.aincc.seoulopenapi.model.AssetsMedia; import com.aincc.seoulopenapi.model.AssetsSimpleInfo; import com.aincc.seoulopenapi.network.OpenBase; import com.aincc.seoulopenapi.openapi.culture.OpenAssetsInfo; import com.aincc.seoulopenapi.openapi.culture.OpenAssetsMedia; /** * * <h3><b>AssetsDetailActivity</b></h3></br> * * 문화재 상세정보 표시<br> * * @author aincc@barusoft.com * @version 1.0.0 * @since 1.0.0 */ public class AssetsDetailActivity extends SeoulBaseActivity { /** * 상단 네비게이션 바 */ @InjectView private Navibar navibar; /** * 컨텐츠 레이아웃 */ @InjectView private RelativeLayout content_layout; /** * 미디어 레이아웃 */ @InjectView(id = R.id.media_layout) private RelativeLayout mediaLayout; /** * 페이져 */ @InjectView private ViewPager pager; /** * 페이지 인디게이터 */ @InjectView private PageIndicator pageIndicator; /** * 페이저 어댑터 */ private AssetsMediaPagerAdapter adapter; /** * 페이지 항목 */ private List<MediaPageItem> pages; /** * 미디어 보기 토클 */ @InjectView private ImageButton mediaToggle; /** * 닫기 */ @InjectView private ImageButton close; /** * 문화재 정보 */ private AssetsSimpleInfo info = null; private List<AssetsInfo> assetInfo = new ArrayList<AssetsInfo>(); private List<AssetsMedia> mediaInfo = new ArrayList<AssetsMedia>(); /** * 언어선택 */ 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_detail); getIntentData(); mappingViews(this); initializeUI(); } /** * 인덴트 정보 처리 * * @since 1.0.0 */ private void getIntentData() { Intent data = getIntent(); if (null != data) { Bundle bundle = data.getExtras(); if (null != bundle) { info = bundle.getParcelable(Constants.EXTRA_KEY_ASSETS_SIMPLE_INFO); language = bundle.getInt(Constants.EXTRA_KEY_ASSETS_LANGUAGE); switch (language) { 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; } } } } @Override protected void initializeUI() { super.initializeUI(); content_layout.setVisibility(View.GONE); mediaToggle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (View.GONE == mediaLayout.getVisibility()) { if (0 == pages.size()) { Toast.makeText(context, string(R.string.empty_media), Toast.LENGTH_SHORT).show(); } else { Animation anim = Animationz.translate(context, new PointF(0, -500), new PointF(0, 0), Constants.MEDIA_ANIM_DELAY, android.R.anim.decelerate_interpolator, true); mediaLayout.setAnimation(anim); mediaLayout.setVisibility(View.VISIBLE); mediaToggle.setImageDrawable(drawable(R.drawable.view_as_info)); } } else { Animation anim = Animationz.translate(context, new PointF(0, 0), new PointF(0, mediaLayout.getHeight() * (-1) - 100), Constants.MEDIA_ANIM_DELAY, android.R.anim.accelerate_interpolator, true); mediaLayout.setAnimation(anim); mediaLayout.postDelayed(new Runnable() { @Override public void run() { mediaLayout.setVisibility(View.GONE); } }, Constants.MEDIA_ANIM_DELAY); mediaToggle.setImageDrawable(drawable(R.drawable.navigation_picture)); } } }); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); initializePager(); initializeFont(SeoulFont.getInstance().getSeoulHangang()); } @Override protected void initializeNavibar() { super.initializeNavibar(); navibar.setActionBack(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); // 문화재 설명 언어 설정 // navibar.setActionFunc(new OnClickListener() // { // @Override // public void onClick(View v) // { // alertSelectLanguage(); // } // }); // navibar.setActionFuncIcon(drawable(R.drawable.navigation_lang)); navibar.setActionFuncVisible(View.INVISIBLE); // 제목 설정 navibar.setTitle(null != info ? info.CULTASSTK : ""); } /** * 대메뉴 페이저 초기화 * * @since 1.0.0 */ private void initializePager() { // 대메뉴 항목 설정 if (null == pages) { pages = new ArrayList<AssetsMediaPagerAdapter.MediaPageItem>(); } if (null == adapter) { // 페이저 어댑터 설정 adapter = new AssetsMediaPagerAdapter(this, pages); } // 페이저 설정 pager.setAdapter(adapter); pager.setOverScrollMode(View.OVER_SCROLL_NEVER); pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { pageIndicator.setPage(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); // 페이지 인디게이터 설정 pageIndicator.setColor(0xFFFF711C, 0x80808080); pageIndicator.setMaxPage(pages.size()); pageIndicator.setOnPageClickListener(new OnPageClickListener() { @Override public void onPageClick(PageIndicator v, int page) { pager.setCurrentItem(page, true); } }); } /** * * @since 1.0.0 * @param tf */ private void initializeFont(Typeface tf) { navibar.setTypeface(tf); // 폰트 지정 CLSSCODE.setTypeface(tf); CULTASSTK_LABEL.setTypeface(tf); CULTASSTK.setTypeface(tf); CULTASSTH_LABEL.setTypeface(tf); ASSIGNNUM.setTypeface(tf); ASSIGNYMD.setTypeface(tf); PERIOD.setTypeface(tf); SCALE.setTypeface(tf); MATERIAL.setTypeface(tf); CLASSIFY.setTypeface(tf); BINDING.setTypeface(tf); QUANTITY.setTypeface(tf); SIZING.setTypeface(tf); OWNER.setTypeface(tf); LOCATION.setTypeface(tf); DESIGNER.setTypeface(tf); BUILDER.setTypeface(tf); HOLDER.setTypeface(tf); SUCCESSOR.setTypeface(tf); ETC_CLSS.setTypeface(tf); ASSIGNETC.setTypeface(tf); CONTENTS.setTypeface(tf); } /** * 문화재 분류 코드명 가져오기 * * @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 */ @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; initializeFont(SeoulFont.getInstance().getSeoulHangang()); break; case 1: langCode = LangCode.ENGLISH; initializeFont(SeoulFont.getInstance().getSeoulHangang()); break; case 2: langCode = LangCode.JAPANESE; initializeFont(Typeface.DEFAULT); break; case 3: langCode = LangCode.CHINAB; initializeFont(Typeface.DEFAULT); break; case 4: langCode = LangCode.CHINAG; initializeFont(Typeface.DEFAULT); break; } clearData(); requestAssetsInfo(Constants.INIT_START_INDEX, Constants.FETCH_COUNT, info.CODE); dlg.dismiss(); } }); builder.show(); } /** * * @since 1.0.0 * @param view * @param info * @param header */ private void viewInfo(TextView view, String info, String header) { if (!Utils.isTrimEmpty(info)) { view.setText(header + info); } else { view.setVisibility(View.GONE); } } /** * 정보 표시하기 * * @since 1.0.0 */ private void displayAssetsInfo() { if (0 == assetInfo.size()) { return; } content_layout.setVisibility(View.VISIBLE); AssetsInfo detailInfo = assetInfo.get(0); navibar.setTitle(detailInfo.CULTASSTK); CLSSCODE.setText(string(R.string.assets_clss) + " " + getAssetsCode(detailInfo.CLSSCODE1, detailInfo.CLSSCODE2)); viewInfo(CULTASSTK_LABEL, string(R.string.assets_cultasstk) + " ", ""); viewInfo(CULTASSTK, detailInfo.CULTASSTK, ""); viewInfo(CULTASSTH_LABEL, string(R.string.assets_cultassth) + " ", ""); viewInfo(CULTASSTH, detailInfo.CULTASSTH, ""); viewInfo(ASSIGNNUM, detailInfo.ASSIGNNUM, string(R.string.assets_assignnum) + " "); viewInfo(ASSIGNYMD, detailInfo.ASSIGNYMD, string(R.string.assets_assignymd) + " "); viewInfo(PERIOD, detailInfo.PERIOD, string(R.string.assets_period) + " "); viewInfo(SCALE, detailInfo.SCALE, string(R.string.assets_scale) + " "); viewInfo(MATERIAL, detailInfo.MATERIAL, string(R.string.assets_material) + " "); viewInfo(CLASSIFY, detailInfo.CLASSIFY, string(R.string.assets_classify) + " "); viewInfo(BINDING, detailInfo.BINDING, string(R.string.assets_binding) + " "); viewInfo(QUANTITY, detailInfo.QUANTITY, string(R.string.assets_quantity) + " "); viewInfo(SIZING, detailInfo.SIZING, string(R.string.assets_sizing) + " "); viewInfo(OWNER, detailInfo.OWNER, string(R.string.assets_owner) + " "); viewInfo(LOCATION, detailInfo.LOCATION, string(R.string.assets_location) + " "); viewInfo(DESIGNER, detailInfo.DESIGNER, string(R.string.assets_designer) + " "); viewInfo(BUILDER, detailInfo.BUILDER, string(R.string.assets_builder) + " "); viewInfo(HOLDER, detailInfo.HOLDER, string(R.string.assets_holder) + " "); viewInfo(SUCCESSOR, detailInfo.SUCCESSOR, string(R.string.assets_successor) + " "); viewInfo(ETC_CLSS, detailInfo.ETC_CLSS, string(R.string.assets_etc_clss) + " "); viewInfo(ASSIGNETC, detailInfo.ASSIGNETC, string(R.string.assets_assignetc) + " "); viewInfo(CONTENTS, detailInfo.CONTENTS, ""); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); initializeUI(); onResume(); } @Override protected void onResume() { super.onResume(); if (null != info && 0 < assetInfo.size()) { // 정보표시 refreshData(); } if (0 == assetInfo.size()) { // 상세정보 요청 requestAssetsInfo(1, 5, info.CODE); } if (0 == mediaInfo.size()) { // 미디어 요청 requestAssetsMedia(1, 5, info.CODE); } } @Override protected void onPause() { super.onPause(); ServiceExecutor.getInstance().cancelAll(); } @Override public void onBackPressed() { super.onBackPressed(); finish(); } @Override public void finish() { super.finish(); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } // /////////////////////////////////////////////////////////////////////////////////////////// // 이하 OpenAPI 연동 // /////////////////////////////////////////////////////////////////////////////////////////// /** * 요청 누적 계수 */ private AtomicInteger requestAccCount = new AtomicInteger(0); @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_DETAIL_INFO: handleOpenAssetsInfo(tr); break; case CULTURE_ASSETS_MEDIA: handleOpenAssetsMedia(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 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 start * @param end * @param code */ private void requestAssetsInfo(int start, int end, String code) { showLoading(); requestAccCount.incrementAndGet(); ServiceExecutor.getInstance().getAssetsInfo(OpenAPI.CULTURE_ASSETS_DETAIL_INFO.name(), listener, OpenAPI.CULTURE_ASSETS_DETAIL_INFO, langCode, code, start, end); } /** * 문화재정보 조회 요청 * * @since 1.0.0 * @param start * @param end * @param code */ private void requestAssetsMedia(int start, int end, String code) { showLoading(); requestAccCount.incrementAndGet(); ServiceExecutor.getInstance().getAssetsMedia(OpenAPI.CULTURE_ASSETS_MEDIA.name(), listener, OpenAPI.CULTURE_ASSETS_MEDIA, code, start, end); } /** * 문화재정보 처리 * * @since 1.0.0 * @param tr */ private void handleOpenAssetsInfo(BaseTrans tr) { OpenAssetsInfo item = (OpenAssetsInfo) tr; if (!item.infos.isEmpty()) { assetInfo.addAll(item.infos); refreshData(); } } /** * 문화재정보 처리 * * @since 1.0.0 * @param tr */ private void handleOpenAssetsMedia(BaseTrans tr) { OpenAssetsMedia item = (OpenAssetsMedia) tr; if (!item.infos.isEmpty()) { mediaInfo.addAll(item.infos); Iterator<AssetsMedia> it = mediaInfo.iterator(); while (it.hasNext()) { AssetsMedia media = it.next(); if (media.FILETYPE.equalsIgnoreCase("1")) { Logger.d1(LOG, "media(image) : " + media.FILE_IDX + ", " + media.FILEPATH + media.FILENAME); pages.add(new MediaPageItem(R.layout.page_assets_media, media)); } else { Logger.d1(LOG, "media(video) : " + media.FILE_IDX + ", " + media.FILEPATH + media.FILENAME); } } pageIndicator.setMaxPage(pages.size()); refreshData(); } } /** * * @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(); } /** * 데이터 초기화 후 갱신 * * @since 1.0.0 */ private void clearData() { assetInfo.clear(); refreshData(); } /** * 데이터 갱신 * * @since 1.0.0 */ synchronized private void refreshData() { runOnUiThread(new Runnable() { @Override public void run() { displayAssetsInfo(); adapter.notifyDataSetChanged(); } }); } /** * 문화재 분류코드 */ @InjectView private TextView CLSSCODE; @InjectView private TextView CULTASSTK_LABEL; /** * 문화재명(한글) */ @InjectView private TextView CULTASSTK; @InjectView private TextView CULTASSTH_LABEL; /** * 문화재명(한자) */ @InjectView private TextView CULTASSTH; /** * 지정번호 */ @InjectView private TextView ASSIGNNUM; /** * 지정연월일 */ @InjectView private TextView ASSIGNYMD; /** * 시대 */ @InjectView private TextView PERIOD; /** * 규모_양식 */ @InjectView private TextView SCALE; /** * 재료 */ @InjectView private TextView MATERIAL; /** * 종별 */ @InjectView private TextView CLASSIFY; /** * 장정 */ @InjectView private TextView BINDING; /** * 수량 */ @InjectView private TextView QUANTITY; /** * 크기 */ @InjectView private TextView SIZING; /** * 소유자 */ @InjectView private TextView OWNER; /** * 소재지 */ @InjectView private TextView LOCATION; /** * 설계자 */ @InjectView private TextView DESIGNER; /** * 시공자 */ @InjectView private TextView BUILDER; /** * 보유자 */ @InjectView private TextView HOLDER; /** * 전승자 */ @InjectView private TextView SUCCESSOR; /** * 천연기념물분류 */ @InjectView private TextView ETC_CLSS; /** * 부속문화재 */ @InjectView private TextView ASSIGNETC; /** * 설명 */ @InjectView private TextView CONTENTS; }