diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-10-26 16:50:15 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-10-26 16:50:15 +0300 |
commit | 68647e329d14af17d64c5c20a3496bc43b964f0b (patch) | |
tree | 238c713741cf797aab98b9c77b17ac36635fe04e /app/src/main/java | |
parent | 2579a54ed94502bef625f410b501d1538f474fec (diff) |
#1303 Hide exceptions related to temporary network issues when not pulling manually
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java')
-rw-r--r-- | app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java | 14 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java | 78 |
2 files changed, 69 insertions, 23 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index e8f46b10..3eb32044 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -212,10 +212,14 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A mainViewModel.hasMultipleAccountsConfigured().observe(this, hasMultipleAccountsConfigured -> canMoveNoteToAnotherAccounts = hasMultipleAccountsConfigured); mainViewModel.getSyncStatus().observe(this, syncStatus -> swipeRefreshLayout.setRefreshing(syncStatus)); - mainViewModel.getSyncErrors().observe(this, exceptions -> BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG) - .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(exceptions) - .show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())) - .show()); + mainViewModel.getSyncErrors().observe(this, exceptions -> { + if (mainViewModel.containsNonInfrastructureRelatedItems(exceptions)) { + BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG) + .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(exceptions) + .show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())) + .show(); + } + }); mainViewModel.getSelectedCategory().observe(this, (selectedCategory) -> { binding.activityNotesListView.emptyContentView.getRoot().setVisibility(GONE); adapter.setShowCategory(selectedCategory.getType() == RECENT || selectedCategory.getType() == FAVORITES); @@ -306,7 +310,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A .apply(RequestOptions.circleCropTransform()) .into(activityBinding.launchAccountSwitcher); - mainViewModel.synchronizeNotes(nextAccount, new IResponseCallback<Void>() { + mainViewModel.synchronizeNotes(nextAccount, new IResponseCallback<>() { @Override public void onSuccess(Void v) { Log.d(TAG, "Successfully synchronized notes for " + nextAccount.getAccountName()); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index c99a21c1..4de6ebec 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -1,5 +1,21 @@ package it.niedermann.owncloud.notes.main; +import static androidx.lifecycle.Transformations.distinctUntilChanged; +import static androidx.lifecycle.Transformations.map; +import static androidx.lifecycle.Transformations.switchMap; +import static java.net.HttpURLConnection.HTTP_NOT_MODIFIED; +import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_RECENT; +import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_STARRED; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByCategory; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByInitials; +import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByTime; +import static it.niedermann.owncloud.notes.shared.model.CategorySortingMethod.SORT_MODIFIED_DESC; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED; +import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem; + import android.accounts.NetworkErrorException; import android.app.Application; import android.content.Context; @@ -19,13 +35,14 @@ import androidx.lifecycle.SavedStateHandle; import com.nextcloud.android.sso.AccountImporter; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; +import com.nextcloud.android.sso.exceptions.UnknownErrorException; import com.nextcloud.android.sso.helper.SingleAccountHelper; -import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -50,22 +67,6 @@ import it.niedermann.owncloud.notes.shared.model.ImportStatus; import it.niedermann.owncloud.notes.shared.model.Item; import it.niedermann.owncloud.notes.shared.model.NavigationCategory; -import static androidx.lifecycle.Transformations.distinctUntilChanged; -import static androidx.lifecycle.Transformations.map; -import static androidx.lifecycle.Transformations.switchMap; -import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_RECENT; -import static it.niedermann.owncloud.notes.main.MainActivity.ADAPTER_KEY_STARRED; -import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByCategory; -import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByInitials; -import static it.niedermann.owncloud.notes.main.slots.SlotterUtil.fillListByTime; -import static it.niedermann.owncloud.notes.shared.model.CategorySortingMethod.SORT_MODIFIED_DESC; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED; -import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem; -import static java.net.HttpURLConnection.HTTP_NOT_MODIFIED; - public class MainViewModel extends AndroidViewModel { private static final String TAG = MainViewModel.class.getSimpleName(); @@ -351,7 +352,7 @@ public class MainViewModel extends AndroidViewModel { lastSecondaryCategory.icon = NavigationAdapter.ICON_SUB_MULTIPLE; } else if (belongsToLastPrimaryCategory) { if (isCategoryOpen) { - if(currentSecondaryCategory == null) { + if (currentSecondaryCategory == null) { throw new IllegalStateException("Current secondary category is null. Last primary category: " + lastPrimaryCategory); } item.label = currentSecondaryCategory; @@ -621,4 +622,45 @@ public class MainViewModel extends AndroidViewModel { } return noteContents.toString(); } + + /** + * @return <code>true</code> if {@param exceptions} contains at least one exception which is not caused by flaky infrastructure. + * @see <a href="https://github.com/stefan-niedermann/nextcloud-notes/issues/1303">Issue #1303</a> + */ + public boolean containsNonInfrastructureRelatedItems(@Nullable Collection<Throwable> exceptions) { + if (exceptions == null || exceptions.isEmpty()) { + return false; + } + + return exceptions.stream().anyMatch(e -> !exceptionIsInfrastructureRelated(e)); + } + + private boolean exceptionIsInfrastructureRelated(@Nullable Throwable e) { + if (e == null) { + return false; + } + + if (e instanceof RuntimeException || e instanceof UnknownErrorException) { + if (isSoftwareCausedConnectionAbort(e.getMessage()) || isNetworkUnreachable(e.getMessage())) { + return true; + } + } + + return exceptionIsInfrastructureRelated(e.getCause()); + } + + private boolean isSoftwareCausedConnectionAbort(@Nullable String input) { + if (input == null) { + return false; + } + return input.toLowerCase(Locale.ROOT).contains("software caused connection abort"); + } + + private boolean isNetworkUnreachable(@Nullable String input) { + if (input == null) { + return false; + } + final var lower = input.toLowerCase(Locale.ROOT); + return lower.contains("failed to connect") && lower.contains("network is unreachable"); + } }
\ No newline at end of file |