Save custom plugins third part

This commit is contained in:
Vitaliy 2020-03-18 15:44:58 +02:00
parent 9f351863a4
commit 1f10ea75de
4 changed files with 279 additions and 70 deletions

View file

@ -1,14 +1,21 @@
package net.osmand.plus; package net.osmand.plus;
import androidx.annotation.NonNull;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import net.osmand.PlatformUtil;
import net.osmand.map.ITileSource; import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiCategory;
import net.osmand.plus.helpers.AvoidSpecificRoads; import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickAction;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -18,9 +25,12 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map;
public class CustomOsmandPlugin extends OsmandPlugin { public class CustomOsmandPlugin extends OsmandPlugin {
private static final Log LOG = PlatformUtil.getLog(CustomOsmandPlugin.class);
public String pluginId; public String pluginId;
public String name; public String name;
public String description; public String description;
@ -33,8 +43,11 @@ public class CustomOsmandPlugin extends OsmandPlugin {
public List<ITileSource> mapSources = new ArrayList<>(); public List<ITileSource> mapSources = new ArrayList<>();
public List<AvoidSpecificRoads.AvoidRoadInfo> avoidRoadInfos = new ArrayList<>(); public List<AvoidSpecificRoads.AvoidRoadInfo> avoidRoadInfos = new ArrayList<>();
public CustomOsmandPlugin(OsmandApplication app) { public CustomOsmandPlugin(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app); super(app);
pluginId = json.getString("pluginId");
name = json.getString("name");
description = json.getString("Description");
} }
// Prepare ".opr" desert-package manually + add all resources inside (extend json to describe package). // Prepare ".opr" desert-package manually + add all resources inside (extend json to describe package).
@ -89,6 +102,47 @@ public class CustomOsmandPlugin extends OsmandPlugin {
return json.toString(); return json.toString();
} }
public void loadAdditionalItemsFromJson(JSONObject json) throws JSONException {
if (json.has("appModes")) {
String appModesStr = json.getString("appModes");
if (!Algorithms.isEmpty(appModesStr)) {
JSONArray appModesJson = new JSONArray(appModesStr);
for (int i = 0; i < appModesJson.length(); i++) {
String str = appModesJson.getString(i);
ApplicationMode mode = ApplicationMode.valueOfStringKey(str, null);
if (mode != null) {
appModes.add(mode);
}
}
}
}
if (json.has("rendererNames")) {
String rendererNamesStr = json.getString("rendererNames");
if (!Algorithms.isEmpty(rendererNamesStr)) {
JSONArray rendererNamesJson = new JSONArray(rendererNamesStr);
for (int i = 0; i < rendererNamesJson.length(); i++) {
String str = rendererNamesJson.getString(i);
rendererNames.add(str);
}
}
}
if (json.has("routerNames")) {
String routerNamesStr = json.getString("routerNames");
if (!Algorithms.isEmpty(routerNamesStr)) {
JSONArray routerNamesJson = new JSONArray(routerNamesStr);
for (int i = 0; i < routerNamesJson.length(); i++) {
String str = routerNamesJson.getString(i);
routerNames.add(str);
}
}
}
readPoiUIFiltersFromJson(json);
readMapSourcesFromJson(json);
readQuickActionsFromJson(json);
readAvoidRoadsFromJson(json);
}
public void saveAdditionalItemsToJson(JSONObject json) throws JSONException { public void saveAdditionalItemsToJson(JSONObject json) throws JSONException {
if (!appModes.isEmpty()) { if (!appModes.isEmpty()) {
List<String> appModesKeys = new ArrayList<>(); List<String> appModesKeys = new ArrayList<>();
@ -113,82 +167,248 @@ public class CustomOsmandPlugin extends OsmandPlugin {
saveAvoidRoadsToJson(json); saveAvoidRoadsToJson(json);
} }
private void savePoiUIFiltersToJson(JSONObject json) throws JSONException { private void savePoiUIFiltersToJson(JSONObject poiUIFiltersJson) throws JSONException {
if (!poiUIFilters.isEmpty()) { if (!poiUIFilters.isEmpty()) {
JSONObject json = new JSONObject();
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
Gson gson = new Gson(); Gson gson = new Gson();
Type type = new TypeToken<HashMap<PoiCategory, LinkedHashSet<String>>>() { Type type = new TypeToken<HashMap<PoiCategory, LinkedHashSet<String>>>() {
}.getType(); }.getType();
for (PoiUIFilter filter : poiUIFilters) { try {
JSONObject jsonObject = new JSONObject(); for (PoiUIFilter filter : poiUIFilters) {
jsonObject.put("name", filter.getName()); JSONObject jsonObject = new JSONObject();
jsonObject.put("filterId", filter.getFilterId()); jsonObject.put("name", filter.getName());
jsonObject.put("acceptedTypes", gson.toJson(filter.getAcceptedTypes(), type)); jsonObject.put("filterId", filter.getFilterId());
jsonArray.put(jsonObject); jsonObject.put("acceptedTypes", gson.toJson(filter.getAcceptedTypes(), type));
jsonArray.put(jsonObject);
}
json.put("items", jsonArray);
} catch (JSONException e) {
LOG.error("Failed write to json", e);
} }
json.put("poiUIFilters", jsonArray); poiUIFiltersJson.put("poiUIFilters", json);
} }
} }
private void saveMapSourcesToJson(JSONObject json) throws JSONException { private void saveMapSourcesToJson(JSONObject mapSourcesJson) throws JSONException {
if (!mapSources.isEmpty()) { if (!mapSources.isEmpty()) {
JSONObject json = new JSONObject();
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
for (ITileSource template : mapSources) { if (!mapSources.isEmpty()) {
JSONObject jsonObject = new JSONObject(); try {
boolean sql = template instanceof SQLiteTileSource; for (ITileSource template : mapSources) {
jsonObject.put("sql", sql); JSONObject jsonObject = new JSONObject();
jsonObject.put("name", template.getName()); boolean sql = template instanceof SQLiteTileSource;
jsonObject.put("minZoom", template.getMinimumZoomSupported()); jsonObject.put("sql", sql);
jsonObject.put("maxZoom", template.getMaximumZoomSupported()); jsonObject.put("name", template.getName());
jsonObject.put("url", template.getUrlTemplate()); jsonObject.put("minZoom", template.getMinimumZoomSupported());
jsonObject.put("randoms", template.getRandoms()); jsonObject.put("maxZoom", template.getMaximumZoomSupported());
jsonObject.put("ellipsoid", template.isEllipticYTile()); jsonObject.put("url", template.getUrlTemplate());
jsonObject.put("inverted_y", template.isInvertedYTile()); jsonObject.put("randoms", template.getRandoms());
jsonObject.put("referer", template.getReferer()); jsonObject.put("ellipsoid", template.isEllipticYTile());
jsonObject.put("timesupported", template.isTimeSupported()); jsonObject.put("inverted_y", template.isInvertedYTile());
jsonObject.put("expire", template.getExpirationTimeMillis()); jsonObject.put("referer", template.getReferer());
jsonObject.put("inversiveZoom", template.getInversiveZoom()); jsonObject.put("timesupported", template.isTimeSupported());
jsonObject.put("ext", template.getTileFormat()); jsonObject.put("expire", template.getExpirationTimeMillis());
jsonObject.put("tileSize", template.getTileSize()); jsonObject.put("inversiveZoom", template.getInversiveZoom());
jsonObject.put("bitDensity", template.getBitDensity()); jsonObject.put("ext", template.getTileFormat());
jsonObject.put("avgSize", template.getAvgSize()); jsonObject.put("tileSize", template.getTileSize());
jsonObject.put("rule", template.getRule()); jsonObject.put("bitDensity", template.getBitDensity());
jsonArray.put(jsonObject); jsonObject.put("avgSize", template.getAvgSize());
jsonObject.put("rule", template.getRule());
jsonArray.put(jsonObject);
}
json.put("items", jsonArray);
} catch (JSONException e) {
LOG.error("Failed write to json", e);
}
} }
json.put("mapSources", jsonArray); mapSourcesJson.put("mapSources", json);
} }
} }
private void saveAvoidRoadsToJson(JSONObject json) throws JSONException { private void saveAvoidRoadsToJson(JSONObject avoidRoadInfosJson) throws JSONException {
if (!avoidRoadInfos.isEmpty()) { if (!avoidRoadInfos.isEmpty()) {
JSONObject json = new JSONObject();
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
for (AvoidSpecificRoads.AvoidRoadInfo avoidRoad : avoidRoadInfos) { if (!avoidRoadInfos.isEmpty()) {
JSONObject jsonObject = new JSONObject(); try {
jsonObject.put("latitude", avoidRoad.latitude); for (AvoidSpecificRoads.AvoidRoadInfo avoidRoad : avoidRoadInfos) {
jsonObject.put("longitude", avoidRoad.longitude); JSONObject jsonObject = new JSONObject();
jsonObject.put("name", avoidRoad.name); jsonObject.put("latitude", avoidRoad.latitude);
jsonObject.put("appModeKey", avoidRoad.appModeKey); jsonObject.put("longitude", avoidRoad.longitude);
jsonArray.put(jsonObject); jsonObject.put("name", avoidRoad.name);
jsonObject.put("appModeKey", avoidRoad.appModeKey);
jsonArray.put(jsonObject);
}
json.put("items", jsonArray);
} catch (JSONException e) {
LOG.error("Failed write to json", e);
}
} }
json.put("avoidRoadInfos", jsonArray); avoidRoadInfosJson.put("avoidRoadInfos", json);
} }
} }
private void saveQuickActionsToJson(JSONObject json) throws JSONException { private void saveQuickActionsToJson(JSONObject quickActionsJson) throws JSONException {
if (!quickActions.isEmpty()) { if (!quickActions.isEmpty()) {
JSONObject json = new JSONObject();
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
Gson gson = new Gson(); Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, String>>() { Type type = new TypeToken<HashMap<String, String>>() {
}.getType(); }.getType();
if (!quickActions.isEmpty()) {
for (QuickAction action : quickActions) { try {
JSONObject jsonObject = new JSONObject(); for (QuickAction action : quickActions) {
jsonObject.put("name", action.hasCustomName(app) ? action.getName(app) : ""); JSONObject jsonObject = new JSONObject();
jsonObject.put("type", action.getType()); jsonObject.put("name", action.hasCustomName(app)
jsonObject.put("params", gson.toJson(action.getParams(), type)); ? action.getName(app) : "");
jsonArray.put(jsonObject); jsonObject.put("type", action.getType());
jsonObject.put("params", gson.toJson(action.getParams(), type));
jsonArray.put(jsonObject);
}
json.put("items", jsonArray);
} catch (JSONException e) {
LOG.error("Failed write to json", e);
}
}
quickActionsJson.put("quickActions", json);
}
}
private void readMapSourcesFromJson(JSONObject json) {
if (json.has("mapSources")) {
try {
String mapSourcesStr = json.getString("mapSources");
if (!Algorithms.isEmpty(mapSourcesStr)) {
json = new JSONObject(mapSourcesStr);
JSONArray jsonArray = json.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
boolean sql = object.optBoolean("sql");
String name = object.optString("name");
int minZoom = object.optInt("minZoom");
int maxZoom = object.optInt("maxZoom");
String url = object.optString("url");
String randoms = object.optString("randoms");
boolean ellipsoid = object.optBoolean("ellipsoid", false);
boolean invertedY = object.optBoolean("inverted_y", false);
String referer = object.optString("referer");
boolean timesupported = object.optBoolean("timesupported", false);
long expire = object.optLong("expire");
boolean inversiveZoom = object.optBoolean("inversiveZoom", false);
String ext = object.optString("ext");
int tileSize = object.optInt("tileSize");
int bitDensity = object.optInt("bitDensity");
int avgSize = object.optInt("avgSize");
String rule = object.optString("rule");
ITileSource template;
if (!sql) {
template = new TileSourceManager.TileSourceTemplate(name, url, ext, maxZoom, minZoom, tileSize, bitDensity, avgSize);
} else {
template = new SQLiteTileSource(app, name, minZoom, maxZoom, url, randoms, ellipsoid, invertedY, referer, timesupported, expire, inversiveZoom);
}
mapSources.add(template);
}
}
} catch (JSONException e) {
throw new IllegalArgumentException("Json parse error", e);
}
}
}
private void readQuickActionsFromJson(JSONObject json) {
if (json.has("quickActions")) {
try {
String quickActionsStr = json.getString("quickActions");
if (!Algorithms.isEmpty(quickActionsStr)) {
Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, String>>() {
}.getType();
JSONObject quickActionsJson = new JSONObject(quickActionsStr);
JSONArray itemsJson = quickActionsJson.getJSONArray("items");
for (int i = 0; i < itemsJson.length(); i++) {
JSONObject object = itemsJson.getJSONObject(i);
String name = object.getString("name");
int actionType = object.getInt("type");
String paramsString = object.getString("params");
HashMap<String, String> params = gson.fromJson(paramsString, type);
QuickAction quickAction = new QuickAction(actionType);
if (!name.isEmpty()) {
quickAction.setName(name);
}
quickAction.setParams(params);
quickActions.add(quickAction);
}
}
} catch (JSONException e) {
throw new IllegalArgumentException("Json parse error", e);
}
}
}
private void readAvoidRoadsFromJson(JSONObject json) {
if (json.has("avoidRoadInfos")) {
try {
String avoidRoadInfosStr = json.getString("avoidRoadInfos");
if (!Algorithms.isEmpty(avoidRoadInfosStr)) {
JSONObject avoidRoadInfosJson = new JSONObject(avoidRoadInfosStr);
JSONArray jsonArray = avoidRoadInfosJson.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
double latitude = object.optDouble("latitude");
double longitude = object.optDouble("longitude");
String name = object.optString("name");
String appModeKey = object.optString("appModeKey");
AvoidSpecificRoads.AvoidRoadInfo roadInfo = new AvoidSpecificRoads.AvoidRoadInfo();
roadInfo.id = 0;
roadInfo.latitude = latitude;
roadInfo.longitude = longitude;
roadInfo.name = name;
if (ApplicationMode.valueOfStringKey(appModeKey, null) != null) {
roadInfo.appModeKey = appModeKey;
} else {
roadInfo.appModeKey = app.getRoutingHelper().getAppMode().getStringKey();
}
avoidRoadInfos.add(roadInfo);
}
}
} catch (JSONException e) {
throw new IllegalArgumentException("Json parse error", e);
}
}
}
private void readPoiUIFiltersFromJson(JSONObject json) {
if (json.has("poiUIFilters")) {
try {
String poiUIFiltersStr = json.getString("poiUIFilters");
if (!Algorithms.isEmpty(poiUIFiltersStr)) {
JSONObject poiUIFiltersJson = new JSONObject(poiUIFiltersStr);
JSONArray jsonArray = poiUIFiltersJson.getJSONArray("items");
Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, LinkedHashSet<String>>>() {
}.getType();
MapPoiTypes poiTypes = app.getPoiTypes();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
String name = object.getString("name");
String filterId = object.getString("filterId");
String acceptedTypesString = object.getString("acceptedTypes");
HashMap<String, LinkedHashSet<String>> acceptedTypes = gson.fromJson(acceptedTypesString, type);
Map<PoiCategory, LinkedHashSet<String>> acceptedTypesDone = new HashMap<>();
for (Map.Entry<String, LinkedHashSet<String>> mapItem : acceptedTypes.entrySet()) {
final PoiCategory a = poiTypes.getPoiCategoryByName(mapItem.getKey());
acceptedTypesDone.put(a, mapItem.getValue());
}
PoiUIFilter filter = new PoiUIFilter(name, filterId, acceptedTypesDone, app);
poiUIFilters.add(filter);
}
}
} catch (JSONException e) {
throw new IllegalArgumentException("Json parse error", e);
} }
json.put("quickActions", jsonArray);
} }
} }

View file

@ -309,15 +309,8 @@ public abstract class OsmandPlugin {
JSONArray jArray = new JSONArray(customPluginsJson); JSONArray jArray = new JSONArray(customPluginsJson);
for (int i = 0; i < jArray.length(); i++) { for (int i = 0; i < jArray.length(); i++) {
JSONObject json = jArray.getJSONObject(i); JSONObject json = jArray.getJSONObject(i);
CustomOsmandPlugin plugin = new CustomOsmandPlugin(app, json);
String pluginId = json.getString("pluginId"); plugin.loadAdditionalItemsFromJson(json);
String name = json.getString("name");
String description = json.getString("Description");
CustomOsmandPlugin plugin = new CustomOsmandPlugin(app);
plugin.pluginId = pluginId;
plugin.name = name;
plugin.description = description;
allPlugins.add(plugin); allPlugins.add(plugin);
} }
} catch (JSONException e) { } catch (JSONException e) {
@ -334,13 +327,15 @@ public abstract class OsmandPlugin {
JSONArray itemsJson = new JSONArray(); JSONArray itemsJson = new JSONArray();
for (CustomOsmandPlugin plugin : customOsmandPlugins) { for (CustomOsmandPlugin plugin : customOsmandPlugins) {
try { try {
String json = plugin.toJson(); itemsJson.put(new JSONObject(plugin.toJson()));
itemsJson.put(new JSONObject(json));
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
settingsAPI.edit(pluginPrefs).putString(CUSTOM_PLUGINS_KEY, itemsJson.toString()).commit(); String jsonStr = itemsJson.toString();
if (!jsonStr.equals(settingsAPI.getString(pluginPrefs, CUSTOM_PLUGINS_KEY, ""))) {
settingsAPI.edit(pluginPrefs).putString(CUSTOM_PLUGINS_KEY, jsonStr).commit();
}
} }
} }

View file

@ -259,14 +259,7 @@ public class SettingsHelper {
} }
void readFromJson(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException { void readFromJson(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
String pluginId = json.getString("pluginId"); plugin = new CustomOsmandPlugin(app, json);
String name = json.getString("name");
String description = json.getString("Description");
plugin = new CustomOsmandPlugin(app);
plugin.pluginId = pluginId;
plugin.name = name;
plugin.description = description;
} }
@NonNull @NonNull

View file

@ -805,6 +805,7 @@ public class ImportHelper {
CustomOsmandPlugin plugin = pluginItem.getPlugin(); CustomOsmandPlugin plugin = pluginItem.getPlugin();
List<SettingsHelper.SettingsItem> pluginItems = pluginItem.getPluginItems(); List<SettingsHelper.SettingsItem> pluginItems = pluginItem.getPluginItems();
if (!Algorithms.isEmpty(pluginItems)) { if (!Algorithms.isEmpty(pluginItems)) {
pluginIndependentItems.removeAll(pluginItems);
for (SettingsHelper.SettingsItem item : pluginItems) { for (SettingsHelper.SettingsItem item : pluginItems) {
item.setShouldReplace(true); item.setShouldReplace(true);
if (item instanceof SettingsHelper.QuickActionSettingsItem) { if (item instanceof SettingsHelper.QuickActionSettingsItem) {