summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java
diff options
context:
space:
mode:
authorSamuel Holland <samuel@sholland.org>2018-01-08 04:33:37 -0600
committerSamuel Holland <samuel@sholland.org>2018-01-08 04:33:54 -0600
commitc4e91f8040968ad51ffccbd2ef9f17d4d322f579 (patch)
tree2c9a776734c959af09e2f8718f1b49c7e64aa9c7 /app/src/main/java
parentc40555c1bd25ed1c832004e01438ec170ba93712 (diff)
Handle tunnel state change errors appropriately
This class should probably be renamed and moved, but I don't know to what or where. Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/wireguard/android/fragment/TunnelController.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/fragment/TunnelController.java b/app/src/main/java/com/wireguard/android/fragment/TunnelController.java
new file mode 100644
index 00000000..668e74c0
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/fragment/TunnelController.java
@@ -0,0 +1,71 @@
+package com.wireguard.android.fragment;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.databinding.DataBindingUtil;
+import android.databinding.ViewDataBinding;
+import android.system.ErrnoException;
+import android.system.OsConstants;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+
+import com.commonsware.cwac.crossport.design.widget.Snackbar;
+import com.wireguard.android.R;
+import com.wireguard.android.databinding.TunnelDetailFragmentBinding;
+import com.wireguard.android.databinding.TunnelListItemBinding;
+import com.wireguard.android.model.Tunnel;
+import com.wireguard.android.model.Tunnel.State;
+import com.wireguard.android.util.ExceptionLoggers;
+
+/**
+ * Helper method shared by TunnelListFragment and TunnelDetailFragment.
+ */
+
+public final class TunnelController {
+ private static final String TAG = TunnelController.class.getSimpleName();
+
+ private TunnelController() {
+ // Prevent instantiation.
+ }
+
+ public static void setTunnelState(final View view, final boolean checked) {
+ final ViewDataBinding binding = DataBindingUtil.findBinding(view);
+ final Tunnel tunnel;
+ if (binding instanceof TunnelDetailFragmentBinding)
+ tunnel = ((TunnelDetailFragmentBinding) binding).getTunnel();
+ else if (binding instanceof TunnelListItemBinding)
+ tunnel = ((TunnelListItemBinding) binding).getItem();
+ else
+ tunnel = null;
+ if (tunnel == null) {
+ Log.e(TAG, "setChecked() from a null tunnel", new IllegalStateException());
+ return;
+ }
+ tunnel.setState(State.of(checked)).whenComplete((state, throwable) -> {
+ if (throwable == null)
+ return;
+ Log.e(TAG, "Cannot set state of tunnel " + tunnel.getName(), throwable);
+ final Context context = view.getContext();
+ if (throwable instanceof ErrnoException
+ && ((ErrnoException) throwable).errno == OsConstants.ENODEV) {
+ final String message = context.getString(R.string.not_supported_message);
+ final AlertDialog dialog = new AlertDialog.Builder(context)
+ .setMessage(Html.fromHtml(message))
+ .setPositiveButton(R.string.ok, null)
+ .setTitle(R.string.not_supported_title)
+ .show();
+ // Make links work.
+ ((TextView) dialog.findViewById(android.R.id.message))
+ .setMovementMethod(LinkMovementMethod.getInstance());
+ } else {
+ final String message =
+ context.getString(checked ? R.string.error_up : R.string.error_down) + ": "
+ + ExceptionLoggers.unwrap(throwable).getMessage();
+ Snackbar.make(view, message, Snackbar.LENGTH_LONG).show();
+ }
+ });
+ }
+}