From 4f421425220c21b0c8598fc241709cebb5ea98f1 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 2 Jul 2020 09:08:31 +0200 Subject: Display exception tips on total crash --- .../notes/exception/ExceptionActivity.java | 8 +++ .../notes/exception/ExceptionDialogFragment.java | 60 +------------------ .../owncloud/notes/exception/tips/TipsAdapter.java | 69 +++++++++++++++++++++- 3 files changed, 75 insertions(+), 62 deletions(-) (limited to 'app/src/main/java/it') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java index 4999a30e..c90405a5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java @@ -9,10 +9,12 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import java.util.Collections; import java.util.Objects; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityExceptionBinding; +import it.niedermann.owncloud.notes.exception.tips.TipsAdapter; import static it.niedermann.owncloud.notes.exception.ExceptionHandler.KEY_THROWABLE; @@ -32,12 +34,18 @@ public class ExceptionActivity extends AppCompatActivity { binding.copy.setOnClickListener((v) -> copyStacktraceToClipboard()); binding.close.setOnClickListener((v) -> close()); + + final TipsAdapter adapter = new TipsAdapter(this::startActivity); + binding.tips.setAdapter(adapter); + binding.tips.setNestedScrollingEnabled(false); + setSupportActionBar(binding.toolbar); Throwable throwable = (Throwable) Objects.requireNonNull(getIntent().getSerializableExtra(KEY_THROWABLE)); throwable.printStackTrace(); binding.toolbar.setTitle(getString(R.string.simple_error)); binding.message.setText(throwable.getMessage()); binding.stacktrace.setText(ExceptionUtil.getDebugInfos(this, throwable)); + adapter.setThrowables(Collections.singletonList(throwable)); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java index b7f0cbdc..308529c3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java @@ -2,12 +2,7 @@ package it.niedermann.owncloud.notes.exception; import android.app.Dialog; import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.provider.Settings; import android.view.View; import androidx.annotation.NonNull; @@ -15,23 +10,12 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDialogFragment; import androidx.fragment.app.DialogFragment; -import com.nextcloud.android.sso.exceptions.NextcloudApiNotRespondingException; -import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotSupportedException; -import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; -import com.nextcloud.android.sso.exceptions.TokenMismatchException; - -import org.json.JSONException; - -import java.net.ConnectException; -import java.net.SocketTimeoutException; import java.util.ArrayList; -import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.DialogExceptionBinding; import it.niedermann.owncloud.notes.exception.tips.TipsAdapter; -import static android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS; import static it.niedermann.owncloud.notes.shared.util.ClipboardUtil.copyToClipboard; public class ExceptionDialogFragment extends AppCompatDialogFragment { @@ -68,49 +52,7 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { binding.statusMessage.setText(getString(R.string.error_sync, throwables.size() > 0 ? throwables.get(0).getLocalizedMessage() : getString(R.string.error_unknown))); binding.stacktrace.setText(debugInfos); - for (Throwable t : throwables) { - if (t instanceof TokenMismatchException) { - adapter.add(R.string.error_dialog_tip_token_mismatch_retry); - adapter.add(R.string.error_dialog_tip_token_mismatch_clear_storage); - Intent intent = new Intent(ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.parse("package:" + BuildConfig.APPLICATION_ID)) - .putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_deck_info); - adapter.add(R.string.error_dialog_tip_clear_storage, intent); - adapter.add(R.string.error_dialog_tip_clear_storage); - } else if (t instanceof NextcloudFilesAppNotSupportedException) { - adapter.add(R.string.error_dialog_tip_files_outdated); - } else if (t instanceof NextcloudApiNotRespondingException) { - if (VERSION.SDK_INT >= VERSION_CODES.M) { - adapter.add(R.string.error_dialog_tip_disable_battery_optimizations, new Intent().setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS).putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_battery_settings)); - } else { - adapter.add(R.string.error_dialog_tip_disable_battery_optimizations); - } - adapter.add(R.string.error_dialog_tip_files_force_stop); - adapter.add(R.string.error_dialog_tip_files_delete_storage); - } else if (t instanceof SocketTimeoutException || t instanceof ConnectException) { - adapter.add(R.string.error_dialog_timeout_instance); - adapter.add(R.string.error_dialog_timeout_toggle, new Intent(Settings.ACTION_WIFI_SETTINGS).putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_network)); - } else if (t instanceof JSONException || t instanceof NullPointerException) { - adapter.add(R.string.error_dialog_check_server); - } else if (t instanceof NextcloudHttpRequestFailedException) { - int statusCode = ((NextcloudHttpRequestFailedException) t).getStatusCode(); - switch (statusCode) { - case 302: - adapter.add(R.string.error_dialog_server_app_enabled); - adapter.add(R.string.error_dialog_redirect); - break; - case 500: - adapter.add(R.string.error_dialog_check_server_logs); - break; - case 503: - adapter.add(R.string.error_dialog_check_maintenance); - break; - case 507: - adapter.add(R.string.error_dialog_insufficient_storage); - break; - } - } - } + adapter.setThrowables(throwables); return new AlertDialog.Builder(requireActivity()) .setView(binding.getRoot()) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java index 2bd92957..844b3bcc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java @@ -1,6 +1,10 @@ package it.niedermann.owncloud.notes.exception.tips; import android.content.Intent; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,11 +15,24 @@ import androidx.annotation.StringRes; import androidx.core.util.Consumer; import androidx.recyclerview.widget.RecyclerView; +import com.nextcloud.android.sso.exceptions.NextcloudApiNotRespondingException; +import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotSupportedException; +import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; +import com.nextcloud.android.sso.exceptions.TokenMismatchException; + +import org.json.JSONException; + +import java.net.ConnectException; +import java.net.SocketTimeoutException; import java.util.LinkedList; import java.util.List; +import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.R; +import static android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS; +import static it.niedermann.owncloud.notes.exception.ExceptionDialogFragment.INTENT_EXTRA_BUTTON_TEXT; + public class TipsAdapter extends RecyclerView.Adapter { @NonNull @@ -44,12 +61,58 @@ public class TipsAdapter extends RecyclerView.Adapter { return tips.size(); } - public void add(@StringRes int text) { + public void setThrowables(@NonNull List throwables) { + for (Throwable t : throwables) { + if (t instanceof TokenMismatchException) { + add(R.string.error_dialog_tip_token_mismatch_retry); + add(R.string.error_dialog_tip_token_mismatch_clear_storage); + Intent intent = new Intent(ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.parse("package:" + BuildConfig.APPLICATION_ID)) + .putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_deck_info); + add(R.string.error_dialog_tip_clear_storage, intent); + add(R.string.error_dialog_tip_clear_storage); + } else if (t instanceof NextcloudFilesAppNotSupportedException) { + add(R.string.error_dialog_tip_files_outdated); + } else if (t instanceof NextcloudApiNotRespondingException) { + if (VERSION.SDK_INT >= VERSION_CODES.M) { + add(R.string.error_dialog_tip_disable_battery_optimizations, new Intent().setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS).putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_battery_settings)); + } else { + add(R.string.error_dialog_tip_disable_battery_optimizations); + } + add(R.string.error_dialog_tip_files_force_stop); + add(R.string.error_dialog_tip_files_delete_storage); + } else if (t instanceof SocketTimeoutException || t instanceof ConnectException) { + add(R.string.error_dialog_timeout_instance); + add(R.string.error_dialog_timeout_toggle, new Intent(Settings.ACTION_WIFI_SETTINGS).putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_open_network)); + } else if (t instanceof JSONException || t instanceof NullPointerException) { + add(R.string.error_dialog_check_server); + } else if (t instanceof NextcloudHttpRequestFailedException) { + int statusCode = ((NextcloudHttpRequestFailedException) t).getStatusCode(); + switch (statusCode) { + case 302: + add(R.string.error_dialog_server_app_enabled); + add(R.string.error_dialog_redirect); + break; + case 500: + add(R.string.error_dialog_check_server_logs); + break; + case 503: + add(R.string.error_dialog_check_maintenance); + break; + case 507: + add(R.string.error_dialog_insufficient_storage); + break; + } + } + } + notifyDataSetChanged(); + } + + private void add(@StringRes int text) { add(text, null); } - public void add(@StringRes int text, @Nullable Intent primaryAction) { + private void add(@StringRes int text, @Nullable Intent primaryAction) { tips.add(new TipsModel(text, primaryAction)); - notifyItemInserted(tips.size()); } } \ No newline at end of file -- cgit v1.2.3