From 84f004706f1ae4628f5ffbc9dfd8efa8a9d85d5c Mon Sep 17 00:00:00 2001 From: anthony restaino Date: Tue, 6 Jun 2017 20:37:05 -0400 Subject: [PATCH] Safeguarding against runtime exceptions when importing and exporting --- .../fragment/BookmarkSettingsFragment.java | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/acr/browser/lightning/fragment/BookmarkSettingsFragment.java b/app/src/main/java/acr/browser/lightning/fragment/BookmarkSettingsFragment.java index 48c4e5e..c094536 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/BookmarkSettingsFragment.java +++ b/app/src/main/java/acr/browser/lightning/fragment/BookmarkSettingsFragment.java @@ -24,6 +24,7 @@ import android.widget.ArrayAdapter; import com.anthonycr.bonsai.CompletableOnSubscribe; import com.anthonycr.bonsai.SingleOnSubscribe; +import com.anthonycr.bonsai.Subscription; import com.anthonycr.grant.PermissionsManager; import com.anthonycr.grant.PermissionsResultAction; @@ -48,6 +49,7 @@ import com.anthonycr.bonsai.Schedulers; import acr.browser.lightning.database.bookmark.BookmarkModel; import acr.browser.lightning.dialog.BrowserDialog; import acr.browser.lightning.utils.Preconditions; +import acr.browser.lightning.utils.SubscriptionUtils; import acr.browser.lightning.utils.Utils; public class BookmarkSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { @@ -66,8 +68,12 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref private File[] mFileList; private String[] mFileNameList; + @Nullable private BookmarkLocalSync mSync; + @Nullable private Subscription mImportSubscription; + @Nullable private Subscription mExportSubscription; + private static final String[] REQUIRED_PERMISSIONS = new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE @@ -153,9 +159,21 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref } } + @Override + public void onDestroyView() { + super.onDestroyView(); + + SubscriptionUtils.safeUnsubscribe(mExportSubscription); + SubscriptionUtils.safeUnsubscribe(mImportSubscription); + } + @Override public void onDestroy() { super.onDestroy(); + + SubscriptionUtils.safeUnsubscribe(mExportSubscription); + SubscriptionUtils.safeUnsubscribe(mImportSubscription); + mActivity = null; } @@ -197,14 +215,21 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref .subscribe(new SingleOnSubscribe>() { @Override public void onItem(@Nullable List item) { + if (!isAdded()) { + return; + } + Preconditions.checkNonNull(item); final File exportFile = BookmarkExporter.createNewExportFile(); - BookmarkExporter.exportBookmarksToFile(item, exportFile) + SubscriptionUtils.safeUnsubscribe(mExportSubscription); + mExportSubscription = BookmarkExporter.exportBookmarksToFile(item, exportFile) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.main()) .subscribe(new CompletableOnSubscribe() { @Override public void onComplete() { + mExportSubscription = null; + Activity activity = getActivity(); if (activity != null) { Utils.showSnackbar(activity, activity.getString(R.string.bookmark_export_path) @@ -214,9 +239,11 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref @Override public void onError(@NonNull Throwable throwable) { + mExportSubscription = null; + Log.e(TAG, "onError: exporting bookmarks", throwable); Activity activity = getActivity(); - if (activity != null) { + if (activity != null && !activity.isFinishing() && isAdded()) { Utils.createInformativeDialog(activity, R.string.title_error, R.string.bookmark_export_failure); } else { Utils.showToast(mApplication, R.string.bookmark_export_failure); @@ -229,7 +256,12 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref @Override public void onDenied(String permission) { - //TODO Show message + Activity activity = getActivity(); + if (activity != null && !activity.isFinishing() && isAdded()) { + Utils.createInformativeDialog(activity, R.string.title_error, R.string.bookmark_export_failure); + } else { + Utils.showToast(mApplication, R.string.bookmark_export_failure); + } } }); return true; @@ -445,11 +477,14 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref Dialog dialog1 = builder.show(); BrowserDialog.setDialogSize(mActivity, dialog1); } else { - BookmarkExporter.importBookmarksFromFile(mFileList[which]) + SubscriptionUtils.safeUnsubscribe(mImportSubscription); + mImportSubscription = BookmarkExporter.importBookmarksFromFile(mFileList[which]) .subscribeOn(Schedulers.io()) .subscribe(new SingleOnSubscribe>() { @Override public void onItem(@Nullable final List importList) { + mImportSubscription = null; + Preconditions.checkNonNull(importList); mBookmarkManager.addBookmarkList(importList) .observeOn(Schedulers.main()) @@ -467,9 +502,11 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref @Override public void onError(@NonNull Throwable throwable) { + mImportSubscription = null; + Log.e(TAG, "onError: importing bookmarks", throwable); Activity activity = getActivity(); - if (activity != null) { + if (activity != null && !activity.isFinishing() && isAdded()) { Utils.createInformativeDialog(activity, R.string.title_error, R.string.import_bookmark_error); } else { Utils.showToast(mApplication, R.string.import_bookmark_error);