package com.door43.translationstudio.tasks;
import com.door43.tools.reporting.GithubReporter;
import com.door43.tools.reporting.GlobalExceptionHandler;
import com.door43.translationstudio.R;
import com.door43.translationstudio.AppContext;
import com.door43.util.FileUtilities;
import com.door43.util.tasks.ManagedTask;
import java.io.File;
import java.io.IOException;
/**
* This task submits the latest crash report to github
*/
public class UploadCrashReportTask extends ManagedTask {
public static final String TASK_ID = "upload_crash_report_task";
private final String mMessage;
private int mMaxProgress = 100;
public UploadCrashReportTask(String message) {
mMessage = message;
}
@Override
public void start() {
File stacktraceDir = new File(AppContext.getPublicDirectory(), AppContext.context().STACKTRACE_DIR);
File logFile = new File(AppContext.getPublicDirectory(), "log.txt");
int githubTokenIdentifier = AppContext.context().getResources().getIdentifier("github_oauth2", "string", AppContext.context().getPackageName());
String githubUrl = AppContext.context().getResources().getString(R.string.github_bug_report_repo);
// TRICKY: make sure the github_oauth2 token has been set
if(githubTokenIdentifier != 0) {
GithubReporter reporter = new GithubReporter(AppContext.context(), githubUrl, AppContext.context().getResources().getString(githubTokenIdentifier));
String[] stacktraces = GlobalExceptionHandler.getStacktraces(stacktraceDir);
if (stacktraces.length > 0) {
// upload most recent stacktrace
reporter.reportCrash(mMessage, new File(stacktraces[0]), logFile);
// empty the log
try {
FileUtilities.writeStringToFile(logFile, "");
} catch (IOException e) {
e.printStackTrace();
}
archiveStackTraces(stacktraceDir, stacktraces);
}
}
}
/**
* archive the stack traces
* @param stacktraceDir
* @param stacktraces
*/
private static void archiveStackTraces(File stacktraceDir, String[] stacktraces) {
// archive extra stacktraces
File archiveDir = new File(stacktraceDir, "archive");
archiveDir.mkdirs();
for (String filePath:stacktraces) {
File traceFile = new File(filePath);
if (traceFile.exists()) {
FileUtilities.moveOrCopy(traceFile, new File(archiveDir, traceFile.getName()));
if(traceFile.exists()) {
traceFile.delete();
}
}
}
}
/**
* move error files into archive
*/
public static void archiveErrorLogs() {
File stacktraceDir = new File(AppContext.getPublicDirectory(), AppContext.context().STACKTRACE_DIR);
String[] stacktraces = GlobalExceptionHandler.getStacktraces(stacktraceDir);
if(stacktraces.length > 0) {
archiveStackTraces(stacktraceDir, stacktraces);
}
}
@Override
public int maxProgress() {
return mMaxProgress;
}
}