package me.devsaki.hentoid;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.StandardExceptionParser;
import com.google.android.gms.analytics.Tracker;
import me.devsaki.hentoid.database.HentoidDB;
import me.devsaki.hentoid.enums.StatusContent;
import me.devsaki.hentoid.updater.UpdateCheck;
import me.devsaki.hentoid.util.ConstsPrefs;
import me.devsaki.hentoid.util.Helper;
import me.devsaki.hentoid.util.LogHelper;
/**
* Created by DevSaki on 20/05/2015.
* Initializes required components:
* Database, Bitmap Cache, Update checks, etc.
*/
public class HentoidApp extends Application {
private static final String TAG = LogHelper.makeLogTag(HentoidApp.class);
private static boolean beginImport;
private static boolean donePressed;
private static int downloadCount = 0;
private static HentoidApp instance;
private static SharedPreferences sharedPrefs;
// Only for use when activity context cannot be passed or used e.g.;
// Notification resources, Analytics, etc.
public static synchronized HentoidApp getInstance() {
return instance;
}
public static SharedPreferences getSharedPrefs() {
return sharedPrefs;
}
public static Context getAppContext() {
return instance.getApplicationContext();
}
public static int getDownloadCount() {
return downloadCount;
}
public static void setDownloadCount(int downloadCount) {
HentoidApp.downloadCount = downloadCount;
}
public static void downloadComplete() {
HentoidApp.downloadCount++;
}
public static boolean isImportComplete() {
return !beginImport;
}
public static void setBeginImport(boolean started) {
HentoidApp.beginImport = started;
}
public static boolean isDonePressed() {
return donePressed;
}
public static void setDonePressed(boolean pressed) {
HentoidApp.donePressed = pressed;
}
private synchronized Tracker getGoogleAnalyticsTracker() {
return AnalyticsTrackers.get(this, AnalyticsTrackers.Target.APP);
}
/***
* Tracking screen view
*
* @param screenName screen name to be displayed on GA dashboard
*/
public void trackScreenView(String screenName) {
Tracker tracker = getGoogleAnalyticsTracker();
// Set screen name.
tracker.setScreenName(screenName);
// Send a screen view.
tracker.send(new HitBuilders.ScreenViewBuilder().build());
GoogleAnalytics.getInstance(this).dispatchLocalHits();
}
/***
* Tracking exception
* Note: LogHelper will track exceptions as well,
* so no need to call if making use of LogHelper with a throwable.
*
* @param e exception to be tracked
*/
public void trackException(Exception e) {
if (e != null) {
Tracker tracker = getGoogleAnalyticsTracker();
tracker.send(new HitBuilders.ExceptionBuilder()
.setDescription(new StandardExceptionParser(this, null)
.getDescription(Thread.currentThread().getName(), e))
.setFatal(false)
.build()
);
}
}
/***
* Tracking event
*
* @param category event category
* @param action action of the event
* @param label label
*/
public void trackEvent(String category, String action, String label) {
Tracker tracker = getGoogleAnalyticsTracker();
// Build and send an Event.
tracker.send(new HitBuilders.EventBuilder().setCategory(category).setAction(action)
.setLabel(label).build());
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
AnalyticsTrackers.get(this, AnalyticsTrackers.Target.APP);
// When dry run is set, hits will not be dispatched,
// but will still be logged as though they were dispatched.
GoogleAnalytics.getInstance(this).setDryRun(BuildConfig.DEBUG);
// Analytics Opt-Out
GoogleAnalytics.getInstance(this).setAppOptOut(sharedPrefs.getBoolean(
ConstsPrefs.PREF_ANALYTICS_TRACKING, false));
sharedPrefs.registerOnSharedPreferenceChangeListener((sp, key) -> {
if (key.equals(ConstsPrefs.PREF_ANALYTICS_TRACKING)) {
GoogleAnalytics.getInstance(getAppContext()).setAppOptOut(
sp.getBoolean(key, false));
}
});
Helper.queryPrefsKey(this);
Helper.ignoreSslErrors();
HentoidDB db = HentoidDB.getInstance(this);
LogHelper.d(TAG, "Content item(s) count: " + db.getContentCount());
db.updateContentStatus(StatusContent.PAUSED, StatusContent.DOWNLOADING);
UpdateCheck(!Helper.getMobileUpdatePrefs());
}
private void UpdateCheck(boolean onlyWifi) {
UpdateCheck.getInstance().checkForUpdate(this,
onlyWifi, false, new UpdateCheck.UpdateCheckCallback() {
@Override
public void noUpdateAvailable() {
LogHelper.d(TAG, "Update Check: No update.");
}
@Override
public void onUpdateAvailable() {
LogHelper.d(TAG, "Update Check: Update!");
}
});
}
}