Merge branch 'sasha_pasha_branch' of ssh://github.com/osmandapp/Osmand into sasha_pasha_branch

This commit is contained in:
PavelRatushny 2017-09-12 18:44:07 +03:00
commit 17c0c62b2a
6 changed files with 108 additions and 115 deletions

View file

@ -1,6 +1,7 @@
package net.osmand.plus; package net.osmand.plus;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.format.DateFormat; import android.text.format.DateFormat;
@ -50,7 +51,7 @@ public class MapMarkersHelper {
public long creationDate; public long creationDate;
public long visitedDate; public long visitedDate;
public String nextKey; public String nextKey;
public long groupKey = -1; public String groupKey;
public String groupName; public String groupName;
public MapMarker(LatLon point, PointDescription name, int colorIndex, public MapMarker(LatLon point, PointDescription name, int colorIndex,
@ -154,6 +155,34 @@ public class MapMarkersHelper {
} }
} }
public static class MarkersSyncGroup {
public static final int FAVORITES_TYPE = 0;
public static final int GPX_TYPE = 1;
private String id;
private String name;
private int type;
public MarkersSyncGroup(@NonNull String id, @NonNull String name, int type) {
this.id = id;
this.name = name;
this.type = type;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public int getType() {
return type;
}
}
public MapMarkersHelper(OsmandApplication ctx) { public MapMarkersHelper(OsmandApplication ctx) {
this.ctx = ctx; this.ctx = ctx;
settings = ctx.getSettings(); settings = ctx.getSettings();
@ -186,6 +215,7 @@ public class MapMarkersHelper {
List<MapMarker> activeMarkers = markersDbHelper.getActiveMarkers(); List<MapMarker> activeMarkers = markersDbHelper.getActiveMarkers();
mapMarkers.addAll(activeMarkers); mapMarkers.addAll(activeMarkers);
checkAndFixActiveMarkersOrderIfNeeded();
List<MapMarker> markersHistory = markersDbHelper.getMarkersHistory(); List<MapMarker> markersHistory = markersDbHelper.getMarkersHistory();
sortMarkers(markersHistory, true); sortMarkers(markersHistory, true);
@ -253,19 +283,8 @@ public class MapMarkersHelper {
} }
} }
public long getGroupId(String name) { public void syncGroup(MarkersSyncGroup group) {
return markersDbHelper.getGroupId(name);
}
// public void removeMarker(double lat, double lon, long groupId) {
// markersDbHelper.removeMarker(lat, lon, groupId);
// loadMarkers();
// refresh();
// }
@Nullable
public String getGroupName(long id) {
return markersDbHelper.getGroupName(id);
} }
public void moveMapMarkerToHistory(MapMarker marker) { public void moveMapMarkerToHistory(MapMarker marker) {
@ -384,15 +403,15 @@ public class MapMarkersHelper {
addMarkers(Collections.singletonList(point), Collections.singletonList(historyName), null); addMarkers(Collections.singletonList(point), Collections.singletonList(historyName), null);
} }
public void addMapMarkers(List<LatLon> points, List<PointDescription> historyNames, List<String> groups) { public void addMapMarkers(List<LatLon> points, List<PointDescription> historyNames, @Nullable MarkersSyncGroup group) {
addMarkers(points, historyNames, groups); addMarkers(points, historyNames, group);
} }
public void addMapMarkers(List<LatLon> points, List<PointDescription> historyNames) { public void addMapMarkers(List<LatLon> points, List<PointDescription> historyNames) {
addMarkers(points, historyNames, null); addMarkers(points, historyNames, null);
} }
private void addMarkers(List<LatLon> points, List<PointDescription> historyNames, @Nullable List<String> groups) { private void addMarkers(List<LatLon> points, List<PointDescription> historyNames, @Nullable MarkersSyncGroup group) {
if (points.size() > 0) { if (points.size() > 0) {
int colorIndex = -1; int colorIndex = -1;
for (int i = 0; i < points.size(); i++) { for (int i = 0; i < points.size(); i++) {
@ -418,8 +437,12 @@ public class MapMarkersHelper {
} }
MapMarker marker = new MapMarker(point, pointDescription, colorIndex, false, 0); MapMarker marker = new MapMarker(point, pointDescription, colorIndex, false, 0);
if (groups != null) { if (group != null) {
marker.groupKey = markersDbHelper.createGroupIfNeeded(groups.get(i)); if (markersDbHelper.getGroup(group.getId()) == null) {
markersDbHelper.addGroup(group.getId(), group.getName(), group.getType());
}
marker.id = group.getId() + marker.getName(ctx);
marker.groupName = group.getName();
} }
marker.history = false; marker.history = false;
marker.nextKey = MapMarkersDbHelper.TAIL_NEXT_VALUE; marker.nextKey = MapMarkersDbHelper.TAIL_NEXT_VALUE;

View file

@ -30,6 +30,7 @@ import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.IconsCache; import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MarkersSyncGroup;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.base.BottomSheetDialogFragment; import net.osmand.plus.base.BottomSheetDialogFragment;
@ -188,7 +189,7 @@ public class EditFavoriteGroupDialogFragment extends BottomSheetDialogFragment {
points.add(new LatLon(fp.getLatitude(), fp.getLongitude())); points.add(new LatLon(fp.getLatitude(), fp.getLongitude()));
names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, fp.getName())); names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, fp.getName()));
} }
markersHelper.addMapMarkers(points, names); markersHelper.addMapMarkers(points, names, new MarkersSyncGroup(group.name, group.name, MarkersSyncGroup.FAVORITES_TYPE));
dismiss(); dismiss();
MapActivity.launchMapActivityMoveToTop(getActivity()); MapActivity.launchMapActivityMoveToTop(getActivity());
} }

