package com.kickstarter.libs.utils; import android.app.Activity; import android.app.Application; import android.content.ComponentCallbacks2; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.facebook.appevents.AppEventsLogger; import com.kickstarter.KSApplication; import com.kickstarter.libs.CurrentConfigType; import com.kickstarter.libs.Koala; import com.kickstarter.libs.Logout; import com.kickstarter.libs.rx.transformers.Transformers; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.apiresponses.ErrorEnvelope; import javax.inject.Inject; public final class ApplicationLifecycleUtil implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 { protected @Inject Koala koala; protected @Inject ApiClientType client; protected @Inject CurrentConfigType config; protected @Inject Logout logout; private final KSApplication application; private boolean isInBackground = true; public ApplicationLifecycleUtil(final @NonNull KSApplication application) { this.application = application; application.component().inject(this); } @Override public void onActivityCreated(final @NonNull Activity activity, final @Nullable Bundle bundle) { } @Override public void onActivityStarted(final @NonNull Activity activity) { } @Override public void onActivityResumed(final @NonNull Activity activity) { if(isInBackground){ koala.trackAppOpen(); // Facebook: logs 'install' and 'app activate' App Events. AppEventsLogger.activateApp(activity); // Refresh the config file this.client.config() .compose(Transformers.pipeApiErrorsTo(this::handleConfigApiError)) .compose(Transformers.neverError()) .subscribe(this.config::config); isInBackground = false; } } /** * Handles a config API error by logging the user out in the case of a 401. We will interpret * 401's on the config request as meaning the user's current access token is no longer valid, * as that endpoint should never 401 othewise. */ private void handleConfigApiError(final @NonNull ErrorEnvelope error) { if (error.httpCode() == 401) { logout.execute(); ApplicationUtils.startNewDiscoveryActivity(this.application); } } @Override public void onActivityPaused(final @NonNull Activity activity) { // Facebook: logs 'app deactivate' App Event. AppEventsLogger.deactivateApp(activity); } @Override public void onActivityStopped(final @NonNull Activity activity) { } @Override public void onActivitySaveInstanceState(final @NonNull Activity activity, final @Nullable Bundle bundle) { } @Override public void onActivityDestroyed(final @NonNull Activity activity) { } @Override public void onConfigurationChanged(final @NonNull Configuration configuration) { } @Override public void onLowMemory() { koala.trackMemoryWarning(); } /** * Memory availability callback. TRIM_MEMORY_UI_HIDDEN means the app's UI is no longer visible. * This is triggered when the user navigates out of the app and primarily used to free resources used by the UI. * http://developer.android.com/training/articles/memory.html */ @Override public void onTrimMemory(final int i) { if(i == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { koala.trackAppClose(); isInBackground = true; } } }