package com.aincc.seoulexcursion.ui.scene;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.TextView;
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.control.ExitBackChecker;
import com.aincc.lib.ui.widget.page.APagerAdapter.OnPagerClickListener;
import com.aincc.lib.ui.widget.page.PageIndicator;
import com.aincc.lib.ui.widget.page.PageIndicator.OnPageClickListener;
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.MainPagerAdapter;
import com.aincc.seoulexcursion.ui.control.MainPagerAdapter.MainPageItem;
import com.aincc.seoulexcursion.ui.scene.assets.AssetsActivity;
import com.aincc.seoulexcursion.ui.scene.parks.ParksActivity;
import com.aincc.seoulexcursion.ui.scene.plays.PlaysActivity;
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.CodeInfo;
import com.aincc.seoulopenapi.network.OpenBase;
import com.aincc.seoulopenapi.openapi.culture.OpenAssetsCodeInfo;
import com.aincc.seoulopenapi.openapi.culture.OpenFacilCodeInfo;
import com.aincc.seoulopenapi.openapi.culture.OpenPlayCodeInfo;
/**
*
* <h3><b>MainActivity</b></h3></br>
*
* 메인 화면 <br>
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
public class MainActivity extends SeoulBaseActivity
{
/**
* 상단 네비게이션 바
*/
@InjectView
private Navibar navibar;
/**
* 대메뉴 페이져
*/
@InjectView
private ViewPager pager;
/**
* 대메뉴 문구
*/
@InjectView
private TextView title;
/**
* 대메뉴 페이지 인디게이터
*/
@InjectView
private PageIndicator pageIndicator;
/**
* 대메뉴 페이저 어댑터
*/
private MainPagerAdapter adapter;
/**
* 대메뉴 페이지 항목
*/
private List<MainPageItem> pages;
/**
* 핸들러
*/
private LauncherHandler handler;
/**
* 종료처리
*/
private ExitBackChecker exitChecker;
/**
* 요청누적계수
*/
private AtomicInteger requestAccCount = new AtomicInteger(0);
/**
* 문화재 분류코드 이터레이터
*/
private Iterator<CodeInfo> assetsIterator;
private CodeInfo currentAssetsCode = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 세부화면 실행 핸들러
handler = new LauncherHandler(this);
// 종료체크 설정
exitChecker = new ExitBackChecker(this, handler, 2000);
mappingViews(this);
initializeUI();
}
@Override
protected void initializeUI()
{
super.initializeUI();
setCurrentMenu(0);
title.setTypeface(SeoulFont.getInstance().getSeoulHangang());
initializePager();
initializeCodeInfo();
}
/**
* 상단 네비게이션 바 초기화
*
* @since 1.0.0
*/
protected void initializeNavibar()
{
super.initializeNavibar();
navibar.setTypeface(SeoulFont.getInstance().getSeoulHangang());
navibar.setActionBackVisible(View.INVISIBLE);
navibar.setActionFuncVisible(View.INVISIBLE);
navibar.setTitle(string(R.string.title_activity_main));
}
/**
* 대메뉴 페이저 초기화
*
* @since 1.0.0
*/
private void initializePager()
{
// 대메뉴 항목 설정
pages = new ArrayList<MainPagerAdapter.MainPageItem>();
pages.add(new MainPageItem(R.layout.main_page, R.id.presentImageView, R.drawable.seoul_park));
pages.add(new MainPageItem(R.layout.main_page, R.id.presentImageView, R.drawable.seoul_play));
pages.add(new MainPageItem(R.layout.main_page, R.id.presentImageView, R.drawable.seoul_assets));
// 페이저 어댑터 설정
adapter = new MainPagerAdapter(this, pages);
adapter.setOnPagerClickListener(new OnPagerClickListener()
{
@Override
public void onPagerClicked(int position)
{
Message msg = handler.obtainMessage(position);
handler.sendMessage(msg);
}
});
// 페이저 설정
pager.setAdapter(adapter);
pager.setOverScrollMode(View.OVER_SCROLL_NEVER);
pager.setOnPageChangeListener(new OnPageChangeListener()
{
@Override
public void onPageSelected(int position)
{
pageIndicator.setPage(position);
setCurrentMenu(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);
setCurrentMenu(page);
}
});
}
/**
* 코드정보 초기화 요청
*
* @since 1.0.0
*/
private void initializeCodeInfo()
{
requestThemeCategory();
requestSubjectCategory();
requestAssetsCategory();
requestPlayCategory();
}
/**
* 현재 메뉴 문구 설정
*
* @since 1.0.0
* @param position
*/
private void setCurrentMenu(int position)
{
switch (position)
{
case MOVE_TO_PARKS:
title.setText(string(R.string.main_menu_park));
break;
case MOVE_TO_PLAY:
title.setText(string(R.string.main_menu_play));
break;
case MOVE_TO_ASSETS:
title.setText(string(R.string.main_menu_assets));
break;
}
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
initializeUI();
}
@Override
protected void onResume()
{
super.onResume();
// 종료체크 옵저버 등록
exitChecker.registerObserver();
}
@Override
protected void onPause()
{
super.onPause();
ServiceExecutor.getInstance().cancelAll();
// 종료체크 옵저버 해제
exitChecker.unregisterObserver();
}
@Override
public void onBackPressed()
{
// 백버튼 처리
exitChecker.backPressed();
}
/**
* 로딩 표시 (초기화 과정이므로, 취소 불가)
*
* @since 1.0.0
*/
private void showLoading()
{
startProgress(string(R.string.loading_init), false, null, Constants.COLOR_BLACK);
}
/**
* 문화시설 테마분류 요청
*
* @since 1.0.0
*/
private void requestThemeCategory()
{
if (0 != App.facilThemeCode.size())
{
return;
}
showLoading();
requestAccCount.incrementAndGet();
ServiceExecutor.getInstance().getFacilCodeInfo(OpenAPI.CULTURE_FACIL_CATEGORY_BY_THEME.name(), listener, OpenAPI.CULTURE_FACIL_CATEGORY_BY_THEME, Constants.INIT_START_INDEX, Constants.FETCH_COUNT);
}
/**
* 문화시설 주제분류 요청
*
* @since 1.0.0
*/
private void requestSubjectCategory()
{
if (0 != App.facilSubjectCode.size())
{
return;
}
showLoading();
requestAccCount.incrementAndGet();
ServiceExecutor.getInstance().getFacilCodeInfo(OpenAPI.CULTURE_FACIL_CATEGORY_BY_SUBJ.name(), listener, OpenAPI.CULTURE_FACIL_CATEGORY_BY_SUBJ, Constants.INIT_START_INDEX, Constants.FETCH_COUNT);
}
/**
* 문화재 분류코드 요청
*
* @since 1.0.0
*/
private void requestAssetsCategory()
{
if (0 != App.assetsCode.size())
{
return;
}
showLoading();
requestAccCount.incrementAndGet();
ServiceExecutor.getInstance().getAssetsCodeInfo(OpenAPI.CULTURE_ASSETS_CATEGORY.name(), listener, OpenAPI.CULTURE_ASSETS_CATEGORY, null, Constants.INIT_START_INDEX, Constants.FETCH_COUNT);
}
/**
* 문화재 세부분류코드 요청
*
* @since 1.0.0
*/
private void requestAssetsDetailCategory(String upperCode)
{
// 요청구분을 OpenAPI 타입으로 구분되므로, 순차적으로 처리한다.
showLoading();
requestAccCount.incrementAndGet();
ServiceExecutor.getInstance().getAssetsCodeInfo(OpenAPI.CULTURE_ASSETS_DETAIL_CATEGORY.name(), listener, OpenAPI.CULTURE_ASSETS_DETAIL_CATEGORY, upperCode, Constants.INIT_START_INDEX, Constants.FETCH_COUNT);
}
/**
* 공연행사 주제분류코드 요청
*
* @since 1.0.0
*/
private void requestPlayCategory()
{
if (0 != App.playCode.size())
{
return;
}
showLoading();
requestAccCount.incrementAndGet();
ServiceExecutor.getInstance().getPlayCodeInfo(OpenAPI.CULTURE_PLAY_CATEGORY.name(), listener, OpenAPI.CULTURE_PLAY_CATEGORY, Constants.INIT_START_INDEX, Constants.FETCH_COUNT);
}
@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_CATEGORY_BY_THEME:
handleOpenFacilCategoryTheme(tr);
break;
case CULTURE_FACIL_CATEGORY_BY_SUBJ:
handleOpenFacilCategorySubject(tr);
break;
case CULTURE_ASSETS_CATEGORY:
handleOpenAssetsCategory(tr);
break;
case CULTURE_PLAY_CATEGORY:
handleOpenPlayCategory(tr);
break;
case CULTURE_ASSETS_DETAIL_CATEGORY:
handleOpenAssetsDetailCategory(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
* @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));
}
/**
* 문화시설 테마분류 목록 검색
*
* @since 1.0.0
* @param tr
*/
private void handleOpenFacilCategoryTheme(BaseTrans tr)
{
OpenFacilCodeInfo item = (OpenFacilCodeInfo) tr;
if (!item.infos.isEmpty())
{
StringBuilder sb = new StringBuilder();
for (CodeInfo code : item.infos)
{
sb.append(code.CODE).append("|").append(code.CODENAME).append("|");
}
PreferencesUtil.setString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_FACILITY_THEME, sb.toString());
App.setFacilThemeCode(sb.toString());
}
}
/**
* 문화시설 주제분류 목록 검색
*
* @since 1.0.0
* @param tr
*/
private void handleOpenFacilCategorySubject(BaseTrans tr)
{
OpenFacilCodeInfo item = (OpenFacilCodeInfo) tr;
if (!item.infos.isEmpty())
{
StringBuilder sb = new StringBuilder();
for (CodeInfo code : item.infos)
{
sb.append(code.CODE).append("|").append(code.CODENAME).append("|");
}
PreferencesUtil.setString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_FACILITY_SUBJECT, sb.toString());
App.setFacilSubjectCode(sb.toString());
}
}
/**
* 문화재 분류 목록 검색
*
* @since 1.0.0
* @param tr
*/
private void handleOpenAssetsCategory(BaseTrans tr)
{
OpenAssetsCodeInfo item = (OpenAssetsCodeInfo) tr;
if (!item.infos.isEmpty())
{
StringBuilder sb = new StringBuilder();
for (CodeInfo code : item.infos)
{
sb.append(code.CODE).append("|").append(code.CODENAME).append("|");
}
PreferencesUtil.setString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_ASSETS, sb.toString());
App.setAssetsCode(sb.toString());
assetsIterator = App.assetsCode.iterator();
if (assetsIterator.hasNext())
{
currentAssetsCode = assetsIterator.next();
requestAssetsDetailCategory(currentAssetsCode.CODE);
}
}
}
/**
* 문화재 세부분류 목록 검색
*
* @since 1.0.0
* @param tr
*/
private void handleOpenAssetsDetailCategory(BaseTrans tr)
{
OpenAssetsCodeInfo item = (OpenAssetsCodeInfo) tr;
if (!item.infos.isEmpty())
{
StringBuilder sb = new StringBuilder();
for (CodeInfo code : item.infos)
{
sb.append(code.CODE).append("|").append(code.CODENAME).append("|");
}
PreferencesUtil.setString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_ASSETS_DETAIL + currentAssetsCode.CODE, sb.toString());
App.setAssetsDetailCode(currentAssetsCode, sb.toString());
}
// 다음 문화재 메인분류에 대한 세부분류 요청
if (assetsIterator.hasNext())
{
currentAssetsCode = assetsIterator.next();
requestAssetsDetailCategory(currentAssetsCode.CODE);
}
}
/**
* 공연행사 주제분류 목록 검색
*
* @since 1.0.0
* @param tr
*/
private void handleOpenPlayCategory(BaseTrans tr)
{
OpenPlayCodeInfo item = (OpenPlayCodeInfo) tr;
if (!item.infos.isEmpty())
{
StringBuilder sb = new StringBuilder();
for (CodeInfo code : item.infos)
{
sb.append(code.CODE).append("|").append(code.CODENAME).append("|");
}
PreferencesUtil.setString(this, Constants.PREFS_CODE_FILE, Constants.PREFS_KEY_PLAY, sb.toString());
App.setPlayCode(sb.toString());
}
}
private static final String LOG = "Seoul";
private static final int MOVE_TO_PARKS = 0;
private static final int MOVE_TO_PLAY = 1;
private static final int MOVE_TO_ASSETS = 2;
private static final int MOVE_TO_UPDATE = 999;
/**
* 공원정보 조회 액티비티 호출
*
* @since 1.0.0
*/
private void moveToParks()
{
Intent intent = new Intent(this, ParksActivity.class);
startActivity(intent);
}
/**
* 공연/문화시설 조회 액티비티 호출
*
* @since 1.0.0
*/
private void moveToPlays()
{
Intent intent = new Intent(this, PlaysActivity.class);
startActivity(intent);
}
/**
* 문화재정보 조회 액티비티 호출
*
* @since 1.0.0
*/
private void moveToAssets()
{
Intent intent = new Intent(this, AssetsActivity.class);
startActivity(intent);
}
// TODO: 버전체크 가능하도록 해야겠어..근데 어떻게?
// 확인해보고 되면 팝업 띄워서 업데이트 연결하도록 해봅시다.
/**
* 마켓 연결
*
* @since 1.0.0
*/
private void moveToUpdateMarket()
{
String uri = "market://details?id=com.aincc.seoulexcursion";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
}
/**
* 메시지 처리
*
* @since 1.0.0
* @param msg
*/
public void handleMessage(Message msg)
{
switch (msg.what)
{
case MOVE_TO_PARKS:
moveToParks();
break;
case MOVE_TO_PLAY:
moveToPlays();
break;
case MOVE_TO_ASSETS:
moveToAssets();
break;
case MOVE_TO_UPDATE:
moveToUpdateMarket();
default:
break;
}
}
/**
*
* <h3><b>LauncherHandler</b></h3></br>
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
static class LauncherHandler extends Handler
{
private final WeakReference<MainActivity> activity;
LauncherHandler(MainActivity activity)
{
this.activity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg)
{
MainActivity activity = this.activity.get();
activity.handleMessage(msg);
}
}
}