com.amazon.analytics.AnalyticsManager.java Source code

Java tutorial

Introduction

Here is the source code for com.amazon.analytics.AnalyticsManager.java

Source

/**
 * Copyright 2015-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *     http://aws.amazon.com/apache2.0/
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package com.amazon.analytics;

import android.app.Activity;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import java.util.HashMap;
import java.util.Map;

/**
 * This class handles common analytics tasks and tracks Activity lifecycle events.
 */
public class AnalyticsManager implements Application.ActivityLifecycleCallbacks {

    /**
     * DEBUG TAG.
     */
    private static final String TAG = AnalyticsManager.class.getSimpleName();

    /**
     * Analytics intent action constant.
     */
    private static final String ANALYTICS_INTENT_ACTION = "ANALYTICS_INTENT_ACTION";

    /**
     * Analytics intent extra data key constant.
     */
    private static final String ANALYTICS_INTENT_ACTION_DATA = "ANALYTICS_INTENT_ACTION_DATA";

    /**
     * Application context.
     */
    private final Context mAppContext;

    /**
     * Singleton instance reference.
     */
    private static AnalyticsManager sInstance;

    /**
     * Lock object.
     */
    private static final Object sLock = new Object();

    /**
     * Map for Analytics constants.
     */
    private final Map<String, String> mAnalyticsConstantMap = new HashMap<>();

    /**
     * Analytics interface reference.
     */
    private IAnalytics mIAnalytics;

    /**
     * Local broadcast receiver.
     */
    private final BroadcastReceiver mLocalBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals(ANALYTICS_INTENT_ACTION)) {
                Log.v(TAG, "Got Analytics broadcast!!! : " + intent);
                HashMap<String, Object> data = intent.getParcelableExtra(ANALYTICS_INTENT_ACTION_DATA);
                if (mIAnalytics != null) {
                    mIAnalytics.trackAction(data);
                }
            }
        }
    };

    /**
     * Singleton constructor.
     *
     * @param context Context.
     */
    private AnalyticsManager(Context context) {

        mAppContext = context.getApplicationContext();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ANALYTICS_INTENT_ACTION);
        LocalBroadcastManager.getInstance(mAppContext).registerReceiver(mLocalBroadcastReceiver, intentFilter);
    }

    /**
     * Singleton get instance method.
     *
     * @param context Context.
     * @return Analytics manager singleton instance.
     */
    public static AnalyticsManager getInstance(Context context) {

        synchronized (sLock) {
            if (sInstance == null) {
                sInstance = new AnalyticsManager(context.getApplicationContext());
            }
            return sInstance;
        }
    }

    /**
     * Set {@link IAnalytics} interface.
     *
     * @param iAnalytics Analytics interface.
     */
    public void setAnalyticsInterface(IAnalytics iAnalytics) {

        if (mIAnalytics == null) {
            mIAnalytics = iAnalytics;
            mIAnalytics.configure(mAppContext);
        }
    }

    /**
     * Get {@link IAnalytics} interface.
     *
     * @return Analytics interface.
     */
    public IAnalytics getIAnalytics() {

        return mIAnalytics;
    }

    /**
     * Add analytics constant of an Activity.
     *
     * @param activityName      Activity name.
     * @param analyticsConstant Analytics constant of given activity.
     * @return Return Analytics instance for easy cascaded settings.
     */
    public AnalyticsManager addAnalyticsConstantForActivity(String activityName, String analyticsConstant) {

        mAnalyticsConstantMap.put(activityName, analyticsConstant);
        return this;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityStarted(Activity activity) {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityResumed(Activity activity) {

        String activityName = getActivityName(activity);
        Log.d(TAG, activityName + " onActivityResumed, analytics tracking.");
        if (mIAnalytics != null) {
            mIAnalytics.collectLifeCycleData(activity, true);

            // Track state through analytics.
            String analyticsConstant = mAnalyticsConstantMap.get(activityName);
            if (analyticsConstant != null) {
                mIAnalytics.trackState(analyticsConstant);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityPaused(Activity activity) {

        String activityName = getActivityName(activity);
        Log.d(TAG, activityName + " onActivityPaused, analytics tracking.");
        if (mIAnalytics != null) {
            mIAnalytics.collectLifeCycleData(activity, false);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityStopped(Activity activity) {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onActivityDestroyed(Activity activity) {

    }

    /**
     * Get Activity name, static internal method.
     *
     * @param activity Activity reference.
     * @return Name of the Activity.
     */
    private static String getActivityName(Activity activity) {

        String activityName = activity.getLocalClassName();
        return getExtension(activityName);
    }

    /**
     * Get extension of a string.
     *
     * @param value Provided string.
     * @return Return the extension of a string.
     */
    private static String getExtension(String value) {

        int dotPos = value.lastIndexOf(".");
        if (dotPos == -1) {
            dotPos = 0;
        } else {
            // Skip dot.
            dotPos++;
        }
        return value.substring(dotPos, value.length());
    }

    /**
     * Gets the analytics constant for an Activity - used for testing.
     *
     * @param activityName Activity name.
     * @return The analytics constant if it exists or an empty String if it doesn't.
     */
    String getConstant(String activityName) {

        if (mAnalyticsConstantMap.keySet().contains(activityName)) {
            return mAnalyticsConstantMap.get(activityName);
        } else {
            return "";
        }
    }

    /**
     * Resets the singleton - for test only.
     */
    void reset() {

        sInstance = null;
    }
}