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 List<Account> accounts = service.getAccounts();
38 Account account = null;
39 for(int i = 0; i < accounts.size(); ++i) {
40 if (!accounts.get(i).isOptionSet(Account.OPTION_DISABLED)) {
41 account = accounts.get(i);
42 break;
43 }
44 }
45 if (account==null) {
46 return;
47 }
48 final Account finalAccount = account;
49 FileInputStream file = context.openFileInput("stacktrace.txt");
50 InputStreamReader inputStreamReader = new InputStreamReader(
51 file);
52 BufferedReader bufferedReader = new BufferedReader(
53 inputStreamReader);
54 final StringBuilder stacktrace = new StringBuilder();
55 String line;
56 while((line = bufferedReader.readLine()) != null) {
57 stacktrace.append(line);
58 stacktrace.append('\n');
59 }
60 file.close();
61 context.deleteFile("stacktrace.txt");
62 AlertDialog.Builder builder = new AlertDialog.Builder(context);
63 builder.setTitle(context.getString(R.string.crash_report_title));
64 builder.setMessage(context.getText(R.string.crash_report_message));
65 builder.setPositiveButton(context.getText(R.string.send_now), new OnClickListener() {
66
67 @Override
68 public void onClick(DialogInterface dialog, int which) {
69
70 Log.d("xmppService","using account="+finalAccount.getJid()+" to send in stack trace");
71 Conversation conversation = service.findOrCreateConversation(finalAccount, "bugs@siacs.eu", false);
72 Message message = new Message(conversation, stacktrace.toString(), Message.ENCRYPTION_NONE);
73 service.sendMessage(message);
74 }
75 });
76 builder.setNegativeButton(context.getText(R.string.send_never),new OnClickListener() {
77
78 @Override
79 public void onClick(DialogInterface dialog, int which) {
80 preferences.edit().putBoolean("never_send", true).commit();
81 }
82 });
83 builder.create().show();
84 } catch (FileNotFoundException e) {
85 return;
86 } catch (IOException e) {
87 return;
88 }
89
90 }
91}