package org.acra.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.support.annotation.NonNull;
import android.widget.Toast;
import org.acra.ACRA;
import org.acra.ReportingInteractionMode;
import org.acra.config.ACRAConfiguration;
import org.acra.file.BulkReportDeleter;
import org.acra.file.CrashReportFileNameParser;
import org.acra.file.ReportLocator;
import org.acra.prefs.PrefUtils;
import org.acra.prefs.SharedPreferencesFactory;
import org.acra.sender.SenderServiceStarter;
import java.io.File;
/**
* Looks for any existing reports and starts sending them.
*/
public final class ApplicationStartupProcessor {
private final Context context;
private final ACRAConfiguration config;
public ApplicationStartupProcessor(@NonNull Context context, @NonNull ACRAConfiguration config) {
this.context = context;
this.config = config;
}
/**
* Delete any old unsent reports if this is a newer version of the app than when we last started.
*/
public void deleteUnsentReportsFromOldAppVersion() {
final SharedPreferences prefs = new SharedPreferencesFactory(context, config).create();
final long lastVersionNr = prefs.getInt(ACRA.PREF_LAST_VERSION_NR, 0);
final int appVersion = getAppVersion();
if (appVersion > lastVersionNr) {
final BulkReportDeleter reportDeleter = new BulkReportDeleter(context);
reportDeleter.deleteReports(true, 0);
reportDeleter.deleteReports(false, 0);
final SharedPreferences.Editor prefsEditor = prefs.edit();
prefsEditor.putInt(ACRA.PREF_LAST_VERSION_NR, appVersion);
PrefUtils.save(prefsEditor);
}
}
/**
* Deletes all the unapproved reports except for the last one.
*
* NOTIFICATION or DIALOG mode require explicit approval by user.
* If latest notification/dialog has been ignored: neither accepted nor refused; they will accumulate.
* So destroy all unapproved reports bar the last one.
*/
public void deleteAllUnapprovedReportsBarOne() {
new BulkReportDeleter(context).deleteReports(false, 1);
}
/**
* If ReportingInteractionMode == Toast and at least one non silent report then show a Toast.
* All approved reports will be sent.
*/
public void sendApprovedReports() {
final ReportLocator reportLocator = new ReportLocator(context);
final File[] reportFiles = reportLocator.getApprovedReports();
if (reportFiles.length == 0) {
return; // There are no approved reports, so bail now.
}
if (config.reportingInteractionMode() == ReportingInteractionMode.TOAST && hasNonSilentApprovedReports(reportFiles)) {
ToastSender.sendToast(context, config.resToastText(), Toast.LENGTH_LONG);
}
// Send the approved reports.
final SenderServiceStarter starter = new SenderServiceStarter(context, config);
starter.startService(false, false);
}
/**
* @return app version or 0 if PackageInfo was not available.
*/
private int getAppVersion() {
final PackageManagerWrapper packageManagerWrapper = new PackageManagerWrapper(context);
final PackageInfo packageInfo = packageManagerWrapper.getPackageInfo();
return (packageInfo == null) ? 0 : packageInfo.versionCode;
}
private boolean hasNonSilentApprovedReports(File[] reportFiles) {
final CrashReportFileNameParser fileNameParser = new CrashReportFileNameParser();
for (final File file : reportFiles) {
if (!fileNameParser.isSilent(file.getName())) {
return true;
}
}
return false;
}
}