package com.dingmouren.dingdingmap.ui.offlinemap;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.amap.api.maps.offlinemap.OfflineMapCity;
import com.amap.api.maps.offlinemap.OfflineMapManager;
import com.amap.api.maps.offlinemap.OfflineMapProvince;
import com.amap.api.maps.offlinemap.OfflineMapStatus;
import com.dingmouren.dingdingmap.Constant;
import com.dingmouren.dingdingmap.MyApplication;
import com.dingmouren.dingdingmap.R;
import com.dingmouren.dingdingmap.base.BaseActivity;
import com.dingmouren.dingdingmap.ui.adapter.OfflineDownloadedAdapter;
import com.dingmouren.dingdingmap.ui.adapter.OfflineListAdapter;
import com.dingmouren.dingdingmap.ui.adapter.OfflinePagerAdapter;
import com.dingmouren.dingdingmap.util.RevealAnimatorUtil;
import com.dingmouren.dingdingmap.util.SPUtil;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
/**
* Created by dingmouren on 2017/3/8.
*/
public class OfflineMapActivity extends BaseActivity implements OfflineMapManager.OfflineMapDownloadListener
, View.OnClickListener, OfflineMapManager.OfflineLoadedListener {
@BindView(R.id.img_back)
ImageView mImageBack;
@BindView(R.id.download_list_text)
TextView mDownloadText;
@BindView(R.id.downloaded_list_text)
TextView mDownloadedText;
@BindView(R.id.content_viewpage)
ViewPager mContentViewPage;
@BindView(R.id.container)
RelativeLayout mRootLayout;
private ExpandableListView mAllOfflineMapList;
private ListView mDownLoadedList;
private OfflineListAdapter adapter;
private OfflineDownloadedAdapter mDownloadedAdapter;
private PagerAdapter mPageAdapter;
private ProgressDialog initDialog;// 刚进入该页面时初始化弹出的dialog
private OfflineMapManager amapManager;//离线地图下载控制器
private final static int UPDATE_LIST = 0;//更新所有列表
private final static int SHOW_MSG = 1;//显示toast log
private final static int DISMISS_INIT_DIALOG = 2;
private final static int SHOW_INIT_DIALOG = 3;
private List<OfflineMapProvince> provinceList = new ArrayList<OfflineMapProvince>();// 保存一级目录的省直辖市
private int animatorX ,animatorY;//动画开始和结束的坐标
private RevealAnimatorUtil revealAnimatorUtil;//揭露动画工具类
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_LIST:
if (mContentViewPage.getCurrentItem() == 0) {
((BaseExpandableListAdapter) adapter).notifyDataSetChanged();
} else {
mDownloadedAdapter.notifyDataChange();
}
break;
case SHOW_MSG:
Toast.makeText(MyApplication.applicationContext, (String) msg.obj, Toast.LENGTH_SHORT).show();
break;
case DISMISS_INIT_DIALOG:
initDialog.dismiss();
handler.sendEmptyMessage(UPDATE_LIST);
break;
case SHOW_INIT_DIALOG:
if (initDialog != null) {
initDialog.show();
}
break;
default:
break;
}
}
};
@Override
public int setLayoutId() {
return R.layout.activity_offlinemap;
}
@Override
public void initView(Bundle savedInstanceState) {
animatorX = (int) SPUtil.get(MyApplication.applicationContext, Constant.REVEAL_CENTER_X,this.getWindowManager().getDefaultDisplay().getWidth());//默认值是屏幕宽度
animatorY = (int) SPUtil.get(MyApplication.applicationContext,Constant.REVEAL_CENTER_Y,this.getWindowManager().getDefaultDisplay().getHeight());//默认值是屏幕高度
amapManager = new OfflineMapManager(this, this);//构造离线地图类
amapManager.setOnOfflineLoadedListener(this);
initDialog();
//揭露动画
revealAnimatorUtil = new RevealAnimatorUtil(mRootLayout,this);
// mRootLayout.post(()-> revealAnimatorUtil.startRevealAnimator(false,animatorX,animatorY));进入的时候不使用揭露动画
}
@Override
public void initListener() {
mImageBack.setOnClickListener(this);
mDownloadText.setOnClickListener(this);
mDownloadedText.setOnClickListener(this);
mContentViewPage.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int paddingHorizontal = mDownloadedText.getPaddingLeft();
int paddingVertical = mDownloadedText.getPaddingTop();
switch (position) {
case 0:
mDownloadText.setBackground(getResources().getDrawable(R.drawable.offline_left_checked));
mDownloadText.setTextColor(Color.WHITE);
mDownloadedText.setBackground(getResources().getDrawable(R.drawable.offline_right_normal));
mDownloadText.setTextColor(Color.GRAY);
break;
case 1:
mDownloadText.setBackground(getResources().getDrawable(R.drawable.offline_left_normal));
mDownloadText.setTextColor(Color.GRAY);
mDownloadedText.setBackground(getResources().getDrawable(R.drawable.offline_right_checked));
mDownloadedText.setTextColor(Color.WHITE);
break;
}
handler.sendEmptyMessage(UPDATE_LIST);
mDownloadedText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
mDownloadText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@Override
public void initData() {
}
@Override
protected void onDestroy() {
super.onDestroy();
if (amapManager != null) {
amapManager.destroy();
}
if (initDialog != null) {
initDialog.dismiss();
initDialog.cancel();
}
}
@Override
public void onBackPressed() {
revealAnimatorUtil.startRevealAnimator(true,animatorX,animatorY);
}
@Override//OfflineLoadedListener
public void onVerifyComplete() {
initAllCityList();
initDownloadedList();
initViewpage();
dissmissDialog();
}
@Override//OfflineMapManager
public void onDownload(int status, int completeCode, String downName) {
switch (status) {
case OfflineMapStatus.SUCCESS:
break;
case OfflineMapStatus.LOADING:
Log.d("amap-download", "download: " + completeCode + "%" + "," + downName);
break;
case OfflineMapStatus.UNZIP:
Log.d("amap-unzip", "unzip: " + completeCode + "%" + "," + downName);
break;
case OfflineMapStatus.WAITING:
Log.d("amap-waiting", "WAITING: " + completeCode + "%" + "," + downName);
break;
case OfflineMapStatus.PAUSE:
Log.d("amap-pause", "pause: " + completeCode + "%" + "," + downName);
break;
case OfflineMapStatus.STOP:
break;
case OfflineMapStatus.ERROR:
Log.e("amap-download", "download: " + " ERROR " + downName);
break;
case OfflineMapStatus.EXCEPTION_AMAP:
Log.e("amap-download", "download: " + " EXCEPTION_AMAP " + downName);
break;
case OfflineMapStatus.EXCEPTION_NETWORK_LOADING:
Log.e("amap-download", "download: " + " EXCEPTION_NETWORK_LOADING " + downName);
Toast.makeText(OfflineMapActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
amapManager.pause();
break;
case OfflineMapStatus.EXCEPTION_SDCARD:
Log.e("amap-download", "download: " + " EXCEPTION_SDCARD " + downName);
break;
default:
break;
}
handler.sendEmptyMessage(UPDATE_LIST);
}
@Override//OfflineMapManager
public void onCheckUpdate(boolean hasNew, String name) {
Log.i("amap-demo", "onCheckUpdate " + name + " : " + hasNew);
Message message = new Message();
message.what = SHOW_MSG;
message.obj = name + "地图数据" + (hasNew == true ? "有更新":"已经是最新");
handler.sendMessage(message);
}
@Override//OfflineMapManager
public void onRemove(boolean success, String name, String describe) {
Log.i("amap-demo", "删除 " + name + " 离线地图" + (success == true ? "成功":"失败"));
handler.sendEmptyMessage(UPDATE_LIST);
Message message = new Message();
message.what = SHOW_MSG;
message.obj = "删除" + name + "离线地图" + (success == true ? "成功":"失败");
handler.sendMessage(message);
}
@Override//OnClickListener
public void onClick(View v) {
switch (v.getId()) {
case R.id.download_list_text:
int paddingHorizontal = mDownloadText.getPaddingLeft();
int paddingVertical = mDownloadText.getPaddingTop();
mContentViewPage.setCurrentItem(0);
mDownloadText.setBackground(MyApplication.applicationContext.getResources().getDrawable(R.drawable.offline_left_checked));
mDownloadText.setTextColor(Color.WHITE);
mDownloadedText.setBackground(MyApplication.applicationContext.getResources().getDrawable(R.drawable.offline_right_normal));
mDownloadedText.setTextColor(Color.GRAY);
mDownloadedText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
mDownloadText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
mDownloadedAdapter.notifyDataChange();
break;
case R.id.downloaded_list_text:
int paddingHorizontal1 = mDownloadedText.getPaddingLeft();
int paddingVertical1 = mDownloadedText.getPaddingTop();
mContentViewPage.setCurrentItem(1);
mDownloadText.setBackground (MyApplication.applicationContext.getResources().getDrawable(R.drawable.offline_left_normal));
mDownloadText.setTextColor(Color.GRAY);
mDownloadedText.setBackground (MyApplication.applicationContext.getResources().getDrawable(R.drawable.offline_right_checked));
mDownloadedText.setTextColor(Color.WHITE);
mDownloadedText.setPadding(paddingHorizontal1, paddingVertical1, paddingHorizontal1, paddingVertical1);
mDownloadText.setPadding(paddingHorizontal1, paddingVertical1, paddingHorizontal1, paddingVertical1);
mDownloadedAdapter.notifyDataChange();
break;
case R.id.img_back:
onBackPressed();
break;
}
}
/**
* 初始化如果已下载的城市多的话,会比较耗时
*/
private void initDialog() {
if (initDialog == null)
initDialog = new ProgressDialog(this);
initDialog.setMessage("正在获取离线城市列表");
initDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
initDialog.setIndeterminate(false);
initDialog.setCancelable(false);
initDialog.show();
}
/**
* 隐藏进度框
*/
private void dissmissDialog() {
if (initDialog != null) {
initDialog.dismiss();
}
}
/**
* 初始化ViewPager
*/
private void initViewpage() {
mPageAdapter = new OfflinePagerAdapter(mContentViewPage,
mAllOfflineMapList, mDownLoadedList);
mContentViewPage.setAdapter(mPageAdapter);
mContentViewPage.setCurrentItem(0);
}
/**
* 初始化所有城市列表
*/
public void initAllCityList() {
// 扩展列表
View provinceContainer = LayoutInflater.from(OfflineMapActivity.this)
.inflate(R.layout.offline_province_listview, null);
mAllOfflineMapList = (ExpandableListView) provinceContainer
.findViewById(R.id.province_download_list);
initProvinceListAndCityMap();
adapter = new OfflineListAdapter(provinceList, amapManager,
OfflineMapActivity.this);
// 为列表绑定数据源
mAllOfflineMapList.setAdapter(adapter);
// adapter实现了扩展列表的展开与合并监听
mAllOfflineMapList.setOnGroupCollapseListener(adapter);
mAllOfflineMapList.setOnGroupExpandListener(adapter);
mAllOfflineMapList.setGroupIndicator(null);
}
private void initProvinceListAndCityMap() {
List<OfflineMapProvince> lists = amapManager
.getOfflineMapProvinceList();
provinceList.add(null);
provinceList.add(null);
provinceList.add(null);
// 添加3个null 以防后面添加出现 index out of bounds
ArrayList<OfflineMapCity> cityList = new ArrayList<OfflineMapCity>();// 以市格式保存直辖市、港澳、全国概要图
ArrayList<OfflineMapCity> gangaoList = new ArrayList<OfflineMapCity>();// 保存港澳城市
ArrayList<OfflineMapCity> gaiyaotuList = new ArrayList<OfflineMapCity>();// 保存概要图
for (int i = 0; i < lists.size(); i++) {
OfflineMapProvince province = lists.get(i);
if (province.getCityList().size() != 1) {
// 普通省份
provinceList.add(i + 3, province);
// cityMap.put(i + 3, cities);
} else {
String name = province.getProvinceName();
if (name.contains("香港")) {
gangaoList.addAll(province.getCityList());
} else if (name.contains("澳门")) {
gangaoList.addAll(province.getCityList());
} else if (name.contains("全国概要图")) {
gaiyaotuList.addAll(province.getCityList());
} else {
// 直辖市
cityList.addAll(province.getCityList());
}
}
}
// 添加,概要图,直辖市,港口
OfflineMapProvince gaiyaotu = new OfflineMapProvince();
gaiyaotu.setProvinceName("概要图");
gaiyaotu.setCityList(gaiyaotuList);
provinceList.set(0, gaiyaotu);// 使用set替换掉刚开始的null
OfflineMapProvince zhixiashi = new OfflineMapProvince();
zhixiashi.setProvinceName("直辖市");
zhixiashi.setCityList(cityList);
provinceList.set(1, zhixiashi);
OfflineMapProvince gaogao = new OfflineMapProvince();
gaogao.setProvinceName("港澳");
gaogao.setCityList(gangaoList);
provinceList.set(2, gaogao);
}
/**
* 初始化已下载列表
*/
public void initDownloadedList() {
mDownLoadedList = (ListView) LayoutInflater.from(
OfflineMapActivity.this).inflate(
R.layout.offline_downloaded_list, null);
android.widget.AbsListView.LayoutParams params = new android.widget.AbsListView.LayoutParams(
android.widget.AbsListView.LayoutParams.MATCH_PARENT,
android.widget.AbsListView.LayoutParams.WRAP_CONTENT);
mDownLoadedList.setLayoutParams(params);
mDownloadedAdapter = new OfflineDownloadedAdapter(this, amapManager);
mDownLoadedList.setAdapter(mDownloadedAdapter);
}
}