package com.dingmouren.dingdingmap.bean; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.amap.api.maps.AMapException; import com.amap.api.maps.offlinemap.OfflineMapCity; import com.amap.api.maps.offlinemap.OfflineMapManager; import com.amap.api.maps.offlinemap.OfflineMapStatus; import com.dingmouren.dingdingmap.MyApplication; import com.dingmouren.dingdingmap.R; public class OfflineChild implements OnClickListener, OnLongClickListener { private Context mContext; private TextView mOffLineCityName;// 离线包名称 private TextView mOffLineCitySize;// 离线包大小 private ImageView mDownloadImage;// 下载相关Image private TextView mDownloadProgress; private OfflineMapManager amapManager; private OfflineMapCity mMapCity;// 离线下载城市 private boolean mIsDownloading = false; private boolean isProvince = false; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int completeCode = (Integer) msg.obj; switch (msg.what) { case OfflineMapStatus.LOADING: displyaLoadingStatus(completeCode); break; case OfflineMapStatus.PAUSE: displayPauseStatus(completeCode); break; case OfflineMapStatus.STOP: break; case OfflineMapStatus.SUCCESS: displaySuccessStatus(); break; case OfflineMapStatus.UNZIP: displayUnZIPStatus(completeCode); break; case OfflineMapStatus.ERROR: displayExceptionStatus(); break; case OfflineMapStatus.WAITING: displayWaitingStatus(completeCode); break; case OfflineMapStatus.CHECKUPDATES: displayDefault(); break; case OfflineMapStatus.EXCEPTION_AMAP: case OfflineMapStatus.EXCEPTION_NETWORK_LOADING: case OfflineMapStatus.EXCEPTION_SDCARD: displayExceptionStatus(); break; case OfflineMapStatus.NEW_VERSION: displayHasNewVersion(); break; } } }; public boolean isProvince() { return isProvince; } public void setProvince(boolean isProvince) { this.isProvince = isProvince; } public OfflineChild(Context context, OfflineMapManager offlineMapManager) { mContext = context; initView(); amapManager = offlineMapManager; // mOfflineMapManager = new OfflineMapManager(mContext, this); } public String getCityName() { if (mMapCity != null) { return mMapCity.getCity(); } return null; } public View getOffLineChildView() { return mOffLineChildView; } private View mOffLineChildView; private void initView() { LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mOffLineChildView = inflater.inflate(R.layout.offlinemap_child, null); mOffLineCityName = (TextView) mOffLineChildView.findViewById(R.id.name); mOffLineCitySize = (TextView) mOffLineChildView .findViewById(R.id.name_size); mDownloadImage = (ImageView) mOffLineChildView .findViewById(R.id.download_status_image); mDownloadProgress = (TextView) mOffLineChildView .findViewById(R.id.download_progress_status); mOffLineChildView.setOnClickListener(this); mOffLineChildView.setOnLongClickListener(this); } public void setOffLineCity(OfflineMapCity mapCity) { if (mapCity != null) { mMapCity = mapCity; mOffLineCityName.setText(mapCity.getCity()); double size = ((int) (mapCity.getSize() / 1024.0 / 1024.0 * 100)) / 100.0; mOffLineCitySize.setText(String.valueOf(size) + " M"); notifyViewDisplay(mMapCity.getState(), mMapCity.getcompleteCode(), mIsDownloading); } } /** * 更新显示状态 在被点击和下载进度发生改变时会被调用 * * @param status * @param completeCode * @param isDownloading */ private void notifyViewDisplay(int status, int completeCode, boolean isDownloading) { if (mMapCity != null) { mMapCity.setState(status); mMapCity.setCompleteCode(completeCode); } Message msg = new Message(); msg.what = status; msg.obj = completeCode; handler.sendMessage(msg); } /** * 最原始的状态,未下载,显示下载按钮 */ private void displayDefault() { mDownloadProgress.setVisibility(View.INVISIBLE); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_download); } /** * 显示有更新 */ private void displayHasNewVersion() { mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_download); mDownloadProgress.setText("已下载-有更新"); } /** * 等待中 * * @param completeCode */ private void displayWaitingStatus(int completeCode) { mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_start); mDownloadProgress.setTextColor(Color.parseColor("#05C1F1")); mDownloadProgress.setText("等待中"); } /** * 下载出现异常 */ private void displayExceptionStatus() { mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_start); mDownloadProgress.setTextColor(Color.parseColor("#05C1F1")); mDownloadProgress.setText("下载出现异常"); } /** * 暂停 * * @param completeCode */ private void displayPauseStatus(int completeCode) { if (mMapCity != null) { completeCode = mMapCity.getcompleteCode(); } mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_start); mDownloadProgress.setTextColor(Color.parseColor("#05C1F1")); mDownloadProgress.setText("暂停中:" + completeCode + "%"); } /** * 下载成功 */ private void displaySuccessStatus() { mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.GONE); mDownloadProgress.setText("安装成功"); mDownloadProgress.setTextColor(mContext.getResources().getColor( android.R.color.darker_gray)); } /** * 正在解压 */ private void displayUnZIPStatus(int completeCode) { mDownloadProgress.setVisibility(View.VISIBLE); mDownloadImage.setVisibility(View.GONE); mDownloadProgress.setText("正在解压: " + completeCode + "%"); mDownloadProgress.setTextColor(mContext.getResources().getColor( android.R.color.darker_gray)); } /** * * @param completeCode */ private void displyaLoadingStatus(int completeCode) { // todo if (mMapCity == null) { return; } mDownloadProgress.setVisibility(View.VISIBLE); mDownloadProgress.setText(mMapCity.getcompleteCode() + "%"); mDownloadImage.setVisibility(View.VISIBLE); mDownloadImage.setImageResource(R.drawable.offlinearrow_stop); mDownloadProgress.setTextColor(Color.parseColor("#05C1F1")); } private synchronized void pauseDownload() { amapManager.pause(); // amapManager.pauseByName(getCityName()); //暂停下载之后,开始下一个等待中的任务 amapManager.restart(); } /** * 启动下载任务 */ private synchronized boolean startDownload() { try { if (isProvince) { amapManager.downloadByProvinceName(mMapCity.getCity()); } else { amapManager.downloadByCityName(mMapCity.getCity()); } return true; } catch (AMapException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(mContext, e.getErrorMessage(), Toast.LENGTH_SHORT).show(); return false; } } public void onClick(View view) { int completeCode = -1, status = -1; if (mMapCity != null) { status = mMapCity.getState(); completeCode = mMapCity.getcompleteCode(); switch (status) { case OfflineMapStatus.UNZIP: case OfflineMapStatus.SUCCESS: // 解压中何在成功啥不干 break; case OfflineMapStatus.LOADING: // case OfflineMapStatus.WAITING: pauseDownload(); // 在下载中的时候点击,表示要暂停 displayPauseStatus(completeCode); break; case OfflineMapStatus.PAUSE: case OfflineMapStatus.CHECKUPDATES: case OfflineMapStatus.ERROR: case OfflineMapStatus.WAITING: // case OfflineMapStatus.NEW_VERSION: default: if(startDownload()) displayWaitingStatus(completeCode); else displayExceptionStatus(); break; } Log.e("zxy-child", mMapCity.getCity() + " " + mMapCity.getState()); } } /** * 长按弹出提示框 删除(取消)下载 * 加入synchronized 避免在dialog还没有关闭的时候再次,请求弹出的bug */ public synchronized void showDeleteDialog(final String name) { new MaterialDialog.Builder(mContext) .title(name) .items(R.array.offline_map_del_or_update) .itemsCallbackSingleChoice(1,(dialog1, itemView, which, text) -> { switch (which){ case 0: amapManager.remove(name); break; case 1: try { amapManager.updateOfflineCityByName(name); } catch (AMapException e) { e.printStackTrace(); } break; } return true; }) .positiveText("确定") .negativeText("取消") .onPositive((dialog1, which) -> { }) .onNegative((dialog1, which) -> dialog1.dismiss()) .show(); } /** * 长按弹出提示框 删除和更新 */ public void showDeleteUpdateDialog(final String name) { new MaterialDialog.Builder(mContext) .title(name) .items(R.array.offline_map_del_or_update) .itemsCallbackSingleChoice(1,(dialog1, itemView, which, text) -> { switch (which){ case 0: amapManager.remove(name); break; case 1: try { amapManager.updateOfflineCityByName(name); } catch (AMapException e) { e.printStackTrace(); } break; } return true; }) .positiveText("确定") .negativeText("取消") .onPositive((dialog1, which) -> { }) .onNegative((dialog1, which) -> dialog1.dismiss()) .show(); } public boolean onLongClick(View arg0) { Log.d("amap-longclick", mMapCity.getCity() + " : " + mMapCity.getState()); if (mMapCity.getState() == OfflineMapStatus.SUCCESS) { showDeleteUpdateDialog(mMapCity.getCity()); } else if (mMapCity.getState() != OfflineMapStatus.CHECKUPDATES) { showDeleteDialog(mMapCity.getCity()); } return false; } }