1package eu.siacs.conversations.utils;
2
3import android.content.Context;
4import android.os.Build;
5
6import androidx.annotation.NonNull;
7
8import com.google.common.base.Joiner;
9import com.google.common.base.Strings;
10import com.google.common.collect.ImmutableList;
11
12import eu.siacs.conversations.BuildConfig;
13import eu.siacs.conversations.services.NotificationService;
14
15import java.io.IOException;
16import java.io.PrintWriter;
17import java.io.StringWriter;
18import java.lang.Thread.UncaughtExceptionHandler;
19import java.text.SimpleDateFormat;
20import java.util.Date;
21import java.util.List;
22import java.util.Locale;
23
24public class ExceptionHandler implements UncaughtExceptionHandler {
25
26 private static final SimpleDateFormat DATE_FORMAT =
27 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.ENGLISH);
28
29 private final UncaughtExceptionHandler defaultHandler;
30 private final Context context;
31
32 ExceptionHandler(final Context context) {
33 this.context = context;
34 this.defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
35 }
36
37 @Override
38 public void uncaughtException(@NonNull Thread thread, final Throwable throwable) {
39 NotificationService.cancelIncomingCallNotification(context);
40 final String stacktrace;
41 try (final StringWriter stringWriter = new StringWriter();
42 final PrintWriter printWriter = new PrintWriter(stringWriter)) {
43 throwable.printStackTrace(printWriter);
44 stacktrace = stringWriter.toString();
45 } catch (final IOException e) {
46 return;
47 }
48 final List<String> report =
49 ImmutableList.of(
50 String.format(
51 "Version: %s %s", BuildConfig.APP_NAME, BuildConfig.VERSION_NAME),
52 String.format("Manufacturer: %s", Strings.nullToEmpty(Build.MANUFACTURER)),
53 String.format("Device: %s", Strings.nullToEmpty(Build.DEVICE)),
54 String.format("Timestamp: %s", DATE_FORMAT.format(new Date())),
55 stacktrace);
56 ExceptionHelper.writeToStacktraceFile(context, Joiner.on("\n").join(report));
57 this.defaultHandler.uncaughtException(thread, throwable);
58 }
59}