package org.droidplanner.android.maps.providers.baidu_map; import android.content.res.Resources; import android.preference.DialogPreference; import android.util.Log; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.baidu.mapapi.map.offline.MKOLSearchRecord; import com.baidu.mapapi.map.offline.MKOLUpdateElement; import com.baidu.mapapi.map.offline.MKOfflineMap; import com.baidu.mapapi.map.offline.MKOfflineMapListener; import java.util.Collections; import java.util.List; import java.util.ArrayList; import org.droidplanner.android.R; public class BaiduMapOfflineMapPreference extends DialogPreference implements MKOfflineMapListener { private MKOfflineMap mOffline = null; private View mBindDialogView = null; private TextView mCidView = null; private TextView mStateView =null; private EditText mCityNameView = null; private LocalMapAdapter mLAdapter = null; private LinearLayout mCityListLayout = null; private LinearLayout mLocalMapLayout = null; private List<MKOLUpdateElement> mLocalMapList = null; // downloaded offline map list private static final int DATA_SIZE_ONE_KB = 1024 * 1024; private static final int DATA_SIZE_UNIT_KB = 1024; private static final double DATA_SIZE_UNIT_MB = 1024 * 1024.0; public BaiduMapOfflineMapPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.fragment_baidumap_offline_map_preference); } private void initView(View view) { mCidView = (TextView) view.findViewById(org.droidplanner.android.R.id.cityid); mCityNameView = (EditText) view.findViewById(org.droidplanner.android.R.id.city); mStateView = (TextView) view.findViewById(org.droidplanner.android.R.id.state); ListView hotCityList = (ListView) view.findViewById(org.droidplanner.android.R.id.hotcitylist); ArrayList<String> hotCities = new ArrayList<String>(); // get hot city list ArrayList<MKOLSearchRecord> hotCityRecords = mOffline.getHotCityList(); if (hotCityRecords != null) { for (MKOLSearchRecord r : hotCityRecords) { hotCities.add(r.cityName + "(" + r.cityID + ")" + " --" + this.formatDataSize(r.size)); } } ListAdapter hAdapter = (ListAdapter) new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, hotCities); hotCityList.setAdapter(hAdapter); ListView allCityList = (ListView) view.findViewById(R.id.allcitylist); // get all offline city map ArrayList<String> allCities = new ArrayList<String>(); ArrayList<MKOLSearchRecord> offlineCityrecords = mOffline.getOfflineCityList(); if (offlineCityrecords != null) { for (MKOLSearchRecord r : offlineCityrecords) { allCities.add(r.cityName + "(" + r.cityID + ")" + " --" + this.formatDataSize(r.size)); } } ListAdapter aAdapter = (ListAdapter) new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, allCities); allCityList.setAdapter(aAdapter); mCityListLayout = (LinearLayout) view.findViewById(R.id.citylist_layout); mLocalMapLayout = (LinearLayout) view.findViewById(R.id.localmap_layout); mLocalMapLayout.setVisibility(View.GONE); mCityListLayout.setVisibility(View.VISIBLE); // get downloaded offline map info mLocalMapList = mOffline.getAllUpdateInfo(); if (mLocalMapList == null) { mLocalMapList = Collections.emptyList(); } ListView localMapListView = (ListView) view.findViewById(R.id.localmaplist); mLAdapter = new LocalMapAdapter(); localMapListView.setAdapter(mLAdapter); Button button = (Button) view.findViewById(R.id.search); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { search(v); } }); button = (Button) view.findViewById(R.id.start); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { start(v); } }); button = (Button) view.findViewById(R.id.stop); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stop(v); } }); button = (Button) view.findViewById(R.id.del); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { remove(v); } }); button = (Button) view.findViewById(R.id.clButton); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { clickCityListButton(v); } }); button = (Button) view.findViewById(R.id.localButton); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { clickLocalMapListButton(v); } }); } /** * switch to city list * * @param view */ public void clickCityListButton(View view) { if (mBindDialogView != null) { mLocalMapLayout.setVisibility(View.GONE); mCityListLayout.setVisibility(View.VISIBLE); } } /** * switch to download manager list * * @param view */ public void clickLocalMapListButton(View view) { if (mBindDialogView != null) { mLocalMapLayout.setVisibility(View.VISIBLE); mCityListLayout.setVisibility(View.GONE); } } /** * search offline city * * @param view */ public void search(View view) { ArrayList<MKOLSearchRecord> records = mOffline.searchCity(mCityNameView .getText().toString()); if (records == null) { return; } mCidView.setText(String.valueOf(records.get(0).cityID)); } /** * Start to download * * @param view */ public void start(View view) { int cityid = Integer.parseInt(mCidView.getText().toString()); mOffline.start(cityid); clickLocalMapListButton(view); final Context context = getContext(); Resources res = context.getResources(); String text = String.format(res.getString(R.string.pref_baidu_map_offline_download_start_message), cityid); Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); updateView(); } /** * Pause download * * @param view */ public void stop(View view) { int cityid = Integer.parseInt(mCidView.getText().toString()); mOffline.pause(cityid); final Context context = getContext(); Resources res = context.getResources(); String text = String.format(res.getString(R.string.pref_baidu_map_offline_download_stop_message), cityid); Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); updateView(); } /** * Remove offline map * * @param view */ public void remove(View view) { int cityid = Integer.parseInt(mCidView.getText().toString()); mOffline.remove(cityid); final Context context = getContext(); Resources res = context.getResources(); String text = String.format(res.getString(R.string.pref_baidu_map_offline_download_remove_message), cityid); Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); updateView(); } /** * Display offline map update status */ public void updateView() { mLocalMapList = mOffline.getAllUpdateInfo(); if (mLocalMapList == null) { mLocalMapList = Collections.emptyList();; } mLAdapter.notifyDataSetChanged(); } public String formatDataSize(int size) { String ret = ""; if (size < (DATA_SIZE_ONE_KB)) { ret = String.format("%dK", size / DATA_SIZE_UNIT_KB); } else { ret = String.format("%.1fM", size / (DATA_SIZE_UNIT_MB)); } return ret; } @Override protected void onDialogClosed(boolean positiveResult) { // destroy offline map module when exit mOffline.destroy(); super.onDialogClosed(positiveResult); } @Override public void onBindDialogView(View view){ // Initialize Baidu Map library com.baidu.mapapi.SDKInitializer.initialize(this.getContext().getApplicationContext()); mBindDialogView = view; mOffline = new MKOfflineMap(); mOffline.init(this); initView(view); super.onBindDialogView(view); } @Override public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); // display download progress if (update != null) { mStateView.setText(String.format("%s : %d%%", update.cityName, update.ratio)); updateView(); } } break; case MKOfflineMap.TYPE_NEW_OFFLINE: // Prompt offline map update is available Log.d("Baidu offline map", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: // Not used yet break; default: break; } } /** * list adapter for managing offline map */ public class LocalMapAdapter extends BaseAdapter { @Override public int getCount() { return mLocalMapList.size(); } @Override public Object getItem(int index) { return mLocalMapList.get(index); } @Override public long getItemId(int index) { return index; } @Override public View getView(int index, View view, ViewGroup arg2) { MKOLUpdateElement e = (MKOLUpdateElement) getItem(index); if (view == null) { view = View.inflate(BaiduMapOfflineMapPreference.this.getContext(), R.layout.list_baidumap_offline_localmap_item, null); } initViewItem(view, e); return view; } void initViewItem(View view, final MKOLUpdateElement e) { Button display = (Button) view.findViewById(R.id.display); Button remove = (Button) view.findViewById(R.id.remove); TextView title = (TextView) view.findViewById(R.id.title); TextView update = (TextView) view.findViewById(R.id.update); TextView ratio = (TextView) view.findViewById(R.id.ratio); ratio.setText(e.ratio + "%"); title.setText(e.cityName); if (e.update) { update.setText(R.string.pref_baidu_map_offline_preference_download_available); } else { update.setText(R.string.pref_baidu_map_offline_preference_download_latest); } if (e.ratio != 100) { display.setEnabled(false); } else { display.setEnabled(true); } remove.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { mOffline.remove(e.cityID); updateView(); } }); display.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Not used yet. } }); } } }