diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-05-07 18:08:45 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-05-07 18:08:45 +0300 |
commit | fa1388cc43cb480721bdddafa61e417f2a884045 (patch) | |
tree | 068bb2c60ec22efe0737f85fe3b940d43a97c4bb /app/src/main/java | |
parent | 26d73013569d4a17c94211f46a002fa1fa4baae1 (diff) |
#456 Clear storage tip: show direct button to start app info page
Diffstat (limited to 'app/src/main/java')
9 files changed, 63 insertions, 35 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index df3187fe4..a9d0dd44c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -154,6 +154,7 @@ public class SyncManager { refreshCapabilities(new IResponseCallback<Capabilities>(responseCallback.getAccount()) { @Override public void onResponse(Capabilities response) { + responseCallback.onError(new NextcloudHttpRequestFailedException(500, new Exception())); if (!response.isMaintenanceEnabled()) { long accountId = responseCallback.getAccount().getId(); Date lastSyncDate = LastSyncUtil.getLastSyncDate(responseCallback.getAccount().getId()); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java index cf67130eb..ae7ab3683 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java @@ -118,8 +118,7 @@ public class ImportAccountActivity extends AppCompatActivity { } assert error != null; setStatusText(error.getMessage()); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(error).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(error).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); + runOnUiThread(() -> ExceptionDialogFragment.newInstance(error, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); restoreWifiPref(); } else { // Remember last account - THIS HAS TO BE DONE SYNCHRONOUSLY @@ -146,7 +145,7 @@ public class ImportAccountActivity extends AppCompatActivity { public void onError(Throwable throwable) { super.onError(throwable); setStatusText(throwable.getMessage()); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); + runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); rollbackAccountCreation(syncManager, createdAccount.getId()); } }); @@ -175,7 +174,7 @@ public class ImportAccountActivity extends AppCompatActivity { setStatusText(R.string.you_have_to_be_connected_to_the_internet_in_order_to_add_an_account); } else { setStatusText(throwable.getMessage()); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); + runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); } rollbackAccountCreation(syncManager, createdAccount.getId()); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java index c52ed0de1..8c0c4f1c1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java @@ -113,7 +113,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener protected ActivityMainBinding binding; protected NavHeaderMainBinding headerBinding; - private MainViewModel mainViewModel; + protected MainViewModel mainViewModel; private FilterViewModel filterViewModel; protected static final int ACTIVITY_ABOUT = 1; @@ -799,7 +799,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener super.onError(throwable); runOnUiThread(() -> { importSnackbar.dismiss(); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); + runOnUiThread(() -> ExceptionDialogFragment.newInstance(throwable, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); }); } }); @@ -841,7 +841,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener .setPositiveButton(R.string.simple_close, null) .show()); } else { - ExceptionDialogFragment.newInstance(throwable).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + ExceptionDialogFragment.newInstance(throwable, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); } } }); @@ -851,8 +851,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener DeckLog.warn("Account already added"); Snackbar.make(binding.coordinatorLayout, accountAlreadyAdded, Snackbar.LENGTH_LONG).show(); } else { - ExceptionDialogFragment.newInstance(error).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); - ExceptionDialogFragment.newInstance(error).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + ExceptionDialogFragment.newInstance(error, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); } } }); @@ -958,7 +957,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener if (!(throwable instanceof NextcloudHttpRequestFailedException) || ((NextcloudHttpRequestFailedException) throwable).getStatusCode() != HttpURLConnection.HTTP_UNAVAILABLE) { runOnUiThread(() -> { Snackbar.make(binding.coordinatorLayout, R.string.synchronization_failed, Snackbar.LENGTH_LONG) - .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(throwable).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())) + .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(throwable, mainViewModel.getCurrentAccount()).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())) .show(); }); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/SelectCardActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/SelectCardActivity.java index 96f7ae565..98ead9a13 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/SelectCardActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/SelectCardActivity.java @@ -95,7 +95,7 @@ public class SelectCardActivity extends MainActivity implements SelectCardListen private void handleException(Throwable throwable) { DeckLog.logError(throwable); - String debugInfos = ExceptionUtil.getDebugInfos(this, throwable); + String debugInfos = ExceptionUtil.getDebugInfos(this, throwable, mainViewModel.getCurrentAccount()); final AlertDialog dialog = new BrandedAlertDialogBuilder(this) .setTitle(R.string.error) .setMessage(debugInfos) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlDialogFragment.java index e0ab5a8f2..3672e04c8 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlDialogFragment.java @@ -113,7 +113,7 @@ public class AccessControlDialogFragment extends BrandedDialogFragment implement if (wrappedDeleteLiveData.hasError()) { DeckLog.logError(wrappedDeleteLiveData.getError()); Snackbar.make(requireView(), getString(R.string.error_revoking_ac, ac.getUser().getDisplayname()), Snackbar.LENGTH_LONG) - .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(wrappedDeleteLiveData.getError()).show(getChildFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show(); + .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(wrappedDeleteLiveData.getError(), viewModel.getCurrentAccount()).show(getChildFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show(); } }); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java index 67bbd99a6..38bd9488f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java @@ -262,7 +262,7 @@ public class CardDetailsFragment extends BrandedFragment implements OnDateSetLis if (createLabelLiveData.hasError()) { DeckLog.logError(createLabelLiveData.getError()); Snackbar.make(requireView(), getString(R.string.error_create_label, newLabel.getTitle()), Snackbar.LENGTH_LONG) - .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(createLabelLiveData.getError()).show(getChildFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show(); + .setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(createLabelLiveData.getError(), viewModel.getAccount()).show(getChildFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show(); } else { newLabel.setLocalId(createdLabel.getLocalId()); ((LabelAutoCompleteAdapter) binding.labels.getAdapter()).exclude(createdLabel); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java index e33827bf3..3ba3eb59f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionActivity.java @@ -37,7 +37,7 @@ public class ExceptionActivity extends AppCompatActivity { binding.toolbar.setTitle(R.string.error); binding.message.setText(throwable.getMessage()); - final String debugInfo = ExceptionUtil.getDebugInfos(this, throwable); + final String debugInfo = ExceptionUtil.getDebugInfos(this, throwable, null); binding.stacktrace.setText(debugInfo); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionDialogFragment.java index a1cbceac2..ba38cdf98 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/exception/ExceptionDialogFragment.java @@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.ui.exception; import android.app.Dialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -29,10 +30,12 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +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.databinding.ItemTipBinding; +import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.util.ExceptionUtil; import static it.niedermann.nextcloud.deck.util.ClipboardUtil.copyToClipboard; @@ -40,10 +43,15 @@ import static it.niedermann.nextcloud.deck.util.ClipboardUtil.copyToClipboard; public class ExceptionDialogFragment extends AppCompatDialogFragment { private static final String KEY_THROWABLES = "throwables"; + private static final String KEY_ACCOUNT = "account"; + private static final String INTENT_EXTRA_BUTTON_TEXT = "button_text"; @NonNull private ArrayList<Throwable> throwables = new ArrayList<>(); + @Nullable + private Account account; + @Override public void onAttach(@NonNull Context context) { super.onAttach(context); @@ -53,6 +61,10 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { if (throwablesArgument != null) { throwables.addAll((ArrayList<Throwable>) throwablesArgument); } + final Object accountArgument = args.getSerializable(KEY_ACCOUNT); + if (accountArgument != null) { + this.account = (Account) accountArgument; + } } if (throwables.size() == 0) { throwables.add(new IllegalArgumentException("Did not receive any exception in " + ExceptionDialogFragment.class.getSimpleName())); @@ -67,7 +79,7 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { final TipsAdapter adapter = new TipsAdapter(); - final String debugInfos = ExceptionUtil.getDebugInfos(requireContext(), throwables); + final String debugInfos = ExceptionUtil.getDebugInfos(requireContext(), throwables, account); binding.tips.setAdapter(adapter); binding.statusMessage.setText(throwables.get(0).getLocalizedMessage()); @@ -78,7 +90,10 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { 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); - adapter.add(R.string.error_dialog_tip_clear_storage); + Intent intent = new Intent(android.provider.Settings.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); } else if (t instanceof NextcloudFilesAppNotSupportedException) { adapter.add(R.string.error_dialog_tip_files_outdated); } else if (t instanceof NextcloudApiNotRespondingException) { @@ -86,7 +101,7 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { 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); + adapter.add(R.string.error_dialog_timeout_toggle, new Intent(android.provider.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) { @@ -96,7 +111,13 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { adapter.add(R.string.error_dialog_redirect); break; case 500: - adapter.add(R.string.error_dialog_check_server_logs); + if (account != null) { + adapter.add(R.string.error_dialog_check_server_logs, new Intent(Intent.ACTION_VIEW) + .putExtra(INTENT_EXTRA_BUTTON_TEXT, R.string.error_action_server_logs) + .setData(Uri.parse(account.getUrl() + getString(R.string.url_fragment_server_logs)))); + } else { + adapter.add(R.string.error_dialog_check_server_logs); + } break; case 503: adapter.add(R.string.error_dialog_check_maintenance); @@ -119,19 +140,12 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { .create(); } - public static DialogFragment newInstance(ArrayList<Throwable> exceptions) { - final Bundle args = new Bundle(); - args.putSerializable(KEY_THROWABLES, exceptions); - final DialogFragment fragment = new ExceptionDialogFragment(); - fragment.setArguments(args); - return fragment; - } - - public static DialogFragment newInstance(Throwable exception) { + public static DialogFragment newInstance(Throwable exception, @Nullable Account account) { final Bundle args = new Bundle(); final ArrayList<Throwable> list = new ArrayList<>(1); list.add(exception); args.putSerializable(KEY_THROWABLES, list); + args.putSerializable(KEY_ACCOUNT, account); final DialogFragment fragment = new ExceptionDialogFragment(); fragment.setArguments(args); return fragment; @@ -183,10 +197,19 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { public void bind(TipsModel tip) { binding.tip.setText(tip.text); - if(tip.primaryAction == null) { + if (tip.primaryAction != null && tip.primaryAction.hasExtra(INTENT_EXTRA_BUTTON_TEXT)) { + binding.actionPrimary.setVisibility(View.VISIBLE); + binding.actionPrimary.setText(tip.primaryAction.getIntExtra(INTENT_EXTRA_BUTTON_TEXT, 0)); + binding.actionPrimary.setOnClickListener((v) -> binding.getRoot().getRootView().getContext().startActivity(tip.primaryAction)); + } else { binding.actionPrimary.setVisibility(View.GONE); + } + if (tip.secondaryAction != null && tip.secondaryAction.hasExtra(INTENT_EXTRA_BUTTON_TEXT)) { + binding.actionSecondary.setVisibility(View.VISIBLE); + binding.actionSecondary.setText(tip.secondaryAction.getIntExtra(INTENT_EXTRA_BUTTON_TEXT, 0)); + binding.actionSecondary.setOnClickListener((v) -> binding.getRoot().getRootView().getContext().startActivity(tip.secondaryAction)); } else { - binding.actionPrimary.setVisibility(View.VISIBLE); + binding.actionSecondary.setVisibility(View.GONE); } } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/ExceptionUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/ExceptionUtil.java index 581313246..977463177 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/ExceptionUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/ExceptionUtil.java @@ -5,6 +5,7 @@ import android.content.pm.PackageManager; import android.os.Build; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.UiThread; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotInstalledException; @@ -13,12 +14,12 @@ import com.nextcloud.android.sso.ui.UiExceptionManager; import java.io.PrintWriter; import java.io.StringWriter; -import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.List; import it.niedermann.nextcloud.deck.BuildConfig; import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.model.Account; public class ExceptionUtil { @@ -26,15 +27,15 @@ public class ExceptionUtil { } - public static String getDebugInfos(Context context, Throwable throwable) { + public static String getDebugInfos(@NonNull Context context, Throwable throwable, @Nullable Account account) { List<Throwable> throwables = new ArrayList<>(); throwables.add(throwable); - return getDebugInfos(context, throwables); + return getDebugInfos(context, throwables, account); } - public static String getDebugInfos(Context context, List<Throwable> throwables) { + public static String getDebugInfos(@NonNull Context context, @NonNull List<Throwable> throwables, @Nullable Account account) { StringBuilder debugInfos = new StringBuilder("" - + getAppVersions(context) + + getAppVersions(context, account) + "\n\n---\n" + getDeviceInfos() + "\n\n---" @@ -45,12 +46,17 @@ public class ExceptionUtil { return debugInfos.toString(); } - private static String getAppVersions(Context context) { + private static String getAppVersions(Context context, @Nullable Account account) { String versions = "" + "App Version: " + BuildConfig.VERSION_NAME + "\n" + "App Version Code: " + BuildConfig.VERSION_CODE + "\n" + "App Flavor: " + BuildConfig.FLAVOR + "\n"; + if (account != null) { + versions += "\n"; + versions += "Server Version: " + account.getServerDeckVersion() + "\n"; + } + try { versions += "\nFiles App Version Code: " + VersionCheckHelper.getNextcloudFilesVersionCode(context); } catch (PackageManager.NameNotFoundException e) { |