View file

@ -36,6 +36,7 @@ import net.osmand.data.PointDescription;
import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MarkersSyncGroup;
import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
@ -57,6 +58,7 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -401,18 +403,22 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment {
if (getSelectedFavoritesCount() > 0) { if (getSelectedFavoritesCount() > 0) {
if (getSettings().USE_MAP_MARKERS.get()) { if (getSettings().USE_MAP_MARKERS.get()) {
MapMarkersHelper markersHelper = getMyApplication().getMapMarkersHelper(); MapMarkersHelper markersHelper = getMyApplication().getMapMarkersHelper();
int size = getSelectedFavoritesCount(); List<LatLon> points = new LinkedList<>();
List<LatLon> points = new ArrayList<>(size); List<PointDescription> names = new LinkedList<>();
List<PointDescription> names = new ArrayList<>(size);
List<String> groups = new ArrayList<>(size);
for (Map.Entry<String, Set<FavouritePoint>> entry : favoritesSelected.entrySet()) { for (Map.Entry<String, Set<FavouritePoint>> entry : favoritesSelected.entrySet()) {
MarkersSyncGroup syncGr = null;
FavoriteGroup favGr = helper.getGroup(entry.getKey());
if (entry.getValue().size() == favGr.points.size()) {
syncGr = new MarkersSyncGroup(favGr.name, favGr.name, MarkersSyncGroup.FAVORITES_TYPE);
}
for (FavouritePoint fp : entry.getValue()) { for (FavouritePoint fp : entry.getValue()) {
points.add(new LatLon(fp.getLatitude(), fp.getLongitude())); points.add(new LatLon(fp.getLatitude(), fp.getLongitude()));
names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, fp.getName())); names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, fp.getName()));
groups.add(entry.getKey());
} }
markersHelper.addMapMarkers(points, names, syncGr);
points.clear();
names.clear();
} }
markersHelper.addMapMarkers(points, names, groups);
MapActivity.launchMapActivityMoveToTop(getActivity()); MapActivity.launchMapActivityMoveToTop(getActivity());
} else { } else {
final TargetPointsHelper targetPointsHelper = getMyApplication().getTargetPointsHelper(); final TargetPointsHelper targetPointsHelper = getMyApplication().getTargetPointsHelper();

View file

@ -5,6 +5,7 @@ import android.support.annotation.Nullable;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.MapMarkersHelper.MarkersSyncGroup;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
@ -20,7 +21,7 @@ import java.util.Random;
public class MapMarkersDbHelper { public class MapMarkersDbHelper {
private static final int DB_VERSION = 4; private static final int DB_VERSION = 6;
public static final String DB_NAME = "map_markers_db"; public static final String DB_NAME = "map_markers_db";
private static final String MARKERS_TABLE_NAME = "map_markers"; private static final String MARKERS_TABLE_NAME = "map_markers";
@ -46,7 +47,7 @@ public class MapMarkersDbHelper {
MARKERS_COL_ADDED + " long, " + MARKERS_COL_ADDED + " long, " +
MARKERS_COL_VISITED + " long, " + MARKERS_COL_VISITED + " long, " +
MARKERS_COL_GROUP_NAME + " TEXT, " + MARKERS_COL_GROUP_NAME + " TEXT, " +
MARKERS_COL_GROUP_KEY + " long, " + MARKERS_COL_GROUP_KEY + " TEXT, " +
MARKERS_COL_COLOR + " int, " + MARKERS_COL_COLOR + " int, " +
MARKERS_COL_NEXT_KEY + " TEXT);"; MARKERS_COL_NEXT_KEY + " TEXT);";
@ -67,15 +68,18 @@ public class MapMarkersDbHelper {
private static final String GROUPS_TABLE_NAME = "map_markers_groups"; private static final String GROUPS_TABLE_NAME = "map_markers_groups";
private static final String GROUPS_COL_ID = "group_id"; private static final String GROUPS_COL_ID = "group_id";
private static final String GROUPS_COL_NAME = "group_name"; private static final String GROUPS_COL_NAME = "group_name";
private static final String GROUPS_COL_TYPE = "group_type";
private static final String GROUPS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + private static final String GROUPS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
GROUPS_TABLE_NAME + " (" + GROUPS_TABLE_NAME + " (" +
GROUPS_COL_ID + " long PRIMARY KEY, " + GROUPS_COL_ID + " TEXT PRIMARY KEY, " +
GROUPS_COL_NAME + " TEXT);"; GROUPS_COL_NAME + " TEXT, " +
GROUPS_COL_TYPE + " int);";
private static final String GROUPS_TABLE_SELECT = "SELECT " + private static final String GROUPS_TABLE_SELECT = "SELECT " +
GROUPS_COL_ID + ", " + GROUPS_COL_ID + ", " +
GROUPS_COL_NAME + GROUPS_COL_NAME + ", " +
GROUPS_COL_TYPE +
" FROM " + GROUPS_TABLE_NAME; " FROM " + GROUPS_TABLE_NAME;
public static final String TAIL_NEXT_VALUE = "tail_next"; public static final String TAIL_NEXT_VALUE = "tail_next";
@ -149,18 +153,26 @@ public class MapMarkersDbHelper {
} }
} }
public long createGroupIfNeeded(String name) { public void addGroup(String id, String name, int type) {
long res = -1;
SQLiteConnection db = openConnection(false); SQLiteConnection db = openConnection(false);
if (db != null) { if (db != null) {
try { try {
SQLiteCursor query = db.rawQuery(GROUPS_TABLE_SELECT + " WHERE " + GROUPS_COL_NAME + " = ?", db.execSQL("INSERT INTO " + GROUPS_TABLE_NAME + " VALUES (?, ?, ?)", new Object[]{id, name, type});
new String[]{name}); } finally {
db.close();
}
}
}
@Nullable
public MarkersSyncGroup getGroup(String id) {
MarkersSyncGroup res = null;
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
SQLiteCursor query = db.rawQuery(GROUPS_TABLE_SELECT + " WHERE " + GROUPS_COL_ID + " = ?", new String[]{id});
if (query.moveToFirst()) { if (query.moveToFirst()) {
res = query.getLong(0); res = readSyncGroup(query);
} else {
res = Long.parseLong(String.valueOf(System.currentTimeMillis()) + String.valueOf(new Random().nextInt(900) + 100));
db.execSQL("INSERT INTO " + GROUPS_TABLE_NAME + " VALUES (?, ?)", new Object[]{res, name});
} }
query.close(); query.close();
} finally { } finally {
@ -170,6 +182,14 @@ public class MapMarkersDbHelper {
return res; return res;
} }
private MarkersSyncGroup readSyncGroup(SQLiteCursor query) {
String id = query.getString(0);
String name = query.getString(1);
int type = query.getInt(2);
return new MarkersSyncGroup(id, name, type);
}
public void addMarker(MapMarker marker) { public void addMarker(MapMarker marker) {
addMarker(marker, false); addMarker(marker, false);
} }
@ -194,7 +214,9 @@ public class MapMarkersDbHelper {
} else { } else {
currentTime = System.currentTimeMillis(); currentTime = System.currentTimeMillis();
} }
marker.id = String.valueOf(currentTime) + String.valueOf(new Random().nextInt(900) + 100); if (marker.id == null) {
marker.id = String.valueOf(currentTime) + String.valueOf(new Random().nextInt(900) + 100);
}
marker.creationDate = currentTime; marker.creationDate = currentTime;
String descr = PointDescription.serializeToString(marker.getOriginalPointDescription()); String descr = PointDescription.serializeToString(marker.getOriginalPointDescription());
int active = marker.history ? 0 : 1; int active = marker.history ? 0 : 1;
@ -217,45 +239,6 @@ public class MapMarkersDbHelper {
marker.history ? HISTORY_NEXT_VALUE : TAIL_NEXT_VALUE}); marker.history ? HISTORY_NEXT_VALUE : TAIL_NEXT_VALUE});
} }
public long getGroupId(String name) {
long res = -1;
if (name != null) {
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
SQLiteCursor query = db.rawQuery(GROUPS_TABLE_SELECT + " WHERE " + GROUPS_COL_NAME + " = ?",
new String[]{name});
if (query.moveToFirst()) {
res = query.getLong(0);
}
query.close();
} finally {
db.close();
}
}
}
return res;
}
@Nullable
public String getGroupName(long id) {
String res = null;
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
SQLiteCursor query = db.rawQuery(GROUPS_TABLE_SELECT + " WHERE " + GROUPS_COL_ID + " = ?",
new String[]{String.valueOf(id)});
if (query.moveToFirst()) {
res = query.getString(1);
}
query.close();
} finally {
db.close();
}
}
return res;
}
public List<MapMarker> getActiveMarkers() { public List<MapMarker> getActiveMarkers() {
List<MapMarker> res = new LinkedList<>(); List<MapMarker> res = new LinkedList<>();
HashMap<String, MapMarker> markers = new LinkedHashMap<>(); HashMap<String, MapMarker> markers = new LinkedHashMap<>();
@ -288,7 +271,7 @@ public class MapMarkersDbHelper {
long added = query.getLong(5); long added = query.getLong(5);
long visited = query.getLong(6); long visited = query.getLong(6);
String groupName = query.getString(7); String groupName = query.getString(7);
long groupKey = query.getLong(8); String groupKey = query.getString(8);
int colorIndex = query.getInt(9); int colorIndex = query.getInt(9);
String nextKey = query.getString(10); String nextKey = query.getString(10);
@ -308,12 +291,14 @@ public class MapMarkersDbHelper {
private void buildLinkedList(HashMap<String, MapMarker> markers, List<MapMarker> res) { private void buildLinkedList(HashMap<String, MapMarker> markers, List<MapMarker> res) {
if (!markers.isEmpty()) { if (!markers.isEmpty()) {
int count = 1;
for (MapMarker marker : markers.values()) { for (MapMarker marker : markers.values()) {
if (!markers.keySet().contains(marker.nextKey)) { if (!markers.keySet().contains(marker.nextKey) || count == markers.size()) {
res.add(0, marker); res.add(0, marker);
markers.remove(marker.id); markers.remove(marker.id);
break; break;
} }
count++;
} }
buildLinkedList(markers, res); buildLinkedList(markers, res);
} }
@ -349,38 +334,6 @@ public class MapMarkersDbHelper {
} }
} }
public void removeMarker(double lat, double lon, long groupId) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
MapMarker marker = null;
SQLiteCursor query = db.rawQuery(MARKERS_TABLE_SELECT + " WHERE " +
MARKERS_COL_LAT + " = ? AND " +
MARKERS_COL_LON + " = ? AND " +
MARKERS_COL_GROUP_KEY + " = ?",
new String[]{String.valueOf(lat), String.valueOf(lon), String.valueOf(groupId)});
if (query.moveToFirst()) {
marker = readItem(query);
}
query.close();
if (marker != null) {
if (marker.history) {
removeMarkerFromHistory(marker);
} else {
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{marker.nextKey, marker.id});
db.execSQL("DELETE FROM " + MARKERS_TABLE_NAME + " WHERE " + MARKERS_COL_ID + " = ?",
new Object[]{marker.id});
}
}
} finally {
db.close();
}
}
}
public void moveMarkerToHistory(MapMarker marker) { public void moveMarkerToHistory(MapMarker marker) {
SQLiteConnection db = openConnection(false); SQLiteConnection db = openConnection(false);
if (db != null) { if (db != null) {

View file

@ -110,8 +110,7 @@ public class MapMarkersActiveAdapter extends RecyclerView.Adapter<MapMarkerItemV
holder.title.setText(marker.getName(mapActivity)); holder.title.setText(marker.getName(mapActivity));
String descr; String descr;
if (marker.groupKey != -1 if ((descr = marker.groupName) != null) {
&& (descr = mapActivity.getMyApplication().getMapMarkersHelper().getGroupName(marker.groupKey)) != null) {
if (descr.equals("")) { if (descr.equals("")) {
descr = mapActivity.getString(R.string.shared_string_favorites); descr = mapActivity.getString(R.string.shared_string_favorites);
} }

View file

@ -44,6 +44,7 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.IconsCache; import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MarkersSyncGroup;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -607,7 +608,9 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, i.name)); names.add(new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, i.name));
} }
} }
markersHelper.addMapMarkers(points, names); File gpx = getGpxDataItem().getFile();
MarkersSyncGroup syncGroup = new MarkersSyncGroup(gpx.getAbsolutePath(), trimExtension(gpx.getName()), MarkersSyncGroup.GPX_TYPE);
markersHelper.addMapMarkers(points, names, syncGroup);
MapActivity.launchMapActivityMoveToTop(getActivity()); MapActivity.launchMapActivityMoveToTop(getActivity());
} else { } else {
final TargetPointsHelper targetPointsHelper = getMyApplication().getTargetPointsHelper(); final TargetPointsHelper targetPointsHelper = getMyApplication().getTargetPointsHelper();
@ -626,6 +629,14 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
} }
} }
private String trimExtension(String src) {
int index = src.lastIndexOf('.');
if (index != -1) {
return src.substring(0, index);
}
return src;
}
private void enterFavoritesMode() { private void enterFavoritesMode() {
actionMode = getActionBarActivity().startSupportActionMode(new ActionMode.Callback() { actionMode = getActionBarActivity().startSupportActionMode(new ActionMode.Callback() {