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.content.pm.PackageInfo;
21import android.content.pm.PackageManager;
22import android.content.pm.PackageManager.NameNotFoundException;
23import android.preference.PreferenceManager;
24import android.text.format.DateUtils;
25import android.util.Log;
26
27public class ExceptionHelper {
28 public static void init(Context context) {
29 if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof ExceptionHandler)) {
30 Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(context));
31 }
32 }
33
34 public static void checkForCrash(Context context, final XmppConnectionService service) {
35 try {
36 final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
37 boolean neverSend = preferences.getBoolean("never_send",false);
38 if (neverSend) {
39 return;
40 }
41 List<Account> accounts = service.getAccounts();
42 Account account = null;
43 for(int i = 0; i < accounts.size(); ++i) {
44 if (!accounts.get(i).isOptionSet(Account.OPTION_DISABLED)) {
45 account = accounts.get(i);
46 break;
47 }
48 }
49 if (account==null) {
50 return;
51 }
52 final Account finalAccount = account;
53 FileInputStream file = context.openFileInput("stacktrace.txt");
54 InputStreamReader inputStreamReader = new InputStreamReader(
55 file);
56 BufferedReader stacktrace = new BufferedReader(
57 inputStreamReader);
58 final StringBuilder report = new StringBuilder();
59 PackageManager pm = context.getPackageManager();
60 PackageInfo packageInfo = null;
61 try {
62 packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
63 report.append("Version: "+packageInfo.versionName+'\n');
64 report.append("Last Update: "+DateUtils.formatDateTime(context, packageInfo.lastUpdateTime, DateUtils.FORMAT_SHOW_TIME|DateUtils.FORMAT_SHOW_DATE)+'\n');
65 } catch (NameNotFoundException e) {}
66 String line;
67 while((line = stacktrace.readLine()) != null) {
68 report.append(line);
69 report.append('\n');
70 }
71 file.close();
72 context.deleteFile("stacktrace.txt");
73 AlertDialog.Builder builder = new AlertDialog.Builder(context);
74 builder.setTitle(context.getString(R.string.crash_report_title));
75 builder.setMessage(context.getText(R.string.crash_report_message));
76 builder.setPositiveButton(context.getText(R.string.send_now), new OnClickListener() {
77
78 @Override
79 public void onClick(DialogInterface dialog, int which) {
80
81 Log.d("xmppService","using account="+finalAccount.getJid()+" to send in stack trace");
82 Conversation conversation = service.findOrCreateConversation(finalAccount, "bugs@siacs.eu", false);
83 Message message = new Message(conversation, report.toString(), Message.ENCRYPTION_NONE);
84 service.sendMessage(message);
85 }
86 });
87 builder.setNegativeButton(context.getText(R.string.send_never),new OnClickListener() {
88
89 @Override
90 public void onClick(DialogInterface dialog, int which) {
91 preferences.edit().putBoolean("never_send", true).commit();
92 }
93 });
94 builder.create().show();
95 } catch (FileNotFoundException e) {
96 return;
97 } catch (IOException e) {
98 return;
99 }
100
101 }
102}