diff --git a/OsmAnd/src/net/osmand/plus/SettingsHelper.java b/OsmAnd/src/net/osmand/plus/SettingsHelper.java index d6a8450f91..ed525566e2 100644 --- a/OsmAnd/src/net/osmand/plus/SettingsHelper.java +++ b/OsmAnd/src/net/osmand/plus/SettingsHelper.java @@ -139,9 +139,9 @@ public class SettingsHelper { PLUGIN, DATA, FILE, - QUICK_ACTION_LIST, - POI_UI_FILTERS_LIST, - MAP_SOURCES_LIST, + QUICK_ACTION, + POI_UI_FILTERS, + MAP_SOURCES, } public abstract static class SettingsItem { @@ -171,6 +171,10 @@ public class SettingsHelper { @NonNull public abstract String getFileName(); + public Boolean shouldReadInCollecting() { + return false; + } + static SettingsItemType parseItemType(@NonNull JSONObject json) throws IllegalArgumentException, JSONException { return SettingsItemType.valueOf(json.getString("type")); } @@ -271,8 +275,6 @@ public class SettingsHelper { private OsmandSettings settings; - JSONObject json; - public OsmandSettingsItemReader(@NonNull OsmandSettingsItem item, @NonNull OsmandSettings settings) { super(item); this.settings = settings; @@ -297,33 +299,32 @@ public class SettingsHelper { if (Algorithms.isEmpty(jsonStr)) { throw new IllegalArgumentException("Cannot find json body"); } -// final JSONObject json; + final JSONObject json; try { json = new JSONObject(jsonStr); } catch (JSONException e) { throw new IllegalArgumentException("Json parse error", e); } -// settings.getContext().runInUIThread(new Runnable() { -// @Override -// public void run() { -// Map> prefs = settings.getRegisteredPreferences(); -// Iterator iter = json.keys(); -// while (iter.hasNext()) { -// String key = iter.next(); -// OsmandPreference p = prefs.get(key); -// if (p != null) { -// try { -// readPreferenceFromJson(p, json); -// } catch (Exception e) { -// LOG.error("Failed to read preference: " + key, e); -// } -// } else { -// LOG.warn("No preference while importing settings: " + key); -// } -// } -// } -// }); - + settings.getContext().runInUIThread(new Runnable() { + @Override + public void run() { + Map> prefs = settings.getRegisteredPreferences(); + Iterator iter = json.keys(); + while (iter.hasNext()) { + String key = iter.next(); + OsmandPreference p = prefs.get(key); + if (p != null) { + try { + readPreferenceFromJson(p, json); + } catch (Exception e) { + LOG.error("Failed to read preference: " + key, e); + } + } else { + LOG.warn("No preference while importing settings: " + key); + } + } + } + }); } } @@ -484,27 +485,6 @@ public class SettingsHelper { if (appMode.isCustomProfile()) { appMode = ApplicationMode.saveProfile(builder, getSettings().getContext()); } - - getSettings().getContext().runInUIThread(new Runnable() { - @Override - public void run() { - Map> prefs = getSettings().getRegisteredPreferences(); - Iterator iter = reader.json.keys(); - while (iter.hasNext()) { - String key = iter.next(); - OsmandPreference p = prefs.get(key); - if (p != null) { - try { - reader.readPreferenceFromJson(p, reader.json); - } catch (Exception e) { - LOG.error("Failed to read preference: " + key, e); - } - } else { - LOG.warn("No preference while importing settings: " + key); - } - } - } - }); } @Override @@ -513,20 +493,17 @@ public class SettingsHelper { json.put("appMode", new JSONObject(appMode.toJson())); } - - OsmandSettingsItemReader reader = new OsmandSettingsItemReader(this, getSettings()) { - @Override - protected void readPreferenceFromJson(@NonNull OsmandPreference preference, @NonNull JSONObject json) throws JSONException { - if (!appModeBeanPrefsIds.contains(preference.getId())) { - preference.readFromJson(json, appMode); - } - } - }; - @NonNull @Override SettingsItemReader getReader() { - return reader; + return new OsmandSettingsItemReader(this, getSettings()) { + @Override + protected void readPreferenceFromJson(@NonNull OsmandPreference preference, @NonNull JSONObject json) throws JSONException { + if (!appModeBeanPrefsIds.contains(preference.getId())) { + preference.readFromJson(json, appMode); + } + } + }; } @NonNull @@ -757,14 +734,14 @@ public class SettingsHelper { public QuickActionSettingsItem(@NonNull OsmandApplication app, @NonNull List quickActions) { - super(SettingsItemType.QUICK_ACTION_LIST, app.getSettings()); + super(SettingsItemType.QUICK_ACTION, app.getSettings()); this.app = app; this.quickActions = quickActions; } public QuickActionSettingsItem(@NonNull OsmandSettings settings, @NonNull JSONObject jsonObject) throws JSONException { - super(SettingsItemType.QUICK_ACTION_LIST, settings, jsonObject); + super(SettingsItemType.QUICK_ACTION, settings, jsonObject); } public List getQuickActions() { @@ -781,6 +758,11 @@ public class SettingsHelper { } } + @Override + public Boolean shouldReadInCollecting() { + return true; + } + @NonNull @Override public String getName() { @@ -874,13 +856,13 @@ public class SettingsHelper { private OsmandApplication app; public PoiUiFilterSettingsItem(OsmandApplication app, List poiUIFilters) { - super(SettingsItemType.POI_UI_FILTERS_LIST, app.getSettings()); + super(SettingsItemType.POI_UI_FILTERS, app.getSettings()); this.app = app; this.poiUIFilters = poiUIFilters; } public PoiUiFilterSettingsItem(OsmandApplication app, JSONObject jsonObject) throws JSONException { - super(SettingsItemType.POI_UI_FILTERS_LIST, app.getSettings(), jsonObject); + super(SettingsItemType.POI_UI_FILTERS, app.getSettings(), jsonObject); this.app = app; readFromJson(jsonObject); } @@ -897,6 +879,11 @@ public class SettingsHelper { return null; } + @Override + public Boolean shouldReadInCollecting() { + return true; + } + @NonNull @Override public String getFileName() { @@ -982,12 +969,12 @@ public class SettingsHelper { private List mapSources; public MapSourcesSettingsItem(OsmandSettings settings, List mapSources) { - super(SettingsItemType.MAP_SOURCES_LIST, settings); + super(SettingsItemType.MAP_SOURCES, settings); this.mapSources = mapSources; } public MapSourcesSettingsItem(OsmandSettings settings, JSONObject jsonObject) throws JSONException { - super(SettingsItemType.MAP_SOURCES_LIST, settings, jsonObject); + super(SettingsItemType.MAP_SOURCES, settings, jsonObject); } @NonNull @@ -1002,6 +989,11 @@ public class SettingsHelper { return null; } + @Override + public Boolean shouldReadInCollecting() { + return true; + } + @NonNull @Override public String getFileName() { @@ -1096,13 +1088,13 @@ public class SettingsHelper { case FILE: item = new FileSettingsItem(app, json); break; - case QUICK_ACTION_LIST: + case QUICK_ACTION: item = new QuickActionSettingsItem(settings, json); break; - case POI_UI_FILTERS_LIST: + case POI_UI_FILTERS: item = new PoiUiFilterSettingsItem(app, json); break; - case MAP_SOURCES_LIST: + case MAP_SOURCES: item = new MapSourcesSettingsItem(settings, json); break; } @@ -1181,15 +1173,14 @@ public class SettingsHelper { } private List processItems(@NonNull File file, @Nullable List items) throws IllegalArgumentException, IOException { -// boolean collecting = items == null; -// if (collecting) { -// items = new ArrayList<>(); -// } else { -// if (items.size() == 0) { -// throw new IllegalArgumentException("No items"); -// } -// } - items = new ArrayList<>(); + boolean collecting = items == null; + if (collecting) { + items = new ArrayList<>(); + } else { + if (items.size() == 0) { + throw new IllegalArgumentException("No items"); + } + } ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); InputStream ois = new BufferedInputStream(zis); try { @@ -1207,9 +1198,9 @@ public class SettingsHelper { SettingsItemsFactory itemsFactory; try { itemsFactory = new SettingsItemsFactory(app, itemsJson); -// if (collecting) { + if (collecting) { items.addAll(itemsFactory.getItems()); -// } + } } catch (IllegalArgumentException e) { LOG.error("Error parsing items: " + itemsJson, e); throw new IllegalArgumentException("No items"); @@ -1220,7 +1211,8 @@ public class SettingsHelper { while ((entry = zis.getNextEntry()) != null) { String fileName = entry.getName(); SettingsItem item = itemsFactory.getItemByFileName(fileName); - if (item != null) { + if (item != null && collecting && item.shouldReadInCollecting() + || item != null && !collecting && !item.shouldReadInCollecting()) { try { item.getReader().readFromStream(ois); } catch (IllegalArgumentException e) { @@ -1251,6 +1243,7 @@ public class SettingsHelper { private File file; private String latestChanges; private int version; + private Boolean isCollecting; private SettingsImportListener listener; private SettingsImporter importer; @@ -1265,6 +1258,17 @@ public class SettingsHelper { this.latestChanges = latestChanges; this.version = version; importer = new SettingsImporter(app); + isCollecting = true; + } + + ImportAsyncTask(@NonNull File settingsFile, @NonNull List items, String latestChanges, int version, @Nullable SettingsImportListener listener) { + this.file = settingsFile; + this.listener = listener; + this.items = items; + this.latestChanges = latestChanges; + this.version = version; + importer = new SettingsImporter(app); + isCollecting = false; } @Override @@ -1279,21 +1283,29 @@ public class SettingsHelper { @Override protected List doInBackground(Void... voids) { - try { - return importer.collectItems(file); - } catch (IllegalArgumentException e) { - LOG.error("Failed to collect items from: " + file.getName(), e); - } catch (IOException e) { - LOG.error("Failed to collect items from: " + file.getName(), e); + if (isCollecting) { + try { + return importer.collectItems(file); + } catch (IllegalArgumentException e) { + LOG.error("Failed to collect items from: " + file.getName(), e); + } catch (IOException e) { + LOG.error("Failed to collect items from: " + file.getName(), e); + } + } else { + return this.items; } return null; } @Override protected void onPostExecute(List items) { - this.items = items; - if (items != null && items.size() > 0) { - processNextItem(); + if (isCollecting) { + listener.onSettingsImportFinished(true, false, items); + } else { + this.items = items; + if (items != null && items.size() > 0) { + processNextItem(); + } } } @@ -1433,46 +1445,6 @@ public class SettingsHelper { } } - @SuppressLint("StaticFieldLeak") - public class PreImportAsyncTask extends AsyncTask> { - - private String latestChanges; - private int version; - private File file; - private SettingsPreImportListener listener; - private SettingsImporter importer; - - PreImportAsyncTask(@NonNull File file, String latestChanges, int version, SettingsPreImportListener listener) { - this.file = file; - this.listener = listener; - this.latestChanges = latestChanges; - this.version = version; - importer = new SettingsImporter(app); - } - - @Override - protected List doInBackground(Void... voids) { - try { - return importer.collectItems(file); - } catch (IllegalArgumentException e) { - LOG.error("Failed to collect items from: " + file.getName(), e); - } catch (IOException e) { - LOG.error("Failed to collect items from: " + file.getName(), e); - } - return null; - } - - @Override - protected void onPostExecute(List settingsItems) { - super.onPostExecute(settingsItems); - if (settingsItems != null && settingsItems.size() > 0) { - listener.onSettingsPreImported(true, settingsItems); - } else { - listener.onSettingsPreImported(false, settingsItems); - } - } - } - @SuppressLint("StaticFieldLeak") private class ExportAsyncTask extends AsyncTask { @@ -1516,6 +1488,10 @@ public class SettingsHelper { new ImportAsyncTask(settingsFile, latestChanges, version, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } + public void importSettings(@NonNull File settingsFile, @NonNull List items, String latestChanges, int version, @Nullable SettingsImportListener listener) { + 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 items) { @@ -1527,59 +1503,4 @@ public class SettingsHelper { @NonNull SettingsItem... items) { exportSettings(fileDir, fileName, listener, new ArrayList<>(Arrays.asList(items))); } - - public void preImportSettings(File file, String latestChanges, int version, SettingsPreImportListener listener) { - new PreImportAsyncTask(file, latestChanges, version, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - public void importSettingsItems(List list) { - for (SettingsItem item : list) { - if (item.exists()) { - switch (item.getType()) { - case PROFILE: { - String title = activity.getString(R.string.overwrite_profile_q, item.getPublicName(app)); - showConfirmDialog(item, title, ""); - break; - } - default: - item.apply(); - break; - } - } else { - if (item.getType() == SettingsItemType.PROFILE) { - String title = activity.getString(R.string.add_new_profile_q, item.getPublicName(app)); - showConfirmDialog(item, title, ""); - } else { - item.apply(); -// acceptItem(item); - } - } - } - } - - private AlertDialog showConfirmDialog(final SettingsItem item, String title, String message) { - AlertDialog.Builder b = new AlertDialog.Builder(activity); - b.setTitle(title); - b.setMessage(message); - b.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - item.apply(); - } - }); - b.setNegativeButton(R.string.shared_string_no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - } - }); - b.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - - } - }); - b.setCancelable(false); - return b.show(); - } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java b/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java index c82053bcae..5158597ca0 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java @@ -776,18 +776,19 @@ public class ImportHelper { File tempDir = app.getAppPath(IndexConstants.TEMP_DIR); final File file = new File(tempDir, name); if (error == null && file.exists()) { - app.getSettingsHelper().preImportSettings(file, latestChanges, version, new SettingsHelper.SettingsPreImportListener() { + app.getSettingsHelper().importSettings(file, latestChanges, version, new SettingsImportListener() { @Override - public void onSettingsPreImported(boolean isSuccessful, List items) { + public void onSettingsImportFinished(boolean succeed, boolean empty, @NonNull List items) { if (isActivityNotDestroyed(activity)) { progress.dismiss(); } - if (isSuccessful) { + if (succeed) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); if (fragmentManager != null) { ExportImportProfileBottomSheet.showInstance( fragmentManager, ExportImportProfileBottomSheet.State.IMPORT, + file, items); } } else { diff --git a/OsmAnd/src/net/osmand/plus/profiles/ExportImportProfileBottomSheet.java b/OsmAnd/src/net/osmand/plus/profiles/ExportImportProfileBottomSheet.java index 0527197799..3225160a66 100644 --- a/OsmAnd/src/net/osmand/plus/profiles/ExportImportProfileBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/profiles/ExportImportProfileBottomSheet.java @@ -87,6 +87,8 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { private SettingsHelper.ProfileSettingsItem profileSettingsItem; + private File file; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -191,11 +193,11 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { List poiUIFilters = new ArrayList<>(); List mapSourceWrappers = new ArrayList<>(); for (SettingsHelper.SettingsItem item : settingsItems) { - if (item.getType().equals(SettingsHelper.SettingsItemType.QUICK_ACTION_LIST)) { + if (item.getType().equals(SettingsHelper.SettingsItemType.QUICK_ACTION)) { quickActions.addAll(((SettingsHelper.QuickActionSettingsItem) item).getQuickActions()); - } else if (item.getType().equals(SettingsHelper.SettingsItemType.POI_UI_FILTERS_LIST)) { + } else if (item.getType().equals(SettingsHelper.SettingsItemType.POI_UI_FILTERS)) { // poiUIFilters.addAll(((SettingsHelper.PoiUiFilterSettingsItem) item).) - } else if (item.getType().equals(SettingsHelper.SettingsItemType.MAP_SOURCES_LIST)) { + } else if (item.getType().equals(SettingsHelper.SettingsItemType.MAP_SOURCES)) { // mapSourceWrappers.addAll(((SettingsHelper.MapSourcesSettingsItem) item).) } } @@ -219,21 +221,14 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { dataToOperate.addAll(dataWrapper.getItems()); } adapter.updateList(dataList); - -// app.getSettingsHelper().importSettings(settingsItems, file, new SettingsHelper.SettingsImportListener() { -// @Override -// public void onSettingsImportFinished(boolean succeed, boolean empty, @NonNull List items) { -// -// } -// }); } private Boolean checkAdditionalDataContains() { boolean containsData = false; for (SettingsHelper.SettingsItem item : settingsItems) { - containsData = item.getType().equals(SettingsHelper.SettingsItemType.QUICK_ACTION_LIST) - || item.getType().equals(SettingsHelper.SettingsItemType.POI_UI_FILTERS_LIST) - || item.getType().equals(SettingsHelper.SettingsItemType.MAP_SOURCES_LIST); + containsData = item.getType().equals(SettingsHelper.SettingsItemType.QUICK_ACTION) + || item.getType().equals(SettingsHelper.SettingsItemType.POI_UI_FILTERS) + || item.getType().equals(SettingsHelper.SettingsItemType.MAP_SOURCES); if (containsData) { break; } @@ -299,7 +294,12 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { if (includeAdditionalData) { list.addAll(prepareAdditionalSettingsItems()); } - app.getSettingsHelper().importSettingsItems(list); + app.getSettingsHelper().importSettings(file, list, "", 1, new SettingsHelper.SettingsImportListener() { + @Override + public void onSettingsImportFinished(boolean succeed, boolean empty, @NonNull List items) { + + } + }); dismiss(); } @@ -410,6 +410,7 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { public static boolean showInstance(@NonNull FragmentManager fragmentManager, State state, + File file, List items) { try { Bundle bundle = new Bundle(); @@ -417,6 +418,7 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { ExportImportProfileBottomSheet fragment = new ExportImportProfileBottomSheet(); fragment.setArguments(bundle); fragment.setSettingsItems(items); + fragment.setFile(file); fragment.show(fragmentManager, TAG); return true; } catch (RuntimeException e) { @@ -424,6 +426,14 @@ public class ExportImportProfileBottomSheet extends BasePreferenceBottomSheet { } } + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + public enum State { EXPORT, IMPORT