package org.acra.legacy;
import android.content.Context;
import android.support.annotation.NonNull;
import org.acra.ACRA;
import org.acra.ACRAConstants;
import org.acra.file.CrashReportFileNameParser;
import org.acra.file.ReportLocator;
import java.io.File;
import java.io.FilenameFilter;
import static org.acra.ACRA.LOG_TAG;
/**
* Migrates reports from the pre 4.8.0 location to the 4.8.0+ locations.
*/
final class ReportMigrator {
private final Context context;
private final CrashReportFileNameParser fileNameParser = new CrashReportFileNameParser();
@NonNull
private final ReportLocator reportLocator;
ReportMigrator(@NonNull Context context) {
this.context = context;
this.reportLocator = new ReportLocator(context);
}
void migrate() {
ACRA.log.i(LOG_TAG, "Migrating unsent ACRA reports to new file locations");
final File[] reportFiles = getCrashReportFiles();
for (final File file : reportFiles) {
// Move it to unapproved or approved folders.
final String fileName = file.getName();
if (fileNameParser.isApproved(fileName)) {
if (file.renameTo(new File(reportLocator.getApprovedFolder(), fileName))) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Cold not migrate unsent ACRA crash report : " + fileName);
}
} else {
if (file.renameTo(new File(reportLocator.getUnapprovedFolder(), fileName))) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Cold not migrate unsent ACRA crash report : " + fileName);
}
}
}
ACRA.log.i(LOG_TAG, "Migrated " + reportFiles.length + " unsent reports");
}
/**
* Returns an array containing the names of pending crash report files.
*
* @return an array containing the names of pending crash report files.
*/
@NonNull
private File[] getCrashReportFiles() {
final File dir = context.getFilesDir();
if (dir == null) {
ACRA.log.w(LOG_TAG, "Application files directory does not exist! The application may not be installed correctly. Please try reinstalling.");
return new File[0];
}
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Looking for error files in " + dir.getAbsolutePath());
// Filter for ".stacktrace" files
final FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, @NonNull String name) {
return name.endsWith(ACRAConstants.REPORTFILE_EXTENSION);
}
};
final File[] result = dir.listFiles(filter);
return (result == null) ? new File[0] : result;
}
}