Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2021-10-26 16:50:15 +0300
committerStefan Niedermann <info@niedermann.it>2021-10-26 16:50:15 +0300
commit68647e329d14af17d64c5c20a3496bc43b964f0b (patch)
tree238c713741cf797aab98b9c77b17ac36635fe04e /app/src/main/java
parent2579a54ed94502bef625f410b501d1538f474fec (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.java14
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java78
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