1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package it.niedermann.nextcloud.deck.ui.exception;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.DialogFragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import it.niedermann.android.util.ClipboardUtil;
import it.niedermann.nextcloud.deck.BuildConfig;
import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.databinding.DialogExceptionBinding;
import it.niedermann.nextcloud.deck.model.Account;
import it.niedermann.nextcloud.deck.ui.exception.tips.TipsAdapter;
import it.niedermann.nextcloud.exception.ExceptionUtil;
public class ExceptionDialogFragment extends AppCompatDialogFragment {
private static final String KEY_THROWABLE = "throwable";
private static final String KEY_ACCOUNT = "account";
public static final String INTENT_EXTRA_BUTTON_TEXT = "button_text";
private Throwable throwable;
@Nullable
private Account account;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
final var args = getArguments();
if (args != null) {
this.throwable = (Throwable) args.getSerializable(KEY_THROWABLE);
if (this.throwable == null) {
throwable = new IllegalArgumentException("Did not receive any exception in " + ExceptionDialogFragment.class.getSimpleName());
}
this.account = (Account) args.getSerializable(KEY_ACCOUNT);
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final var view = View.inflate(getContext(), R.layout.dialog_exception, null);
final var binding = DialogExceptionBinding.bind(view);
final var adapter = new TipsAdapter((actionIntent) -> requireActivity().startActivity(actionIntent));
final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(requireContext(), throwable, BuildConfig.FLAVOR, account == null ? null : account.getServerDeckVersion());
binding.tips.setAdapter(adapter);
binding.stacktrace.setText(debugInfos);
DeckLog.logError(throwable);
adapter.setThrowable(requireContext(), account, throwable);
return new MaterialAlertDialogBuilder(requireActivity())
.setView(binding.getRoot())
.setTitle(R.string.error_dialog_title)
.setPositiveButton(android.R.string.copy, (a, b) -> {
ClipboardUtil.INSTANCE.copyToClipboard(requireContext(), getString(R.string.simple_exception), "```\n" + debugInfos + "\n```");
a.dismiss();
})
.setNegativeButton(R.string.simple_close, null)
.create();
}
public static DialogFragment newInstance(@NonNull Throwable throwable, @Nullable Account account) {
final var fragment = new ExceptionDialogFragment();
final var args = new Bundle();
args.putSerializable(KEY_THROWABLE, throwable);
args.putSerializable(KEY_ACCOUNT, account);
fragment.setArguments(args);
return fragment;
}
}
|