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			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}