package com.robert.maps.applib.preference;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import com.robert.maps.applib.R;
import com.robert.maps.applib.utils.CheckBoxPreferenceExt;
public class MixedMapsPreference extends MMPreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.mixedmapspreference);
registerForContextMenu(getListView());
findPreference("pref_addmixmap").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
getListView().showContextMenu();
return false;
}
});
loadMixedMaps();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
private void loadMixedMaps() {
PreferenceGroup prefGroup = (PreferenceGroup) findPreference("pref_mixmaps_group");
prefGroup.removeAll();
final Cursor c = mPoiManager.getGeoDatabase().getMixedMaps();
if(c != null) {
final int idMapid = c.getColumnIndex(MAPID);
final int idName = c.getColumnIndex(NAME);
final int idType = c.getColumnIndex(TYPE);
final int idParams = c.getColumnIndex(PARAMS);
if(c.moveToFirst()) {
do {
switch(c.getInt(idType)) {
case 3:
case 2: {
final JSONObject json = getMapCustomParams(c.getString(idParams));
final CheckBoxPreferenceExt pref = new CheckBoxPreferenceExt(this, PREF_MIXMAPS_ + c.getInt(idMapid) + "_enabled", true);
pref.setKey(PREF_MIXMAPS_ + c.getInt(idMapid));
pref.setTitle(PreferenceManager.getDefaultSharedPreferences(this).getString(PREF_MIXMAPS_ + c.getInt(idMapid) + "_name", c.getString(idName)));
pref.setSummary(R.string.menu_add_ownsourcemap);
pref.setIntent(new Intent(this, CustomMapsPrefActivity.class)
.putExtra("Key", PREF_MIXMAPS_ + c.getInt(idMapid))
.putExtra(MAPID, "mixmap_"+c.getInt(idMapid))
.putExtra(NAME, c.getString(idName))
.putExtra(BASEURL, json.optString(BASEURL))
.putExtra(MAPPROJECTION, json.optString(MAPPROJECTION))
.putExtra(MINZOOM, json.optString(MINZOOM))
.putExtra(MAXZOOM, json.optString(MAXZOOM))
);
prefGroup.addPreference(pref);
} break;
case 1: {
final JSONObject json = getMapPairParams(c.getString(idParams));
final CheckBoxPreferenceExt pref = new CheckBoxPreferenceExt(this, PREF_MIXMAPS_ + c.getInt(idMapid) + "_enabled", true);
pref.setKey(PREF_MIXMAPS_ + c.getInt(idMapid));
pref.setTitle(PreferenceManager.getDefaultSharedPreferences(this).getString(PREF_MIXMAPS_ + c.getInt(idMapid) + "_name", c.getString(idName)));
pref.setSummary(R.string.menu_add_dualmap);
pref.setIntent(new Intent(this, PairMapsPrefActivity.class)
.putExtra("Key", PREF_MIXMAPS_ + c.getInt(idMapid))
.putExtra(MAPID, c.getString(idMapid))
.putExtra(NAME, c.getString(idName))
.putExtra(OVERLAYID, json.optString(OVERLAYID))
);
prefGroup.addPreference(pref);
} break;
};
} while(c.moveToNext());
}
c.close();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if(menuInfo == null || menuInfo != null && ((AdapterView.AdapterContextMenuInfo) menuInfo).id == 0) {
menu.add(Menu.NONE, R.id.add_dualmap, Menu.NONE, R.string.menu_add_dualmap);
menu.add(Menu.NONE, R.id.add_ownsourcemap, Menu.NONE, R.string.menu_add_ownsourcemap);
} else if(menuInfo != null && ((AdapterView.AdapterContextMenuInfo) menuInfo).position != 0) {
menu.add(Menu.NONE, R.id.menu_deletepoi, Menu.NONE, R.string.menu_delete);
((AdapterView.AdapterContextMenuInfo) menuInfo).id = 0;
}
super.onCreateContextMenu(menu, v, menuInfo);
}
public PrefMenuInfo mPrefMenuInfo = new PrefMenuInfo();
public class PrefMenuInfo implements ContextMenuInfo {
public int MenuId;
public long MapId;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getItemId() == R.id.add_dualmap) {
mPoiManager.addMap(1, getMapPairParams("").toString());
loadMixedMaps();
} else if(item.getItemId() == R.id.add_ownsourcemap) {
mPoiManager.addMap(2, getMapCustomParams("").toString());
loadMixedMaps();
} else if(item.getItemId() == R.id.menu_deletepoi) {
PreferenceGroup prefGroup = (PreferenceGroup) findPreference("pref_mixmaps_group");
final String key = prefGroup.getPreference(((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).position - 2).getKey();
final String params[] = key.split("_");
mPoiManager.getGeoDatabase().deleteMap(Long.parseLong(params[2]));
final SharedPreferences aPref = PreferenceManager.getDefaultSharedPreferences(this);
final Editor editor = aPref.edit();
editor.remove(PREF_MIXMAPS_+params[2]+"_enabled");
editor.remove(PREF_MIXMAPS_+params[2]+"_name");
editor.remove(PREF_MIXMAPS_+params[2]+MAPID);
editor.remove(PREF_MIXMAPS_+params[2]+OVERLAYID);
editor.remove(PREF_MIXMAPS_+params[2]+"_baseurl");
editor.remove(PREF_MIXMAPS_+params[2]+"_projection");
editor.remove(PREF_MIXMAPS_+params[2]+"_isoverlay");
editor.commit();
loadMixedMaps();
}
return super.onContextItemSelected(item);
}
public static JSONObject getMapPairParams(String jsonstring) {
JSONObject json;
try {
json = new JSONObject(jsonstring);
} catch(Exception e) {
json = new JSONObject();
try {
json.put(MAPID, "");
json.put(OVERLAYID, "");
json.put(OVERLAYOPAQUE, 0);
json.put(MAPPROJECTION, 0);
json.put(OVERLAYPROJECTION, 0);
} catch (JSONException e1) {
}
}
return json;
}
public static JSONObject getMapCustomParams(String jsonstring) {
JSONObject json;
try {
json = new JSONObject(jsonstring);
} catch(Exception e) {
json = new JSONObject();
try {
json.put(BASEURL, "");
json.put(MAPPROJECTION, 1);
json.put(ISOVERLAY, false);
json.put(ONLINECACHE, true);
json.put(MINZOOM, 0);
json.put(MAXZOOM, 19);
json.put(STRETCH, 1.0f);
} catch (JSONException e1) {
}
}
return json;
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.startsWith(PREF_MIXMAPS_)) {
if(key.endsWith("_name")) {
CheckBoxPreferenceExt pref = (CheckBoxPreferenceExt) findPreference(key.replace("_name", ""));
if(pref != null)
pref.setTitle(sharedPreferences.getString(key, ""));
} else if(key.endsWith("_enabled")) {
CheckBoxPreferenceExt pref = (CheckBoxPreferenceExt) findPreference(key.replace("_enabled", ""));
if(pref != null)
pref.setChecked(sharedPreferences.getBoolean(key, true));
}
}
}
@Override
protected void onDestroy() {
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
}