package com.robert.maps.applib;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Locale;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.openintents.filemanager.FileManagerActivity;
import org.openintents.filemanager.intents.FileManagerIntents;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import com.robert.maps.applib.constants.PrefConstants;
import com.robert.maps.applib.kml.XMLparser.PredefMapsParser;
import com.robert.maps.applib.preference.MixedMapsPreference;
import com.robert.maps.applib.preference.UserMapsPrefActivity;
import com.robert.maps.applib.tileprovider.TileSourceBase;
import com.robert.maps.applib.utils.CheckBoxPreferenceExt;
import com.robert.maps.applib.utils.Ut;
public class MainPreferences extends PreferenceActivity implements OnSharedPreferenceChangeListener, PrefConstants {
private static String PNG = ".png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerForContextMenu(getListView());
final SharedPreferences aPref = PreferenceManager.getDefaultSharedPreferences(this);
final ArrayList<String> arrEntry = new ArrayList<String>();
arrEntry.add("Default");
final ArrayList<String> arrEntryValues = new ArrayList<String>();
arrEntryValues.add("");
final File folderCursors = Ut.getRMapsMainDir(this, "icons/cursors");
if(folderCursors != null) {
File[] files = folderCursors.listFiles();
if(files != null) {
for (int i = 0; i < files.length; i++) {
if(files[i].getName().toLowerCase().endsWith(PNG)) {
arrEntry.add(files[i].getName());
arrEntryValues.add(files[i].getName());
}
}
}
}
final String sdf = aPref.getString("pref_dir_main", "NO");
if(sdf.equalsIgnoreCase("NO")) {
final Editor editor = aPref.edit();
editor.putString("pref_dir_main", Ut.getExternalStorageDirectory()+"/rmaps/");
editor.putString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/");
editor.putString("pref_dir_import", Ut.getExternalStorageDirectory()+"/rmaps/import/");
editor.putString("pref_dir_export", Ut.getExternalStorageDirectory()+"/rmaps/export/");
editor.commit();
}
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.mainpreferences);
((ListPreference) findPreference("pref_person_icon")).setEntries((String[])arrEntry.toArray(new String[arrEntry.size()]));
((ListPreference) findPreference("pref_person_icon")).setEntryValues((String[])arrEntryValues.toArray(new String[arrEntry.size()]));
((ListPreference) findPreference("pref_arrow_icon")).setEntries((String[])arrEntry.toArray(new String[arrEntry.size()]));
((ListPreference) findPreference("pref_arrow_icon")).setEntryValues((String[])arrEntryValues.toArray(new String[arrEntry.size()]));
findPreference("pref_dir_main").setSummary(aPref.getString("pref_dir_main", Ut.getExternalStorageDirectory()+"/rmaps/"));
findPreference("pref_dir_maps").setSummary(aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/"));
findPreference("pref_main_usermaps").setSummary("Maps from "+aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/"));
findPreference("pref_dir_import").setSummary(aPref.getString("pref_dir_import", Ut.getExternalStorageDirectory()+"/rmaps/import/"));
findPreference("pref_dir_export").setSummary(aPref.getString("pref_dir_export", Ut.getExternalStorageDirectory()+"/rmaps/export/"));
findPreference("pref_dir_main").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
pickDir(R.string.pref_dir_main, Uri.parse(aPref.getString("pref_dir_main", Ut.getExternalStorageDirectory()+"/rmaps/")));
return false;
}
});
findPreference("pref_dir_maps").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
pickDir(R.string.pref_dir_maps, Uri.parse(aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/")));
return false;
}
});
findPreference("pref_dir_import").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
pickDir(R.string.pref_dir_import, Uri.parse(aPref.getString("pref_dir_import", Ut.getExternalStorageDirectory()+"/rmaps/import/")));
return false;
}
});
findPreference("pref_dir_export").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
pickDir(R.string.pref_dir_export, Uri.parse(aPref.getString("pref_dir_export", Ut.getExternalStorageDirectory()+"/rmaps/export/")));
return false;
}
});
final PreferenceGroup prefMapsgroup = (PreferenceGroup) findPreference("pref_predefmaps_mapsgroup");
final PreferenceGroup prefOverlaysgroup = (PreferenceGroup) findPreference("pref_predefmaps_overlaysgroup");
final SAXParserFactory fac = SAXParserFactory.newInstance();
SAXParser parser = null;
try {
parser = fac.newSAXParser();
if(parser != null){
final InputStream in = getResources().openRawResource(R.raw.predefmaps);
parser.parse(in, new PredefMapsParser(prefMapsgroup, prefOverlaysgroup, this));
}
} catch (Exception e) {
e.printStackTrace();
}
final File folder = Ut.getRMapsMapsDir(this);
LoadUserMaps(folder);
findPreference("pref_main_mixmaps").setIntent(new Intent(getApplicationContext(), MixedMapsPreference.class));
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
private void pickDir(int id, Uri uri) {
Intent intent = new Intent(MainPreferences.this, FileManagerActivity.class);
intent.setAction(FileManagerIntents.ACTION_PICK_DIRECTORY);
intent.setData(uri);
startActivityForResult(intent, id);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == R.string.pref_dir_main
|| requestCode == R.string.pref_dir_maps
|| requestCode == R.string.pref_dir_import
|| requestCode == R.string.pref_dir_export) {
if (resultCode == RESULT_OK && data != null) {
// obtain the filename
String filename = Uri.decode(data.getDataString());
if (filename != null) {
// Get rid of URI prefix:
if (filename.startsWith("file://")) {
filename = filename.substring(7);
}
String prefName = "";
if(requestCode == R.string.pref_dir_main) {
prefName = "pref_dir_main";
} else if(requestCode == R.string.pref_dir_maps) {
prefName = "pref_dir_maps";
} else if(requestCode == R.string.pref_dir_import) {
prefName = "pref_dir_import";
} else if(requestCode == R.string.pref_dir_export) {
prefName = "pref_dir_export";
}
final SharedPreferences aPref = PreferenceManager.getDefaultSharedPreferences(this);
final Editor editor = aPref.edit();
editor.putString(prefName, filename);
editor.commit();
onSharedPreferenceChanged(aPref, prefName);
}
}
}
}
private void LoadUserMaps(final File folder) {
// Cash file preferences
final PreferenceGroup prefUserMapsgroup = (PreferenceGroup) findPreference("pref_usermaps_mapsgroup");
prefUserMapsgroup.removeAll();
final SharedPreferences aPref = PreferenceManager.getDefaultSharedPreferences(this);
final Editor prefEditor = aPref.edit();
final File[] files = folder.listFiles();
if (files != null)
for (int i = 0; i < files.length; i++) {
if (files[i].getName().toLowerCase().endsWith(getString(R.string.mnm))
|| files[i].getName().toLowerCase().endsWith(getString(R.string.tar))
|| files[i].getName().toLowerCase().endsWith(getString(R.string.sqlitedb))) {
final String name = Ut.FileName2ID(files[i].getName());
prefEditor.putString(PREF_USERMAPS_ + name + "_baseurl", files[i].getAbsolutePath());
final CheckBoxPreferenceExt pref = new CheckBoxPreferenceExt(this, PREF_USERMAPS_ + name + "_enabled", false);
pref.setKey(PREF_USERMAPS_ + name);
pref.setTitle(aPref.getString(PREF_USERMAPS_ + name + "_name", files[i].getName()));
pref.setSummary(files[i].getAbsolutePath());
pref.setIntent(new Intent(this, UserMapsPrefActivity.class)
.putExtra("Key", PREF_USERMAPS_ + name)
.putExtra("ID", TileSourceBase.USERMAP_ + name)
.putExtra("Name", files[i].getName())
.putExtra("AbsolutePath", files[i].getAbsolutePath())
);
prefUserMapsgroup.addPreference(pref);
}
}
prefEditor.commit();
}
@Override
protected void onDestroy() {
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
public void onSharedPreferenceChanged(SharedPreferences aPref, String aKey) {
Ut.w(aKey);
if(aKey.equalsIgnoreCase("pref_dir_maps")){
findPreference("pref_main_usermaps").setSummary("Maps from "+aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/"));
findPreference(aKey).setSummary(aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/"));
final File dir = new File(aPref.getString("pref_dir_maps", Ut.getExternalStorageDirectory()+"/rmaps/maps/").concat("/").replace("//", "/"));
if(!dir.exists()){
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
dir.mkdirs();
}
}
if(dir.exists())
LoadUserMaps(dir);
}
else if(Ut.equalsIgnoreCase(aKey, 0, 9, "pref_dir_")) {
findPreference("pref_dir_main").setSummary(aPref.getString("pref_dir_main", Ut.getExternalStorageDirectory()+"/rmaps/"));
findPreference("pref_dir_import").setSummary(aPref.getString("pref_dir_import", Ut.getExternalStorageDirectory()+"/rmaps/import/"));
findPreference("pref_dir_export").setSummary(aPref.getString("pref_dir_export", Ut.getExternalStorageDirectory()+"/rmaps/export/"));
}
else if(aKey.equalsIgnoreCase("pref_locale")) {
Locale locale = ((MapApplication) getApplication()).getDefLocale();
final String lang = aPref.getString("pref_locale", " ");
if(lang.equalsIgnoreCase("zh_CN")) {
locale = Locale.SIMPLIFIED_CHINESE;
} else if(lang.equalsIgnoreCase("zh_TW")) {
locale = Locale.TRADITIONAL_CHINESE;
} else if(!lang.equalsIgnoreCase("") && !lang.equalsIgnoreCase(" ")) {
locale = new Locale(lang);
}
Locale.setDefault(locale);
Configuration config = getBaseContext().getResources().getConfiguration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
finish();
Intent myIntent = new Intent(MainPreferences.this, MainPreferences.class);
startActivity(myIntent);
}
else if (Ut.equalsIgnoreCase(aKey, 0, 14, PREF_USERMAPS_)) {
if (aKey.endsWith("name") && findPreference(aKey.replace("_name", "")) != null) {
findPreference(aKey.replace("_name", "")).setTitle(aPref.getString(aKey, ""));
} else if (aKey.endsWith("_enabled") && findPreference(aKey.replace("_enabled", "")) != null) {
((CheckBoxPreferenceExt) findPreference(aKey.replace("_enabled", ""))).setChecked(aPref.getBoolean(aKey, true));
}
} else if (Ut.equalsIgnoreCase(aKey, 0, 16, PREF_PREDEFMAPS_)) {
final Preference pref = findPreference(aKey+"_screen");
if(pref != null && pref instanceof CheckBoxPreferenceExt)
((CheckBoxPreferenceExt) pref).setChecked(aPref.getBoolean(aKey, true));
}
}
}