package co.smartreceipts.android;
import android.app.Activity;
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.support.multidex.MultiDex;
import android.support.v4.app.Fragment;
import com.squareup.leakcanary.LeakCanary;
import com.tom_roush.pdfbox.util.PDFBoxResourceLoader;
import java.io.File;
import java.io.IOException;
import javax.inject.Inject;
import co.smartreceipts.android.aws.cognito.CognitoManager;
import co.smartreceipts.android.di.AppComponent;
import co.smartreceipts.android.di.BaseAppModule;
import co.smartreceipts.android.di.DaggerAppComponent;
import co.smartreceipts.android.ocr.OcrManager;
import co.smartreceipts.android.persistence.DatabaseHelper;
import co.smartreceipts.android.persistence.PersistenceManager;
import co.smartreceipts.android.purchases.PurchaseManager;
import co.smartreceipts.android.push.PushManager;
import co.smartreceipts.android.rating.data.AppRatingPreferencesStorage;
import co.smartreceipts.android.settings.versions.AppVersionManager;
import co.smartreceipts.android.settings.versions.VersionUpgradedListener;
import co.smartreceipts.android.utils.WBUncaughtExceptionHandler;
import co.smartreceipts.android.utils.cache.SmartReceiptsTemporaryFileCache;
import co.smartreceipts.android.utils.log.Logger;
import dagger.android.AndroidInjector;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.HasActivityInjector;
import dagger.android.HasServiceInjector;
import dagger.android.support.HasSupportFragmentInjector;
import wb.android.storage.SDCardStateException;
import wb.android.storage.StorageManager;
public class SmartReceiptsApplication extends Application implements VersionUpgradedListener,
HasActivityInjector, HasSupportFragmentInjector, HasServiceInjector {
@Inject
DispatchingAndroidInjector<Activity> activityInjector;
@Inject
DispatchingAndroidInjector<Fragment> supportFragmentInjector;
@Inject
DispatchingAndroidInjector<Service> serviceInjector;
@Inject
PersistenceManager persistenceManager;
@Inject
ExtraInitializer extraInitializer;
@Inject
PurchaseManager purchaseManager;
@Inject
PushManager pushManager;
@Inject
CognitoManager cognitoManager;
@Inject
OcrManager ocrManager;
@Inject
AppRatingPreferencesStorage appRatingPreferencesStorage;
private AppComponent appComponent;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
@Override
public void onCreate() {
super.onCreate();
configureLog();
appComponent = DaggerAppComponent.builder()
.baseAppModule(new BaseAppModule(this))
.build();
appComponent.inject(this);
WBUncaughtExceptionHandler.initialize();
Logger.debug(this, "\n\n\n\n Launching App...");
init();
}
public AppComponent getAppComponent() {
return appComponent;
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return activityInjector;
}
@Override
public DispatchingAndroidInjector<Fragment> supportFragmentInjector() {
return supportFragmentInjector;
}
@Override
public AndroidInjector<Service> serviceInjector() {
return serviceInjector;
}
private void init() {
pushManager.initialize();
purchaseManager.initialize(this);
cognitoManager.initialize();
ocrManager.initialize();
PDFBoxResourceLoader.init(getApplicationContext());
// Clear our cache
new SmartReceiptsTemporaryFileCache(this).resetCache();
// Check if a new version is available
new AppVersionManager(this, persistenceManager.getPreferenceManager()).onLaunch(this);
// Add launch count for rating prompt monitoring
appRatingPreferencesStorage.incrementLaunchCount();
// LeakCanary initialization
if (LeakCanary.isInAnalyzerProcess(this)) {
Logger.debug(this, "Ignoring this process as it's the LeakCanary analyzer one...");
} else {
LeakCanary.install(this);
}
extraInitializer.init();
}
private void configureLog() {
final String logDirPath = getFilesDir().getPath();
System.setProperty("LOG_DIR", logDirPath);
}
// This is called after _sdCard is available but before _db is
// This was added after version 78 (version 79 is the first "new" one)
// Make this a listener
@Override
public void onVersionUpgrade(int oldVersion, int newVersion) {
Logger.debug(this, "Upgrading the app from version {} to {}", oldVersion, newVersion);
if (oldVersion <= 78) {
try {
StorageManager external = persistenceManager.getExternalStorageManager();
File db = this.getDatabasePath(DatabaseHelper.DATABASE_NAME); // Internal db file
if (db != null && db.exists()) {
File sdDB = external.getFile("receipts.db");
if (sdDB.exists()) {
sdDB.delete();
}
Logger.debug(this, "Copying the database file from {} to {}", db.getAbsolutePath(), sdDB.getAbsolutePath());
try {
external.copy(db, sdDB, true);
} catch (IOException e) {
Logger.error(this, "Exception occurred when upgrading app version", e);
}
}
} catch (SDCardStateException e) {
Logger.warn(this, "Caught sd card exception", e);
}
}
}
}