1package eu.siacs.conversations.utils;
2
3import java.io.BufferedReader;
4import java.io.FileInputStream;
5import java.io.FileNotFoundException;
6import java.io.IOException;
7import java.io.InputStreamReader;
8import java.util.List;
9
10import eu.siacs.conversations.R;
11import eu.siacs.conversations.entities.Account;
12import eu.siacs.conversations.entities.Conversation;
13import eu.siacs.conversations.entities.Message;
14import eu.siacs.conversations.services.XmppConnectionService;
15import android.app.AlertDialog;
16import android.content.Context;
17import android.content.DialogInterface;
18import android.content.SharedPreferences;
19import android.content.DialogInterface.OnClickListener;
20import android.preference.PreferenceManager;
21import android.util.Log;
22
23public class ExceptionHelper {
24 public static void init(Context context) {
25 if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof ExceptionHandler)) {
26 Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(context));
27 }
28 }
29
30 public static void checkForCrash(Context context, final XmppConnectionService service) {
31 try {
32 final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
33 boolean neverSend = preferences.getBoolean("never_send",false);
34 if (neverSend) {
35 return;
36 }
37 FileInputStream file = context.openFileInput("stacktrace.txt");
38 InputStreamReader inputStreamReader = new InputStreamReader(
39 file);
40 BufferedReader bufferedReader = new BufferedReader(
41 inputStreamReader);
42 final StringBuilder stacktrace = new StringBuilder();
43 String line;
44 while((line = bufferedReader.readLine()) != null) {
45 stacktrace.append(line);
46 stacktrace.append('\n');
47 }
48 file.close();
49 context.deleteFile("stacktrace.txt");
50 AlertDialog.Builder builder = new AlertDialog.Builder(context);
51 builder.setTitle(context.getString(R.string.crash_report_title));
52 builder.setMessage(context.getText(R.string.crash_report_message));
53 builder.setPositiveButton(context.getText(R.string.send_now), new OnClickListener() {
54
55 @Override
56 public void onClick(DialogInterface dialog, int which) {
57 List<Account> accounts = service.getAccounts();
58 Account account = null;
59 for(int i = 0; i < accounts.size(); ++i) {
60 if (!accounts.get(i).isOptionSet(Account.OPTION_DISABLED)) {
61 account = accounts.get(i);
62 break;
63 }
64 }
65 if (account!=null) {
66 Log.d("xmppService","using account="+account.getJid()+" to send in stack trace");
67 Conversation conversation = service.findOrCreateConversation(account, "bugs@siacs.eu", false);
68 Message message = new Message(conversation, stacktrace.toString(), Message.ENCRYPTION_NONE);
69 service.sendMessage(message, null);
70 }
71 }
72 });
73 builder.setNegativeButton(context.getText(R.string.send_never),new OnClickListener() {
74
75 @Override
76 public void onClick(DialogInterface dialog, int which) {
77 preferences.edit().putBoolean("never_send", true).commit();
78 }
79 });
80 builder.create().show();
81 } catch (FileNotFoundException e) {
82 return;
83 } catch (IOException e) {
84 return;
85 }
86
87 }
88}