package com.rafali.flickruploader;
import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import com.crashlytics.android.Crashlytics;
import com.rafali.common.STR;
import com.rafali.common.ToolString;
import com.rafali.flickruploader.api.FlickrApi;
import com.rafali.flickruploader.model.FlickrSet;
import com.rafali.flickruploader.model.Folder;
import com.rafali.flickruploader.model.Media;
import com.rafali.flickruploader.tool.Utils;
import org.androidannotations.api.BackgroundExecutor;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.nio.charset.Charset;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.android.LogcatAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import io.fabric.sdk.android.Fabric;
import se.emilsjolander.sprinkles.Migration;
import se.emilsjolander.sprinkles.Sprinkles;
public class FlickrUploader extends Application {
static final org.slf4j.Logger LOG = LoggerFactory.getLogger(FlickrUploader.class);
private static Context context;
@Override
public void onCreate() {
super.onCreate();
FlickrUploader.context = getApplicationContext();
getHandler();
try {
Sprinkles sprinkles = Sprinkles.init(getApplicationContext());
Migration initialMigration = new Migration();
initialMigration.createTable(Media.class);
initialMigration.createTable(FlickrSet.class);
initialMigration.createTable(Folder.class);
sprinkles.addMigration(initialMigration);
Sprinkles.getDatabase();
if (!Config.isDebug()) {
Fabric.with(this, new Crashlytics());
}
} catch (Throwable e) {
Log.e("Flickr Uploader", e.getMessage(), e);
}
BackgroundExecutor.execute(new Runnable() {
@Override
public void run() {
try {
initLogs();
final long previousVersionCode = Utils.getLongProperty(STR.versionCode);
if (Config.VERSION != previousVersionCode) {
Utils.saveAndroidDevice();
Utils.setLongProperty(STR.versionCode, (long) Config.VERSION);
if (previousVersionCode < 40) {
if (FlickrApi.isAuthentified()) {
FlickrApi.syncMedia();
}
}
}
} catch (Throwable e) {
LOG.error(ToolString.stack2string(e));
}
}
});
}
public static Context getAppContext() {
return context;
}
private static Handler handler;
public static Handler getHandler() {
if (handler == null) {
handler = new Handler();
}
return handler;
}
public static String getLogFilePath() {
return context.getFilesDir().getPath() + "/logs/flickruploader.log";
}
private static void initLogs() {
Logger logbackLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
LoggerContext lc = logbackLogger.getLoggerContext();
Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.detachAndStopAllAppenders();
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
rollingPolicy.setMaxHistory(3);
SizeAndTimeBasedFNATP<ILoggingEvent> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<ILoggingEvent>();
sizeAndTimeBasedFNATP.setMaxFileSize("2MB");
rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP);
rollingPolicy.setFileNamePattern(context.getFilesDir().getPath() + "/logs/old/flickruploader.%d{yyyy-MM-dd}.%i.log");
rollingPolicy.setContext(lc);
RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<ILoggingEvent>();
fileAppender.setContext(lc);
fileAppender.setFile(getLogFilePath());
fileAppender.setRollingPolicy(rollingPolicy);
fileAppender.setTriggeringPolicy(rollingPolicy);
rollingPolicy.setParent(fileAppender);
PatternLayoutEncoder pl = new PatternLayoutEncoder();
pl.setContext(lc);
pl.setCharset(Charset.defaultCharset());
pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %class{0}.%method:%L > %msg%n");
pl.setImmediateFlush(false);
pl.start();
fileAppender.setEncoder(pl);
fileAppender.setName("file");
rollingPolicy.start();
fileAppender.start();
if (Config.isDebug()) {
final PatternLayoutEncoder logcatTagPattern = new PatternLayoutEncoder();
logcatTagPattern.setContext(lc);
logcatTagPattern.setPattern("%class{0}");
logcatTagPattern.start();
final PatternLayoutEncoder logcatPattern = new PatternLayoutEncoder();
logcatPattern.setContext(lc);
logcatPattern.setPattern("[%thread] %method:%L > %msg%n");
logcatPattern.start();
final LogcatAppender logcatAppender = new LogcatAppender();
logcatAppender.setContext(lc);
logcatAppender.setTagEncoder(logcatTagPattern);
logcatAppender.setEncoder(logcatPattern);
logcatAppender.start();
rootLogger.addAppender(logcatAppender);
}
rootLogger.addAppender(fileAppender);
}
public static void flushLogs() {
try {
Logger logbackLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
LoggerContext lc = logbackLogger.getLoggerContext();
Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
Appender<ILoggingEvent> appender = rootLogger.getAppender("file");
appender.stop();
appender.start();
} catch (Throwable e) {
Log.e("Flickr Uploader", e.getMessage(), e);
}
}
public static void cleanLogs() {
try {
String path = context.getFilesDir().getPath() + "/logs/old";
File folder = new File(path);
if (folder.exists() && folder.isDirectory()) {
File[] listFiles = folder.listFiles();
if (listFiles != null) {
for (File file : listFiles) {
try {
if (System.currentTimeMillis() - file.lastModified() > 24 * 60 * 60 * 1000L)
file.delete();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
} catch (Throwable e) {
Log.e("Flickr Uploader", e.getMessage(), e);
}
}
public static long getLogSize() {
flushLogs();
return Utils.getFileSize(new File(context.getFilesDir().getPath() + "/logs/"));
}
public static void deleteAllLogs() {
Utils.deleteFiles(new File(context.getFilesDir().getPath() + "/logs/"));
initLogs();
}
}