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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
package it.niedermann.owncloud.notes.exception.tips;
import static android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
import static it.niedermann.owncloud.notes.exception.ExceptionDialogFragment.INTENT_EXTRA_BUTTON_TEXT;
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.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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 com.nextcloud.android.sso.exceptions.UnknownErrorException;
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;
public class TipsAdapter extends RecyclerView.Adapter<TipsViewHolder> {
@NonNull
private final Consumer<Intent> actionButtonClickedListener;
@NonNull
private final List<TipsModel> tips = new LinkedList<>();
public TipsAdapter(@NonNull Consumer<Intent> actionButtonClickedListener) {
this.actionButtonClickedListener = actionButtonClickedListener;
}
@NonNull
@Override
public TipsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final var view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tip, parent, false);
return new TipsViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TipsViewHolder holder, int position) {
holder.bind(tips.get(position), actionButtonClickedListener);
}
@Override
public int getItemCount() {
return tips.size();
}
public void setThrowables(@NonNull List<Throwable> throwables) {
for (final var throwable : throwables) {
if (throwable instanceof TokenMismatchException) {
add(R.string.error_dialog_tip_token_mismatch_retry);
add(R.string.error_dialog_tip_token_mismatch_clear_storage);
final var 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);
} else if (throwable instanceof NextcloudFilesAppNotSupportedException) {
add(R.string.error_dialog_tip_files_outdated);
} else if (throwable instanceof NextcloudApiNotRespondingException) {
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));
add(R.string.error_dialog_tip_files_force_stop);
add(R.string.error_dialog_tip_files_delete_storage);
final var 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);
} else if (throwable instanceof SocketTimeoutException || throwable 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 (throwable instanceof JSONException || throwable instanceof NullPointerException) {
add(R.string.error_dialog_check_server);
} else if (throwable instanceof NextcloudHttpRequestFailedException) {
final int statusCode = ((NextcloudHttpRequestFailedException) throwable).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;
}
} else if (throwable instanceof UnknownErrorException) {
if ("com.nextcloud.android.sso.QueryParam".equals(throwable.getMessage())) {
add(R.string.error_dialog_min_version, new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.nextcloud.client"))
.putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_update_files_app));
} else if("Read timed out".equals(throwable.getMessage())) {
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));
}
}
}
notifyDataSetChanged();
}
private void add(@StringRes int text) {
add(text, null);
}
private void add(@StringRes int text, @Nullable Intent primaryAction) {
tips.add(new TipsModel(text, primaryAction));
}
}
|