package net.osmand.plus.activities;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.osmand.map.TileSourceManager;
import net.osmand.map.TileSourceManager.TileSourceTemplate;
import net.osmand.plus.NavigationService;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.PoiFiltersHelper;
import net.osmand.plus.ProgressDialogImplementation;
import net.osmand.plus.R;
import net.osmand.plus.ResourceManager;
import net.osmand.plus.SQLiteTileSource;
import net.osmand.plus.OsmandSettings.ApplicationMode;
import net.osmand.plus.OsmandSettings.DayNightMode;
import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.activities.RouteProvider.RouteService;
import net.osmand.plus.render.BaseOsmandRender;
import net.osmand.plus.render.RendererRegistry;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.location.LocationManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.widget.Toast;
public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnPreferenceClickListener {
private final static String VECTOR_MAP = "#VECTOR_MAP"; //$NON-NLS-1$
private class BooleanPreference {
private final boolean defValue;
private final String id;
private CheckBoxPreference pref;
public BooleanPreference(String id, boolean defValue){
this.id = id;
this.defValue = defValue;
}
public String getId() {
return id;
}
public boolean getDefValue() {
return defValue;
}
public void setPref(CheckBoxPreference pref) {
this.pref = pref;
}
public CheckBoxPreference getPref() {
return pref;
}
}
private EditTextPreference userPassword;
private EditTextPreference userName;
private EditTextPreference applicationDir;
private Preference saveCurrentTrack;
private Preference reloadIndexes;
private Preference downloadIndexes;
private ListPreference applicationMode;
private ListPreference daynightMode;
private ListPreference saveTrackInterval;
private ListPreference rotateMap;
private ListPreference tileSourcePreference;
private ListPreference positionOnMap;
private ListPreference routerPreference;
private ListPreference maxLevelToDownload;
private ListPreference mapScreenOrientation;
private ListPreference voicePreference;
private ListPreference metricPreference;
private ListPreference rendererPreference;
private ListPreference routeServiceInterval;
private ListPreference routeServiceWaitInterval;
private ListPreference routeServiceProvider;
private CheckBoxPreference routeServiceEnabled;
private CheckBoxPreference useInternetToDownload;
private ProgressDialog progressDlg;
private BooleanPreference[] booleanPreferences = new BooleanPreference[]{
new BooleanPreference(OsmandSettings.SHOW_VIEW_ANGLE, OsmandSettings.SHOW_VIEW_ANGLE_DEF),
new BooleanPreference(OsmandSettings.USE_TRACKBALL_FOR_MOVEMENTS, OsmandSettings.USE_TRACKBALL_FOR_MOVEMENTS_DEF),
new BooleanPreference(OsmandSettings.USE_HIGH_RES_MAPS, OsmandSettings.USE_HIGH_RES_MAPS_DEF),
new BooleanPreference(OsmandSettings.USE_ENGLISH_NAMES, OsmandSettings.USE_ENGLISH_NAMES_DEF),
new BooleanPreference(OsmandSettings.USE_TRAFFIC_DATA_TO_ROUTE, OsmandSettings.USE_TRAFFIC_DATA_TO_ROUTE_DEF),
new BooleanPreference(OsmandSettings.AUTO_ZOOM_MAP, OsmandSettings.AUTO_ZOOM_MAP_DEF),
new BooleanPreference(OsmandSettings.SAVE_TRACK_TO_GPX, OsmandSettings.SAVE_TRACK_TO_GPX_DEF),
new BooleanPreference(OsmandSettings.DEBUG_RENDERING_INFO, OsmandSettings.DEBUG_RENDERING_INFO_DEF),
new BooleanPreference(OsmandSettings.USE_STEP_BY_STEP_RENDERING, OsmandSettings.USE_STEP_BY_STEP_RENDERING_DEF),
new BooleanPreference(OsmandSettings.FAST_ROUTE_MODE, OsmandSettings.FAST_ROUTE_MODE_DEF),
new BooleanPreference(OsmandSettings.USE_OSMAND_ROUTING_SERVICE_ALWAYS, OsmandSettings.USE_OSMAND_ROUTING_SERVICE_ALWAYS_DEF),
};
private BroadcastReceiver broadcastReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_pref);
PreferenceScreen screen = getPreferenceScreen();
for(BooleanPreference b : booleanPreferences){
CheckBoxPreference p = (CheckBoxPreference) screen.findPreference(b.getId());
p.setOnPreferenceChangeListener(this);
b.setPref(p);
}
useInternetToDownload =(CheckBoxPreference) screen.findPreference(OsmandSettings.USE_INTERNET_TO_DOWNLOAD_TILES);
useInternetToDownload.setOnPreferenceChangeListener(this);
reloadIndexes =(Preference) screen.findPreference(OsmandSettings.RELOAD_INDEXES);
reloadIndexes.setOnPreferenceClickListener(this);
downloadIndexes =(Preference) screen.findPreference(OsmandSettings.DOWNLOAD_INDEXES);
downloadIndexes.setOnPreferenceClickListener(this);
saveCurrentTrack =(Preference) screen.findPreference(OsmandSettings.SAVE_CURRENT_TRACK);
saveCurrentTrack.setOnPreferenceClickListener(this);
userName = (EditTextPreference) screen.findPreference(OsmandSettings.USER_NAME);
userName.setOnPreferenceChangeListener(this);
userPassword = (EditTextPreference) screen.findPreference(OsmandSettings.USER_PASSWORD);
userPassword.setOnPreferenceChangeListener(this);
applicationDir = (EditTextPreference) screen.findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR);
applicationDir.setOnPreferenceChangeListener(this);
applicationMode =(ListPreference) screen.findPreference(OsmandSettings.APPLICATION_MODE);
applicationMode.setOnPreferenceChangeListener(this);
daynightMode =(ListPreference) screen.findPreference(OsmandSettings.DAYNIGHT_MODE);
daynightMode.setOnPreferenceChangeListener(this);
rotateMap =(ListPreference) screen.findPreference(OsmandSettings.ROTATE_MAP);
rotateMap.setOnPreferenceChangeListener(this);
saveTrackInterval =(ListPreference) screen.findPreference(OsmandSettings.SAVE_TRACK_INTERVAL);
saveTrackInterval.setOnPreferenceChangeListener(this);
positionOnMap =(ListPreference) screen.findPreference(OsmandSettings.POSITION_ON_MAP);
positionOnMap.setOnPreferenceChangeListener(this);
mapScreenOrientation = (ListPreference) screen.findPreference(OsmandSettings.MAP_SCREEN_ORIENTATION);
mapScreenOrientation.setOnPreferenceChangeListener(this);
maxLevelToDownload = (ListPreference) screen.findPreference(OsmandSettings.MAX_LEVEL_TO_DOWNLOAD_TILE);
maxLevelToDownload.setOnPreferenceChangeListener(this);
tileSourcePreference = (ListPreference) screen.findPreference(OsmandSettings.MAP_TILE_SOURCES);
tileSourcePreference.setOnPreferenceChangeListener(this);
routerPreference = (ListPreference) screen.findPreference(OsmandSettings.ROUTER_SERVICE);
routerPreference.setOnPreferenceChangeListener(this);
voicePreference = (ListPreference) screen.findPreference(OsmandSettings.VOICE_PROVIDER);
voicePreference.setOnPreferenceChangeListener(this);
metricPreference = (ListPreference) screen.findPreference(OsmandSettings.DEFAULT_METRIC_SYSTEM);
metricPreference.setOnPreferenceChangeListener(this);
rendererPreference =(ListPreference) screen.findPreference(OsmandSettings.RENDERER);
rendererPreference.setOnPreferenceChangeListener(this);
routeServiceInterval =(ListPreference) screen.findPreference(OsmandSettings.SERVICE_OFF_INTERVAL);
routeServiceInterval.setOnPreferenceChangeListener(this);
routeServiceWaitInterval =(ListPreference) screen.findPreference(OsmandSettings.SERVICE_OFF_WAIT_INTERVAL);
routeServiceWaitInterval.setOnPreferenceChangeListener(this);
routeServiceProvider =(ListPreference) screen.findPreference(OsmandSettings.SERVICE_OFF_PROVIDER);
routeServiceProvider.setOnPreferenceChangeListener(this);
routeServiceEnabled =(CheckBoxPreference) screen.findPreference(OsmandSettings.SERVICE_OFF_ENABLED);
routeServiceEnabled.setOnPreferenceChangeListener(this);
broadcastReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
routeServiceEnabled.setChecked(false);
}
};
registerReceiver(broadcastReceiver, new IntentFilter(NavigationService.OSMAND_STOP_SERVICE_ACTION));
}
private void updateApplicationDirSummary() {
String storageDir = OsmandSettings.getExternalStorageDirectory(getApplicationContext()).getAbsolutePath();
applicationDir.setText(storageDir);
applicationDir.setSummary(storageDir);
}
@Override
protected void onResume() {
super.onResume();
updateAllSettings();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broadcastReceiver);
}
private void fillTime(ListPreference component, int[] seconds, int[] minutes, int currentSeconds){
int minutesLength = minutes == null? 0 : minutes.length;
int secondsLength = seconds == null? 0 : seconds.length;
String[] ints = new String[secondsLength + minutesLength];
String[] intDescriptions = new String[ints.length];
for (int i = 0; i < secondsLength; i++) {
ints[i] = seconds[i] + "";
intDescriptions[i] = ints[i] + " " + getString(R.string.int_seconds); //$NON-NLS-1$
}
for (int i = 0; i < minutesLength; i++) {
ints[secondsLength + i] = (minutes[i] * 60) + "";
intDescriptions[secondsLength + i] = minutes[i] + " " + getString(R.string.int_min); //$NON-NLS-1$
}
fill(component, intDescriptions, ints, currentSeconds+"");
}
public void updateAllSettings(){
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
for(BooleanPreference b : booleanPreferences){
b.getPref().setChecked(prefs.getBoolean(b.getId(), b.getDefValue()));
}
userName.setText(OsmandSettings.getUserName(prefs));
userPassword.setText(OsmandSettings.getUserPassword(prefs));
applicationDir.setText(OsmandSettings.getExternalStorageDirectory(prefs).getAbsolutePath());
useInternetToDownload.setChecked(OsmandSettings.isUsingInternetToDownloadTiles(prefs));
Resources resources = this.getResources();
String[] e = new String[] {resources.getString(R.string.position_on_map_center),
resources.getString(R.string.position_on_map_bottom)};
positionOnMap.setEntryValues(e);
positionOnMap.setEntries(e);
positionOnMap.setValueIndex(OsmandSettings.getPositionOnMap(prefs));
fillTime(saveTrackInterval, new int[]{1, 2, 3, 5, 15, 20, 30}, new int[]{1, 2, 3, 5}, OsmandSettings.getSavingTrackInterval(prefs)); //$NON-NLS-1$
fillTime(routeServiceInterval, new int[]{0, 30, 45, 60}, new int[]{2, 3, 5, 8, 10, 15, 20, 30, 40, 50, 70, 90}, OsmandSettings.getServiceOffInterval(prefs)/1000); //$NON-NLS-1$
fillTime(routeServiceWaitInterval, new int[]{15, 30, 45, 60, 90}, new int[]{2, 3, 5, 10}, OsmandSettings.getServiceOffWaitInterval(prefs)/1000);
fill(rotateMap, //
new String[]{getString(R.string.rotate_map_none_opt), getString(R.string.rotate_map_bearing_opt), getString(R.string.rotate_map_compass_opt)}, //
new String[]{OsmandSettings.ROTATE_MAP_NONE+"", OsmandSettings.ROTATE_MAP_BEARING+"", OsmandSettings.ROTATE_MAP_COMPASS+""}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
OsmandSettings.getRotateMap(prefs)+""); //$NON-NLS-1$
fill(routeServiceProvider,//
new String[]{getString(R.string.gps_provider), getString(R.string.network_provider)}, //
new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}, //
OsmandSettings.getServiceOffProvider(prefs));
routeServiceEnabled.setChecked(getMyApplication().getNavigationService() != null);
fill(mapScreenOrientation, //
new String[] {
resources.getString(R.string.map_orientation_portrait),
resources.getString(R.string.map_orientation_landscape),
resources.getString(R.string.map_orientation_default), }, //
new String[] {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + "", //$NON-NLS-1$
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + "", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + "" }, //$NON-NLS-1$ //$NON-NLS-2$
OsmandSettings.getMapOrientation(prefs) + ""); //$NON-NLS-1$
ApplicationMode[] presets = ApplicationMode.values();
String[] names = new String[presets.length];
String[] values = new String[presets.length];
for(int i=0; i<presets.length; i++){
names[i] = ApplicationMode.toHumanString(presets[i], this);
values[i] = presets[i].name();
}
fill(applicationMode, names, values, OsmandSettings.getApplicationMode(prefs).name());
DayNightMode[] dnpresets = DayNightMode.possibleValues(this);
names = new String[dnpresets.length];
values = new String[dnpresets.length];
for(int i=0; i< dnpresets.length; i++){
names[i] = dnpresets[i].toHumanString(this);
values[i] = dnpresets[i].name();
}
fill(daynightMode, names, values, OsmandSettings.getDayNightMode(prefs).name());
String[] entries = new String[RouteService.values().length];
String entry = OsmandSettings.getRouterService(prefs).getName();
for (int i = 0; i < RouteService.values().length; i++) {
entries[i] = RouteService.values()[i].getName();
}
fill(routerPreference, entries, entries, entry);
names = new String[MetricsConstants.values().length];
values = new String[MetricsConstants.values().length];
entry = OsmandSettings.getDefaultMetricConstants(this).name();
for (int i = 0; i < MetricsConstants.values().length; i++) {
values[i] = MetricsConstants.values()[i].name();
names[i] = MetricsConstants.values()[i].toHumanString(this);
}
fill(metricPreference, names, values, entry);
// read available voice data
File extStorage = OsmandSettings.extendOsmandPath(getApplicationContext(), ResourceManager.VOICE_PATH);
Set<String> setFiles = new LinkedHashSet<String>();
if (extStorage.exists()) {
for (File f : extStorage.listFiles()) {
if (f.isDirectory()) {
setFiles.add(f.getName());
}
}
}
String provider = OsmandSettings.getVoiceProvider(prefs);
entries = new String[setFiles.size() + 1];
int k = 0;
entries[k++] = getString(R.string.voice_not_use);
for(String s : setFiles){
entries[k++] = s;
}
voicePreference.setEntries(entries);
voicePreference.setEntryValues(entries);
if(setFiles.contains(provider)){
voicePreference.setValue(provider);
} else {
voicePreference.setValueIndex(0);
}
String vectorRenderer = OsmandSettings.getVectorRenderer(prefs);
Collection<String> rendererNames = RendererRegistry.getRegistry().getRendererNames();
entries = (String[]) rendererNames.toArray(new String[rendererNames.size()]);
rendererPreference.setEntries(entries);
rendererPreference.setEntryValues(entries);
if(rendererNames.contains(vectorRenderer)){
rendererPreference.setValue(vectorRenderer);
} else {
rendererPreference.setValueIndex(0);
}
int startZoom = 12;
int endZoom = 19;
entries = new String[endZoom - startZoom + 1];
for (int i = startZoom; i <= endZoom; i++) {
entries[i - startZoom] = i + ""; //$NON-NLS-1$
}
fill(maxLevelToDownload, entries, entries, OsmandSettings.getMaximumLevelToDownloadTile(prefs)+""); //$NON-NLS-1$
Map<String, String> entriesMap = getTileSourceEntries(this);
entries = new String[entriesMap.size() + 1];
values = new String[entriesMap.size() + 1];
values[0] = VECTOR_MAP;
entries[0] = getString(R.string.vector_data);
int ki = 1;
for(Map.Entry<String, String> es : entriesMap.entrySet()){
entries[ki] = es.getValue();
values[ki] = es.getKey();
ki++;
}
String value = OsmandSettings.isUsingMapVectorData(prefs)? VECTOR_MAP : OsmandSettings.getMapTileSourceName(prefs);
fill(tileSourcePreference, entries, values, value);
String mapName = " " + (OsmandSettings.isUsingMapVectorData(prefs) ? getString(R.string.vector_data) : //$NON-NLS-1$
OsmandSettings.getMapTileSourceName(prefs));
String summary = tileSourcePreference.getSummary().toString();
if (summary.lastIndexOf(':') != -1) {
summary = summary.substring(0, summary.lastIndexOf(':') + 1);
}
tileSourcePreference.setSummary(summary + mapName);
updateApplicationDirSummary();
}
private void fill(ListPreference component, String[] list, String[] values, String selected) {
component.setEntries(list);
component.setEntryValues(values);
component.setValue(selected);
}
public static Map<String, String> getTileSourceEntries(Context ctx){
Map<String, String> map = new LinkedHashMap<String, String>();
File dir = OsmandSettings.extendOsmandPath(ctx, ResourceManager.TILES_PATH);
if (dir != null && dir.canRead()) {
File[] files = dir.listFiles();
Arrays.sort(files, new Comparator<File>(){
@Override
public int compare(File object1, File object2) {
if(object1.lastModified() > object2.lastModified()){
return -1;
} else if(object1.lastModified() == object2.lastModified()){
return 0;
}
return 1;
}
});
if (files != null) {
for (File f : files) {
if (f.getName().endsWith(SQLiteTileSource.EXT)) {
String n = f.getName();
map.put(f.getName(), n.substring(0, n.lastIndexOf('.')));
} else if (f.isDirectory() && !f.getName().equals(ResourceManager.TEMP_SOURCE_TO_LOAD)) {
map.put(f.getName(), f.getName());
}
}
}
}
for(TileSourceTemplate l : TileSourceManager.getKnownSourceTemplates()){
map.put(l.getName(), l.getName());
}
return map;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
Editor edit = prefs.edit();
// handle boolean prefences
BooleanPreference p = null;
for(BooleanPreference b : booleanPreferences){
if(b.getPref() == preference){
p = b;
break;
}
}
if(p != null){
edit.putBoolean(p.getId(), (Boolean)newValue);
if(p.getId() == OsmandSettings.SHOW_POI_OVER_MAP && ((Boolean) newValue)){
edit.putString(OsmandSettings.SELECTED_POI_FILTER_FOR_MAP, PoiFiltersHelper.getOsmDefinedFilterId(null));
}
edit.commit();
} else if(preference == applicationMode){
ApplicationMode old = OsmandSettings.getApplicationMode(prefs);
edit.putString(OsmandSettings.APPLICATION_MODE, (String) newValue);
setAppMode(ApplicationMode.valueOf(newValue.toString()), edit, getMyApplication(), old);
edit.commit();
updateAllSettings();
} else if(preference == daynightMode){
edit.putString(OsmandSettings.DAYNIGHT_MODE, (String) newValue);
getMyApplication().getDaynightHelper().setDayNightMode(DayNightMode.valueOf(newValue.toString()));
edit.commit();
} else if(preference == mapScreenOrientation){
edit.putInt(OsmandSettings.MAP_SCREEN_ORIENTATION, Integer.parseInt(newValue.toString()));
edit.commit();
} else if(preference == saveTrackInterval){
edit.putInt(OsmandSettings.SAVE_TRACK_INTERVAL, Integer.parseInt(newValue.toString()));
edit.commit();
} else if(preference == userPassword){
edit.putString(OsmandSettings.USER_PASSWORD, (String) newValue);
edit.commit();
} else if(preference == useInternetToDownload){
OsmandSettings.setUseInternetToDownloadTiles((Boolean) newValue, edit);
edit.commit();
} else if(preference == userName){
edit.putString(OsmandSettings.USER_NAME, (String) newValue);
edit.commit();
} else if(preference == applicationDir){
warnAboutChangingStorage(edit, (String) newValue);
return false;
} else if(preference == positionOnMap){
edit.putInt(OsmandSettings.POSITION_ON_MAP, positionOnMap.findIndexOfValue((String) newValue));
edit.commit();
} else if (preference == maxLevelToDownload) {
edit.putInt(OsmandSettings.MAX_LEVEL_TO_DOWNLOAD_TILE, Integer.parseInt((String) newValue));
edit.commit();
} else if (preference == routeServiceInterval) {
edit.putInt(OsmandSettings.SERVICE_OFF_INTERVAL, Integer.parseInt((String) newValue) * 1000);
edit.commit();
} else if (preference == routeServiceWaitInterval) {
edit.putInt(OsmandSettings.SERVICE_OFF_WAIT_INTERVAL, Integer.parseInt((String) newValue) * 1000);
edit.commit();
} else if (preference == rotateMap) {
edit.putInt(OsmandSettings.ROTATE_MAP, Integer.parseInt((String) newValue));
edit.commit();
} else if (preference == routeServiceProvider) {
edit.putString(OsmandSettings.SERVICE_OFF_PROVIDER, (String) newValue);
edit.commit();
} else if (preference == routeServiceEnabled) {
Intent serviceIntent = new Intent(this, NavigationService.class);
if ((Boolean) newValue) {
ComponentName name = startService(serviceIntent);
if (name == null) {
routeServiceEnabled.setChecked(getMyApplication().getNavigationService() != null);
}
} else {
if(!stopService(serviceIntent)){
routeServiceEnabled.setChecked(getMyApplication().getNavigationService() != null);
}
}
} else if (preference == routerPreference) {
RouteService s = null;
for(RouteService r : RouteService.values()){
if(r.getName().equals(newValue)){
s = r;
break;
}
}
if(s != null){
edit.putInt(OsmandSettings.ROUTER_SERVICE, s.ordinal());
}
edit.commit();
} else if (preference == rendererPreference) {
BaseOsmandRender loaded = RendererRegistry.getRegistry().getRenderer((String) newValue);
if(loaded == null){
Toast.makeText(this, R.string.renderer_load_exception, Toast.LENGTH_SHORT).show();
} else {
RendererRegistry.getRegistry().setCurrentSelectedRender(loaded);
edit.putString(OsmandSettings.RENDERER, (String) newValue);
Toast.makeText(this, R.string.renderer_load_sucess, Toast.LENGTH_SHORT).show();
getMyApplication().getResourceManager().getRenderer().clearCache();
}
edit.commit();
} else if (preference == voicePreference) {
int i = voicePreference.findIndexOfValue((String) newValue);
if (i == 0) {
edit.putString(OsmandSettings.VOICE_PROVIDER, null);
} else {
edit.putString(OsmandSettings.VOICE_PROVIDER, (String) newValue);
}
edit.commit();
getMyApplication().initCommandPlayer();
} else if (preference == metricPreference) {
MetricsConstants mc = MetricsConstants.valueOf((String) newValue);
OsmandSettings.setDefaultMetricConstants(edit, mc);
} else if (preference == tileSourcePreference) {
if(VECTOR_MAP.equals((String) newValue)){
edit.putBoolean(OsmandSettings.MAP_VECTOR_DATA, true);
} else {
edit.putString(OsmandSettings.MAP_TILE_SOURCES, (String) newValue);
edit.putBoolean(OsmandSettings.MAP_VECTOR_DATA, false);
}
edit.commit();
String summary = tileSourcePreference.getSummary().toString();
if (summary.lastIndexOf(':') != -1) {
summary = summary.substring(0, summary.lastIndexOf(':') + 1);
}
summary += " " + (OsmandSettings.isUsingMapVectorData(prefs) ? getString(R.string.vector_data) : //$NON-NLS-1$
OsmandSettings.getMapTileSourceName(prefs));
tileSourcePreference.setSummary(summary);
}
return true;
}
private void warnAboutChangingStorage(final Editor edit, final String newValue) {
final String newDir = newValue != null ? newValue.trim(): newValue;
File path = new File(newDir);
path.mkdirs();
if(!path.canRead() || !path.exists()){
Toast.makeText(this, R.string.specified_dir_doesnt_exist, Toast.LENGTH_LONG).show() ;
return;
}
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.application_dir_change_warning));
builder.setPositiveButton(R.string.default_buttons_yes, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//edit the preference
edit.putString(OsmandSettings.EXTERNAL_STORAGE_DIR, newDir);
edit.commit();
getMyApplication().getResourceManager().resetStoreDirectory();
reloadIndexes();
updateApplicationDirSummary();
}
});
builder.setNegativeButton(R.string.default_buttons_cancel, null);
builder.show();
}
public void reloadIndexes(){
progressDlg = ProgressDialog.show(this, getString(R.string.loading_data), getString(R.string.reading_indexes), true);
final ProgressDialogImplementation impl = new ProgressDialogImplementation(progressDlg);
impl.setRunnable("Initializing app", new Runnable(){ //$NON-NLS-1$
@Override
public void run() {
try {
showWarnings(getMyApplication().getResourceManager().reloadIndexes(impl));
} finally {
if(progressDlg !=null){
progressDlg.dismiss();
progressDlg = null;
}
}
}
});
impl.run();
}
private OsmandApplication getMyApplication() {
return (OsmandApplication)getApplication();
}
@Override
protected void onStop() {
if(progressDlg !=null){
progressDlg.dismiss();
progressDlg = null;
}
super.onStop();
}
protected void showWarnings(List<String> warnings) {
if (!warnings.isEmpty()) {
final StringBuilder b = new StringBuilder();
boolean f = true;
for (String w : warnings) {
if(f){
f = false;
} else {
b.append('\n');
}
b.append(w);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SettingsActivity.this, b.toString(), Toast.LENGTH_LONG).show();
}
});
}
}
public static void setAppMode(ApplicationMode preset, Editor edit, OsmandApplication application, ApplicationMode old){
if (preset == ApplicationMode.CAR) {
OsmandSettings.setUseInternetToDownloadTiles(true, edit);
// edit.putBoolean(OsmandSettings.SHOW_POI_OVER_MAP, _);
edit.putBoolean(OsmandSettings.SHOW_TRANSPORT_OVER_MAP, false);
edit.putInt(OsmandSettings.ROTATE_MAP, OsmandSettings.ROTATE_MAP_BEARING);
edit.putBoolean(OsmandSettings.SHOW_VIEW_ANGLE, false);
edit.putBoolean(OsmandSettings.AUTO_ZOOM_MAP, true);
edit.putBoolean(OsmandSettings.SHOW_OSM_BUGS, false);
edit.putBoolean(OsmandSettings.USE_STEP_BY_STEP_RENDERING, true);
// edit.putBoolean(OsmandSettings.USE_ENGLISH_NAMES, _);
edit.putBoolean(OsmandSettings.SAVE_TRACK_TO_GPX, true);
edit.putInt(OsmandSettings.SAVE_TRACK_INTERVAL, 5);
edit.putInt(OsmandSettings.POSITION_ON_MAP, OsmandSettings.BOTTOM_CONSTANT);
// edit.putString(OsmandSettings.MAP_TILE_SOURCES, _);
} else if (preset == ApplicationMode.BICYCLE) {
// edit.putBoolean(OsmandSettings.USE_INTERNET_TO_DOWNLOAD_TILES, _);
// edit.putBoolean(OsmandSettings.USE_INTERNET_TO_CALCULATE_ROUTE, _);
// edit.putBoolean(OsmandSettings.SHOW_POI_OVER_MAP, true);
edit.putInt(OsmandSettings.ROTATE_MAP, OsmandSettings.ROTATE_MAP_BEARING);
edit.putBoolean(OsmandSettings.SHOW_VIEW_ANGLE, true);
edit.putBoolean(OsmandSettings.AUTO_ZOOM_MAP, false);
// edit.putBoolean(OsmandSettings.SHOW_OSM_BUGS, _);
// edit.putBoolean(OsmandSettings.USE_ENGLISH_NAMES, _);
edit.putBoolean(OsmandSettings.SAVE_TRACK_TO_GPX, true);
edit.putInt(OsmandSettings.SAVE_TRACK_INTERVAL, 30);
edit.putInt(OsmandSettings.POSITION_ON_MAP, OsmandSettings.BOTTOM_CONSTANT);
// edit.putString(OsmandSettings.MAP_TILE_SOURCES, _);
} else if (preset == ApplicationMode.PEDESTRIAN) {
// edit.putBoolean(OsmandSettings.USE_INTERNET_TO_DOWNLOAD_TILES, _);
// edit.putBoolean(OsmandSettings.SHOW_POI_OVER_MAP, true);
edit.putInt(OsmandSettings.ROTATE_MAP, OsmandSettings.ROTATE_MAP_COMPASS);
edit.putBoolean(OsmandSettings.SHOW_VIEW_ANGLE, true);
edit.putBoolean(OsmandSettings.AUTO_ZOOM_MAP, false);
edit.putBoolean(OsmandSettings.USE_STEP_BY_STEP_RENDERING, false);
// if(useInternetToDownloadTiles.isChecked()){
// edit.putBoolean(OsmandSettings.SHOW_OSM_BUGS, true);
// }
// edit.putBoolean(OsmandSettings.USE_ENGLISH_NAMES, _);
edit.putBoolean(OsmandSettings.SAVE_TRACK_TO_GPX, false);
// edit.putInt(OsmandSettings.SAVE_TRACK_INTERVAL, _);
edit.putInt(OsmandSettings.POSITION_ON_MAP, OsmandSettings.CENTER_CONSTANT);
// edit.putString(OsmandSettings.MAP_TILE_SOURCES, _);
} else if (preset == ApplicationMode.DEFAULT) {
// edit.putBoolean(OsmandSettings.USE_INTERNET_TO_DOWNLOAD_TILES, _);
// edit.putBoolean(OsmandSettings.SHOW_POI_OVER_MAP, true);
edit.putInt(OsmandSettings.ROTATE_MAP, OsmandSettings.ROTATE_MAP_NONE);
edit.putBoolean(OsmandSettings.SHOW_VIEW_ANGLE, false);
edit.putBoolean(OsmandSettings.AUTO_ZOOM_MAP, false);
edit.putBoolean(OsmandSettings.USE_STEP_BY_STEP_RENDERING, true);
// edit.putBoolean(OsmandSettings.SHOW_OSM_BUGS, _);
// edit.putBoolean(OsmandSettings.USE_ENGLISH_NAMES, _);
edit.putBoolean(OsmandSettings.SAVE_TRACK_TO_GPX, false);
// edit.putInt(OsmandSettings.SAVE_TRACK_INTERVAL, _);
edit.putInt(OsmandSettings.POSITION_ON_MAP, OsmandSettings.CENTER_CONSTANT);
// edit.putString(OsmandSettings.MAP_TILE_SOURCES, _);
}
BaseOsmandRender current = RendererRegistry.getRegistry().getCurrentSelectedRenderer();
BaseOsmandRender defaultRender = RendererRegistry.getRegistry().defaultRender();
BaseOsmandRender newRenderer;
if (preset == ApplicationMode.CAR) {
newRenderer = RendererRegistry.getRegistry().carRender();
} else if (preset == ApplicationMode.BICYCLE) {
newRenderer = RendererRegistry.getRegistry().bicycleRender();
} else if (preset == ApplicationMode.PEDESTRIAN) {
newRenderer = RendererRegistry.getRegistry().pedestrianRender();
} else {
newRenderer = defaultRender;
}
if (newRenderer != current) {
RendererRegistry.getRegistry().setCurrentSelectedRender(newRenderer);
application.getResourceManager().getRenderer().clearCache();
}
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference == applicationDir) {
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
@Override
public boolean onPreferenceClick(Preference preference) {
if(preference == downloadIndexes){
startActivity(new Intent(this, DownloadIndexActivity.class));
return true;
} else if(preference == reloadIndexes){
reloadIndexes();
return true;
} else if(preference == saveCurrentTrack){
SavingTrackHelper helper = new SavingTrackHelper(this);
if (helper.hasDataToSave()) {
progressDlg = ProgressDialog.show(this, getString(R.string.saving_gpx_tracks), getString(R.string.saving_gpx_tracks), true);
final ProgressDialogImplementation impl = new ProgressDialogImplementation(progressDlg);
impl.setRunnable("SavingGPX", new Runnable() { //$NON-NLS-1$
@Override
public void run() {
try {
SavingTrackHelper helper = new SavingTrackHelper(SettingsActivity.this);
helper.saveDataToGpx();
helper.close();
} finally {
if (progressDlg != null) {
progressDlg.dismiss();
progressDlg = null;
}
}
}
});
impl.run();
} else {
helper.close();
}
return true;
}
return false;
}
}