Merge branch 'master' into straight_to
This commit is contained in:
commit
6b0595f6a0
25 changed files with 381 additions and 166 deletions
|
@ -1557,6 +1557,8 @@ public class GPXUtilities {
|
|||
serializer.endTag(null, "wpt"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
writeExtensions(serializer, file);
|
||||
|
||||
serializer.endTag(null, "gpx"); //$NON-NLS-1$
|
||||
serializer.endDocument();
|
||||
serializer.flush();
|
||||
|
|
|
@ -135,12 +135,9 @@ public class GeneralRouter implements VehicleRouter {
|
|||
for (int i = 0; i < objectAttributes.length; i++) {
|
||||
objectAttributes[i] = new RouteAttributeContext(parent.objectAttributes[i], params);
|
||||
}
|
||||
allowPrivate = params.containsKey(ALLOW_PRIVATE) && parseSilentBoolean(params.get(ALLOW_PRIVATE), false) ;
|
||||
allowPrivate = params.containsKey(ALLOW_PRIVATE) && parseSilentBoolean(params.get(ALLOW_PRIVATE), false);
|
||||
shortestRoute = params.containsKey(USE_SHORTEST_WAY) && parseSilentBoolean(params.get(USE_SHORTEST_WAY), false);
|
||||
heightObstacles = params.containsKey(USE_HEIGHT_OBSTACLES) && parseSilentBoolean(params.get(USE_HEIGHT_OBSTACLES), false);
|
||||
if(shortestRoute) {
|
||||
maxSpeed = Math.min(CAR_SHORTEST_DEFAULT_SPEED, maxSpeed);
|
||||
}
|
||||
if (params.containsKey(DEFAULT_SPEED)) {
|
||||
defaultSpeed = parseSilentFloat(params.get(DEFAULT_SPEED), defaultSpeed);
|
||||
}
|
||||
|
@ -150,8 +147,10 @@ public class GeneralRouter implements VehicleRouter {
|
|||
if (params.containsKey(MAX_SPEED)) {
|
||||
maxSpeed = parseSilentFloat(params.get(MAX_SPEED), maxSpeed);
|
||||
}
|
||||
if (shortestRoute) {
|
||||
maxSpeed = Math.min(CAR_SHORTEST_DEFAULT_SPEED, maxSpeed);
|
||||
}
|
||||
initCaches();
|
||||
|
||||
}
|
||||
|
||||
public GeneralRouter(GeneralRouterProfile profile, Map<String, String> attributes) {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
<string name="last_update_from_telegram_date">Last update from Telegram: %1$s</string>
|
||||
<string name="last_response_date">Last response: %1$s</string>
|
||||
<string name="last_update_from_telegram_duration">Last update from Telegram: %1$s ago</string>
|
||||
|
|
|
@ -207,7 +207,7 @@ class TelegramSettings(private val app: TelegramApplication) {
|
|||
fun updateLiveTrack(userId: Int, chatId: Long, deviceName: String, enable: Boolean) {
|
||||
val tracksInfo = liveTracksInfo.toMutableList()
|
||||
if (enable) {
|
||||
val colorIndex = if (tracksInfo.size > 0) (tracksInfo.last().colorIndex + 1) % ShowLocationHelper.GPX_COLORS_COUNT else 0
|
||||
val colorIndex = if (tracksInfo.size > 0) (tracksInfo.last().colorIndex + 1) % ShowLocationHelper.GPX_COLORS.size else 0
|
||||
tracksInfo.add(LiveTrackInfo(userId, chatId, deviceName, colorIndex))
|
||||
} else {
|
||||
tracksInfo.removeAll { it.userId == userId && it.chatId == chatId && it.deviceName == deviceName }
|
||||
|
|
|
@ -43,23 +43,21 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
|
||||
const val LIVE_TRACKS_DIR = "livetracks"
|
||||
|
||||
const val GPX_COLORS_COUNT = 10
|
||||
|
||||
private const val STATUS_WIDGET_ID = "status_widget"
|
||||
private const val STATUS_WIDGET_MENU_ICON = "widget_location_sharing_night"
|
||||
private const val STATUS_WIDGET_MENU_ICON_OLD = "ic_action_relative_bearing"
|
||||
private const val STATUS_WIDGET_ICON_OLD = "widget_relative_bearing_day"
|
||||
private const val STATUS_WIDGET_ANIM_ICON_DAY = "anim_widget_location_sharing_day"
|
||||
private const val STATUS_WIDGET_ANIM_ICON_NIGHT = "anim_widget_location_sharing_night"
|
||||
private const val STATUS_WIDGET_ON_ANIM_ICON_DAY = "anim_widget_location_sharing_on_day"
|
||||
private const val STATUS_WIDGET_ON_ANIM_ICON_NIGHT = "anim_widget_location_sharing_on_night"
|
||||
private const val STATUS_WIDGET_ICON_DAY = "widget_location_sharing_day"
|
||||
private const val STATUS_WIDGET_ICON_NIGHT = "widget_location_sharing_night"
|
||||
private const val STATUS_WIDGET_ON_ICON_DAY = "widget_location_sharing_on_day"
|
||||
private const val STATUS_WIDGET_ON_ICON_NIGHT = "widget_location_sharing_on_night"
|
||||
private const val STATUS_WIDGET_OFF_ICON_DAY = "widget_location_sharing_off_day"
|
||||
private const val STATUS_WIDGET_OFF_ICON_NIGHT = "widget_location_sharing_off_night"
|
||||
|
||||
val GPX_COLORS = arrayOf(
|
||||
"red", "orange", "lightblue", "blue", "purple",
|
||||
"red", "orange", "lightblue", "blue", "purple", "pink",
|
||||
"translucent_red", "translucent_orange", "translucent_lightblue",
|
||||
"translucent_blue", "translucent_purple"
|
||||
"translucent_blue", "translucent_purple", "translucent_pink"
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -232,21 +230,27 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
STATUS_WIDGET_MENU_ICON_OLD
|
||||
}
|
||||
val text = when {
|
||||
time > 0L -> {
|
||||
iconDay = STATUS_WIDGET_ANIM_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ANIM_ICON_NIGHT
|
||||
time > 0L && isSending -> {
|
||||
iconDay = STATUS_WIDGET_ON_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ON_ICON_NIGHT
|
||||
val diffTime = (System.currentTimeMillis() - time) / 1000
|
||||
OsmandFormatter.getFormattedDurationForWidget(diffTime)
|
||||
}
|
||||
time > 0L && !isSending -> {
|
||||
iconDay = STATUS_WIDGET_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ICON_NIGHT
|
||||
val diffTime = (System.currentTimeMillis() - time) / 1000
|
||||
OsmandFormatter.getFormattedDurationForWidget(diffTime)
|
||||
}
|
||||
time == 0L && isSending -> {
|
||||
iconDay = STATUS_WIDGET_ON_ANIM_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ON_ANIM_ICON_NIGHT
|
||||
iconDay = STATUS_WIDGET_ON_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ON_ICON_NIGHT
|
||||
app.getString(R.string.shared_string_ok)
|
||||
}
|
||||
time == 0L && !isSending -> {
|
||||
iconDay = STATUS_WIDGET_ANIM_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ANIM_ICON_NIGHT
|
||||
app.getString(R.string.shared_string_ok)
|
||||
iconDay = STATUS_WIDGET_ICON_DAY
|
||||
iconNight = STATUS_WIDGET_ICON_NIGHT
|
||||
app.getString(R.string.shared_string_error_short)
|
||||
}
|
||||
else -> {
|
||||
iconDay = STATUS_WIDGET_OFF_ICON_DAY
|
||||
|
|
15
OsmAnd/res/drawable/ic_action_keep_both.xml
Normal file
15
OsmAnd/res/drawable/ic_action_keep_both.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M7,19V21C7,22.1046 7.8954,23 9,23H19C20.1046,23 21,22.1046 21,21V7C21,5.8954 20.1046,5 19,5H17V17C17,18.1046 16.1046,19 15,19H7Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M3,3C3,1.8954 3.8954,1 5,1H15C16.1046,1 17,1.8954 17,3V17C17,18.1046 16.1046,19 15,19H5C3.8954,19 3,18.1046 3,17V3ZM9,12V10H7V12H5V14H7L7,16H9V14H11V12H9ZM13,7H15V16H13V10H11V8H13V7Z"
|
||||
android:fillColor="#727272"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
20
OsmAnd/res/drawable/ic_action_map_style.xml
Normal file
20
OsmAnd/res/drawable/ic_action_map_style.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M4,15V18L15,18V16.5C15,16.2239 15.2239,16 15.5,16C15.7761,16 16,16.2239 16,16.5V18H20V15H4Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M18,4H20V20H18V4ZM13,4H4V20H13V4ZM15.5,4C15.7761,4 16,4.2239 16,4.5V7.5C16,7.7761 15.7761,8 15.5,8C15.2239,8 15,7.7761 15,7.5V4.5C15,4.2239 15.2239,4 15.5,4ZM15.5,20C15.7761,20 16,19.7761 16,19.5V16.5C16,16.2239 15.7761,16 15.5,16C15.2239,16 15,16.2239 15,16.5V19.5C15,19.7761 15.2239,20 15.5,20ZM2,4C2,2.8954 2.8954,2 4,2H20C21.1046,2 22,2.8954 22,4V20C22,21.1046 21.1046,22 20,22H4C2.8954,22 2,21.1046 2,20V4ZM15,10.5C15,10.2239 15.2239,10 15.5,10C15.7761,10 16,10.2239 16,10.5V13.5C16,13.7761 15.7761,14 15.5,14C15.2239,14 15,13.7761 15,13.5V10.5Z"
|
||||
android:fillColor="#727272"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M4,4h9v11h-9z"
|
||||
android:strokeAlpha="0.2"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.2"/>
|
||||
</vector>
|
40
OsmAnd/res/drawable/ic_action_replace.xml
Normal file
40
OsmAnd/res/drawable/ic_action_replace.xml
Normal file
|
@ -0,0 +1,40 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M7,21V19H9V21H11V23H9C7.8954,23 7,22.1046 7,21Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M13,23H15V21H13V23Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M17,21V23H19C20.1046,23 21,22.1046 21,21V19H19V21H17Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M19,17H21V15H19V17Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M19,13H21V11H19V13Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M19,9H21V7C21,5.8954 20.1046,5 19,5H17V7H19V9Z"
|
||||
android:strokeAlpha="0.5"
|
||||
android:fillColor="#727272"
|
||||
android:fillAlpha="0.5"/>
|
||||
<path
|
||||
android:pathData="M5,1C3.8954,1 3,1.8954 3,3V17C3,18.1046 3.8954,19 5,19H15C16.1046,19 17,18.1046 17,17V3C17,1.8954 16.1046,1 15,1H5ZM11,10L15,13L11,16V14H6V12H11V10Z"
|
||||
android:fillColor="#727272"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
|
@ -11,7 +11,8 @@
|
|||
Thx - Hardy
|
||||
|
||||
-->
|
||||
<string name="routing_profile_direct_to">Direct to point routing</string>
|
||||
<string name="routing_profile_direct_to">Direct-to-point</string>
|
||||
<string name="clear_recorded_data">Clear recorded data</string>
|
||||
<string name="release_3_6">
|
||||
• Profiles: now you can change order, set icon for map, change all setting for base profiles and restore them back to defaults\n\n
|
||||
• Added exit number in the navigation\n\n
|
||||
|
|
|
@ -1119,7 +1119,7 @@ public class OsmandAidlApi {
|
|||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private void finishGpxImport(boolean destinationExists, File destination, String color, boolean show) {
|
||||
int col = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(
|
||||
final int col = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(
|
||||
app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
if (!destinationExists) {
|
||||
GpxDataItem gpxDataItem = new GpxDataItem(destination, col);
|
||||
|
@ -1145,6 +1145,9 @@ public class OsmandAidlApi {
|
|||
@Override
|
||||
protected void onPostExecute(GPXFile gpx) {
|
||||
if (gpx.error == null) {
|
||||
if (col != -1) {
|
||||
gpx.setColor(col);
|
||||
}
|
||||
selectedGpx.setGpxFile(gpx, app);
|
||||
refreshMap();
|
||||
}
|
||||
|
|
|
@ -112,23 +112,24 @@ public class OsmAndLocationSimulation {
|
|||
startStopRouteAnimation(ma, true, null);
|
||||
}
|
||||
|
||||
private void startAnimationThread(final OsmandApplication app, final List<Location> directions, final boolean useLocationTime, final float coeff) {
|
||||
private void startAnimationThread(final OsmandApplication app, final List<Location> directions, final boolean locTime, final float coeff) {
|
||||
final float time = 1.5f;
|
||||
routeAnimation = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
Location current = directions.isEmpty() ? null : new Location(directions.remove(0));
|
||||
|
||||
boolean useLocationTime = locTime && current.getTime() != 0;
|
||||
Location prev = current;
|
||||
long prevTime = current == null ? 0 : current.getTime();
|
||||
float meters = metersToGoInFiveSteps(directions, current);
|
||||
if(current != null) {
|
||||
current.setProvider(OsmAndLocationProvider.SIMULATED_PROVIDER);
|
||||
}
|
||||
|
||||
while (!directions.isEmpty() && routeAnimation != null) {
|
||||
int timeout = (int) (time * 1000);
|
||||
float intervalTime = time;
|
||||
if(useLocationTime) {
|
||||
if (useLocationTime) {
|
||||
current = directions.remove(0);
|
||||
meters = current.distanceTo(prev);
|
||||
if (!directions.isEmpty()) {
|
||||
|
|
|
@ -46,6 +46,7 @@ import net.osmand.plus.activities.DayNightHelper;
|
|||
import net.osmand.plus.activities.ExitActivity;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.SavingTrackHelper;
|
||||
import net.osmand.plus.activities.actions.OsmAndDialogs;
|
||||
import net.osmand.plus.api.SQLiteAPI;
|
||||
import net.osmand.plus.api.SQLiteAPIImpl;
|
||||
import net.osmand.plus.base.MapViewTrackingUtilities;
|
||||
|
@ -465,7 +466,7 @@ public class OsmandApplication extends MultiDexApplication {
|
|||
if (voiceProvider == null || OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(voiceProvider)) {
|
||||
if (warningNoneProvider && voiceProvider == null) {
|
||||
if (uiContext instanceof MapActivity) {
|
||||
((MapActivity) uiContext).showVoiceProviderDialog(applicationMode, applyAllModes);
|
||||
OsmAndDialogs.showVoiceProviderDialog((MapActivity) uiContext, applicationMode, applyAllModes);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -251,7 +251,7 @@ public abstract class OsmandPlugin {
|
|||
boolean paid = plugin.isPaid();
|
||||
if ((Version.isDeveloperVersion(app) || !Version.isProductionVersion(app)) && !paid) {
|
||||
// for test reasons
|
||||
marketEnabled = false;
|
||||
// marketEnabled = false;
|
||||
}
|
||||
if (pckg || (!marketEnabled && !paid)) {
|
||||
if (pckg && !app.getSettings().getPlugins().contains("-" + plugin.getId())) {
|
||||
|
|
|
@ -25,9 +25,13 @@ import java.util.List;
|
|||
|
||||
public class SQLiteTileSource implements ITileSource {
|
||||
|
||||
|
||||
public static final String EXT = IndexConstants.SQLITE_EXT;
|
||||
private static final Log LOG = PlatformUtil.getLog(SQLiteTileSource.class);
|
||||
private static final String MAXZOOM_FIELD = "maxzoom";
|
||||
private static final String MINZOOM_FIELD = "minzoom";
|
||||
private static final String ELLIPSOID_FIELD = "ellipsoid";
|
||||
private static final String URL_FIELD = "url";
|
||||
private static final String EXPIREMINUTES_FIELD = "expireminutes";
|
||||
|
||||
private ITileSource base;
|
||||
private String urlTemplate = null;
|
||||
|
@ -163,7 +167,7 @@ public class SQLiteTileSource implements ITileSource {
|
|||
if(cursor.moveToFirst()) {
|
||||
String[] columnNames = cursor.getColumnNames();
|
||||
List<String> list = Arrays.asList(columnNames);
|
||||
int url = list.indexOf("url");
|
||||
int url = list.indexOf(URL_FIELD);
|
||||
if(url != -1) {
|
||||
String template = cursor.getString(url);
|
||||
if(!Algorithms.isEmpty(template)){
|
||||
|
@ -192,7 +196,7 @@ public class SQLiteTileSource implements ITileSource {
|
|||
timeSupported = hasTimeColumn();
|
||||
addInfoColumn("timecolumn", timeSupported? "yes" : "no");
|
||||
}
|
||||
int expireminutes = list.indexOf("expireminutes");
|
||||
int expireminutes = list.indexOf(EXPIREMINUTES_FIELD);
|
||||
this.expirationTimeMillis = -1;
|
||||
if(expireminutes != -1) {
|
||||
int minutes = (int) cursor.getInt(expireminutes);
|
||||
|
@ -200,14 +204,14 @@ public class SQLiteTileSource implements ITileSource {
|
|||
this.expirationTimeMillis = minutes * 60 * 1000l;
|
||||
}
|
||||
} else {
|
||||
addInfoColumn("expireminutes", "0");
|
||||
addInfoColumn(EXPIREMINUTES_FIELD, "0");
|
||||
}
|
||||
int tsColumn = list.indexOf("tilesize");
|
||||
this.tileSizeSpecified = tsColumn != -1;
|
||||
if(tileSizeSpecified) {
|
||||
this.tileSize = (int) cursor.getInt(tsColumn);
|
||||
}
|
||||
int ellipsoid = list.indexOf("ellipsoid");
|
||||
int ellipsoid = list.indexOf(ELLIPSOID_FIELD);
|
||||
if(ellipsoid != -1) {
|
||||
int set = (int) cursor.getInt(ellipsoid);
|
||||
if(set == 1){
|
||||
|
@ -225,15 +229,14 @@ public class SQLiteTileSource implements ITileSource {
|
|||
if(randomsId != -1) {
|
||||
this.randoms = cursor.getString(randomsId);
|
||||
this.randomsArray = TileSourceTemplate.buildRandomsArray(this.randoms);
|
||||
|
||||
}
|
||||
//boolean inversiveInfoZoom = tnumbering != -1 && "BigPlanet".equals(cursor.getString(tnumbering));
|
||||
boolean inversiveInfoZoom = inversiveZoom;
|
||||
int mnz = list.indexOf("minzoom");
|
||||
int mnz = list.indexOf(MINZOOM_FIELD);
|
||||
if(mnz != -1) {
|
||||
minZoom = (int) cursor.getInt(mnz);
|
||||
}
|
||||
int mxz = list.indexOf("maxzoom");
|
||||
int mxz = list.indexOf(MAXZOOM_FIELD);
|
||||
if(mxz != -1) {
|
||||
maxZoom = (int) cursor.getInt(mxz);
|
||||
}
|
||||
|
@ -251,10 +254,37 @@ public class SQLiteTileSource implements ITileSource {
|
|||
return db;
|
||||
}
|
||||
|
||||
public void updateFromTileSourceTemplate(TileSourceTemplate r) {
|
||||
if (!onlyReadonlyAvailable) {
|
||||
int maxZoom = r.getMaximumZoomSupported();
|
||||
int minZoom = r.getMinimumZoomSupported();
|
||||
if (inversiveZoom) {
|
||||
int mnz = minZoom;
|
||||
minZoom = 17 - maxZoom;
|
||||
maxZoom = 17 - mnz;
|
||||
}
|
||||
if (getUrlTemplate() != null && !getUrlTemplate().equals(r.getUrlTemplate())) {
|
||||
db.execSQL("update info set " + URL_FIELD + " = '" + r.getUrlTemplate() + "'");
|
||||
}
|
||||
if (r.getMinimumZoomSupported() != minZoom) {
|
||||
db.execSQL("update info set " + MINZOOM_FIELD + " = '" + minZoom + "'");
|
||||
}
|
||||
if (r.getMaximumZoomSupported() != maxZoom) {
|
||||
db.execSQL("update info set " + MAXZOOM_FIELD + " = '" + maxZoom + "'");
|
||||
}
|
||||
if (r.isEllipticYTile() != isEllipticYTile()) {
|
||||
db.execSQL("update info set " + ELLIPSOID_FIELD + " = '" + (r.isEllipticYTile() ? 1 : 0) + "'");
|
||||
}
|
||||
if (r.getExpirationTimeMinutes() != getExpirationTimeMinutes()) {
|
||||
db.execSQL("update info set " + EXPIREMINUTES_FIELD + " = '" + r.getExpirationTimeMinutes() + "'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addInfoColumn(String columnName, String value) {
|
||||
if(!onlyReadonlyAvailable) {
|
||||
db.execSQL("alter table info add column "+columnName+" TEXT");
|
||||
db.execSQL("update info set "+columnName+" = '"+value+"'");
|
||||
if (!onlyReadonlyAvailable) {
|
||||
db.execSQL("alter table info add column " + columnName + " TEXT");
|
||||
db.execSQL("update info set " + columnName + " = '" + value + "'");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -517,7 +547,9 @@ public class SQLiteTileSource implements ITileSource {
|
|||
return referer;
|
||||
}
|
||||
|
||||
|
||||
public String getUrlTemplate() {
|
||||
return urlTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1090,75 +1090,6 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
|||
new XMasDialogFragment().show(getSupportFragmentManager(), XMasDialogFragment.TAG);
|
||||
}
|
||||
|
||||
public void showVoiceProviderDialog(final ApplicationMode applicationMode, final boolean applyAllModes) {
|
||||
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
|
||||
final RoutingOptionsHelper routingOptionsHelper = app.getRoutingOptionsHelper();
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(UiUtilities.getThemedContext(this, nightMode));
|
||||
final String[] firstSelectedVoiceProvider = new String[1];
|
||||
|
||||
View view = UiUtilities.getInflater(this, nightMode).inflate(R.layout.select_voice_first, null);
|
||||
|
||||
((ImageView) view.findViewById(R.id.icon))
|
||||
.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_volume_up, settings.isLightContent()));
|
||||
|
||||
view.findViewById(R.id.spinner).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(final View v) {
|
||||
routingOptionsHelper.selectVoiceGuidance(MapActivity.this, new CallbackWithObject<String>() {
|
||||
@Override
|
||||
public boolean processResult(String result) {
|
||||
boolean acceptableValue = !RoutePreferencesMenu.MORE_VALUE.equals(firstSelectedVoiceProvider[0]);
|
||||
if (acceptableValue) {
|
||||
((TextView) v.findViewById(R.id.selectText))
|
||||
.setText(routingOptionsHelper.getVoiceProviderName(v.getContext(), result));
|
||||
firstSelectedVoiceProvider[0] = result;
|
||||
}
|
||||
return acceptableValue;
|
||||
}
|
||||
}, applicationMode);
|
||||
}
|
||||
});
|
||||
|
||||
((ImageView) view.findViewById(R.id.dropDownIcon))
|
||||
.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_arrow_drop_down, settings.isLightContent()));
|
||||
|
||||
builder.setCancelable(true);
|
||||
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
||||
builder.setPositiveButton(R.string.shared_string_apply, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (!Algorithms.isEmpty(firstSelectedVoiceProvider[0])) {
|
||||
routingOptionsHelper.applyVoiceProvider(MapActivity.this, firstSelectedVoiceProvider[0], applyAllModes);
|
||||
if (OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(firstSelectedVoiceProvider[0])) {
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, true);
|
||||
} else {
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNeutralButton(R.string.shared_string_do_not_use, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if (applyAllModes) {
|
||||
muteVoiceForAllProfiles();
|
||||
} else {
|
||||
settings.VOICE_PROVIDER.setModeValue(applicationMode, OsmandSettings.VOICE_PROVIDER_NOT_USE);
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, true);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
builder.setView(view);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void muteVoiceForAllProfiles() {
|
||||
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
|
||||
settings.VOICE_PROVIDER.setModeValue(mode, OsmandSettings.VOICE_PROVIDER_NOT_USE);
|
||||
settings.VOICE_MUTE.setModeValue(mode, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void dismissSecondSplashScreen() {
|
||||
if (SecondSplashScreenFragment.VISIBLE) {
|
||||
|
|
|
@ -247,18 +247,18 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
}
|
||||
}
|
||||
}
|
||||
clearRecordedData(warnings.isEmpty());
|
||||
return new SaveGpxResult(warnings, filenames);
|
||||
}
|
||||
|
||||
if (warnings.isEmpty()) {
|
||||
public void clearRecordedData(boolean isWarningEmpty) {
|
||||
if (isWarningEmpty) {
|
||||
SQLiteDatabase db = getWritableDatabase();
|
||||
if (db != null) {
|
||||
try {
|
||||
if (db.isOpen()) {
|
||||
// remove all from db
|
||||
db.execSQL("DELETE FROM " + TRACK_NAME + " WHERE " + TRACK_COL_DATE + " <= ?", new Object[]{System.currentTimeMillis()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
db.execSQL("DELETE FROM " + POINT_NAME + " WHERE " + POINT_COL_DATE + " <= ?", new Object[]{System.currentTimeMillis()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
// delete all
|
||||
// db.execSQL("DELETE FROM " + TRACK_NAME + " WHERE 1 = 1", new Object[] { }); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
// db.execSQL("DELETE FROM " + POINT_NAME + " WHERE 1 = 1", new Object[] { }); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
} finally {
|
||||
db.close();
|
||||
|
@ -274,7 +274,6 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
currentTrack.getModifiablePointsToDisplay().clear();
|
||||
currentTrack.getModifiableGpxFile().modifiedTime = System.currentTimeMillis();
|
||||
prepareCurrentTrackForRecording();
|
||||
return new SaveGpxResult(warnings, filenames);
|
||||
}
|
||||
|
||||
public Map<String, GPXFile> collectRecordedData() {
|
||||
|
|
|
@ -5,7 +5,23 @@ import java.util.Map;
|
|||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import net.osmand.CallbackWithObject;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu;
|
||||
import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
public class OsmAndDialogs {
|
||||
|
||||
|
@ -26,6 +42,75 @@ public class OsmAndDialogs {
|
|||
}
|
||||
|
||||
|
||||
public static void showVoiceProviderDialog(final MapActivity activity, final ApplicationMode applicationMode, final boolean applyAllModes) {
|
||||
OsmandApplication app = activity.getMyApplication();
|
||||
final OsmandSettings settings = app.getSettings();
|
||||
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
|
||||
final RoutingOptionsHelper routingOptionsHelper = app.getRoutingOptionsHelper();
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(UiUtilities.getThemedContext(activity, nightMode));
|
||||
final String[] firstSelectedVoiceProvider = new String[1];
|
||||
|
||||
View view = UiUtilities.getInflater(activity, nightMode).inflate(R.layout.select_voice_first, null);
|
||||
|
||||
((ImageView) view.findViewById(R.id.icon))
|
||||
.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_volume_up, settings.isLightContent()));
|
||||
|
||||
view.findViewById(R.id.spinner).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(final View v) {
|
||||
routingOptionsHelper.selectVoiceGuidance(activity, new CallbackWithObject<String>() {
|
||||
@Override
|
||||
public boolean processResult(String result) {
|
||||
boolean acceptableValue = !RoutePreferencesMenu.MORE_VALUE.equals(firstSelectedVoiceProvider[0]);
|
||||
if (acceptableValue) {
|
||||
((TextView) v.findViewById(R.id.selectText))
|
||||
.setText(routingOptionsHelper.getVoiceProviderName(v.getContext(), result));
|
||||
firstSelectedVoiceProvider[0] = result;
|
||||
}
|
||||
return acceptableValue;
|
||||
}
|
||||
}, applicationMode);
|
||||
}
|
||||
});
|
||||
|
||||
((ImageView) view.findViewById(R.id.dropDownIcon))
|
||||
.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_arrow_drop_down, settings.isLightContent()));
|
||||
|
||||
builder.setCancelable(true);
|
||||
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
||||
builder.setPositiveButton(R.string.shared_string_apply, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (!Algorithms.isEmpty(firstSelectedVoiceProvider[0])) {
|
||||
routingOptionsHelper.applyVoiceProvider(activity, firstSelectedVoiceProvider[0], applyAllModes);
|
||||
if (OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(firstSelectedVoiceProvider[0])) {
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, true);
|
||||
} else {
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNeutralButton(R.string.shared_string_do_not_use, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if (applyAllModes) {
|
||||
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
|
||||
//if (!settings.VOICE_PROVIDER.isSetForMode(mode)) {
|
||||
settings.VOICE_PROVIDER.setModeValue(mode, OsmandSettings.VOICE_PROVIDER_NOT_USE);
|
||||
settings.VOICE_MUTE.setModeValue(mode, true);
|
||||
//}
|
||||
}
|
||||
}
|
||||
settings.VOICE_PROVIDER.setModeValue(applicationMode, OsmandSettings.VOICE_PROVIDER_NOT_USE);
|
||||
settings.VOICE_MUTE.setModeValue(applicationMode, true);
|
||||
}
|
||||
});
|
||||
|
||||
builder.setView(view);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
public static void registerDialogAction(OsmAndAction action) {
|
||||
if(action.getDialogID() != 0) {
|
||||
dialogActions.put(action.getDialogID(), action);
|
||||
|
|
|
@ -23,6 +23,7 @@ import net.osmand.map.TileSourceManager;
|
|||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
|
||||
import net.osmand.plus.ContextMenuItem;
|
||||
import net.osmand.plus.SQLiteTileSource;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
|
@ -252,7 +253,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
|
|||
getDownloadActivity().reloadLocalIndexes();
|
||||
return true;
|
||||
}
|
||||
}, info.getName());
|
||||
}, info.getFileName());
|
||||
} else if (resId == R.string.local_index_mi_restore) {
|
||||
new LocalIndexOperationTask(getDownloadActivity(), listAdapter, LocalIndexOperationTask.RESTORE_OPERATION).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, info);
|
||||
} else if (resId == R.string.shared_string_delete) {
|
||||
|
@ -1237,7 +1238,9 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
|
|||
}
|
||||
});
|
||||
if (info.getType() == LocalIndexType.TILES_DATA
|
||||
&& (info.getAttachedObject() instanceof TileSourceManager.TileSourceTemplate)) {
|
||||
&& ((info.getAttachedObject() instanceof TileSourceManager.TileSourceTemplate)
|
||||
|| ((info.getAttachedObject() instanceof SQLiteTileSource)
|
||||
&& ((SQLiteTileSource) info.getAttachedObject()).couldBeDownloadedFromInternet()))) {
|
||||
item = optionsMenu.getMenu().add(R.string.shared_string_edit)
|
||||
.setIcon(iconsCache.getThemedIcon(R.drawable.ic_action_edit_dark));
|
||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
|
|
|
@ -310,6 +310,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
}
|
||||
if (app.getSavingTrackHelper().hasDataToSave()) {
|
||||
items.add(R.string.save_current_track);
|
||||
items.add(R.string.clear_recorded_data);
|
||||
}
|
||||
String[] strings = new String[items.size()];
|
||||
for (int i = 0; i < strings.length; i++) {
|
||||
|
@ -326,6 +327,8 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
if (app.getLocationProvider().checkGPSEnabled(activity)) {
|
||||
startGPXMonitoring(activity, showTrackSelection);
|
||||
}
|
||||
} else if (item == R.string.clear_recorded_data) {
|
||||
app.getSavingTrackHelper().clearRecordedData(true);
|
||||
} else if(item == R.string.gpx_monitoring_stop) {
|
||||
stopRecording();
|
||||
} else if(item == R.string.gpx_start_new_segment) {
|
||||
|
|
|
@ -36,6 +36,7 @@ import net.osmand.plus.OsmandSettings;
|
|||
import net.osmand.plus.OsmandSettings.CommonPreference;
|
||||
import net.osmand.plus.OsmandSettings.LayerTransparencySeekbarMode;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.SQLiteTileSource;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.Version;
|
||||
import net.osmand.plus.activities.DownloadTilesDialog;
|
||||
|
@ -478,10 +479,11 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
|
|||
t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
public static void defineNewEditLayer(final Activity activity, final ResultMatcher<TileSourceTemplate> resultMatcher, String editedLayerName) {
|
||||
public static void defineNewEditLayer(final Activity activity, final ResultMatcher<TileSourceTemplate> resultMatcher, final String editedLayerName) {
|
||||
final OsmandApplication app = (OsmandApplication) activity.getApplication();
|
||||
final OsmandSettings settings = app.getSettings();
|
||||
final Map<String, String> entriesMap = settings.getTileSourceEntries(false);
|
||||
final Map<String, String> entriesMap = settings.getTileSourceEntries(true);
|
||||
final SQLiteTileSource[] sqLiteTileSource = new SQLiteTileSource[1];
|
||||
boolean nightMode = isNightMode(activity, app);
|
||||
final int dp8 = AndroidUtils.dpToPx(app, 8f);
|
||||
int textColorPrimary = ContextCompat.getColor(app, nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light);
|
||||
|
@ -512,10 +514,25 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
|
|||
);
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
existing.setAdapter(adapter);
|
||||
TileSourceTemplate template;
|
||||
if (editedLayerName != null) {
|
||||
if (!editedLayerName.endsWith(IndexConstants.SQLITE_EXT)) {
|
||||
File f = ((OsmandApplication) activity.getApplication()).getAppPath(
|
||||
IndexConstants.TILES_INDEX_DIR + editedLayerName);
|
||||
TileSourceTemplate template = TileSourceManager.createTileSourceTemplate(f);
|
||||
template = TileSourceManager.createTileSourceTemplate(f);
|
||||
} else {
|
||||
List<TileSourceTemplate> knownTemplates = TileSourceManager.getKnownSourceTemplates();
|
||||
File tPath = app.getAppPath(IndexConstants.TILES_INDEX_DIR);
|
||||
File dir = new File(tPath, editedLayerName);
|
||||
sqLiteTileSource[0] = new SQLiteTileSource(app, dir, knownTemplates);
|
||||
sqLiteTileSource[0].couldBeDownloadedFromInternet();
|
||||
template = new TileSourceManager.TileSourceTemplate(sqLiteTileSource[0].getName(),
|
||||
sqLiteTileSource[0].getUrlTemplate(), "png", sqLiteTileSource[0].getMaximumZoomSupported(),
|
||||
sqLiteTileSource[0].getMinimumZoomSupported(), sqLiteTileSource[0].getTileSize(),
|
||||
sqLiteTileSource[0].getBitDensity(), 32000);
|
||||
template.setExpirationTimeMinutes(sqLiteTileSource[0].getExpirationTimeMinutes());
|
||||
template.setEllipticYTile(sqLiteTileSource[0].isEllipticYTile());
|
||||
}
|
||||
if (template != null) {
|
||||
result[0] = template.copy();
|
||||
updateTileSourceEditView(result[0], name, urlToLoad, minZoom, maxZoom, expire, elliptic);
|
||||
|
@ -558,6 +575,9 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
|
|||
r.setEllipticYTile(elliptic.isChecked());
|
||||
r.setUrlToLoad(urlToLoad.getText().toString().equals("") ? null : urlToLoad.getText().toString().replace("{$x}", "{1}")
|
||||
.replace("{$y}", "{2}").replace("{$z}", "{0}"));
|
||||
if (sqLiteTileSource[0] != null) {
|
||||
sqLiteTileSource[0].updateFromTileSourceTemplate(r);
|
||||
} else {
|
||||
if (r.getName().length() > 0) {
|
||||
if (settings.installTileSource(r)) {
|
||||
Toast.makeText(activity, activity.getString(R.string.edit_tilesource_successfully, r.getName()),
|
||||
|
@ -565,6 +585,7 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
|
|||
resultMatcher.publish(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
Toast.makeText(activity, e.getMessage(), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ import net.osmand.plus.UiUtilities;
|
|||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.SettingsBaseActivity;
|
||||
import net.osmand.plus.activities.actions.AppModeDialog;
|
||||
import net.osmand.plus.activities.actions.OsmAndDialogs;
|
||||
import net.osmand.plus.base.ContextMenuFragment.MenuState;
|
||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
|
@ -1098,7 +1099,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
|
|||
if (app != null) {
|
||||
String voiceProvider = app.getSettings().VOICE_PROVIDER.getModeValue(appMode);
|
||||
if (voiceProvider == null || OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(voiceProvider)) {
|
||||
mapActivity.showVoiceProviderDialog(appMode, false);
|
||||
OsmAndDialogs.showVoiceProviderDialog(mapActivity, appMode, false);
|
||||
} else {
|
||||
app.getRoutingOptionsHelper().switchSound();
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ import net.osmand.plus.OsmandApplication;
|
|||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.actions.OsmAndDialogs;
|
||||
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
|
||||
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
|
||||
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
|
||||
|
@ -182,7 +183,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
|
|||
routingHelper.getVoiceRouter().setMuteForMode(applicationMode, active);
|
||||
String voiceProvider = app.getSettings().VOICE_PROVIDER.getModeValue(applicationMode);
|
||||
if (voiceProvider == null || OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(voiceProvider)) {
|
||||
mapActivity.showVoiceProviderDialog(applicationMode, false);
|
||||
OsmAndDialogs.showVoiceProviderDialog(mapActivity, applicationMode, false);
|
||||
} else {
|
||||
muteSoundItem[0].setChecked(!active);
|
||||
muteSoundItem[0].setIcon(getContentIcon(!active ? optionsItem.getActiveIconId() : optionsItem.getDisabledIconId()));
|
||||
|
|
|
@ -187,13 +187,13 @@ public class RoutingOptionsHelper {
|
|||
public void applyVoiceProvider(MapActivity mapActivity, String provider, boolean applyAllModes) {
|
||||
OsmandApplication app = mapActivity.getMyApplication();
|
||||
ApplicationMode selectedAppMode = app.getRoutingHelper().getAppMode();
|
||||
OsmandSettings.OsmandPreference<String> VP = app.getSettings().VOICE_PROVIDER;
|
||||
if (applyAllModes) {
|
||||
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
|
||||
app.getSettings().VOICE_PROVIDER.setModeValue(mode, provider);
|
||||
VP.setModeValue(mode, provider);
|
||||
}
|
||||
} else {
|
||||
app.getSettings().VOICE_PROVIDER.setModeValue(selectedAppMode, provider);
|
||||
}
|
||||
VP.setModeValue(selectedAppMode, provider);
|
||||
app.initVoiceCommandPlayer(mapActivity, selectedAppMode, false, null, true, false, applyAllModes);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ public class RouteCalculationResult {
|
|||
|
||||
private static double distanceClosestToIntermediate = 3000;
|
||||
private static double distanceThresholdToIntermediate = 25;
|
||||
private static double DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS = 50;
|
||||
// could not be null and immodifiable!
|
||||
private final List<Location> locations;
|
||||
private final List<RouteDirectionInfo> directions;
|
||||
|
@ -696,22 +697,9 @@ public class RouteCalculationResult {
|
|||
private static void introduceFirstPointAndLastPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, Location start, LatLon end,
|
||||
OsmandApplication ctx) {
|
||||
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > 50) {
|
||||
// add start point
|
||||
locations.add(0, start);
|
||||
if(segs != null) {
|
||||
segs.add(0, segs.get(0));
|
||||
}
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
for (RouteDirectionInfo i : directions) {
|
||||
i.routePointOffset++;
|
||||
}
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(directions.get(0).getAverageSpeed(),
|
||||
TurnType.straight());
|
||||
info.routePointOffset = 0;
|
||||
// info.setDescriptionRoute(ctx.getString( R.string.route_head));//; //$NON-NLS-1$
|
||||
directions.add(0, info);
|
||||
}
|
||||
boolean firstPointIntroduced = introduceFirstPoint(locations, directions, segs, start);
|
||||
boolean lastPointIntroduced = introduceLastPoint(locations, directions, segs, end);
|
||||
if (firstPointIntroduced || lastPointIntroduced) {
|
||||
checkForDuplicatePoints(locations, directions);
|
||||
}
|
||||
RouteDirectionInfo lastDirInf = directions.size() > 0 ? directions.get(directions.size() - 1) : null;
|
||||
|
@ -746,6 +734,70 @@ public class RouteCalculationResult {
|
|||
}
|
||||
}
|
||||
|
||||
private static boolean introduceFirstPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, Location start) {
|
||||
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) {
|
||||
// add start point
|
||||
locations.add(0, start);
|
||||
if (segs != null) {
|
||||
segs.add(0, segs.get(0));
|
||||
}
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
for (RouteDirectionInfo i : directions) {
|
||||
i.routePointOffset++;
|
||||
}
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(directions.get(0).getAverageSpeed(), TurnType.straight());
|
||||
info.routePointOffset = 0;
|
||||
// info.setDescriptionRoute(ctx.getString( R.string.route_head));//; //$NON-NLS-1$
|
||||
directions.add(0, info);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean introduceLastPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, LatLon end) {
|
||||
if (!locations.isEmpty()) {
|
||||
Location lastFoundLocation = locations.get(locations.size() - 1);
|
||||
|
||||
Location endLocation = new Location(lastFoundLocation.getProvider());
|
||||
endLocation.setLatitude(end.getLatitude());
|
||||
endLocation.setLongitude(end.getLongitude());
|
||||
|
||||
if (lastFoundLocation.distanceTo(endLocation) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) {
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
if (locations.size() > 2) {
|
||||
int type = TurnType.C;
|
||||
Location prevLast = locations.get(locations.size() - 2);
|
||||
float lastBearing = prevLast.bearingTo(lastFoundLocation);
|
||||
float bearingToEnd = lastFoundLocation.bearingTo(endLocation);
|
||||
double diff = MapUtils.degreesDiff(lastBearing, bearingToEnd);
|
||||
if (Math.abs(diff) > 10) {
|
||||
if (Math.abs(diff) < 60) {
|
||||
type = diff > 0 ? TurnType.TSLL : TurnType.TSLR;
|
||||
} else {
|
||||
type = diff > 0 ? TurnType.TL : TurnType.TR;
|
||||
}
|
||||
}
|
||||
|
||||
RouteDirectionInfo lastDirInf = directions.get(directions.size() - 1);
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(lastDirInf != null ? lastDirInf.getAverageSpeed() : 1, TurnType.valueOf(type, false));
|
||||
info.routePointOffset = locations.size() - 1;
|
||||
directions.add(info);
|
||||
}
|
||||
}
|
||||
// add end point
|
||||
locations.add(endLocation);
|
||||
if (segs != null) {
|
||||
segs.add(segs.get(segs.size() - 1));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* PREPARATION
|
||||
* At the end always update listDistance local vars and time
|
||||
|
|
|
@ -96,6 +96,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
private View saveButton;
|
||||
|
||||
private boolean isBaseProfileImported;
|
||||
private boolean isNewProfile;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -118,7 +119,6 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
profile.routeService = baseModeForNewProfile.getRouteService();
|
||||
profile.locationIcon = baseModeForNewProfile.getLocationIcon();
|
||||
profile.navigationIcon = baseModeForNewProfile.getNavigationIcon();
|
||||
onAppModeChanged(ApplicationMode.valueOfStringKey(baseModeForNewProfile.getStringKey(), null));
|
||||
} else {
|
||||
profile.stringKey = getSelectedAppMode().getStringKey();
|
||||
profile.parent = getSelectedAppMode().getParent();
|
||||
|
@ -148,6 +148,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
changedProfile.locationIcon = profile.locationIcon;
|
||||
changedProfile.navigationIcon = profile.navigationIcon;
|
||||
}
|
||||
isNewProfile = ApplicationMode.valueOfStringKey(changedProfile.stringKey, null) == null;
|
||||
}
|
||||
|
||||
private String createNonDuplicateName(String oldName) {
|
||||
|
@ -189,7 +190,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
findPreference(SELECT_ICON).setIconSpaceReserved(false);
|
||||
findPreference(SELECT_LOCATION_ICON).setIconSpaceReserved(false);
|
||||
findPreference(SELECT_NAV_ICON).setIconSpaceReserved(false);
|
||||
if (getSelectedAppMode().equals(ApplicationMode.DEFAULT)) {
|
||||
if (getSelectedAppMode().equals(ApplicationMode.DEFAULT) && !isNewProfile) {
|
||||
findPreference(SELECT_ICON).setVisible(false);
|
||||
findPreference(ICON_ITEMS).setVisible(false);
|
||||
}
|
||||
|
@ -228,10 +229,9 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
if (getActivity() != null) {
|
||||
hideKeyboard();
|
||||
if (isChanged()) {
|
||||
boolean isNew = ApplicationMode.valueOfStringKey(changedProfile.stringKey, null) == null;
|
||||
if (saveProfile(isNew)) {
|
||||
if (saveProfile()) {
|
||||
profile = changedProfile;
|
||||
if (isNew) {
|
||||
if (isNewProfile) {
|
||||
ProfileAppearanceFragment.this.dismiss();
|
||||
BaseSettingsFragment.showInstance(getMapActivity(), SettingsScreenType.CONFIGURE_PROFILE,
|
||||
ApplicationMode.valueOfStringKey(changedProfile.stringKey, null));
|
||||
|
@ -645,7 +645,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean saveProfile(boolean isNew) {
|
||||
private boolean saveProfile() {
|
||||
if (changedProfile.name.replace(" ", "").length() < 1) {
|
||||
if (getActivity() != null) {
|
||||
createWarningDialog(getActivity(),
|
||||
|
@ -653,7 +653,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
if (isNew) {
|
||||
if (isNewProfile) {
|
||||
ApplicationMode.ApplicationModeBuilder builder = ApplicationMode
|
||||
.createCustomMode(changedProfile.parent, changedProfile.stringKey, app)
|
||||
.setIconResName(ProfileIcons.getResStringByResId(changedProfile.iconRes))
|
||||
|
|
Loading…
Reference in a new issue