package com.aptoide.amethyst.analytics;
import android.content.Context;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.util.Log;
import com.aptoide.amethyst.Aptoide;
import com.aptoide.amethyst.BuildConfig;
import com.aptoide.amethyst.LoginActivity;
import com.aptoide.amethyst.downloadmanager.model.Download;
import com.aptoide.amethyst.preferences.EnumPreferences;
import com.aptoide.amethyst.utils.AptoideUtils;
import com.aptoide.amethyst.utils.Logger;
import com.flurry.android.FlurryAgent;
import com.localytics.android.Localytics;
import java.util.HashMap;
/**
* Created by neuro on 07-05-2015.f
*/
public class Analytics {
private static final boolean ACTIVATE = BuildConfig.LOCALYTICS_CONFIGURED;
private static final int ALL = Integer.MAX_VALUE;
private static final int LOCALYTICS = 1 << 0;
// Constantes globais a todos os eventos.
public static final String ACTION = "Action";
/**
* Verifica se as flags fornecidas constam em accepted.
*
* @param flag flags fornecidas
* @param accepted flags aceitáveis
* @return true caso as flags fornecidas constem em accepted.
*/
private static boolean checkAcceptability(int flag, int accepted) {
return (flag & accepted) == accepted;
}
private static void track(String event, String key, String attr, int flags) {
try {
if (!ACTIVATE)
return;
HashMap stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put(key, attr);
track(event, stringObjectHashMap, flags);
Logger.d("Analytics", "Event: " + event + ", Key: " + key + ", attr: " + attr);
} catch (Exception e) {
Log.d("Analytics", e.getStackTrace().toString());
}
}
private static void track(String event, HashMap map, int flags) {
try {
if (!ACTIVATE)
return;
if(checkAcceptability(flags, LOCALYTICS))
Localytics.tagEvent(event, map);
Logger.d("Analytics", "Event: " + event + ", Map: " + map);
} catch (Exception e) {
Log.d("Analytics", e.getStackTrace().toString());
}
}
private static void track(String event, int flags) {
try {
if (!ACTIVATE)
return;
if(checkAcceptability(flags, LOCALYTICS))
Localytics.tagEvent(event);
Logger.d("Analytics", "Event: " + event);
} catch (Exception e) {
e.printStackTrace();
}
}
public static class Lifecycle {
public static class Application {
public static void onCreate(Context context) {
if (!ACTIVATE)
return;
// Integrate Localytics
Localytics.integrate(context);
}
}
public static class Activity {
public static void onCreate(android.app.Activity activity) {
if (!ACTIVATE)
return;
}
public static void onDestroy(android.app.Activity activity) {
if (!ACTIVATE)
return;
}
public static void onResume(android.app.Activity activity, @Nullable String screenName) {
if (!ACTIVATE)
return;
// Localytics
Localytics.openSession();
Localytics.upload();
if (!AptoideUtils.AccountUtils.isLoggedIn(activity)) {
Localytics.setCustomDimension(0, "Not Logged In");
} else {
Localytics.setCustomDimension(0, "Logged In");
}
String cpuid = PreferenceManager.getDefaultSharedPreferences(Aptoide.getContext()).getString(EnumPreferences.APTOIDE_CLIENT_UUID.name(), "NoInfo");
Localytics.setCustomerId(cpuid);
if (screenName != null) {
Localytics.tagScreen(screenName);
}
Localytics.handleTestMode(activity.getIntent());
Logger.d("Analytics", "Event: CPU_ID: " + cpuid);
Logger.d("Analytics", "Screen: " + screenName);
}
public static void onPause(android.app.Activity activity) {
if (!ACTIVATE)
return;
// Localytics
Localytics.closeSession();
Localytics.upload();
}
public static void onStart(android.app.Activity activity) {
if (!ACTIVATE)
return;
FlurryAgent.onStartSession(activity, BuildConfig.FLURRY_KEY);
}
public static void onStop(android.app.Activity activity) {
if (!ACTIVATE)
return;
FlurryAgent.onEndSession(activity);
}
}
}
public static class Screens {
public static void tagScreen(String screenName) {
if (!ACTIVATE)
return;
Logger.d("Analytics", "Localytics: Screens: " + screenName);
Localytics.tagScreen(screenName);
Localytics.upload();
}
}
// TODO
public static class Tutorial {
public static final String EVENT_NAME = "Tutorial";
public static final String STEP_ACCOMPLISHED = "Step Accomplished";
public static void finishedTutorial(int lastFragment) {
try {
track(EVENT_NAME, STEP_ACCOMPLISHED, Integer.toString(lastFragment), ALL);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
public static class Login {
public static final String EVENT_NAME = "Logged in";
public static void login(String username, LoginActivity.Mode mode) {
if (!ACTIVATE)
return;
try {
// TODO: Change to setCustomerId
Localytics.setCustomerId(username);
track(EVENT_NAME, ACTION, mode.toString(), ALL);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
public static class UserRegister {
public static final String EVENT_NAME = "User Registered";
public static void registered() {
track(EVENT_NAME, ALL);
}
}
// Novos
public static class Rollback {
private static final String EVENT_NAME = "Rollback";
private static final String DOWNGRADED = "Downgraded";
private static final String CLEAR = "Clear";
public static void downgraded() {
// track(EVENT_NAME, ACTION, DOWNGRADED, ALL);
}
public static void clear() {
// track(EVENT_NAME, ACTION, CLEAR, ALL);
}
}
public static class ScheduledDownloads {
public static final String EVENT_NAME = "Scheduled Downloads";
private static final String CLICK_ON_INSTALL_SELECTED = "Clicked on Install Selected";
private static final String CLICK_ON_INVERT_SELECTION = "Clicked on Invert Selection";
private static final String CLICK_ON_REMOVE_SELECTED = "Clicked on Remove Selected";
public static void clickOnInstallSelected() {
// track(EVENT_NAME, ACTION, CLICK_ON_INSTALL_SELECTED, ALL);
}
public static void clickOnInvertSelection() {
// track(EVENT_NAME, ACTION, CLICK_ON_INVERT_SELECTION, ALL);
}
public static void clickOnRemoveSelected() {
// track(EVENT_NAME, ACTION, CLICK_ON_REMOVE_SELECTED, ALL);
}
}
public static class SendFeedback {
public static final String EVENT_NAME = "Send Feedback";
private static final String SEND_FEEDBACK = EVENT_NAME;
public static void sendFeedback() {
track(EVENT_NAME, ACTION, SEND_FEEDBACK, ALL);
}
}
public static class ExcludedUpdates {
private static final String EVENT_NAME = "Excluded Updates";
private static final String RESTORE_UPDATES = "Restore Updates";
public static void restoreUpdates() {
track(EVENT_NAME, ACTION, RESTORE_UPDATES, ALL);
}
}
/**
* Incomplete
*/
public static class Settings {
public static final String EVENT_NAME = "Settings";
private static final String CHECKED = "Checked";
public static void onSettingChange(String s) {
// track(EVENT_NAME, ACTION, s, ALL);
}
public static void onSettingChange(String s, boolean checked) {
// track(EVENT_NAME, ACTION, s, ALL);
//
// HashMap<String, String> objectObjectHashMap = new HashMap<>();
// objectObjectHashMap.put(ACTION, s);
// objectObjectHashMap.put(CHECKED, Boolean.valueOf(checked).toString());
}
}
public static class Facebook {
public static final String EVENT_NAME = "Facebook";
public static final String JOIN = "Join";
public static final String LOGIN = "Login";
public static void join() {
track(EVENT_NAME, ACTION, JOIN, ALL);
}
public static void Login() {
track(EVENT_NAME, ACTION, LOGIN, ALL);
}
}
public static class BackupApps {
public static final String EVENT_NAME = "Opened Backup Apps";
public static void open() {
track(EVENT_NAME, ALL);
}
}
public static class Home {
public static final String EVENT_NAME = "Home";
public static final String CLICK_ON_MORE_ = "Click on More ";
public static final String CLICK_ON_EDITORS_CHOISE = "Click On Editor's Choise";
public static final String CLICK_ON_HIGHLIGHTED = "Click On Highlighted";
public static final String CLICK_ON_HIGHLIGHTED_MORE = "Click On Highlighted More";
public static final String CLICK_ON_APPLICATIONS = "Click On Applications";
public static final String CLICK_ON_APPLICATIONS_MORE = "Click On Applications More";
public static final String CLICK_ON_GAMES = "Click On Games";
public static final String CLICK_ON_GAMES_MORE = "Click On Games More";
public static final String CLICK_ON_REVIEWS = "Click On Reviews";
public static final String CLICK_ON_REVIEWS_MORE = "Click On Reviews More";
public static final String CLICK_ON_PUBLISHERS = "Click On Publishers";
public static final String CLICK_ON_PUBLISHERS_MORE = "Click On Publishers More";
public static final String CLICK_ON_APPS_ESSENTIALS = "Click On Apps Essentials";
public static final String CLICK_ON_APPS_FOR_KIDS = "Click On Apps For Kids";
public static void clickOnHighlighted() {
// track(EVENT_NAME, ACTION, CLICK_ON_HIGHLIGHTED_MORE, ALL);
}
public static void generic(String s) {
track(EVENT_NAME, ACTION, s, ALL);
}
// public static void clickOnApplicationsMore() {
// track(EVENT_NAME, ACTION, CLICK_ON_APPLICATIONS_MORE, ALL);
// }
public static void clickOnReviewsMore() {
// track(EVENT_NAME, ACTION, CLICK_ON_REVIEWS_MORE, ALL);
}
public static void clickOnMoreWidget(String widgetname) {
// track(EVENT_NAME, ACTION, CLICK_ON_MORE_ + widgetname, ALL);
}
}
public static class AdultContent {
public static final String EVENT_NAME = "Adult Content";
public static void lock() {
track(EVENT_NAME, ACTION, "Click on On", ALL);
}
public static void unlock() {
track(EVENT_NAME, ACTION, "Click on Off", ALL);
}
}
public static class Top {
public static final String EVENT_NAME = "Top";
public static final String CLICK_ON_LOCAL_TOP_APPS_MORE = "Click on Local Top Apps More";
public static final String CLICK_ON_TOP_APPLICATIONS_MORE = "Click on Top Applications More";
public static final String CLICK_ON_LOCAL_TOP_STORES_MORE = "Click on Local Top Stores More";
}
public static class Stores {
public static final String EVENT_NAME = "Stores";
public static final String STORE_NAME = "Store Name";
public static void enter(String storeName) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(ACTION, "Enter");
map.put(STORE_NAME, storeName);
track(EVENT_NAME, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void subscribe(String storeName) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(ACTION, "Subscribe");
map.put(STORE_NAME, storeName);
track(EVENT_NAME, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class Updates {
public static final String EVENT_NAME = "Updates";
public static void update() {
track(EVENT_NAME, ACTION, "Update", ALL);
}
public static void updateAll() {
track(EVENT_NAME, ACTION, "Update All", ALL);
}
public static void createReview() {
track(EVENT_NAME, ACTION, "Create Review", ALL);
}
}
// TODO: Não está implementado na v6
public static class DownloadManager {
public static final String EVENT_NAME = "Download Manager";
public static void clearDownloadComplete() {
// track(EVENT_NAME, ACTION, "Clear download complete", ALL);
}
public static void clickDownloadComplete() {
// track(EVENT_NAME, ACTION, "Click download complete", ALL);
}
public static void clearTopMenu() {
// track(EVENT_NAME, ACTION, "Clear topmenu", ALL);
}
}
public static class Search {
public static final String EVENT_NAME_SEARCH_TERM = "Search Term";
public static final String EVENT_NAME_POSITION = "Search Position";
public static final String EVENT_NAME_SEARCH_OTHER_STORES = "Search Other Stores";
public static final String SEARCH_POSITION = "Search Position";
public static final String SUBSCRIBED = "Subscribed";
public static final String REPO = "Repo";
public static final String QUERY = "Query";
public static final String INSIDE_STORE = "Inside Store";
public static void searchPosition(int position, boolean subscribed, String repo) {
HashMap<String, String> map = new HashMap<>();
map.put(SEARCH_POSITION, String.valueOf(position));
map.put(SUBSCRIBED, String.valueOf(subscribed));
map.put(REPO, repo);
track(EVENT_NAME_POSITION, map, ALL);
}
public static void searchTerm(String query, String repo) {
HashMap<String, String> map = new HashMap<>();
map.put(QUERY, query);
if (repo != null && !repo.isEmpty()) {
map.put(INSIDE_STORE, String.valueOf(true));
map.put(REPO, repo);
} else {
map.put(INSIDE_STORE, String.valueOf(false));
}
track(EVENT_NAME_SEARCH_TERM, map, ALL);
}
public static void searchOtherStores() {
track(EVENT_NAME_SEARCH_OTHER_STORES, ALL);
}
}
public static class ApplicationInstall {
public static final String EVENT_NAME = "Application Install";
private static final String TYPE = "Type";
private static final String PACKAGE_NAME = "Package Name";
private static final String REFERRED = "Referred";
private static final String REPLACED = "Replaced";
private static final String INSTALLED = "Installed";
private static final String DOWNGRADED_ROLLBACK = "Downgraded Rollback";
private static void innerTrack(String packageName, String type,@Nullable Boolean referred, int flags) {
try {
HashMap<String, String> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put(TYPE, type);
stringObjectHashMap.put(PACKAGE_NAME, packageName);
if (referred != null) {
stringObjectHashMap.put(REFERRED, referred.toString());
} else {
stringObjectHashMap.put(REFERRED, new Boolean(false).toString());
}
track(EVENT_NAME, stringObjectHashMap, flags);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void installed(String packageName, boolean referred) {
innerTrack(packageName, INSTALLED, referred, ALL);
}
public static void replaced(String packageName) {
innerTrack(packageName, REPLACED, null, ALL);
}
public static void downgraded(String packageName) {
innerTrack(packageName, DOWNGRADED_ROLLBACK, null, ALL);
}
}
public static class ApplicationLaunch {
public static final String EVENT_NAME = "Application Launch (Aptoide Launch)";
public static final String SOURCE = "Source";
public static final String LAUNCHER = "Launcher";
public static final String WEBSITE = "Website";
public static final String NEW_UPDATES_NOTIFICATION = "New Updates Available";
public static final String DOWNLOADING_UPDATES = "Downloading Updates";
public static final String TIMELINE_NOTIFICATION = "Timeline Notification";
public static final String NEW_REPO = "New Repository";
public static final String URI = "Uri";
public static void launcher() {
track(EVENT_NAME, SOURCE, LAUNCHER, ALL);
}
public static void website(String uri) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(SOURCE, WEBSITE);
if (uri != null) {
map.put(URI, uri.substring(0, uri.indexOf(":")));
}
track(EVENT_NAME, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void newUpdatesNotification() {
track(EVENT_NAME, SOURCE, NEW_UPDATES_NOTIFICATION, ALL);
}
public static void downloadingUpdates() {
track(EVENT_NAME, SOURCE, DOWNLOADING_UPDATES, ALL);
}
public static void timelineNotification() {
track(EVENT_NAME, SOURCE, TIMELINE_NOTIFICATION, ALL);
}
public static void newRepo() {
track(EVENT_NAME, SOURCE, NEW_REPO, ALL);
}
}
public static class ClickedOnInstallButton {
public static final String EVENT_NAME = "Clicked on Install Button";
private static final String CLICKED_ON_INSTALL_BUTTON = "Clicked on install button";
private static final String APPLICATION_NAME = "Application Name";
private static final String APPLICATION_PUBLISHER = "Application Publisher";
// public static void clicked(GetApkInfoJson getApkInfoJson) {
// try {
// HashMap<String, String> map = new HashMap<>();
//
// map.put(APPLICATION_NAME, getApkInfoJson.getApk().packageName);
// map.put(APPLICATION_PUBLISHER, getApkInfoJson.getMeta().getDeveloper().info.name);
//
// track(CLICKED_ON_INSTALL_BUTTON, map, ALL);
//
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public static void clicked(String packageName, String developer) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(APPLICATION_NAME, packageName);
map.put(APPLICATION_PUBLISHER, developer);
track(CLICKED_ON_INSTALL_BUTTON, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class DownloadComplete {
public static final String EVENT_NAME = "Download Complete";
private static final String APPLICATION_NAME = "Application Name";
private static final String PACKAGE_NAME = "Package Name";
public static void downloadComplete(Download download) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(APPLICATION_NAME, download.getName());
map.put(PACKAGE_NAME, download.getPackageName());
track(EVENT_NAME, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class SocialTimeline {
public static final String EVENT_NAME = "Social Timeline";
public static final String eventName = "Social Timeline";
public static final String APPLICATION_NAME = "Application Name";
public static final String action = "Action";
public static final String like = "Like";
public static final String DISLIKE = "Dislike";
public static final String comment = "Comment";
public static final String login = "Login";
public static final String share = "Share";
public static void like(String appName) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(action, like);
map.put(APPLICATION_NAME, appName);
track(eventName, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void dislike(String appName) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(action, DISLIKE);
map.put(APPLICATION_NAME, appName);
track(eventName, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void comment(String appName) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(action, comment);
map.put(APPLICATION_NAME, appName);
track(eventName, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void login() {
// Declarado mas não utilizado, apenas para localização
try {
// track(eventName, action, login, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class ViewedApplication {
public static final String EVENT_NAME = "Viewed Application";
private static final String VIEWED_APPLICATION = "Viewed Application";
private static final String APPLICATION_NAME = "Application Name";
private static final String TYPE = "Type";
private static final String APPLICATION_PUBLISHER = "Application Publisher";
private static final String SOURCE = "Source";
public static void view(String packageName, String developer, String download_from) {
try {
HashMap<String, String> map = new HashMap<>();
map.put(APPLICATION_NAME, packageName);
map.put(APPLICATION_PUBLISHER, developer);
map.put(SOURCE, download_from);
track(VIEWED_APPLICATION, map, ALL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class Dimenstions {
private static void setDimension(int i, String s) {
if (!ACTIVATE) {
return;
}
Logger.d("Analytics", "Dimension: " + i + ", Value: " + s);
Localytics.setCustomDimension(i, s);
}
public static void setPartnerDimension(String partner) {
setDimension(1, partner);
}
public static void setVerticalDimension(String verticalName) {
setDimension(2, verticalName);
}
public static void setGmsPresent(boolean b) {
if (b) {
setDimension(3, "GMS Present");
} else {
setDimension(3, "GMS Not Present");
}
}
public static class Vertical {
public static final String SMARTPHONE = "smartphone";
}
}
public static class LTV {
public static void cpi(String packageName, String revenue) {
ltv("CPI Click", packageName, Double.valueOf(revenue));
}
public static void purchasedApp(String packageName, double revenue) {
ltv("App Purchase", packageName, revenue);
}
private static void ltv(String eventName, String packageName, double revenue) {
if (!ACTIVATE) {
return;
}
try {
HashMap<String, String> map = new HashMap<>();
Double revenueDouble = Double.valueOf(revenue);
Long value = revenueDouble.longValue();
map.put("packageName", packageName);
Logger.d("Analytics", "LTV: " + eventName + ": " + packageName + ", " + value);
Localytics.tagEvent(eventName, map, value);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}
}