package com.etiennelawlor.loop;
import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;
import android.support.v7.app.AppCompatDelegate;
import android.util.Log;
import com.flurry.android.FlurryAgent;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
import java.io.File;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import timber.log.Timber;
/**
* Created by etiennelawlor on 5/23/15.
*/
public class LoopApplication extends Application {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
// region Static Variables
private static LoopApplication currentApplication = null;
// endregion
// region Member Variables
private RefWatcher refWatcher;
// endregion
// region Lifecycle Methods
@Override
public void onCreate() {
super.onCreate();
currentApplication = this;
// initializeFabric();
initializeLeakCanary();
initializeTimber();
initializeFlurry();
initializeRealm();
}
// endregion
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
// region Helper Methods
public static LoopApplication getInstance() {
return currentApplication;
}
public static File getCacheDirectory() {
return currentApplication.getCacheDir();
}
public static RefWatcher getRefWatcher(Context context) {
LoopApplication application = (LoopApplication) context.getApplicationContext();
return application.refWatcher;
}
// private void initializeFabric(){
// if (!Fabric.isInitialized()) {
// final Fabric fabric = new Fabric.Builder(this)
// .kits(new Crashlytics())
// .debuggable(true)
// .build();
//
// Fabric.with(fabric);
// }
// }
private void initializeLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
refWatcher = LeakCanary.install(this);
}
private void initializeTimber(){
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree() {
// Add the line number to the tag
@Override
protected String createStackElementTag(StackTraceElement element) {
return String.format("[Line - %s] [Method - %s] [Class - %s]",
element.getLineNumber(),
element.getMethodName(),
super.createStackElementTag(element));
}
});
} else {
Timber.plant(new ReleaseTree());
}
}
private void initializeFlurry(){
FlurryAgent.setLogEnabled(false);
FlurryAgent.init(this, getString(R.string.flurry_api_key));
}
private void initializeRealm(){
Realm.init(this);
RealmConfiguration config =
new RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(config);
}
// endregion
// region Inner Classes
/** A tree which logs important information for crash reporting. */
private static class ReleaseTree extends Timber.Tree {
private static final int MAX_LOG_LENGTH = 4000;
@Override
protected boolean isLoggable(int priority) {
if(priority == Log.VERBOSE || priority == Log.DEBUG){
return false;
}
// Only log WARN, INFO, ERROR, WTF
return true;
}
@Override
protected void log(int priority, String tag, String message, Throwable t) {
if(isLoggable(priority)){
// FakeCrashLibrary.log(priority, tag, message);
//
// if (t != null) {
// if (priority == Log.ERROR) {
// FakeCrashLibrary.logError(t);
// } else if (priority == Log.WARN) {
// FakeCrashLibrary.logWarning(t);
// }
// }
// Crashlytics.log(priority, tag, message);
//
// if (t != null) {
// if (priority == Log.ERROR) {
// Crashlytics.logException(t);
// } else if (priority == Log.INFO) {
// Crashlytics.log(message);
// }
// }
// Message is short enough, does not need to be broken into chunks
if(message.length() < MAX_LOG_LENGTH){
if(priority == Log.ASSERT) {
Log.wtf(tag, message);
} else {
Log.println(priority, tag, message);
}
return;
}
// Split by line, then ensure each line can fit into Log's maximum length
for(int i=0, length = message.length(); i<length; i++) {
int newline = message.indexOf('\n', i);
newline = newline != -1 ? newline : length;
do {
int end = Math.min(newline, i + MAX_LOG_LENGTH);
String part = message.substring(i, end);
if(priority == Log.ASSERT) {
Log.wtf(tag, part);
} else {
Log.println(priority, tag, part);
}
i = end;
} while (i < newline);
}
}
}
}
// endregion
}