Remove plugins items after disabling plugin

This commit is contained in:
Vitaliy 2020-03-25 11:50:31 +02:00
parent 24d026781b
commit 2f98f7c475
2 changed files with 140 additions and 64 deletions

View file

@ -6,13 +6,26 @@ import android.content.res.Configuration;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.plus.SettingsHelper.AvoidRoadsSettingsItem;
import net.osmand.plus.SettingsHelper.MapSourcesSettingsItem;
import net.osmand.plus.SettingsHelper.PoiUiFilterSettingsItem;
import net.osmand.plus.SettingsHelper.QuickActionsSettingsItem;
import net.osmand.plus.SettingsHelper.SettingsCollectListener;
import net.osmand.plus.SettingsHelper.SettingsItem;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@ -52,12 +65,89 @@ public class CustomOsmandPlugin extends OsmandPlugin {
@Override
public boolean init(@NonNull OsmandApplication app, @Nullable Activity activity) {
return super.init(app, activity);
super.init(app, activity);
if (activity != null) {
// called from UI
File pluginItemsFile = getPluginItemsFile();
if (pluginItemsFile.exists()) {
addPluginItemsFromFile(pluginItemsFile);
}
}
return true;
}
private void addPluginItemsFromFile(final File file) {
app.getSettingsHelper().collectSettings(file, "", 1, new SettingsCollectListener() {
@Override
public void onSettingsCollectFinished(boolean succeed, boolean empty, @NonNull List<SettingsItem> items) {
if (succeed && !items.isEmpty()) {
}
}
});
}
private void removePluginItemsFromFile(final File file) {
app.getSettingsHelper().collectSettings(file, "", 1, new SettingsCollectListener() {
@Override
public void onSettingsCollectFinished(boolean succeed, boolean empty, @NonNull List<SettingsItem> items) {
if (succeed && !items.isEmpty()) {
for (SettingsItem item : items) {
if (item instanceof QuickActionsSettingsItem) {
QuickActionsSettingsItem quickActionsSettingsItem = (QuickActionsSettingsItem) item;
List<QuickAction> quickActions = quickActionsSettingsItem.getItems();
for (QuickAction action : quickActions) {
QuickAction savedAction = app.getQuickActionRegistry().getQuickAction(app, action.getType(), action.getName(app), action.getParams());
if (savedAction != null) {
app.getQuickActionRegistry().deleteQuickAction(savedAction);
}
}
}
if (item instanceof MapSourcesSettingsItem) {
MapSourcesSettingsItem mapSourcesSettingsItem = (MapSourcesSettingsItem) item;
List<ITileSource> mapSources = mapSourcesSettingsItem.getItems();
for (ITileSource tileSource : mapSources) {
if (tileSource instanceof TileSourceManager.TileSourceTemplate) {
// app.getSettings().installTileSource((TileSourceManager.TileSourceTemplate) tileSource);
} else if (tileSource instanceof SQLiteTileSource) {
// ((SQLiteTileSource) tileSource).createDataBase();
}
}
}
if (item instanceof PoiUiFilterSettingsItem) {
PoiUiFilterSettingsItem poiUiFilterSettingsItem = (PoiUiFilterSettingsItem) item;
List<PoiUIFilter> poiUIFilters = poiUiFilterSettingsItem.getItems();
for (PoiUIFilter filter : poiUIFilters) {
app.getPoiFilters().removePoiFilter(filter);
}
app.getSearchUICore().refreshCustomPoiFilters();
}
if (item instanceof AvoidRoadsSettingsItem) {
AvoidRoadsSettingsItem avoidRoadsSettingsItem = (AvoidRoadsSettingsItem) item;
List<AvoidSpecificRoads.AvoidRoadInfo> avoidRoadInfos = avoidRoadsSettingsItem.getItems();
for (AvoidSpecificRoads.AvoidRoadInfo avoidRoad : avoidRoadInfos) {
app.getAvoidSpecificRoads().removeImpassableRoad(avoidRoad);
}
}
}
}
}
});
}
@Override
public void disable(OsmandApplication app) {
super.disable(app);
File pluginItemsFile = getPluginItemsFile();
if (pluginItemsFile.exists()) {
removePluginItemsFromFile(pluginItemsFile);
}
}
private File getPluginItemsFile() {
File pluginDir = new File(app.getAppPath(null), IndexConstants.PLUGINS_DIR + pluginId);
return new File(pluginDir, "items" + IndexConstants.OSMAND_SETTINGS_FILE_EXT);
}
@Override

View file

@ -1241,28 +1241,33 @@ public class SettingsHelper {
@Override
public void apply() {
if (!items.isEmpty() || !duplicateItems.isEmpty()) {
List<QuickAction> newActions = new ArrayList<>(existingItems);
if (!duplicateItems.isEmpty()) {
if (shouldReplace) {
for (QuickAction duplicateItem : duplicateItems) {
for (QuickAction savedAction : existingItems) {
if (duplicateItem.getName(app).equals(savedAction.getName(app))) {
newActions.remove(savedAction);
}
}
}
} else {
for (QuickAction duplicateItem : duplicateItems) {
renameItem(duplicateItem);
}
}
newActions.addAll(duplicateItems);
}
newActions.addAll(items);
List<QuickAction> newActions = getNewActions();
actionRegistry.updateQuickActions(newActions);
}
}
private List<QuickAction> getNewActions() {
List<QuickAction> newActions = new ArrayList<>(existingItems);
if (!duplicateItems.isEmpty()) {
if (shouldReplace) {
for (QuickAction duplicateItem : duplicateItems) {
for (QuickAction savedAction : existingItems) {
if (duplicateItem.getName(app).equals(savedAction.getName(app))) {
newActions.remove(savedAction);
}
}
}
} else {
for (QuickAction duplicateItem : duplicateItems) {
renameItem(duplicateItem);
}
}
newActions.addAll(duplicateItems);
}
newActions.addAll(items);
return newActions;
}
@Override
public boolean shouldReadOnCollecting() {
return true;
@ -1325,9 +1330,10 @@ public class SettingsHelper {
Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, String>>() {
}.getType();
if (!items.isEmpty()) {
if (!items.isEmpty() || !duplicateItems.isEmpty()) {
List<QuickAction> newActions = getNewActions();
try {
for (QuickAction action : items) {
for (QuickAction action : newActions) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", action.hasCustomName(app)
? action.getName(app) : "");
@ -1966,10 +1972,10 @@ public class SettingsHelper {
private Map<String, SettingsItem> items;
private Map<String, String> additionalParams;
private boolean onlyJson;
private boolean exportItemsFiles;
SettingsExporter(boolean onlyJson) {
this.onlyJson = onlyJson;
SettingsExporter(boolean exportItemsFiles) {
this.exportItemsFiles = exportItemsFiles;
items = new LinkedHashMap<>();
additionalParams = new LinkedHashMap<>();
}
@ -1987,25 +1993,6 @@ public class SettingsHelper {
void exportSettings(File file) throws JSONException, IOException {
JSONObject json = createItemsJson();
if (onlyJson) {
saveJsonItems(file, json);
} else {
saveZipItems(file, json);
}
}
private void saveJsonItems(File file, JSONObject json) throws JSONException, IOException {
InputStream inputStream = new ByteArrayInputStream(json.toString(2).getBytes("UTF-8"));
OutputStream os = new BufferedOutputStream(new FileOutputStream(file), BUFFER);
try {
Algorithms.streamCopy(inputStream, os);
} finally {
Algorithms.closeStream(inputStream);
Algorithms.closeStream(os);
}
}
private void saveZipItems(File file, JSONObject json) throws JSONException, IOException {
OutputStream os = new BufferedOutputStream(new FileOutputStream(file), BUFFER);
ZipOutputStream zos = new ZipOutputStream(os);
try {
@ -2013,14 +2000,8 @@ public class SettingsHelper {
zos.putNextEntry(entry);
zos.write(json.toString(2).getBytes("UTF-8"));
zos.closeEntry();
for (SettingsItem item : items.values()) {
SettingsItemWriter writer = item.getWriter();
if (writer != null) {
entry = new ZipEntry(item.getFileName());
zos.putNextEntry(entry);
writer.writeToStream(zos);
zos.closeEntry();
}
if (exportItemsFiles) {
writeItemFiles(zos);
}
zos.flush();
zos.finish();
@ -2030,6 +2011,18 @@ public class SettingsHelper {
}
}
private void writeItemFiles(ZipOutputStream zos) throws IOException {
for (SettingsItem item : items.values()) {
ZipEntry entry = new ZipEntry(item.getFileName());
zos.putNextEntry(entry);
SettingsItemWriter itemWriter = item.getWriter();
if (itemWriter != null) {
itemWriter.writeToStream(zos);
}
zos.closeEntry();
}
}
private JSONObject createItemsJson() throws JSONException {
JSONObject json = new JSONObject();
json.put("version", VERSION);
@ -2387,10 +2380,10 @@ public class SettingsHelper {
ExportAsyncTask(@NonNull File settingsFile,
@Nullable SettingsExportListener listener,
@NonNull List<SettingsItem> items, boolean onlyJson) {
@NonNull List<SettingsItem> items, boolean exportItemsFiles) {
this.file = settingsFile;
this.listener = listener;
this.exporter = new SettingsExporter(onlyJson);
this.exporter = new SettingsExporter(exportItemsFiles);
for (SettingsItem item : items) {
exporter.addSettingsItem(item);
}
@ -2431,23 +2424,16 @@ public class SettingsHelper {
new ImportAsyncTask(settingsFile, items, latestChanges, version, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void exportSettings(@NonNull File fileDir, @NonNull String fileName, @Nullable SettingsExportListener listener, @NonNull List<SettingsItem> items) {
public void exportSettings(@NonNull File fileDir, @NonNull String fileName, @Nullable SettingsExportListener listener, @NonNull List<SettingsItem> items, boolean exportItemsFiles) {
File file = new File(fileDir, fileName + OSMAND_SETTINGS_FILE_EXT);
ExportAsyncTask exportAsyncTask = new ExportAsyncTask(file, listener, items, false);
exportAsyncTasks.put(file, exportAsyncTask);
exportAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void exportPluginItems(@NonNull File pluginDir, @Nullable SettingsExportListener listener, @NonNull List<SettingsItem> items) {
File file = new File(pluginDir, "items.json");
ExportAsyncTask exportAsyncTask = new ExportAsyncTask(file, listener, items, true);
ExportAsyncTask exportAsyncTask = new ExportAsyncTask(file, listener, items, exportItemsFiles);
exportAsyncTasks.put(file, exportAsyncTask);
exportAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void exportSettings(@NonNull File fileDir, @NonNull String fileName, @Nullable SettingsExportListener listener,
@NonNull SettingsItem... items) {
exportSettings(fileDir, fileName, listener, new ArrayList<>(Arrays.asList(items)));
boolean exportItemsFiles, @NonNull SettingsItem... items) {
exportSettings(fileDir, fileName, listener, new ArrayList<>(Arrays.asList(items)), exportItemsFiles);
}
public enum ImportType {