ExceptionHandler.java

 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}