package com.automattic.simplenote; import android.app.Activity; import android.app.Application; import android.content.ComponentCallbacks2; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatDelegate; import com.automattic.simplenote.analytics.AnalyticsTracker; import com.automattic.simplenote.analytics.AnalyticsTrackerGoogleAnalytics; import com.automattic.simplenote.analytics.AnalyticsTrackerNosara; import com.automattic.simplenote.models.Note; import com.automattic.simplenote.models.NoteCountIndexer; import com.automattic.simplenote.models.NoteTagger; import com.automattic.simplenote.models.Tag; import com.automattic.simplenote.utils.PrefUtils; import com.crashlytics.android.Crashlytics; import com.simperium.Simperium; import com.simperium.client.Bucket; import com.simperium.client.BucketNameInvalid; import org.wordpress.passcodelock.AppLockManager; import io.fabric.sdk.android.Fabric; public class Simplenote extends Application { private static final int TEN_SECONDS_MILLIS = 10000; // log tag public static final String TAG = "Simplenote"; // intent IDs public static final int INTENT_PREFERENCES = 1; public static final int INTENT_EDIT_NOTE = 2; public static final String DELETED_NOTE_ID = "deletedNoteId"; private static final String AUTH_PROVIDER = "simplenote.com"; private Simperium mSimperium; private Bucket<Note> mNotesBucket; private Bucket<Tag> mTagsBucket; public void onCreate() { super.onCreate(); if (!BuildConfig.DEBUG) { Fabric.with(this, new Crashlytics()); } AppLockManager.getInstance().enableDefaultAppLockIfAvailable(this); mSimperium = Simperium.newClient( BuildConfig.SIMPERIUM_APP_ID, BuildConfig.SIMPERIUM_APP_KEY, this ); mSimperium.setAuthProvider(AUTH_PROVIDER); try { mNotesBucket = mSimperium.bucket(new Note.Schema()); Tag.Schema tagSchema = new Tag.Schema(); tagSchema.addIndex(new NoteCountIndexer(mNotesBucket)); mTagsBucket = mSimperium.bucket(tagSchema); // Every time a note changes or is deleted we need to reindex the tag counts mNotesBucket.addListener(new NoteTagger(mTagsBucket)); } catch (BucketNameInvalid e) { throw new RuntimeException("Could not create bucket", e); } AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); ApplicationLifecycleMonitor applicationLifecycleMonitor = new ApplicationLifecycleMonitor(); registerComponentCallbacks(applicationLifecycleMonitor); registerActivityLifecycleCallbacks(applicationLifecycleMonitor); AnalyticsTracker.registerTracker(new AnalyticsTrackerGoogleAnalytics(this)); AnalyticsTracker.registerTracker(new AnalyticsTrackerNosara(this)); AnalyticsTracker.refreshMetadata(mSimperium.getUser().getEmail()); } @SuppressWarnings("unused") private boolean isFirstLaunch() { // NotesActivity sets this pref to false after first launch return PrefUtils.getBoolPref(this, PrefUtils.PREF_FIRST_LAUNCH, true); } public Simperium getSimperium() { return mSimperium; } public Bucket<Note> getNotesBucket() { return mNotesBucket; } public Bucket<Tag> getTagsBucket() { return mTagsBucket; } private class ApplicationLifecycleMonitor implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 { private boolean mIsInBackground = true; // ComponentCallbacks @Override public void onTrimMemory(int level) { if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { mIsInBackground = true; // Give the buckets some time to finish sync, then stop them new Handler().postDelayed(new Runnable() { @Override public void run() { if (!mIsInBackground) { return; } if (mNotesBucket != null) { mNotesBucket.stop(); } if (mTagsBucket != null) { mTagsBucket.stop(); } } }, TEN_SECONDS_MILLIS); // Send analytics if app is in the background AnalyticsTracker.track( AnalyticsTracker.Stat.APPLICATION_CLOSED, AnalyticsTracker.CATEGORY_USER, "application_closed" ); AnalyticsTracker.flush(); } else { mIsInBackground = false; } } @Override public void onConfigurationChanged(Configuration newConfig) { } @Override public void onLowMemory() { } // ActivityLifeCycle callbacks @Override public void onActivityResumed(Activity activity) { if (mIsInBackground) { AnalyticsTracker.track( AnalyticsTracker.Stat.APPLICATION_OPENED, AnalyticsTracker.CATEGORY_USER, "application_opened" ); mIsInBackground = false; } } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } } }