Auto switch day/night mode:

- added settings for sunrise/sunset,day,night,sensor auto switch
- DayNightHelper contains the base switching logic
- auto switching works only if render is selected which has its -night counterpart
- light sensor threshold is currently hard coded

git-svn-id: https://osmand.googlecode.com/svn/trunk@854 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
pavol.zibrita 2010-12-25 23:56:17 +00:00
parent ed10675d40
commit a60ef26f4d
12 changed files with 339 additions and 67 deletions

View file

@ -56,7 +56,7 @@ package net.osmand;
* *
* Known limitations: * Known limitations:
* *
* It is assumed that the data provided are within valie ranges * It is assumed that the data provided are within value ranges
* (i.e. latitude between -90 and +90, longitude between 0 and 360, * (i.e. latitude between -90 and +90, longitude between 0 and 360,
* a valid date, and time zone between -14 and +14. * a valid date, and time zone between -14 and +14.
* *
@ -172,13 +172,9 @@ package net.osmand;
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
// Import required classes and packages // Import required classes and packages
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.math.BigDecimal; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
@ -189,7 +185,7 @@ import java.util.TimeZone;
* This Java class performs calculations to determine the time of * This Java class performs calculations to determine the time of
* sunrise and sunset given lat, long, and date. * sunrise and sunset given lat, long, and date.
* *
* It is assumed that the data provided are within valie ranges * It is assumed that the data provided are within value ranges
* (i.e. latitude between -90 and +90, longitude between 0 and 360, * (i.e. latitude between -90 and +90, longitude between 0 and 360,
* a valid date, and time zone between -14 and +14. * a valid date, and time zone between -14 and +14.
* *
@ -224,7 +220,7 @@ public class SunriseSunset
private double dfMinRise, dfMinSet; // minute of event: SUNUP.BAS M3 private double dfMinRise, dfMinSet; // minute of event: SUNUP.BAS M3
private double dfSinLat, dfCosLat; // sin and cos of latitude private double dfSinLat, dfCosLat; // sin and cos of latitude
private double dfZenith; // SUNUP.BAS Z: Zenith private double dfZenith; // SUNUP.BAS Z: Zenith
private SimpleDateFormat dfmtDate; // formatting for date alone // private SimpleDateFormat dfmtDate; // formatting for date alone
private SimpleDateFormat dfmtDateTime; // formatting for date and time private SimpleDateFormat dfmtDateTime; // formatting for date and time
private SimpleDateFormat dfmtYear; // formatting for year private SimpleDateFormat dfmtYear; // formatting for year
private SimpleDateFormat dfmtMonth; // formatting for month private SimpleDateFormat dfmtMonth; // formatting for month

View file

@ -14,7 +14,6 @@ public class ToDoConstants {
// For 0.5 release // For 0.5 release
// 104. Add activity to show current loaded indexes and information about them // 104. Add activity to show current loaded indexes and information about them
// 108. Auto switch at night rendering.
// 97. For voice navigation consider current speed of vehicle. Especially when speed > 50 pronounce more than 200 m // 97. For voice navigation consider current speed of vehicle. Especially when speed > 50 pronounce more than 200 m
// 112. Investigate exiting/minimizing app (Issue) // 112. Investigate exiting/minimizing app (Issue)
@ -48,6 +47,7 @@ public class ToDoConstants {
// 105. Route mode fast/short (Issue) // 105. Route mode fast/short (Issue)
// 109. Update download index activity (introduce select/deselect all, update existing) // 109. Update download index activity (introduce select/deselect all, update existing)
// and make green text for already loaded indexes. // and make green text for already loaded indexes.
// 108. Auto switch at night rendering.
// DONE SWING // DONE SWING

View file

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources> <resources>
<string name="daynight_mode_day">Day</string>
<string name="daynight_mode_night">Night</string>
<string name="daynight_mode_auto">Sunrise/Sunset</string>
<string name="daynight_mode_sensor">Light sensor</string>
<string name="daynight_descr">Choose day/night mode switching rule</string>
<string name="daynight_none_descr">Select renderer with night counterpart</string>
<string name="daynight">Day/night mode</string>
<string name="download_files_question">Download {0} files ({1} MB)?</string> <string name="download_files_question">Download {0} files ({1} MB)?</string>
<string name="items_were_selected">{0} items were selected</string> <string name="items_were_selected">{0} items were selected</string>
<string name="filter_existing_indexes">Filter downloaded</string> <string name="filter_existing_indexes">Filter downloaded</string>

View file

@ -8,6 +8,7 @@
<CheckBoxPreference android:summary="@string/use_english_names_descr" android:title="@string/use_english_names" <CheckBoxPreference android:summary="@string/use_english_names_descr" android:title="@string/use_english_names"
android:key="use_english_names"></CheckBoxPreference> android:key="use_english_names"></CheckBoxPreference>
<ListPreference android:key="renderer" android:title="@string/renderers" android:summary="@string/renderers_descr"></ListPreference> <ListPreference android:key="renderer" android:title="@string/renderers" android:summary="@string/renderers_descr"></ListPreference>
<ListPreference android:key="daynight_mode" android:title="@string/daynight" android:summary="@string/daynight_descr"></ListPreference>
<CheckBoxPreference android:summary="@string/continuous_rendering_descr" android:title="@string/continuous_rendering" <CheckBoxPreference android:summary="@string/continuous_rendering_descr" android:title="@string/continuous_rendering"
android:key="use_step_by_step_rendering" /> android:key="use_step_by_step_rendering" />
<CheckBoxPreference android:key="use_high_res_maps" android:title="@string/use_high_res_maps" android:summary="@string/use_high_res_maps_descr"></CheckBoxPreference> <CheckBoxPreference android:key="use_high_res_maps" android:title="@string/use_high_res_maps" android:summary="@string/use_high_res_maps_descr"></CheckBoxPreference>

View file

@ -20,6 +20,8 @@ import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.location.LocationManager; import android.location.LocationManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
@ -49,6 +51,50 @@ public class OsmandSettings {
} }
public enum DayNightMode {
AUTO(R.string.daynight_mode_auto),
DAY(R.string.daynight_mode_day),
NIGHT(R.string.daynight_mode_night),
SENSOR(R.string.daynight_mode_sensor);
private final int key;
DayNightMode(int key) {
this.key = key;
}
public String toHumanString(Context ctx){
return ctx.getResources().getString(key);
}
public boolean isSensor() {
return this == SENSOR;
}
public boolean isAuto() {
return this == AUTO;
}
public boolean isDay() {
return this == DAY;
}
public boolean isNight() {
return this == NIGHT;
}
public static DayNightMode[] possibleValues(Context context) {
SensorManager mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
if (mLight != null) {
return DayNightMode.values();
} else {
return new DayNightMode[] { AUTO, DAY, NIGHT };
}
}
}
// These settings are stored in SharedPreferences // These settings are stored in SharedPreferences
public static final String SHARED_PREFERENCES_NAME = "net.osmand.settings"; //$NON-NLS-1$ public static final String SHARED_PREFERENCES_NAME = "net.osmand.settings"; //$NON-NLS-1$
@ -199,6 +245,23 @@ public class OsmandSettings {
return prefs.edit().putString(APPLICATION_MODE, p.name()).commit(); return prefs.edit().putString(APPLICATION_MODE, p.name()).commit();
} }
// this value string is synchronized with settings_pref.xml preference name
public static final String DAYNIGHT_MODE = "daynight_mode"; //$NON-NLS-1$
public static DayNightMode getDayNightMode(SharedPreferences prefs) {
String s = prefs.getString(DAYNIGHT_MODE, DayNightMode.AUTO.name());
try {
return DayNightMode.valueOf(s);
} catch (IllegalArgumentException e) {
return DayNightMode.AUTO;
}
}
public static boolean setDayNightMode(Context ctx, DayNightMode p) {
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
return prefs.edit().putString(APPLICATION_MODE, p.name()).commit();
}
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name
public static final String ROUTER_SERVICE = "router_service"; //$NON-NLS-1$ public static final String ROUTER_SERVICE = "router_service"; //$NON-NLS-1$
@ -298,7 +361,7 @@ public class OsmandSettings {
public static final String MAP_SCREEN_ORIENTATION = "map_screen_orientation"; //$NON-NLS-1$ public static final String MAP_SCREEN_ORIENTATION = "map_screen_orientation"; //$NON-NLS-1$
public static int getMapOrientation(SharedPreferences prefs){ public static int getMapOrientation(SharedPreferences prefs){
return prefs.getInt(MAP_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); return prefs.getInt(MAP_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
} }
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name

View file

@ -0,0 +1,150 @@
package net.osmand.activities;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import net.osmand.LogUtil;
import net.osmand.OsmandSettings;
import net.osmand.OsmandSettings.DayNightMode;
import net.osmand.SunriseSunset;
import net.osmand.render.RendererRegistry;
import org.apache.commons.logging.Log;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationManager;
/**
* Class to help determine if we want to render day or night map
* - it uses the DayNightMode enumeration for its behavior
* - it uses the {@link RendererRegistry} to check if the night part is present
* - it uses the LightSensor and needs calls from MapActivity on onPause and onResume to register/unregister
* the sensor listener
* - it uses the {@link SunriseSunset} and {@link LocationManager} to find out about sunset/sunrise and use it
*
* Note: the usage of SunriseSunset is not optimized in any way, it is recalculated on each demand. If this
* way it would be resource consuming, some recalculation threshold could be specified to recalculate the sun-rise/set
* only sometimes.
* Note2: the light sensor threshold is hard coded to {@link SensorManager#LIGHT_CLOUDY} and could be made customizable
*
* @author pavol.zibrita
*/
public class DayNightHelper implements SensorEventListener {
private static final Log log = LogUtil.getLog(DayNightHelper.class);
String currentRenderName = "";
boolean daynightcheck = false;
boolean sensorcheck = false;
private final OsmandApplication osmandApplication;
public DayNightHelper(OsmandApplication osmandApplication) {
this.osmandApplication = osmandApplication;
setDayNightMode(OsmandSettings.getDayNightMode(OsmandSettings
.getPrefs(osmandApplication)));
}
DayNightMode dayNightMode = DayNightMode.AUTO;
private DayNightHelper listener;
private float lux = SensorManager.LIGHT_SUNLIGHT;
public void setDayNightMode(DayNightMode mode) {
if (this.dayNightMode != mode) {
this.dayNightMode = mode;
this.currentRenderName = "";
this.daynightcheck = false;
this.sensorcheck = false;
osmandApplication.getResourceManager().getRenderer().clearCache();
}
unregisterServiceListener();
registerServiceListener();
}
public boolean getDayNightRenderer() {
RendererRegistry registry = RendererRegistry.getRegistry();
String name = registry.getCurrentSelectedRenderer().name;
boolean day = true;
if (!currentRenderName.equals(name)) {
currentRenderName = name;
if (registry.hasDayNightRenderer(name)) {
if (dayNightMode.isDay()) {
day = true;
} else if (dayNightMode.isNight()) {
day = false;
} else if (dayNightMode.isAuto()) {
daynightcheck = true;
} else if (dayNightMode.isSensor()) {
sensorcheck = true;
registerServiceListener();
}
}
}
// We are in auto mode!
if (daynightcheck) {
LocationManager locationProvider = (LocationManager) osmandApplication
.getSystemService(Context.LOCATION_SERVICE); // Or use
// LocationManager.GPS_PROVIDER
Location lastKnownLocation = locationProvider
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
SunriseSunset daynightSwitch = new SunriseSunset(
lastKnownLocation.getLatitude(),
lastKnownLocation.getLongitude(), new Date(), TimeZone
.getDefault().getRawOffset());
day = daynightSwitch.isDaytime();
log.debug("Sunrise/sunset setting to day: " + day);
}
if (sensorcheck) {
day = lux > SensorManager.LIGHT_CLOUDY;
log.debug("lux value:" + lux + " setting to day: " + day);
}
return day;
}
public void onMapPause() {
unregisterServiceListener();
}
private void unregisterServiceListener() {
if (listener != null) {
SensorManager mSensorManager = (SensorManager) osmandApplication
.getSystemService(Context.SENSOR_SERVICE);
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
mSensorManager.unregisterListener(listener, mLight);
listener = null;
}
}
public void onMapResume() {
registerServiceListener();
}
private void registerServiceListener() {
if (dayNightMode.isSensor() && sensorcheck) {
SensorManager mSensorManager = (SensorManager) osmandApplication
.getSystemService(Context.SENSOR_SERVICE);
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
List<Sensor> list = mSensorManager.getSensorList(Sensor.TYPE_LIGHT);
log.info("Light sensors:" + list.size());
mSensorManager.registerListener(this, mLight,
SensorManager.SENSOR_DELAY_NORMAL);
listener = this;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.values.length > 0) {
lux = event.values[0];
}
}
}

View file

@ -700,6 +700,7 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
currentLocationProvider = null; currentLocationProvider = null;
routingHelper.setUiActivity(null); routingHelper.setUiActivity(null);
((OsmandApplication)getApplication()).getDaynightHelper().onMapPause();
OsmandSettings.setLastKnownMapLocation(this, (float) mapView.getLatitude(), (float) mapView.getLongitude()); OsmandSettings.setLastKnownMapLocation(this, (float) mapView.getLatitude(), (float) mapView.getLongitude());
AnimateDraggingMapThread animatedThread = mapView.getAnimatedDraggingThread(); AnimateDraggingMapThread animatedThread = mapView.getAnimatedDraggingThread();
@ -866,6 +867,8 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
if(progress != null){ if(progress != null){
((OsmandApplication) getApplication()).getResourceManager().setBusyIndicator(new BusyIndicator(this, progress)); ((OsmandApplication) getApplication()).getResourceManager().setBusyIndicator(new BusyIndicator(this, progress));
} }
((OsmandApplication)getApplication()).getDaynightHelper().onMapResume();
} }

View file

@ -40,6 +40,7 @@ public class OsmandApplication extends Application {
private List<String> startingWarnings; private List<String> startingWarnings;
private ProgressDialog progressDlg; private ProgressDialog progressDlg;
private Handler uiHandler; private Handler uiHandler;
private DayNightHelper daynightHelper;
@ -48,6 +49,7 @@ public class OsmandApplication extends Application {
super.onCreate(); super.onCreate();
routingHelper = new RoutingHelper(OsmandSettings.getApplicationMode(OsmandSettings.getPrefs(OsmandApplication.this)), OsmandApplication.this, player); routingHelper = new RoutingHelper(OsmandSettings.getApplicationMode(OsmandSettings.getPrefs(OsmandApplication.this)), OsmandApplication.this, player);
manager = new ResourceManager(this); manager = new ResourceManager(this);
daynightHelper = new DayNightHelper(this);
uiHandler = new Handler(); uiHandler = new Handler();
startApplication(); startApplication();
} }
@ -70,6 +72,10 @@ public class OsmandApplication extends Application {
return manager; return manager;
} }
public DayNightHelper getDaynightHelper() {
return daynightHelper;
}
@Override @Override
public void onLowMemory() { public void onLowMemory() {
super.onLowMemory(); super.onLowMemory();

View file

@ -12,12 +12,13 @@ import java.util.Set;
import net.osmand.NavigationService; import net.osmand.NavigationService;
import net.osmand.OsmandSettings; import net.osmand.OsmandSettings;
import net.osmand.OsmandSettings.ApplicationMode;
import net.osmand.OsmandSettings.DayNightMode;
import net.osmand.PoiFiltersHelper; import net.osmand.PoiFiltersHelper;
import net.osmand.ProgressDialogImplementation; import net.osmand.ProgressDialogImplementation;
import net.osmand.R; import net.osmand.R;
import net.osmand.ResourceManager; import net.osmand.ResourceManager;
import net.osmand.SQLiteTileSource; import net.osmand.SQLiteTileSource;
import net.osmand.OsmandSettings.ApplicationMode;
import net.osmand.activities.RouteProvider.RouteService; import net.osmand.activities.RouteProvider.RouteService;
import net.osmand.map.TileSourceManager; import net.osmand.map.TileSourceManager;
import net.osmand.map.TileSourceManager.TileSourceTemplate; import net.osmand.map.TileSourceManager.TileSourceTemplate;
@ -40,10 +41,10 @@ import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.widget.Toast; import android.widget.Toast;
public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnPreferenceClickListener { public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnPreferenceClickListener {
@ -83,6 +84,7 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
private Preference downloadIndexes; private Preference downloadIndexes;
private ListPreference applicationMode; private ListPreference applicationMode;
private ListPreference daynightMode;
private ListPreference saveTrackInterval; private ListPreference saveTrackInterval;
private ListPreference rotateMap; private ListPreference rotateMap;
private ListPreference tileSourcePreference; private ListPreference tileSourcePreference;
@ -145,6 +147,8 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
applicationMode =(ListPreference) screen.findPreference(OsmandSettings.APPLICATION_MODE); applicationMode =(ListPreference) screen.findPreference(OsmandSettings.APPLICATION_MODE);
applicationMode.setOnPreferenceChangeListener(this); applicationMode.setOnPreferenceChangeListener(this);
daynightMode =(ListPreference) screen.findPreference(OsmandSettings.DAYNIGHT_MODE);
daynightMode.setOnPreferenceChangeListener(this);
rotateMap =(ListPreference) screen.findPreference(OsmandSettings.ROTATE_MAP); rotateMap =(ListPreference) screen.findPreference(OsmandSettings.ROTATE_MAP);
rotateMap.setOnPreferenceChangeListener(this); rotateMap.setOnPreferenceChangeListener(this);
saveTrackInterval =(ListPreference) screen.findPreference(OsmandSettings.SAVE_TRACK_INTERVAL); saveTrackInterval =(ListPreference) screen.findPreference(OsmandSettings.SAVE_TRACK_INTERVAL);
@ -212,75 +216,77 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
positionOnMap.setEntries(e); positionOnMap.setEntries(e);
positionOnMap.setValueIndex(OsmandSettings.getPositionOnMap(prefs)); positionOnMap.setValueIndex(OsmandSettings.getPositionOnMap(prefs));
fill(saveTrackInterval, new String[]{
saveTrackInterval.setEntries(new String[]{
resources.getString(R.string.interval_1_second), resources.getString(R.string.interval_1_second),
resources.getString(R.string.interval_2_seconds), resources.getString(R.string.interval_2_seconds),
resources.getString(R.string.interval_5_seconds), resources.getString(R.string.interval_5_seconds),
resources.getString(R.string.interval_15_seconds), resources.getString(R.string.interval_15_seconds),
resources.getString(R.string.interval_30_seconds), resources.getString(R.string.interval_30_seconds),
resources.getString(R.string.interval_1_minute), resources.getString(R.string.interval_1_minute),
resources.getString(R.string.interval_5_minutes)}); resources.getString(R.string.interval_5_minutes)}, //
saveTrackInterval.setEntryValues(new String[]{"1", "2", "5", "15", "30", "60", "300"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ new String[]{"1", "2", "5", "15", "30", "60", "300"}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
saveTrackInterval.setValue(OsmandSettings.getSavingTrackInterval(prefs)+""); //$NON-NLS-1$ OsmandSettings.getSavingTrackInterval(prefs)+""); //$NON-NLS-1$
String[] ints = new String[]{"0", "1", "2", "5", "8", "10", "15", "20", "25", "30", "40", "45", "60", "90" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ String[] ints = new String[]{"0", "1", "2", "5", "8", "10", "15", "20", "25", "30", "40", "45", "60", "90" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$
String[] intDescriptions = new String[ints.length]; String[] intDescriptions = new String[ints.length];
for(int i=0; i<intDescriptions.length; i++){ for(int i=0; i<intDescriptions.length; i++){
intDescriptions[i] = ints[i] + " " + getString(R.string.int_min); //$NON-NLS-1$ intDescriptions[i] = ints[i] + " " + getString(R.string.int_min); //$NON-NLS-1$
} }
routeServiceInterval.setEntries(intDescriptions); fill(routeServiceInterval, intDescriptions, ints, OsmandSettings.getServiceOffInterval(prefs)/60000+""); //$NON-NLS-1$
routeServiceInterval.setEntryValues(ints);
routeServiceInterval.setValue(OsmandSettings.getServiceOffInterval(prefs)/60000+""); //$NON-NLS-1$
ints = new String[]{"15", "30", "45", "60", "90", "120", "180", "300", "600"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ ints = new String[]{"15", "30", "45", "60", "90", "120", "180", "300", "600"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
intDescriptions = new String[ints.length]; intDescriptions = new String[ints.length];
for(int i=0; i<intDescriptions.length; i++){ for(int i=0; i<intDescriptions.length; i++){
intDescriptions[i] = ints[i] + " " + getString(R.string.int_seconds); //$NON-NLS-1$ intDescriptions[i] = ints[i] + " " + getString(R.string.int_seconds); //$NON-NLS-1$
} }
routeServiceWaitInterval.setEntries(intDescriptions); fill(routeServiceWaitInterval, intDescriptions, ints, OsmandSettings.getServiceOffWaitInterval(prefs)/1000+""); //$NON-NLS-1$
routeServiceWaitInterval.setEntryValues(ints);
routeServiceWaitInterval.setValue(OsmandSettings.getServiceOffWaitInterval(prefs)/1000+""); //$NON-NLS-1$
rotateMap.setEntries(new String[]{getString(R.string.rotate_map_none_opt), getString(R.string.rotate_map_bearing_opt), getString(R.string.rotate_map_compass_opt)}); fill(rotateMap, //
rotateMap.setEntryValues(new String[]{OsmandSettings.ROTATE_MAP_NONE+"", OsmandSettings.ROTATE_MAP_BEARING+"", OsmandSettings.ROTATE_MAP_COMPASS+""}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ new String[]{getString(R.string.rotate_map_none_opt), getString(R.string.rotate_map_bearing_opt), getString(R.string.rotate_map_compass_opt)}, //
rotateMap.setValue(OsmandSettings.getRotateMap(prefs)+""); //$NON-NLS-1$ 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$
routeServiceProvider.setEntries(new String[]{getString(R.string.gps_provider), getString(R.string.network_provider)}); fill(routeServiceProvider,//
routeServiceProvider.setEntryValues(new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}); new String[]{getString(R.string.gps_provider), getString(R.string.network_provider)}, //
routeServiceProvider.setValue(OsmandSettings.getServiceOffProvider(prefs)); new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}, //
OsmandSettings.getServiceOffProvider(prefs));
routeServiceEnabled.setChecked(OsmandSettings.getServiceOffEnabled(prefs)); routeServiceEnabled.setChecked(OsmandSettings.getServiceOffEnabled(prefs));
mapScreenOrientation.setEntries(new String[]{ fill(mapScreenOrientation, //
new String[] {
resources.getString(R.string.map_orientation_portrait), resources.getString(R.string.map_orientation_portrait),
resources.getString(R.string.map_orientation_landscape), resources.getString(R.string.map_orientation_landscape),
resources.getString(R.string.map_orientation_default), resources.getString(R.string.map_orientation_default), }, //
}); new String[] {
mapScreenOrientation.setEntryValues(new String[]{ActivityInfo.SCREEN_ORIENTATION_PORTRAIT+"", //$NON-NLS-1$ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + "", //$NON-NLS-1$
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE+"", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED+""}); //$NON-NLS-1$ //$NON-NLS-2$ ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + "", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + "" }, //$NON-NLS-1$ //$NON-NLS-2$
mapScreenOrientation.setValue(OsmandSettings.getMapOrientation(prefs)+""); //$NON-NLS-1$ OsmandSettings.getMapOrientation(prefs) + ""); //$NON-NLS-1$
ApplicationMode[] presets = ApplicationMode.values(); ApplicationMode[] presets = ApplicationMode.values();
String[] names = new String[presets.length];
String[] values = new String[presets.length]; String[] values = new String[presets.length];
String[] valueEntries = new String[presets.length];
for(int i=0; i<presets.length; i++){ for(int i=0; i<presets.length; i++){
values[i] = ApplicationMode.toHumanString(presets[i], this); names[i] = ApplicationMode.toHumanString(presets[i], this);
valueEntries[i] = presets[i].name(); values[i] = presets[i].name();
} }
applicationMode.setEntries(values); fill(applicationMode, names, values, OsmandSettings.getApplicationMode(prefs).name());
applicationMode.setEntryValues(valueEntries);
applicationMode.setValue(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[] entries = new String[RouteService.values().length];
String entry = OsmandSettings.getRouterService(prefs).getName(); String entry = OsmandSettings.getRouterService(prefs).getName();
for(int i=0; i<entries.length; i++){ for(int i=0; i<entries.length; i++){
entries[i] = RouteService.values()[i].getName(); entries[i] = RouteService.values()[i].getName();
} }
routerPreference.setEntries(entries); fill(routerPreference,entries,entries,entry);
routerPreference.setEntryValues(entries);
routerPreference.setValue(entry);
// read available voice data // read available voice data
File extStorage = new File(Environment.getExternalStorageDirectory(), ResourceManager.VOICE_PATH); File extStorage = new File(Environment.getExternalStorageDirectory(), ResourceManager.VOICE_PATH);
@ -309,11 +315,7 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
String vectorRenderer = OsmandSettings.getVectorRenderer(prefs); String vectorRenderer = OsmandSettings.getVectorRenderer(prefs);
Collection<String> rendererNames = RendererRegistry.getRegistry().getRendererNames(); Collection<String> rendererNames = RendererRegistry.getRegistry().getRendererNames();
entries = new String[rendererNames.size()]; entries = (String[]) rendererNames.toArray(new String[rendererNames.size()]);
k = 0;
for(String s : rendererNames){
entries[k++] = s;
}
rendererPreference.setEntries(entries); rendererPreference.setEntries(entries);
rendererPreference.setEntryValues(entries); rendererPreference.setEntryValues(entries);
if(rendererNames.contains(vectorRenderer)){ if(rendererNames.contains(vectorRenderer)){
@ -321,6 +323,7 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
} else { } else {
rendererPreference.setValueIndex(0); rendererPreference.setValueIndex(0);
} }
updateDayNightAccess(vectorRenderer);
int startZoom = 12; int startZoom = 12;
int endZoom = 19; int endZoom = 19;
@ -328,29 +331,24 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
for (int i = startZoom; i <= endZoom; i++) { for (int i = startZoom; i <= endZoom; i++) {
entries[i - startZoom] = i + ""; //$NON-NLS-1$ entries[i - startZoom] = i + ""; //$NON-NLS-1$
} }
maxLevelToDownload.setEntries(entries); fill(maxLevelToDownload, entries, entries, OsmandSettings.getMaximumLevelToDownloadTile(prefs)+""); //$NON-NLS-1$
maxLevelToDownload.setEntryValues(entries);
maxLevelToDownload.setValue(OsmandSettings.getMaximumLevelToDownloadTile(prefs)+""); //$NON-NLS-1$
Map<String, String> entriesMap = getTileSourceEntries(this); Map<String, String> entriesMap = getTileSourceEntries(this);
entries = new String[entriesMap.size() + 1]; entries = new String[entriesMap.size() + 1];
valueEntries = new String[entriesMap.size() + 1]; values = new String[entriesMap.size() + 1];
valueEntries[0] = VECTOR_MAP; values[0] = VECTOR_MAP;
entries[0] = getString(R.string.vector_data); entries[0] = getString(R.string.vector_data);
int ki = 1; int ki = 1;
for(Map.Entry<String, String> es : entriesMap.entrySet()){ for(Map.Entry<String, String> es : entriesMap.entrySet()){
entries[ki] = es.getValue(); entries[ki] = es.getValue();
valueEntries[ki] = es.getKey(); values[ki] = es.getKey();
ki++; ki++;
} }
tileSourcePreference.setEntries(entries);
tileSourcePreference.setEntryValues(valueEntries);
String value = OsmandSettings.isUsingMapVectorData(prefs)? VECTOR_MAP : OsmandSettings.getMapTileSourceName(prefs); 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$ String mapName = " " + (OsmandSettings.isUsingMapVectorData(prefs) ? getString(R.string.vector_data) : //$NON-NLS-1$
OsmandSettings.getMapTileSourceName(prefs)); OsmandSettings.getMapTileSourceName(prefs));
tileSourcePreference.setValue(value);
String summary = tileSourcePreference.getSummary().toString(); String summary = tileSourcePreference.getSummary().toString();
if (summary.lastIndexOf(':') != -1) { if (summary.lastIndexOf(':') != -1) {
summary = summary.substring(0, summary.lastIndexOf(':') + 1); summary = summary.substring(0, summary.lastIndexOf(':') + 1);
@ -358,6 +356,13 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
tileSourcePreference.setSummary(summary + mapName); tileSourcePreference.setSummary(summary + mapName);
} }
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){ public static Map<String, String> getTileSourceEntries(Context ctx){
Map<String, String> map = new LinkedHashMap<String, String>(); Map<String, String> map = new LinkedHashMap<String, String>();
File dir = new File(Environment.getExternalStorageDirectory(), ResourceManager.TILES_PATH); File dir = new File(Environment.getExternalStorageDirectory(), ResourceManager.TILES_PATH);
@ -420,6 +425,10 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
setAppMode(ApplicationMode.valueOf(newValue.toString()), edit, (OsmandApplication) getApplication(), old); setAppMode(ApplicationMode.valueOf(newValue.toString()), edit, (OsmandApplication) getApplication(), old);
edit.commit(); edit.commit();
updateAllSettings(); updateAllSettings();
} else if(preference == daynightMode){
edit.putString(OsmandSettings.DAYNIGHT_MODE, (String) newValue);
((OsmandApplication)getApplication()).getDaynightHelper().setDayNightMode(DayNightMode.valueOf(newValue.toString()));
edit.commit();
} else if(preference == mapScreenOrientation){ } else if(preference == mapScreenOrientation){
edit.putInt(OsmandSettings.MAP_SCREEN_ORIENTATION, Integer.parseInt(newValue.toString())); edit.putInt(OsmandSettings.MAP_SCREEN_ORIENTATION, Integer.parseInt(newValue.toString()));
edit.commit(); edit.commit();
@ -483,6 +492,7 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
Toast.makeText(this, R.string.renderer_load_exception, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.renderer_load_exception, Toast.LENGTH_SHORT).show();
} else { } else {
RendererRegistry.getRegistry().setCurrentSelectedRender(loaded); RendererRegistry.getRegistry().setCurrentSelectedRender(loaded);
updateDayNightAccess(newValue);
edit.putString(OsmandSettings.RENDERER, (String) newValue); edit.putString(OsmandSettings.RENDERER, (String) newValue);
Toast.makeText(this, R.string.renderer_load_sucess, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.renderer_load_sucess, Toast.LENGTH_SHORT).show();
((OsmandApplication)getApplication()).getResourceManager().getRenderer().clearCache(); ((OsmandApplication)getApplication()).getResourceManager().getRenderer().clearCache();
@ -517,6 +527,16 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
return true; return true;
} }
private void updateDayNightAccess(Object newValue) {
if (newValue != null && RendererRegistry.getRegistry().hasDayNightRenderer((String)newValue)) {
daynightMode.setSummary(R.string.daynight_descr);
daynightMode.setEnabled(true);
} else {
daynightMode.setSummary(R.string.daynight_none_descr);
daynightMode.setEnabled(false);
}
}
public void reloadIndexes(){ public void reloadIndexes(){
progressDlg = ProgressDialog.show(this, getString(R.string.loading_data), getString(R.string.reading_indexes), true); progressDlg = ProgressDialog.show(this, getString(R.string.loading_data), getString(R.string.reading_indexes), true);
final ProgressDialogImplementation impl = new ProgressDialogImplementation(progressDlg); final ProgressDialogImplementation impl = new ProgressDialogImplementation(progressDlg);

View file

@ -45,6 +45,11 @@ public class BaseOsmandRender implements RenderingRuleVisitor {
public BaseOsmandRender(){ public BaseOsmandRender(){
} }
public boolean isDayRender()
{
return !name.endsWith(RendererRegistry.NIGHT_SUFFIX);
}
@Override @Override
public void rendering(String name, String depends, int defaultColor) { public void rendering(String name, String depends, int defaultColor) {
this.name = name; this.name = name;

View file

@ -13,6 +13,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import net.osmand.LogUtil; import net.osmand.LogUtil;
import net.osmand.activities.OsmandApplication;
import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapDataObject;
import net.osmand.binary.BinaryMapIndexReader.TagValuePair; import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
import net.osmand.data.preparation.MapTileDownloader.IMapDownloaderCallback; import net.osmand.data.preparation.MapTileDownloader.IMapDownloaderCallback;
@ -272,7 +273,8 @@ public class OsmandRenderer {
public Bitmap generateNewBitmap(RenderingContext rc, List<BinaryMapDataObject> objects, Bitmap bmp, boolean useEnglishNames, List<IMapDownloaderCallback> notifyList) { public Bitmap generateNewBitmap(RenderingContext rc, List<BinaryMapDataObject> objects, Bitmap bmp, boolean useEnglishNames, List<IMapDownloaderCallback> notifyList) {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
render = RendererRegistry.getRegistry().getCurrentSelectedRenderer(); boolean renderDay = ((OsmandApplication)context.getApplicationContext()).getDaynightHelper().getDayNightRenderer();
render = RendererRegistry.getRegistry().getCurrentSelectedRendererForDayNight(renderDay);
// fill area // fill area
Canvas cv = new Canvas(bmp); Canvas cv = new Canvas(bmp);

View file

@ -74,16 +74,24 @@ public class RendererRegistry {
return renderer; return renderer;
} }
public boolean hasDayNightRenderer(String name){
return hasRender(name) && hasRender(name + NIGHT_SUFFIX);
}
public BaseOsmandRender getRenderer(String name){ public BaseOsmandRender getRenderer(String name){
if(renderers.containsKey(name)){ if(renderers.containsKey(name)){
return renderers.get(name); return renderers.get(name);
} }
if(!externalRenderers.containsKey(name) && !internalRenderers.containsKey(name)){ if(!hasRender(name)){
return null; return null;
} }
return getRenderer(name, new LinkedHashSet<String>()); return getRenderer(name, new LinkedHashSet<String>());
} }
private boolean hasRender(String name) {
return externalRenderers.containsKey(name) || internalRenderers.containsKey(name);
}
private BaseOsmandRender getRenderer(String name, Set<String> loadedRenderers) { private BaseOsmandRender getRenderer(String name, Set<String> loadedRenderers) {
try { try {
return loadRenderer(name); return loadRenderer(name);
@ -153,4 +161,14 @@ public class RendererRegistry {
this.currentSelectedRender = currentSelectedRender; this.currentSelectedRender = currentSelectedRender;
} }
public BaseOsmandRender getCurrentSelectedRendererForDayNight(boolean forDay) {
BaseOsmandRender local = getCurrentSelectedRenderer();
if (forDay && local.isDayRender()) {
return local;
} else {
BaseOsmandRender localNight = getRenderer(local.name + NIGHT_SUFFIX);
return localNight != null ? localNight : local;
}
}
} }