package com.aincc.seoulexcursion.ui.scene.plays; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.lang3.StringUtils; 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.net.Uri; import android.os.Bundle; import android.text.Html; import android.text.util.Linkify; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ImageView.ScaleType; 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.util.ImageLoader; import com.aincc.lib.util.ImageWorker.ImageWorkerAdapter; import com.aincc.lib.util.URLImageParser; 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.widget.Navibar; import com.aincc.seoulexcursion.util.Logger; import com.aincc.seoulexcursion.util.SeoulFont; import com.aincc.seoulopenapi.OpenAPI; import com.aincc.seoulopenapi.ServiceExecutor; import com.aincc.seoulopenapi.model.FacilInfo; import com.aincc.seoulopenapi.model.FacilSimpleInfo; import com.aincc.seoulopenapi.model.FacilTrafficInfo; import com.aincc.seoulopenapi.network.OpenBase; import com.aincc.seoulopenapi.openapi.culture.OpenFacilDetailInfo; import com.aincc.seoulopenapi.openapi.culture.OpenFacilTrafficInfo; /** * * <h3><b>FacilDetailActivity</b></h3></br> * * 문화시설 세부정보 표시 * <p> * * version 1.3.0 : 교통정보 표시 기능 추가. * * @author aincc@barusoft.com * @version 1.3.0 * @since 1.0.0 */ public class FacilsDetailActivity extends SeoulBaseActivity { /** * 상단 네비게이션 바 */ @InjectView private Navibar navibar; /** * 컨텐츠 레이아웃 */ @InjectView private RelativeLayout content_layout; /** * 미디어 레이아웃 */ @InjectView(id = R.id.media_layout) private RelativeLayout mediaLayout; /** * 미디어 보기 토클 */ @InjectView private ImageButton mediaToggle; /** * 메인 이미지 */ @InjectView private ImageView image; /** * 문의전화 */ @InjectView private ImageButton callphone; /** * 홈페이지 연결 */ @InjectView private ImageButton org_link; /** * 교통정보 * * @since 1.3.0 */ @InjectView private ImageButton traffic; /** * 닫기 */ @InjectView private ImageButton close; /** * 시설정보 */ private FacilSimpleInfo info; /** * 시설정보 */ private List<FacilInfo> facilsInfo = new ArrayList<FacilInfo>(); /** * 교통정보 * * @since 1.3.0 */ private List<FacilTrafficInfo> trafficInfo = new ArrayList<FacilTrafficInfo>(); /** * 이미지 다운로더 */ private ImageLoader imageLoader; /** * 이미지 어댑터 */ private ImageWorkerAdapter imageAdapter; @Override protected void onCreate(Bundle savedInstanceState) { Logger.d1(LOG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_facils_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_FACILS_SIMPLE_INFO); } } } @Override protected void initializeUI() { super.initializeUI(); content_layout.setVisibility(View.GONE); image.setScaleType(ScaleType.FIT_CENTER); if (null == imageAdapter) { imageAdapter = new ImageWorkerAdapter() { @Override public Object getItem(int num) { if (0 < facilsInfo.size()) { return facilsInfo.get(0).MAIN_IMG; } return null; } @Override public int getSize() { if (0 < facilsInfo.size()) { return 1; } return 0; } }; } mediaToggle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (View.GONE == mediaLayout.getVisibility()) { if (0 == facilsInfo.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)); } } }); callphone.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (0 < facilsInfo.size()) { FacilInfo detailInfo = facilsInfo.get(0); if (!Utils.isTrimEmpty(detailInfo.PHNE)) { // 전화 다이얼러 호출 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + detailInfo.PHNE)); startActivity(intent); } else { Toast.makeText(context, string(R.string.empty_callphone), Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(context, string(R.string.empty_callphone), Toast.LENGTH_SHORT).show(); } } }); org_link.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (0 < facilsInfo.size()) { FacilInfo detailInfo = facilsInfo.get(0); if (!Utils.isTrimEmpty(detailInfo.HOMEPAGE)) { String url = ""; if (!detailInfo.HOMEPAGE.startsWith("http://")) { url = "http://" + detailInfo.HOMEPAGE; } else { url = detailInfo.HOMEPAGE; } // 웹페이지 표시 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); } else { Toast.makeText(context, string(R.string.empty_homepage), Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(context, string(R.string.empty_homepage), Toast.LENGTH_SHORT).show(); } } }); /** * 교통정보 버튼 선택시 처리 * * @since 1.3.0 */ traffic.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (0 < trafficInfo.size()) { TrafficInfoPopup.show(context, trafficInfo); } else { Toast.makeText(context, string(R.string.empty_traffic), Toast.LENGTH_SHORT).show(); } } }); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); HOMEPAGE.setAutoLinkMask(Linkify.WEB_URLS); ETC_DESC.setAutoLinkMask(Linkify.WEB_URLS); FAC_DESC.setAutoLinkMask(Linkify.WEB_URLS); PHNE.setAutoLinkMask(Linkify.PHONE_NUMBERS); initializeFont(SeoulFont.getInstance().getSeoulHangang()); } @Override protected void initializeNavibar() { super.initializeNavibar(); navibar.setActionBack(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); navibar.setActionFuncVisible(View.INVISIBLE); // 제목 설정 navibar.setTitle(null != info ? info.FAC_NAME : ""); } /** * * @since 1.0.0 * @param tf */ private void initializeFont(Typeface tf) { navibar.setTypeface(tf); // 폰트 지정 FAC_NAME.setTypeface(tf); ADDR.setTypeface(tf); PHNE.setTypeface(tf); FAX.setTypeface(tf); HOMEPAGE.setTypeface(tf); OPENHOUR.setTypeface(tf); ENTR_FEE.setTypeface(tf); CLOSEDAY.setTypeface(tf); OPEN_DAY.setTypeface(tf); SEAT_CNT.setTypeface(tf); ETC_DESC.setTypeface(tf); FAC_DESC.setTypeface(tf); ENTRFREE.setTypeface(tf); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); initializeUI(); onResume(); } @Override protected void onResume() { super.onResume(); imageLoader = App.getImageLoader(imageAdapter); if (null != info && 0 < facilsInfo.size()) { // 정보표시 refreshData(); } if (0 == facilsInfo.size()) { // 상세정보 요청 request(); } } @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 연동 // /////////////////////////////////////////////////////////////////////////////////////////// /** * 로딩표시 * * @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 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 displayFacilsInfo() { if (0 == facilsInfo.size()) { return; } content_layout.setVisibility(View.VISIBLE); FacilInfo detailInfo = facilsInfo.get(0); navibar.setTitle(detailInfo.FAC_NAME); viewInfo(FAC_NAME, detailInfo.FAC_NAME, string(R.string.facil_name) + " "); viewInfo(ADDR, detailInfo.ADDR, string(R.string.facil_addr) + " "); viewInfo(PHNE, detailInfo.PHNE, string(R.string.facil_phne) + " "); viewInfo(FAX, detailInfo.FAX, string(R.string.facil_fax) + " "); viewInfo(HOMEPAGE, detailInfo.HOMEPAGE, string(R.string.facil_homepage) + " "); viewInfo(OPENHOUR, detailInfo.OPENHOUR, string(R.string.facil_openhour) + " "); viewInfo(ENTR_FEE, detailInfo.ENTR_FEE, string(R.string.facil_entr_fee) + " "); viewInfo(CLOSEDAY, detailInfo.CLOSEDAY, string(R.string.facil_closeday) + " "); viewInfo(OPEN_DAY, detailInfo.OPEN_DAY, string(R.string.facil_open_day) + " "); viewInfo(SEAT_CNT, detailInfo.SEAT_CNT, string(R.string.facil_seat_cnt) + " "); ETC_DESC.setText(Html.fromHtml(StringUtils.trim(string(R.string.facil_etc_desc) + " " + detailInfo.ETC_DESC), new URLImageParser(ETC_DESC, this), null)); FAC_DESC.setText(Html.fromHtml(StringUtils.trim(string(R.string.facil_fac_desc) + " " + detailInfo.FAC_DESC), new URLImageParser(FAC_DESC, this), null)); // viewInfo(ETC_DESC, detailInfo.ETC_DESC, string(R.string.facil_etc_desc) + " "); // viewInfo(FAC_DESC, detailInfo.FAC_DESC, string(R.string.facil_fac_desc) + " "); if (detailInfo.ENTRFREE.equals("0")) { viewInfo(ENTRFREE, string(R.string.free), string(R.string.facil_entrfree) + " "); } else { viewInfo(ENTRFREE, string(R.string.nonfree), string(R.string.facil_entrfree) + " "); } imageLoader.loadImage(detailInfo.MAIN_IMG, image); } /** * 데이터 초기화 후 갱신 * * @since 1.3.0 */ private void clearData() { facilsInfo.clear(); trafficInfo.clear(); refreshData(); } /** * 데이터 갱신 * * @since 1.0.0 */ synchronized private void refreshData() { runOnUiThread(new Runnable() { @Override public void run() { displayFacilsInfo(); } }); } // /////////////////////////////////////////////////////////////////////////////////////////// // 이하 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_FACIL_DETAIL_INFO: handleOpenInfo(tr); break; case CULTURE_FACIL_TRAFFIC_INFO: handleOpenTrafficInfo(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() { clearData(); requestInfo(1, 5, info.FAC_CODE); requestTrafficInfo(1, 5, info.FAC_CODE); } /** * 시설정보 조회 요청 * * @since 1.0.0 * @param start * @param end * @param faccode */ private void requestInfo(int start, int end, String faccode) { showLoading(); requestAccCount.incrementAndGet(); ServiceExecutor.getInstance().getFacilDetailInfo(OpenAPI.CULTURE_FACIL_DETAIL_INFO.name(), listener, OpenAPI.CULTURE_FACIL_DETAIL_INFO, faccode, start, end); } /** * 교통정보 요청 * * @since 1.0.0 * @param start * @param end * @param faccode */ private void requestTrafficInfo(int start, int end, String faccode) { showLoading(); requestAccCount.incrementAndGet(); ServiceExecutor.getInstance().getFacilTrafficInfo(OpenAPI.CULTURE_FACIL_TRAFFIC_INFO.name(), listener, OpenAPI.CULTURE_FACIL_TRAFFIC_INFO, faccode, start, end); } /** * 시설정보 처리 * * @since 1.0.0 * @param tr */ private void handleOpenInfo(BaseTrans tr) { OpenFacilDetailInfo item = (OpenFacilDetailInfo) tr; if (!item.infos.isEmpty()) { facilsInfo.addAll(item.infos); refreshData(); } } /** * 교통정보 처리 * * @since 1.3.0 * @param tr */ private void handleOpenTrafficInfo(BaseTrans tr) { OpenFacilTrafficInfo item = (OpenFacilTrafficInfo) tr; if (!item.infos.isEmpty()) { trafficInfo.addAll(item.infos); } } /** * * @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(); } /** * 시설명 */ @InjectView private TextView FAC_NAME; /** * 주소 */ @InjectView private TextView ADDR; /** * 전화번호 */ @InjectView private TextView PHNE; /** * 팩스번호 */ @InjectView private TextView FAX; /** * 홈페이지 */ @InjectView private TextView HOMEPAGE; /** * 관람시간 */ @InjectView private TextView OPENHOUR; /** * 관람료 */ @InjectView private TextView ENTR_FEE; /** * 휴관일 */ @InjectView private TextView CLOSEDAY; /** * 개관일자 */ @InjectView private TextView OPEN_DAY; /** * 객석수 */ @InjectView private TextView SEAT_CNT; /** * 기타사항 */ @InjectView private TextView ETC_DESC; /** * 시설소개 */ @InjectView private TextView FAC_DESC; /** * 무료구분 */ @InjectView private TextView ENTRFREE; }