ExceptionHelper.java

 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}