From 2e7b56cf48ecc0e450be43df4258b5861c9526ec Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 17 Dec 2014 01:53:05 +0000 Subject: [PATCH] Proper error page --- .../i2p/bote/android/NetworkInfoFragment.java | 103 +++++++++++++++--- .../res/layout/fragment_network_error.xml | 76 +++++++++++++ .../main/res/layout/fragment_network_info.xml | 6 - app/src/main/res/values/strings.xml | 6 + 4 files changed, 171 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/layout/fragment_network_error.xml diff --git a/app/src/main/java/i2p/bote/android/NetworkInfoFragment.java b/app/src/main/java/i2p/bote/android/NetworkInfoFragment.java index 5713a4b..fb79fe4 100644 --- a/app/src/main/java/i2p/bote/android/NetworkInfoFragment.java +++ b/app/src/main/java/i2p/bote/android/NetworkInfoFragment.java @@ -1,17 +1,25 @@ package i2p.bote.android; +import android.content.Context; import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import com.androidplot.pie.PieChart; import com.androidplot.pie.Segment; import com.androidplot.pie.SegmentFormatter; +import net.i2p.android.ui.I2PAndroidHelper; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Collection; import java.util.List; import java.util.Set; @@ -24,6 +32,8 @@ import i2p.bote.network.RelayPeer; import static i2p.bote.Util._; public class NetworkInfoFragment extends Fragment { + private Exception mConnectError; + private PieChart mKademliaPie; private TextView mKademliaPeers; private PieChart mRelayPie; @@ -31,29 +41,54 @@ public class NetworkInfoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_network_info, container, false); + Bundle savedInstanceState) { + mConnectError = I2PBote.getInstance().getConnectError(); + if (mConnectError == null) + return inflater.inflate(R.layout.fragment_network_info, container, false); + else + return inflater.inflate(R.layout.fragment_network_error, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mKademliaPie = (PieChart) view.findViewById(R.id.kademlia_peers_pie); - mKademliaPeers = (TextView) view.findViewById(R.id.kademlia_peers); - mRelayPie = (PieChart) view.findViewById(R.id.relay_peers_pie); - mRelayPeers = (TextView) view.findViewById(R.id.relay_peers); + if (mConnectError == null) { + mKademliaPie = (PieChart) view.findViewById(R.id.kademlia_peers_pie); + mKademliaPeers = (TextView) view.findViewById(R.id.kademlia_peers); + mRelayPie = (PieChart) view.findViewById(R.id.relay_peers_pie); + mRelayPeers = (TextView) view.findViewById(R.id.relay_peers); - setupKademliaPeers(); - setupRelayPeers(); + setupKademliaPeers(); + setupRelayPeers(); - Collection bannedPeers = I2PBote.getInstance().getBannedPeers(); - ((TextView) view.findViewById(R.id.banned_peers)).setText( - "" + bannedPeers.size()); + Collection bannedPeers = I2PBote.getInstance().getBannedPeers(); + ((TextView) view.findViewById(R.id.banned_peers)).setText( + "" + bannedPeers.size()); + } else { + ((TextView) view.findViewById(R.id.error)).setText(mConnectError.toString()); - Exception e = I2PBote.getInstance().getConnectError(); - if (e != null) - ((TextView) view.findViewById(R.id.error)).setText(e.toString()); + view.findViewById(R.id.copy_error).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String fullError = joinStackTrace(mConnectError); + Object clipboardService = getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) clipboardService; + clipboard.setText(fullError); + } else { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) clipboardService; + android.content.ClipData clip = android.content.ClipData.newPlainText( + getString(R.string.bote_connection_error), fullError); + clipboard.setPrimaryClip(clip); + } + Toast.makeText(getActivity(), R.string.full_error_copied_to_clipboard, Toast.LENGTH_SHORT).show(); + } + }); + + if ((new I2PAndroidHelper(getActivity())).isI2PAndroidInstalled()) + view.findViewById(R.id.error_page_i2p_content).setVisibility(View.VISIBLE); + } } private void setupSegmentFormatter(SegmentFormatter sf) { @@ -165,4 +200,44 @@ public class NetworkInfoFragment extends Fragment { mRelayPie.getBorderPaint().setColor(Color.TRANSPARENT); mRelayPie.getBackgroundPaint().setColor(Color.TRANSPARENT); } + + private static String joinStackTrace(Throwable e) { + StringWriter writer = null; + try { + writer = new StringWriter(); + joinStackTrace(e, writer); + return writer.toString(); + } + finally { + if (writer != null) + try { + writer.close(); + } catch (IOException e1) { + // ignore + } + } + } + + private static void joinStackTrace(Throwable e, StringWriter writer) { + PrintWriter printer = null; + try { + printer = new PrintWriter(writer); + + while (e != null) { + + printer.println(e); + StackTraceElement[] trace = e.getStackTrace(); + for (int i = 0; i < trace.length; i++) + printer.println("\tat " + trace[i]); + + e = e.getCause(); + if (e != null) + printer.println("Caused by:\r\n"); + } + } + finally { + if (printer != null) + printer.close(); + } + } } diff --git a/app/src/main/res/layout/fragment_network_error.xml b/app/src/main/res/layout/fragment_network_error.xml new file mode 100644 index 0000000..b8bdbdd --- /dev/null +++ b/app/src/main/res/layout/fragment_network_error.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_network_info.xml b/app/src/main/res/layout/fragment_network_info.xml index 11f5ce1..375a3b1 100644 --- a/app/src/main/res/layout/fragment_network_info.xml +++ b/app/src/main/res/layout/fragment_network_info.xml @@ -78,11 +78,5 @@ android:text="0" android:textAppearance="@style/TextAppearance.AppCompat.Primary"/> - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 316927a..742e9e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,6 +152,12 @@ Unreliable Untested Banned Peers: + Oh dear! Bote couldn\'t connect to the network. + This is the error that happened: + You can fix most problems by restarting Bote. To do this, go back to the main Bote page, then click "Disconnect from network" in the menu, and then click "Connect to network" in the menu again. + If that doesn\'t help, check that I2P is running. You can see I2P\'s current status in the notification drawer, or by opening the I2P app. If it isn\'t running properly, restart I2P (in the app, click "Stop", and then click "Start" when it appears). Wait for I2P to be fully running, and then star Bote. + Bote connection error + Full error copied to clipboard General General settings and default identity settings Auto-check mail