package com.mixpanel.android.mpmetrics; import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import com.mixpanel.android.viewcrawler.GestureTracker; import org.json.JSONException; import org.json.JSONObject; @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) /* package */ class MixpanelActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { private Handler mHandler = new Handler(Looper.getMainLooper()); private Runnable check; private boolean mIsForeground = true; private boolean mPaused = true; public static final int CHECK_DELAY = 500; public MixpanelActivityLifecycleCallbacks(MixpanelAPI mpInstance, MPConfig config) { mMpInstance = mpInstance; mConfig = config; } @Override public void onActivityStarted(Activity activity) { if (activity.getIntent().hasExtra("mp_campaign_id") && activity.getIntent().hasExtra("mp_message_id")) { String campaignId = activity.getIntent().getStringExtra("mp_campaign_id"); String messageId = activity.getIntent().getStringExtra("mp_message_id"); JSONObject pushProps = new JSONObject(); try { pushProps.put("campaign_id", campaignId); pushProps.put("message_id", messageId); pushProps.put("message_type", "push"); mMpInstance.track("$app_open", pushProps); } catch (JSONException e) {} activity.getIntent().removeExtra("mp_campaign_id"); activity.getIntent().removeExtra("mp_message_id"); } if (android.os.Build.VERSION.SDK_INT >= MPConfig.UI_FEATURES_MIN_API && mConfig.getAutoShowMixpanelUpdates()) { if (!activity.isTaskRoot()) { return; // No checks, no nothing. } mMpInstance.getPeople().showNotificationIfAvailable(activity); } new GestureTracker(mMpInstance, activity); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityPaused(Activity activity) { mPaused = true; if (check != null) { mHandler.removeCallbacks(check); } mHandler.postDelayed(check = new Runnable(){ @Override public void run() { if (mIsForeground && mPaused) { mIsForeground = false; mMpInstance.flush(); } } }, CHECK_DELAY); } @Override public void onActivityDestroyed(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityResumed(Activity activity) { if (android.os.Build.VERSION.SDK_INT >= MPConfig.UI_FEATURES_MIN_API && mConfig.getAutoShowMixpanelUpdates()) { mMpInstance.getPeople().joinExperimentIfAvailable(); } mPaused = true; boolean wasBackground = !mIsForeground; mIsForeground = true; if (check != null) { mHandler.removeCallbacks(check); } if (wasBackground) { // App is in foreground now } } @Override public void onActivityStopped(Activity activity) { } protected boolean isInForeground() { return mIsForeground; } private final MixpanelAPI mMpInstance; private final MPConfig mConfig; }