From adb9464de5df3136d045e7c4f7b10e373107ab6c Mon Sep 17 00:00:00 2001 From: veliymolfar Date: Wed, 11 Mar 2020 13:29:28 +0200 Subject: [PATCH] refactor / three state importTask --- .../src/net/osmand/plus/SettingsHelper.java | 252 ++++++++---------- .../plus/settings/ImportCompleteFragment.java | 22 +- .../settings/ImportDuplicatesFragment.java | 39 ++- .../plus/settings/ImportSettingsFragment.java | 101 ++++--- 4 files changed, 192 insertions(+), 222 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/SettingsHelper.java b/OsmAnd/src/net/osmand/plus/SettingsHelper.java index e6de24fcea..f9c67faf8b 100644 --- a/OsmAnd/src/net/osmand/plus/SettingsHelper.java +++ b/OsmAnd/src/net/osmand/plus/SettingsHelper.java @@ -104,9 +104,6 @@ public class SettingsHelper { private boolean checkingDuplicates; private ImportAsyncTask importTask; private Map exportAsyncTasks = new HashMap<>(); - private CheckDuplicatesTask checkDuplicatesTask; - private List importedItems; - private List selectedItems; public interface SettingsImportListener { void onSettingsImportFinished(boolean succeed, boolean empty, @NonNull List items); @@ -1828,36 +1825,52 @@ public class SettingsHelper { private String latestChanges; private int version; - private SettingsImportListener listener; + private SettingsImportListener importListener; + private CheckDuplicatesListener duplicatesListener; private SettingsImporter importer; private List items = new ArrayList<>(); + private List selectedItems = new ArrayList<>(); private List processedItems = new ArrayList<>(); private SettingsItem currentItem; private AlertDialog dialog; + private State state; + private List duplicates; - ImportAsyncTask(@NonNull File settingsFile, String latestChanges, int version, @Nullable SettingsImportListener listener) { - this.file = settingsFile; - this.listener = listener; + ImportAsyncTask(@NonNull File file, String latestChanges, int version, @Nullable SettingsImportListener importListener) { + this.file = file; + this.importListener = importListener; this.latestChanges = latestChanges; this.version = version; importer = new SettingsImporter(app); collectOnly = true; + state = State.COLLECT; } - ImportAsyncTask(@NonNull File settingsFile, @NonNull List items, String latestChanges, int version, @Nullable SettingsImportListener listener) { - this.file = settingsFile; - this.listener = listener; + ImportAsyncTask(@NonNull File file, @NonNull List items, String latestChanges, int version, @Nullable SettingsImportListener importListener) { + this.file = file; + this.importListener = importListener; this.items = items; this.latestChanges = latestChanges; this.version = version; importer = new SettingsImporter(app); collectOnly = false; + state = State.IMPORT; + } + + ImportAsyncTask(@NonNull File file, @NonNull List items, @NonNull List selectedItems, @Nullable CheckDuplicatesListener duplicatesListener) { + this.file = file; + this.items = items; + this.duplicatesListener = duplicatesListener; + this.selectedItems = selectedItems; + importer = new SettingsImporter(app); + collectOnly = true; + state = State.CHECK_DUPLICATES; } @Override protected void onPreExecute() { if (importing) { - finishImport(listener, false, false, items); + finishImport(importListener, false, false, items); } importing = true; importSuspended = false; @@ -1866,29 +1879,58 @@ public class SettingsHelper { @Override protected List doInBackground(Void... voids) { - if (collectOnly) { - 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; + switch (state) { + case COLLECT: + 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); + } + break; + case CHECK_DUPLICATES: + checkingDuplicates = true; + long startTime = System.currentTimeMillis(); + List duplicatesData = getDuplicatesData(this.selectedItems); + long diffTime = System.currentTimeMillis() - startTime; + if (diffTime < 500 && diffTime >= 0) { + try { + Thread.sleep(500 - diffTime); + } catch (InterruptedException e) { + LOG.error("Error on check duplicates delay" + e); + } + } + this.duplicates = duplicatesData; + return selectedItems; + case IMPORT: + return this.items; } return null; } @Override protected void onPostExecute(@Nullable List items) { - if (items != null) { + if (items != null && !State.CHECK_DUPLICATES.equals(state)) { this.items = items; + } else { + selectedItems = items; } - if (collectOnly) { - listener.onSettingsImportFinished(true, false, this.items); - } else if (items != null && items.size() > 0) { - processNextItem(); + switch (state) { + case COLLECT: + importListener.onSettingsImportFinished(true, false, this.items); + break; + case CHECK_DUPLICATES: + checkingDuplicates = false; + if (duplicatesListener != null) { + duplicatesListener.onDuplicatesChecked(duplicates, this.selectedItems); + } + break; + case IMPORT: + if (items != null && items.size() > 0) { + processNextItem(); + } + break; } } @@ -1898,9 +1940,9 @@ public class SettingsHelper { } if (items.size() == 0 && !importSuspended) { if (processedItems.size() > 0) { - new ImportItemsAsyncTask(file, listener, processedItems).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new ImportItemsAsyncTask(file, importListener, processedItems).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { - finishImport(listener, false, true, items); + finishImport(importListener, false, true, items); } return; } @@ -1942,38 +1984,46 @@ public class SettingsHelper { return this.file; } - public void setListener(SettingsImportListener listener) { - this.listener = listener; + public void setImportListener(SettingsImportListener importListener) { + this.importListener = importListener; } - } - @Nullable - public List getSettingsItems() { - return importTask != null ? importTask.getItems() : null; - } + public void setDuplicatesListener(CheckDuplicatesListener duplicatesListener) { + this.duplicatesListener = duplicatesListener; + } - @Nullable - public File getSettingsFile() { - return importTask != null ? importTask.getFile() : null; - } + public State getState() { + return this.state; + } - @Nullable - public List getImportedItems() { - return importedItems; - } + public List getDuplicates() { + return this.duplicates; + } - @Nullable - public List getDuplicatesItems() { - return checkDuplicatesTask != null ? checkDuplicatesTask.getDuplicates() : null; - } + public List getSelectedItems() { + return this.selectedItems; + } - public void setImportedItems(@Nullable List importedItems) { - this.importedItems = importedItems; - } - - @Nullable - public CheckDuplicatesTask getCheckDuplicatesTask() { - return checkDuplicatesTask; + private List getDuplicatesData(List items) { + List duplicateItems = new ArrayList<>(); + for (SettingsItem item : items) { + if (item instanceof SettingsHelper.ProfileSettingsItem) { + if (item.exists()) { + duplicateItems.add(((SettingsHelper.ProfileSettingsItem) item).getModeBean()); + } + } else if (item instanceof SettingsHelper.CollectionSettingsItem) { + List duplicates = ((CollectionSettingsItem) item).excludeDuplicateItems(); + if (!duplicates.isEmpty()) { + duplicateItems.addAll(duplicates); + } + } else if (item instanceof SettingsHelper.FileSettingsItem) { + if (item.exists()) { + duplicateItems.add(((SettingsHelper.FileSettingsItem) item).getFile()); + } + } + } + return duplicateItems; + } } @Nullable @@ -1982,12 +2032,8 @@ public class SettingsHelper { } @Nullable - public List getSelectedItems() { - return selectedItems; - } - - public void setSelectedItems(@Nullable List selectedItems) { - this.selectedItems = selectedItems; + public State getImportTaskState() { + return importTask != null ? importTask.getState() : null; } public boolean isFileExporting(File file) { @@ -2041,11 +2087,9 @@ public class SettingsHelper { importing = false; importSuspended = false; importTask = null; - checkDuplicatesTask = null; if (listener != null) { listener.onSettingsImportFinished(success, empty, items); } - importedItems = items; } @SuppressLint("StaticFieldLeak") @@ -2088,82 +2132,8 @@ public class SettingsHelper { } } - @SuppressLint("StaticFieldLeak") - public class CheckDuplicatesTask extends AsyncTask> { - - private List items; - private List duplicates; - private CheckDuplicatesListener listener; - private long startTime; - - CheckDuplicatesTask(@NonNull List items, CheckDuplicatesListener listener) { - this.items = items; - this.listener = listener; - } - - @Override - protected void onPreExecute() { - selectedItems = this.items; - checkingDuplicates = true; - checkDuplicatesTask = this; - startTime = System.currentTimeMillis(); - } - - @Override - protected List doInBackground(Void... voids) { - long currentTime = System.currentTimeMillis(); - List duplicateItems = getDuplicatesData(this.items); - if (currentTime - startTime < 700) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - LOG.error("Error on check duplicates delay" + e); - } - } - return duplicateItems; - } - - @Override - protected void onPostExecute(List objects) { - duplicates = objects; - if (listener != null) { - listener.onDuplicatesChecked(objects, this.items); - } - checkingDuplicates = false; - } - - private List getDuplicatesData(List items) { - List duplicateItems = new ArrayList<>(); - for (SettingsItem item : items) { - if (item instanceof SettingsHelper.ProfileSettingsItem) { - if (item.exists()) { - duplicateItems.add(((SettingsHelper.ProfileSettingsItem) item).getModeBean()); - } - } else if (item instanceof SettingsHelper.CollectionSettingsItem) { - List duplicates = ((CollectionSettingsItem) item).excludeDuplicateItems(); - if (!duplicates.isEmpty()) { - duplicateItems.addAll(duplicates); - } - } else if (item instanceof SettingsHelper.FileSettingsItem) { - if (item.exists()) { - duplicateItems.add(((SettingsHelper.FileSettingsItem) item).getFile()); - } - } - } - return duplicateItems; - } - - public void setListener(CheckDuplicatesListener listener) { - this.listener = listener; - } - - List getDuplicates() { - return duplicates; - } - } - - public void checkDuplicates(@NonNull List items, CheckDuplicatesListener listener) { - new CheckDuplicatesTask(items, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + public void checkDuplicates(@NonNull File file, @NonNull List items, @NonNull List selectedItems, CheckDuplicatesListener listener) { + new ImportAsyncTask(file, items, selectedItems, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } public void importSettings(@NonNull File settingsFile, String latestChanges, int version, @@ -2186,4 +2156,10 @@ public class SettingsHelper { @NonNull SettingsItem... items) { exportSettings(fileDir, fileName, listener, new ArrayList<>(Arrays.asList(items))); } + + public enum State { + COLLECT, + CHECK_DUPLICATES, + IMPORT + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/ImportCompleteFragment.java b/OsmAnd/src/net/osmand/plus/settings/ImportCompleteFragment.java index edb68f68e9..56f8cb6015 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ImportCompleteFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ImportCompleteFragment.java @@ -19,7 +19,6 @@ import androidx.recyclerview.widget.RecyclerView; import net.osmand.AndroidUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.SettingsHelper; import net.osmand.plus.SettingsHelper.SettingsItem; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; @@ -39,19 +38,18 @@ import static net.osmand.plus.settings.ImportSettingsFragment.getSettingsToOpera public class ImportCompleteFragment extends BaseOsmAndFragment { public static final String TAG = ImportCompleteFragment.class.getSimpleName(); - private static final String FILE_NAME_KEY = "FILE_NAME_KEY"; private OsmandApplication app; private RecyclerView recyclerView; private List settingsItems; private String fileName; private boolean nightMode; - private SettingsHelper settingsHelper; public static void showInstance(FragmentManager fm, @NonNull List settingsItems, @NonNull String fileName) { ImportCompleteFragment fragment = new ImportCompleteFragment(); fragment.setSettingsItems(settingsItems); fragment.setFileName(fileName); + fragment.setRetainInstance(true); fm.beginTransaction() .replace(R.id.fragmentContainer, fragment, TAG) .addToBackStack(IMPORT_SETTINGS_TAG) @@ -61,18 +59,8 @@ public class ImportCompleteFragment extends BaseOsmAndFragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - fileName = savedInstanceState.getString(FILE_NAME_KEY); - } app = requireMyApplication(); - settingsHelper = app.getSettingsHelper(); nightMode = !app.getSettings().isLightContent(); - if (settingsItems == null) { - settingsItems = settingsHelper.getImportedItems(); - if (settingsItems == null) { - dismissFragment(); - } - } } @Nullable @@ -120,19 +108,11 @@ public class ImportCompleteFragment extends BaseOsmAndFragment { } } - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(FILE_NAME_KEY, fileName); - } - public void dismissFragment() { FragmentManager fm = getFragmentManager(); if (fm != null) { fm.popBackStack(IMPORT_SETTINGS_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); } - settingsHelper.setImportedItems(null); - settingsHelper.setSelectedItems(null); } private void navigateTo(AdditionalDataWrapper.Type type) { diff --git a/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java b/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java index b4039b1870..5a5286851f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java @@ -79,24 +79,18 @@ public class ImportDuplicatesFragment extends BaseOsmAndFragment implements View app = requireMyApplication(); settingsHelper = app.getSettingsHelper(); nightMode = !app.getSettings().isLightContent(); - if (settingsItems == null) { - settingsItems = settingsHelper.getSelectedItems(); - } - if (duplicatesList == null) { - duplicatesList = settingsHelper.getDuplicatesItems(); - } - if (file == null) { - file = settingsHelper.getSettingsFile(); - } - SettingsHelper.ImportAsyncTask importAsyncTask = settingsHelper.getImportTask(); - List importedItems = settingsHelper.getImportedItems(); - if (importAsyncTask != null) { - importAsyncTask.setListener(getImportListener()); - } else if (importedItems != null) { - FragmentManager fm = getFragmentManager(); - if (fm != null) { - ImportCompleteFragment.showInstance(fm, importedItems, file.getName()); + SettingsHelper.ImportAsyncTask importTask = settingsHelper.getImportTask(); + if (importTask != null) { + if (settingsItems == null) { + settingsItems = importTask.getSelectedItems(); } + if (duplicatesList == null) { + duplicatesList = importTask.getDuplicates(); + } + if (file == null) { + file = importTask.getFile(); + } + importTask.setImportListener(getImportListener()); } } @@ -150,20 +144,21 @@ public class ImportDuplicatesFragment extends BaseOsmAndFragment implements View return root; } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); if (duplicatesList != null) { DuplicatesSettingsAdapter adapter = new DuplicatesSettingsAdapter(app, prepareDuplicates(duplicatesList), nightMode); list.setLayoutManager(new LinearLayoutManager(getMyApplication())); list.setAdapter(adapter); } - if (settingsHelper.isImporting() && !settingsHelper.isCollectOnly()) { + SettingsHelper.State state = settingsHelper.getImportTaskState(); + if (settingsHelper.isImporting() && !settingsHelper.isCollectOnly() && state != null && state.equals(SettingsHelper.State.IMPORT)) { setupImportingUi(); } else { toolbarLayout.setTitle(getString(R.string.import_duplicates_title)); } + toolbarLayout.setTitle(getString(R.string.import_duplicates_title)); } private List prepareDuplicates(List duplicatesList) { @@ -287,7 +282,7 @@ public class ImportDuplicatesFragment extends BaseOsmAndFragment implements View } }); FragmentManager fm = getFragmentManager(); - if (fm != null) { + if (fm != null && file != null) { ImportCompleteFragment.showInstance(fm, items, file.getName()); } } else if (empty) { diff --git a/OsmAnd/src/net/osmand/plus/settings/ImportSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/ImportSettingsFragment.java index 56f58d0275..20b1365f27 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ImportSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ImportSettingsFragment.java @@ -1,7 +1,9 @@ package net.osmand.plus.settings; +import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.content.res.Configuration; import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; @@ -25,6 +27,7 @@ import com.google.android.material.appbar.CollapsingToolbarLayout; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; +import net.osmand.PlatformUtil; import net.osmand.map.ITileSource; import net.osmand.map.TileSourceManager; import net.osmand.plus.AppInitializer; @@ -33,6 +36,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.SQLiteTileSource; import net.osmand.plus.SettingsHelper; +import net.osmand.plus.SettingsHelper.ImportAsyncTask; import net.osmand.plus.SettingsHelper.SettingsItem; import net.osmand.plus.UiUtilities; import net.osmand.plus.base.BaseOsmAndFragment; @@ -43,6 +47,8 @@ import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.widgets.TextViewEx; +import org.apache.commons.logging.Log; + import java.io.File; import java.util.ArrayList; import java.util.List; @@ -51,7 +57,8 @@ public class ImportSettingsFragment extends BaseOsmAndFragment implements View.OnClickListener { public static final String TAG = ImportSettingsFragment.class.getSimpleName(); - public static final String IMPORT_SETTINGS_TAG = "import_settings_tag"; + public static final Log LOG = PlatformUtil.getLog(ImportSettingsFragment.class.getSimpleName()); + static final String IMPORT_SETTINGS_TAG = "import_settings_tag"; private OsmandApplication app; private ExportImportSettingsAdapter adapter; private ExpandableListView expandableList; @@ -77,33 +84,11 @@ public class ImportSettingsFragment extends BaseOsmAndFragment } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = requireMyApplication(); settingsHelper = app.getSettingsHelper(); nightMode = !app.getSettings().isLightContent(); - if (settingsItems == null) { - settingsItems = app.getSettingsHelper().getSettingsItems(); - } - if (file == null) { - file = app.getSettingsHelper().getSettingsFile(); - } - List duplicates = settingsHelper.getDuplicatesItems(); - if (duplicates == null) { - SettingsHelper.CheckDuplicatesTask checkDuplicatesTask = settingsHelper.getCheckDuplicatesTask(); - if (checkDuplicatesTask != null) { - settingsHelper.getCheckDuplicatesTask().setListener(getDuplicatesListener()); - } - } else { - FragmentManager fm = getFragmentManager(); - if (duplicates.isEmpty()) { - app.getSettingsHelper().importSettings(file, settingsItems, "", 1, getImportListener()); - } else { - if (fm != null) { - ImportDuplicatesFragment.showInstance(fm, duplicates, settingsItems, file); - } - } - } } @Nullable @@ -133,17 +118,44 @@ public class ImportSettingsFragment extends BaseOsmAndFragment } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + ImportAsyncTask importAsyncTask = settingsHelper.getImportTask(); + if (importAsyncTask != null) { + if (settingsItems == null) { + settingsItems = importAsyncTask.getItems(); + } + if (file == null) { + file = importAsyncTask.getFile(); + } + List duplicates = importAsyncTask.getDuplicates(); + List selectedItems = importAsyncTask.getSelectedItems(); + if (duplicates == null) { + importAsyncTask.setDuplicatesListener(getDuplicatesListener()); + } else if (duplicates.isEmpty()) { + if (selectedItems != null && file != null) { + settingsHelper.importSettings(file, selectedItems, "", 1, getImportListener()); + } + } +// else if (!fromPopBackStack) { +// FragmentManager fm = getFragmentManager(); +// if (fm != null && file != null && selectedItems != null) { +// ImportDuplicatesFragment.showInstance(fm, duplicates, selectedItems, file); +// } +// } + } + adapter = new ExportImportSettingsAdapter(app, nightMode, true); if (settingsItems != null) { adapter.updateSettingsList(getSettingsToOperate(settingsItems)); } expandableList.setAdapter(adapter); + toolbarLayout.setTitle(getString(R.string.shared_string_import)); + SettingsHelper.State state = settingsHelper.getImportTaskState(); if (settingsHelper.isCheckingDuplicates()) { updateUi(R.string.shared_string_preparing, R.string.checking_for_duplicate_description); - } else if (settingsHelper.isImporting() && !settingsHelper.isCollectOnly()) { + } else if (settingsHelper.isImporting() && !settingsHelper.isCollectOnly() && state != null && state.equals(SettingsHelper.State.IMPORT)) { updateUi(R.string.shared_string_importing, R.string.importing_from); } else { toolbarLayout.setTitle(getString(R.string.shared_string_import)); @@ -171,21 +183,26 @@ public class ImportSettingsFragment extends BaseOsmAndFragment } private void updateUi(int toolbarTitleRes, int descriptionRes) { - toolbarLayout.setTitle(getString(toolbarTitleRes)); - description.setText(UiUtilities.createSpannableString( - String.format(getString(descriptionRes), file.getName()), - file.getName(), - new StyleSpan(Typeface.BOLD) - )); - buttonsContainer.setVisibility(View.GONE); - progressBar.setVisibility(View.VISIBLE); - adapter.clearSettingsList(); + if (file != null) { + String fileName = file.getName(); + toolbarLayout.setTitle(getString(toolbarTitleRes)); + description.setText(UiUtilities.createSpannableString( + String.format(getString(descriptionRes), fileName), + fileName, + new StyleSpan(Typeface.BOLD) + )); + buttonsContainer.setVisibility(View.GONE); + progressBar.setVisibility(View.VISIBLE); + adapter.clearSettingsList(); + } } private void importItems() { updateUi(R.string.shared_string_preparing, R.string.checking_for_duplicate_description); - List settingsItems = getSettingsItemsFromData(adapter.getDataToOperate()); - settingsHelper.checkDuplicates(settingsItems, getDuplicatesListener()); + List selectedItems = getSettingsItemsFromData(adapter.getDataToOperate()); + if (file != null && settingsItems != null) { + settingsHelper.checkDuplicates(file, settingsItems, selectedItems, getDuplicatesListener()); + } } private SettingsHelper.SettingsImportListener getImportListener() { @@ -200,7 +217,7 @@ public class ImportSettingsFragment extends BaseOsmAndFragment public void onRoutingFilesLoaded() { } }); - if (fm != null) { + if (fm != null && file != null) { ImportCompleteFragment.showInstance(fm, items, file.getName()); } } else if (empty) { @@ -220,9 +237,11 @@ public class ImportSettingsFragment extends BaseOsmAndFragment if (isAdded()) { updateUi(R.string.shared_string_importing, R.string.importing_from); } - settingsHelper.importSettings(file, items, "", 1, getImportListener()); + if (file != null) { + settingsHelper.importSettings(file, items, "", 1, getImportListener()); + } } else { - if (fm != null) { + if (fm != null && file != null) { if (!isStateSaved()) { ImportDuplicatesFragment.showInstance(fm, duplicates, items, file); }