/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright notice shall be * included in all copies or substantial portions of the software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.facebook.appevents.internal; import android.content.Context; import android.os.Bundle; import android.text.format.DateUtils; import com.facebook.LoggingBehavior; import com.facebook.appevents.AppEventsConstants; import com.facebook.appevents.AppEventsLogger; import com.facebook.internal.Logger; import java.util.Locale; class SessionLogger { private static final String TAG = SessionLogger.class.getCanonicalName(); private static final long[] INACTIVE_SECONDS_QUANTA = new long[] { 5 * DateUtils.MINUTE_IN_MILLIS, 15 * DateUtils.MINUTE_IN_MILLIS, 30 * DateUtils.MINUTE_IN_MILLIS, 1 * DateUtils.HOUR_IN_MILLIS, 6 * DateUtils.HOUR_IN_MILLIS, 12 * DateUtils.HOUR_IN_MILLIS, 1 * DateUtils.DAY_IN_MILLIS, 2 * DateUtils.DAY_IN_MILLIS, 3 * DateUtils.DAY_IN_MILLIS, 7 * DateUtils.DAY_IN_MILLIS, 14 * DateUtils.DAY_IN_MILLIS, 21 * DateUtils.DAY_IN_MILLIS, 28 * DateUtils.DAY_IN_MILLIS, 60 * DateUtils.DAY_IN_MILLIS, 90 * DateUtils.DAY_IN_MILLIS, 120 * DateUtils.DAY_IN_MILLIS, 150 * DateUtils.DAY_IN_MILLIS, 180 * DateUtils.DAY_IN_MILLIS, 365 * DateUtils.DAY_IN_MILLIS, }; public static void logActivateApp( Context applicationContext, String activityName, SourceApplicationInfo sourceApplicationInfo, String appId ) { String sourAppInfoStr = sourceApplicationInfo != null ? sourceApplicationInfo.toString() : "Unclassified"; Bundle eventParams = new Bundle(); eventParams.putString( AppEventsConstants.EVENT_PARAM_SOURCE_APPLICATION, sourAppInfoStr); AppEventsLogger logger = new InternalAppEventsLogger( activityName, appId, null); logger.logEvent(AppEventsConstants.EVENT_NAME_ACTIVATED_APP, eventParams); if (logger.getFlushBehavior() != AppEventsLogger.FlushBehavior.EXPLICIT_ONLY) { logger.flush(); } } public static void logDeactivateApp( Context applicationContext, String activityName, SessionInfo sessionInfo, String appId) { Long interruptionDurationMillis = sessionInfo.getDiskRestoreTime() - sessionInfo.getSessionLastEventTime(); if (interruptionDurationMillis < 0) { interruptionDurationMillis = 0l; logClockSkewEvent(); } Long sessionLength = sessionInfo.getSessionLength(); if (sessionLength < 0) { logClockSkewEvent(); sessionLength = 0l; } Bundle eventParams = new Bundle(); eventParams.putInt( AppEventsConstants.EVENT_NAME_SESSION_INTERRUPTIONS, sessionInfo.getInterruptionCount()); eventParams.putString( AppEventsConstants.EVENT_NAME_TIME_BETWEEN_SESSIONS, String.format( Locale.ROOT, "session_quanta_%d", getQuantaIndex(interruptionDurationMillis))); SourceApplicationInfo sourceApplicationInfo = sessionInfo.getSourceApplicationInfo(); String sourAppInfoStr = sourceApplicationInfo != null ? sourceApplicationInfo.toString() : "Unclassified"; eventParams.putString( AppEventsConstants.EVENT_PARAM_SOURCE_APPLICATION, sourAppInfoStr); eventParams.putLong(Constants.LOG_TIME_APP_EVENT_KEY, sessionInfo.getSessionLastEventTime() / 1000); new InternalAppEventsLogger( activityName, appId, null) .logEvent( AppEventsConstants.EVENT_NAME_DEACTIVATED_APP, (sessionLength / DateUtils.SECOND_IN_MILLIS), eventParams); } private static void logClockSkewEvent() { Logger.log(LoggingBehavior.APP_EVENTS, TAG, "Clock skew detected"); } private static int getQuantaIndex(long timeBetweenSessions) { int quantaIndex = 0; while ( quantaIndex < INACTIVE_SECONDS_QUANTA.length && INACTIVE_SECONDS_QUANTA[quantaIndex] < timeBetweenSessions ) { ++quantaIndex; } return quantaIndex; } }