diff --git a/ATMobileAnalytics/SmartTracker/SmartTracker.iml b/ATMobileAnalytics/SmartTracker/SmartTracker.iml index 73df5726..0aa638dc 100644 --- a/ATMobileAnalytics/SmartTracker/SmartTracker.iml +++ b/ATMobileAnalytics/SmartTracker/SmartTracker.iml @@ -50,13 +50,6 @@ - - - - - - - @@ -64,6 +57,13 @@ + + + + + + + @@ -85,75 +85,88 @@ + + + + + + + + + + + - + + - + - + - + + + - + - + - + + - - + - - + + - + + + - - - + - - + @@ -162,14 +175,15 @@ - + + + - \ No newline at end of file diff --git a/ATMobileAnalytics/SmartTracker/build.gradle b/ATMobileAnalytics/SmartTracker/build.gradle index 25803874..e4b69d0a 100644 --- a/ATMobileAnalytics/SmartTracker/build.gradle +++ b/ATMobileAnalytics/SmartTracker/build.gradle @@ -1,10 +1,11 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' +apply plugin: 'jacoco' android { compileSdkVersion 26 - buildToolsVersion '27.0.1' + buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 14 targetSdkVersion 26 @@ -29,7 +30,7 @@ android { def siteUrl = 'https://github.com/at-internet/atinternet-android-sdk' def gitUrl = 'https://github.com/at-internet/atinternet-android-sdk.git' group = "com.atinternet" -def standardVersion = "2.8.3" +def standardVersion = "2.8.4" version = standardVersion + "s" install { @@ -73,8 +74,8 @@ bintray { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - compileOnly 'com.android.support:appcompat-v7:26.0.2' - compileOnly 'com.google.android.gms:play-services-ads:11.6.0' + compileOnly 'com.android.support:appcompat-v7:26.1.0' + compileOnly 'com.google.android.gms:play-services-ads:11.8.0' compileOnly('io.socket:socket.io-client:0.8.3') { // excluding org.json which is provided by Android exclude group: 'org.json', module: 'json' @@ -103,7 +104,7 @@ task javadoc(type: Javadoc) { options.memberLevel = JavadocMemberLevel.PUBLIC options.header = "ATInternet Android SDK API " + standardVersion - options.stylesheetFile = new File(projectDir, "docs-res/style.css"); + options.stylesheetFile = new File(projectDir, "docs-res/style.css") } task javadocJar(type: Jar, dependsOn: javadoc) { @@ -150,4 +151,36 @@ task createBuildFile { def file = new File(project.rootDir, "build.properties") file.createNewFile() file.text = "version=" + standardVersion + "\n" +} + +jacoco { + toolVersion = "0.7.1.201405082137" +} + +def coverageSourceDirs = [ + project.rootDir.absolutePath + '/SmartTracker/src/main/java/com/atinternet/Tracker' +] + +task jacocoTestReport(type: JacocoReport, dependsOn: "testReleaseUnitTest") { + group = "Reporting" + + description = "Generate Jacoco coverage reports" + + classDirectories = fileTree( + dir: project.rootDir.absolutePath + '/SmartTracker/build/intermediates/classes/release/com/atinternet/tracker', + excludes: ['**/R.class', + '**/R$*.class', + '**/*$ViewInjector*.*', + '**/BuildConfig.*', + '**/Manifest*.*'] + ) + + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files(project.rootDir.absolutePath + '/SmartTracker/build/jacoco/testReleaseUnitTest.exec') + + reports { + xml.enabled = true + html.enabled = true + } } \ No newline at end of file diff --git a/ATMobileAnalytics/SmartTracker/core.manifest.json b/ATMobileAnalytics/SmartTracker/core.manifest.json index 6d833352..f255b920 100755 --- a/ATMobileAnalytics/SmartTracker/core.manifest.json +++ b/ATMobileAnalytics/SmartTracker/core.manifest.json @@ -1,7 +1,7 @@ { "name": "Core", "description": "Geode_Tag_Android_Description", - "version": "2.8.3", + "version": "2.8.4", "type": "core", "config": { "storage": { diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ATImageView.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ATImageView.java index 461a66b3..83ca24fa 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ATImageView.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ATImageView.java @@ -26,7 +26,7 @@ of this software and associated documentation files (the "Software"), to deal import android.util.AttributeSet; import android.widget.ImageView; -@SuppressLint("Instantiatable") +@SuppressLint({"Instantiatable", "AppCompatCustomView"}) public class ATImageView extends ImageView { public ATImageView(android.content.Context context) { super(context); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AbstractScreen.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AbstractScreen.java index 00ad1c9f..38daaba6 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AbstractScreen.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AbstractScreen.java @@ -70,19 +70,31 @@ public String stringValue() { private SelfPromotionImpressions selfPromotionImpressions; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } LinkedHashMap getCustomVarsMap() { - return customVarsMap == null ? (customVarsMap = new LinkedHashMap<>()) : customVarsMap; + if (customVarsMap == null) { + customVarsMap = new LinkedHashMap<>(); + } + return customVarsMap; } LinkedHashMap getSelfPromotionImpressionsMap() { - return selfPromotionImpressionsMap == null ? (selfPromotionImpressionsMap = new LinkedHashMap<>()) : selfPromotionImpressionsMap; + if (selfPromotionImpressionsMap == null) { + selfPromotionImpressionsMap = new LinkedHashMap<>(); + } + return selfPromotionImpressionsMap; } LinkedHashMap getPublisherImpressionsMap() { - return publisherImpressionsMap == null ? (publisherImpressionsMap = new LinkedHashMap<>()) : publisherImpressionsMap; + if (publisherImpressionsMap == null) { + publisherImpressionsMap = new LinkedHashMap<>(); + } + return publisherImpressionsMap; } /** @@ -166,9 +178,10 @@ public void setCart(Cart cart) { * @return the Location instance */ public Location Location(double latitude, double longitude) { - return location == null ? (location = new Location(tracker) - .setLatitude(latitude) - .setLongitude(longitude)) : location; + if (location == null) { + location = new Location(tracker).setLatitude(latitude).setLongitude(longitude); + } + return location; } /** @@ -178,7 +191,10 @@ public Location Location(double latitude, double longitude) { * @return the Aisle instance */ public Aisle Aisle(String level1) { - return aisle == null ? (aisle = new Aisle(tracker).setLevel1(level1)) : aisle; + if (aisle == null) { + aisle = new Aisle(tracker).setLevel1(level1); + } + return aisle; } /** @@ -188,7 +204,10 @@ public Aisle Aisle(String level1) { * @return the CustomTreeStructure instance */ public CustomTreeStructure CustomTreeStructure(int category1) { - return customTreeStructure == null ? (customTreeStructure = new CustomTreeStructure(tracker).setCategory1(category1)) : customTreeStructure; + if (customTreeStructure == null) { + customTreeStructure = new CustomTreeStructure(tracker).setCategory1(category1); + } + return customTreeStructure; } /** @@ -198,7 +217,10 @@ public CustomTreeStructure CustomTreeStructure(int category1) { * @return the Campaign identifier */ public Campaign Campaign(String campaignId) { - return campaign == null ? (campaign = new Campaign(tracker).setCampaignId(campaignId)) : campaign; + if (campaign == null) { + campaign = new Campaign(tracker).setCampaignId(campaignId); + } + return campaign; } /** @@ -211,7 +233,10 @@ public Campaign Campaign(String campaignId) { */ @Deprecated public Order Order(String orderId, double turnover) { - return order == null ? (order = new Order(tracker).setOrderId(orderId).setTurnover(turnover)) : order; + if (order == null) { + order = new Order(tracker).setOrderId(orderId).setTurnover(turnover); + } + return order; } /** @@ -222,9 +247,12 @@ public Order Order(String orderId, double turnover) { * @return the InternalSearch instance */ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber); + } + return internalSearch; } /** @@ -233,7 +261,10 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return CustomVars instance */ public CustomVars CustomVars() { - return customVars == null ? (customVars = new CustomVars(this)) : customVars; + if (customVars == null) { + customVars = new CustomVars(this); + } + return customVars; } /** @@ -242,7 +273,10 @@ public CustomVars CustomVars() { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -251,7 +285,10 @@ public CustomObjects CustomObjects() { * @return PublisherImpressions instance */ public PublisherImpressions Publishers() { - return publisherImpressions == null ? (publisherImpressions = new PublisherImpressions(this)) : publisherImpressions; + if (publisherImpressions == null) { + publisherImpressions = new PublisherImpressions(this); + } + return publisherImpressions; } /** @@ -260,7 +297,10 @@ public PublisherImpressions Publishers() { * @return SelfPromotionImpressions instance */ public SelfPromotionImpressions SelfPromotions() { - return selfPromotionImpressions == null ? (selfPromotionImpressions = new SelfPromotionImpressions(this)) : selfPromotionImpressions; + if (selfPromotionImpressions == null) { + selfPromotionImpressions = new SelfPromotionImpressions(this); + } + return selfPromotionImpressions; } /** diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Audios.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Audios.java index bab030e9..6a3716f3 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Audios.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Audios.java @@ -44,15 +44,8 @@ public class Audios { * @return the Audio instance */ public Audio add(String name, int duration) { - int index = -1; - int length = list.size(); + int index = searchAudioIndexByName(name); Audio audio; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { audio = new Audio(player) .setName(name) @@ -60,7 +53,7 @@ public Audio add(String name, int duration) { list.add(audio); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "Audio with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "Audio with the same name already exists"); audio = list.get(index); } @@ -112,21 +105,11 @@ public Audio add(String name, String chapter1, String chapter2, String chapter3, * @param name audio identified by name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } - if (index > -1) { - if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { - list.get(index).sendStop(); - } - list.remove(index); + int index = searchAudioIndexByName(name); + if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { + list.get(index).sendStop(); } + list.remove(index); } /** @@ -137,4 +120,15 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchAudioIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + + return -1; + } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AutoTracker.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AutoTracker.java index 5d13ee71..c9e4a8de 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AutoTracker.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/AutoTracker.java @@ -47,13 +47,15 @@ public class AutoTracker extends Tracker { private App app; private boolean enabledLiveTagging; private boolean enabledAutoTracking; - private String appVersion; private SmartSender smartSender; private Endpoints endpoints; static AutoTracker getInstance(String... args) { - return instance == null ? instance = new AutoTracker(args) : instance; + if (instance == null) { + instance = new AutoTracker(args); + } + return instance; } AutoTracker(String... args) { @@ -61,11 +63,11 @@ static AutoTracker getInstance(String... args) { Context context = appContext.get(); token = retrieveValidToken(args); - appVersion = getAppVersion(context); + String appVersion = getAppVersion(context); app = new App(token, appVersion); endpoints = new Endpoints(String.valueOf(configuration.get("atEnv")), token, appVersion); - smartSender = new SmartSender(token, endpoints.getResourceEndpoint(Endpoints.Resource.Socket)); + smartSender = new SmartSender(token, endpoints.getResourceEndpoint(Endpoints.Resource.SOCKET)); WindowManager wm = (WindowManager) context.getSystemService(android.content.Context.WINDOW_SERVICE); Display d = wm.getDefaultDisplay(); float scale = UI.getScale(d); @@ -146,7 +148,7 @@ public void enableLiveTagging(boolean enabled) { public void enableAutoTracking(boolean enabled) { enabledAutoTracking = enabled; if (enabledAutoTracking && getConfigRequester == null) { - getConfigRequester = new GetConfigRequester(endpoints.getResourceEndpoint(Endpoints.Resource.GetConfig)); + getConfigRequester = new GetConfigRequester(endpoints.getResourceEndpoint(Endpoints.Resource.GET_CONFIG)); smartTrackerActivityLifecycle.setGetConfigRequester(getConfigRequester); TrackerQueue.getInstance().put(getConfigRequester); } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Cart.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Cart.java index 2a9519b8..f2f10a19 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Cart.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Cart.java @@ -35,7 +35,10 @@ public class Cart extends BusinessObject { ArrayList getProductsList() { - return productsList == null ? (productsList = new ArrayList<>()) : productsList; + if (productsList == null) { + productsList = new ArrayList<>(); + } + return productsList; } Cart(Tracker tracker) { @@ -50,7 +53,10 @@ ArrayList getProductsList() { * @return the Products instance */ public Products Products() { - return products == null ? (products = new Products(this)) : products; + if (products == null) { + products = new Products(this); + } + return products; } /** diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Configuration.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Configuration.java index 4f584ec4..cb000ea8 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Configuration.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Configuration.java @@ -71,7 +71,8 @@ public class Configuration extends LinkedHashMap { } } } - for (String key : configuration.keySet()) { + for (Entry entry : configuration.entrySet()) { + String key = entry.getKey(); put(key, configuration.get(key)); } } @@ -125,6 +126,7 @@ private JSONObject getDefaultConfiguration(boolean isTablet) { * * @return the pretty printed configuration */ + @Override public String toString() { StringBuilder sb = new StringBuilder("Tracker configuration : \n"); Iterator> iter = entrySet().iterator(); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Context.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Context.java index 6ac5aa96..ff5aa049 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Context.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Context.java @@ -95,13 +95,10 @@ public void setBackgroundMode(BackgroundMode backgroundMode) { this.backgroundMode = backgroundMode; if (backgroundMode != null) { - switch (backgroundMode) { - case Task: - tracker.setParam(Hit.HitParam.BackgroundMode.stringValue(), "task", new ParamOption().setPersistent(true)); - break; - default: - tracker.unsetParam(Hit.HitParam.BackgroundMode.stringValue()); - break; + if (backgroundMode == BackgroundMode.Task) { + tracker.setParam(Hit.HitParam.BackgroundMode.stringValue(), "task", new ParamOption().setPersistent(true)); + } else { + tracker.unsetParam(Hit.HitParam.BackgroundMode.stringValue()); } } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Core.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Core.java index 836a4993..df0f63d6 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Core.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Core.java @@ -46,6 +46,7 @@ of this software and associated documentation files (the "Software"), to deal import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Pair; import android.view.Display; import android.view.View; @@ -135,9 +136,7 @@ boolean isPersistent() { Param(String key, final Closure value) { this(); this.key = key; - this.values = new ArrayList() {{ - add(value); - }}; + this.values.add(value); } Param(String key, Closure value, ParamOption paramOption) { @@ -287,6 +286,7 @@ class Builder implements Runnable { private static final String MH_PARAMETER_FORMAT = "%1$s-%2$s-%3$s"; private static final String MHID_FORMAT = "%02d%02d%02d%d"; private static final String OPT_OUT = "opt-out"; + private static final String MHERR = "mherr"; private static final int REFCONFIGCHUNKS = 4; private static final int MH_PARAMETER_MAX_LENGTH = 30; private static final int MHERR_PARAMETER_LENGTH = 8; @@ -346,7 +346,7 @@ String buildConfiguration() { if (hitConfigChunks != REFCONFIGCHUNKS) { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.error, "There is something wrong with configuration : " + conf); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.ERROR, "There is something wrong with configuration : " + conf); conf = new StringBuilder(); } @@ -361,23 +361,23 @@ Object[] build() { StringBuilder queryString = new StringBuilder(); - String configuration = buildConfiguration(); + String configStr = buildConfiguration(); String idClient = ""; // Calcul pour connaitre la longueur maximum du hit String oltParameter = Tool.getTimeStamp().execute(); - int MAX_LENGTH_AVAILABLE = HIT_MAX_LENGTH - (configuration.length() + oltParameter.length() + MH_PARAMETER_MAX_LENGTH); - MAX_LENGTH_AVAILABLE -= idClient.length(); + int maxLengthAvailable = HIT_MAX_LENGTH - (configStr.length() + oltParameter.length() + MH_PARAMETER_MAX_LENGTH); + maxLengthAvailable -= idClient.length(); LinkedHashMap> dictionary; - if (!TextUtils.isEmpty(configuration)) { + if (!TextUtils.isEmpty(configStr)) { dictionary = prepareQuery(); Set keySet = dictionary.keySet(); if (dictionary.get(Hit.HitParam.UserId.stringValue()) != null) { idClient = dictionary.get(Hit.HitParam.UserId.stringValue()).first; - MAX_LENGTH_AVAILABLE -= idClient.length(); + maxLengthAvailable -= idClient.length(); } // Outerloop est un label de référence si jamais une boucle doit être interrompue @@ -389,7 +389,7 @@ Object[] build() { // Si la valeur du paramètre est trop grande - if (value.length() > MAX_LENGTH_AVAILABLE) { + if (value.length() > maxLengthAvailable) { // Si le paramètre est découpable if (Lists.getSliceReadyParams().contains(parameterKey)) { @@ -406,11 +406,11 @@ Object[] build() { String currentSplitValue = valuesList[i]; // Si la valeur courante est trop grande - if (currentSplitValue.length() > MAX_LENGTH_AVAILABLE) { + if (currentSplitValue.length() > maxLengthAvailable) { // Erreur : Valeur trop longue non découpable indexError = countSplitHits; queryString.append(currentKey); - int currentMaxLength = MAX_LENGTH_AVAILABLE - (MHERR_PARAMETER_LENGTH + queryString.length()); + int currentMaxLength = maxLengthAvailable - (MHERR_PARAMETER_LENGTH + queryString.length()); // On cherche la position du dernier % afin d'éviter les exceptions au moment de la découpe brutale String splitError = currentSplitValue.substring(0, currentMaxLength); @@ -421,13 +421,13 @@ Object[] build() { } else { queryString.append(splitError); } - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: Param " + parameterKey + " value still too long after slicing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: Param " + parameterKey + " value still too long after slicing"); // On retourne à l'endroit du code où se trouve outerloop break outerloop; } // Sinon si le hit déjà construit + la valeur courante est trop grand - else if (queryString.length() + currentSplitValue.length() > MAX_LENGTH_AVAILABLE) { + else if (queryString.length() + currentSplitValue.length() > maxLengthAvailable) { // On créé un nouveau tronçon countSplitHits++; prepareHitsList.add(queryString.toString()); @@ -444,12 +444,12 @@ else if (queryString.length() + currentSplitValue.length() > MAX_LENGTH_AVAILABL } else { // Erreur : le paramètre n'est pas découpable indexError = countSplitHits; - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: parameter " + parameterKey + " value not allowed to be sliced"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: parameter " + parameterKey + " value not allowed to be sliced"); break; } } // Sinon, si le hit est trop grand, on le découpe entre deux paramètres - else if (queryString.length() + value.length() > MAX_LENGTH_AVAILABLE) { + else if (queryString.length() + value.length() > maxLengthAvailable) { countSplitHits++; prepareHitsList.add(queryString.toString()); queryString = new StringBuilder() @@ -465,15 +465,15 @@ else if (queryString.length() + value.length() > MAX_LENGTH_AVAILABLE) { // Si un seul hit est construit if (countSplitHits == 1) { if (indexError == countSplitHits) { - hitsList.add(configuration + makeSubQuery("mherr", "1") + queryString); + hitsList.add(configStr + makeSubQuery(MHERR, "1") + queryString); } else { - hitsList.add(configuration + queryString); + hitsList.add(configStr + queryString); } } // Sinon, si le nombre de tronçons > 999, erreur else if (countSplitHits > HIT_MAX_COUNT) { - hitsList.add(configuration + makeSubQuery("mherr", "1") + queryString); - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: too much hit parts"); + hitsList.add(configStr + makeSubQuery(MHERR, "1") + queryString); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: too much hit parts"); } // Sinon, on ajoute les hits construits à la liste de hits à envoyer else { @@ -483,21 +483,21 @@ else if (countSplitHits > HIT_MAX_COUNT) { String countSplitHitsString = countSplitHits.toString(); String mhParameter = makeSubQuery("mh", String.format(MH_PARAMETER_FORMAT, Tool.formatNumberLength(Integer.toString(i + 1), countSplitHitsString.length()), countSplitHitsString, mhID)); if (indexError == (i + 1)) { - hitsList.add(configuration + mhParameter + makeSubQuery("mherr", "1") + prepareHitsList.get(i)); + hitsList.add(configStr + mhParameter + makeSubQuery(MHERR, "1") + prepareHitsList.get(i)); } else { - hitsList.add(configuration + mhParameter + prepareHitsList.get(i)); + hitsList.add(configStr + mhParameter + prepareHitsList.get(i)); } } } if (tracker.getListener() != null) { - String message = ""; + StringBuilder message = new StringBuilder(); for (String hit : hitsList) { - message += hit + "\n"; + message.append(hit).append('\n'); } - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.build, message, TrackerListener.HitStatus.Success); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.BUILD, message.toString(), TrackerListener.HitStatus.Success); } } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.build, "Empty configuration", TrackerListener.HitStatus.Failed); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.BUILD, "Empty configuration", TrackerListener.HitStatus.Failed); } return new Object[]{hitsList, oltParameter}; @@ -567,19 +567,17 @@ ArrayList organizeParameters(LinkedHashMap completeBuffer) LinkedHashMap> prepareQuery() { LinkedHashMap> formattedParameters = new LinkedHashMap<>(); - LinkedHashMap completeBuffer = new LinkedHashMap() {{ - putAll(persistentParams); - putAll(volatileParams); - }}; + LinkedHashMap completeBuffer = new LinkedHashMap<>(); + completeBuffer.putAll(persistentParams); + completeBuffer.putAll(volatileParams); // ORGANISE PARAMS ArrayList params = organizeParameters(completeBuffer); // PREPARE for (final Param p : params) { - List paramValues = new ArrayList() {{ - addAll(p.getValues()); - }}; + List paramValues = new ArrayList<>(); + paramValues.addAll(p.getValues()); String strValue = paramValues.remove(0).execute(); if (strValue != null) { @@ -594,14 +592,14 @@ LinkedHashMap> prepareQuery() { if (Tool.isJSON(appendValue)) { result.putAll(Tool.toMap(new JSONObject(appendValue))); } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Couldn't append value to a JSONObject"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Couldn't append value to a JSONObject"); } } strValue = new JSONObject(result).toString(); } catch (JSONException e) { e.printStackTrace(); } - } else if (p.getOptions().getType() == ParamOption.Type.Array) { + } else if (p.getOptions().getType() == ParamOption.Type.ARRAY) { try { List result = new ArrayList(); JSONArray valArray = new JSONArray(strValue); @@ -625,17 +623,21 @@ LinkedHashMap> prepareQuery() { } } else { // NOT JSON + StringBuilder strBuilder = new StringBuilder(strValue); for (Closure closureValue : paramValues) { - strValue += p.getOptions().getSeparator(); - strValue += closureValue.execute(); + strBuilder.append(p.getOptions().getSeparator()) + .append(closureValue.execute()); } + strValue = strBuilder.toString(); } } else { // NOT JSON + StringBuilder strBuilder = new StringBuilder(strValue); for (Closure closureValue : paramValues) { - strValue += ","; - strValue += closureValue.execute(); + strBuilder.append(',') + .append(closureValue.execute()); } + strValue = strBuilder.toString(); } String key = p.getKey(); @@ -644,7 +646,7 @@ LinkedHashMap> prepareQuery() { if (TechnicalContext.doNotTrackEnabled(Tracker.getAppContext())) { strValue = OPT_OUT; } else if (((Boolean) configuration.get(TrackerConfigurationKeys.HASH_USER_ID))) { - strValue = Tool.SHA_256(strValue); + strValue = Tool.SHA256(strValue); } tracker.setInternalUserId(strValue); } else if (key.equals(Hit.HitParam.Referrer.stringValue())) { @@ -715,7 +717,7 @@ private void send(final Hit hit) { saveHitDatabase(hit); } // Si pas de connexion - else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.offline || (!hit.isOffline() && storage.getCountOfflineHits() > 0)) { + else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.OFFLINE || (!hit.isOffline() && storage.getCountOfflineHits() > 0)) { // Si le hit ne provient pas du offline if (storage.getOfflineMode() != Tracker.OfflineMode.never && !hit.isOffline()) { saveHitDatabase(hit); @@ -742,7 +744,7 @@ else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.off updateRetryCount(hit); } } - Tool.executeCallback(trackerListener, Tool.CallbackType.send, message, TrackerListener.HitStatus.Failed); + Tool.executeCallback(trackerListener, Tool.CallbackType.SEND, message, TrackerListener.HitStatus.Failed); updateDebugger(message, "error48", false); } // Le hit a été envoyé @@ -751,7 +753,7 @@ else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.off if (hit.isOffline()) { storage.deleteHit(hit.getUrl()); } - Tool.executeCallback(trackerListener, Tool.CallbackType.send, hit.getUrl(), TrackerListener.HitStatus.Success); + Tool.executeCallback(trackerListener, Tool.CallbackType.SEND, hit.getUrl(), TrackerListener.HitStatus.Success); updateDebugger(hit.getUrl(), "sent48", true); } } catch (final Exception e) { @@ -792,30 +794,32 @@ void send(boolean includeOfflineHits) { } static void sendOfflineHits(TrackerListener listener, Storage storage, boolean forceSendOfflineHits, boolean async) { - if ((storage.getOfflineMode() != Tracker.OfflineMode.always || forceSendOfflineHits) && TechnicalContext.getConnection() != TechnicalContext.ConnectionType.offline && !OfflineHitProcessing) { - - if (TrackerQueue.getEnabledFillQueueFromDatabase() && storage.getCountOfflineHits() > 0) { - ArrayList offlineHits = storage.getOfflineHits(); - if (async) { - TrackerQueue.setEnabledFillQueueFromDatabase(false); - for (Hit hit : offlineHits) { - Sender sender = new Sender(listener, hit, forceSendOfflineHits); - TrackerQueue.getInstance().put(sender); - } - TrackerQueue.getInstance().put(new Runnable() { - @Override - public void run() { - TrackerQueue.setEnabledFillQueueFromDatabase(true); - } - }); - } else { - OfflineHitProcessing = true; - for (Hit hit : offlineHits) { - Sender sender = new Sender(listener, hit, forceSendOfflineHits); - sender.send(false); + if ((storage.getOfflineMode() != Tracker.OfflineMode.always || forceSendOfflineHits) + && TechnicalContext.getConnection() != TechnicalContext.ConnectionType.OFFLINE + && !OfflineHitProcessing + && TrackerQueue.getEnabledFillQueueFromDatabase() + && storage.getCountOfflineHits() > 0) { + + ArrayList offlineHits = storage.getOfflineHits(); + if (async) { + TrackerQueue.setEnabledFillQueueFromDatabase(false); + for (Hit hit : offlineHits) { + Sender sender = new Sender(listener, hit, forceSendOfflineHits); + TrackerQueue.getInstance().put(sender); + } + TrackerQueue.getInstance().put(new Runnable() { + @Override + public void run() { + TrackerQueue.setEnabledFillQueueFromDatabase(true); } - OfflineHitProcessing = false; + }); + } else { + OfflineHitProcessing = true; + for (Hit hit : offlineHits) { + Sender sender = new Sender(listener, hit, forceSendOfflineHits); + sender.send(false); } + OfflineHitProcessing = false; } } } @@ -832,10 +836,10 @@ private void updateRetryCount(Hit hit) { void saveHitDatabase(final Hit hit) { final String url = storage.saveHit(hit.getUrl(), System.currentTimeMillis(), oltParameter); if (!TextUtils.isEmpty(url)) { - Tool.executeCallback(trackerListener, Tool.CallbackType.save, hit.getUrl()); + Tool.executeCallback(trackerListener, Tool.CallbackType.SAVE, hit.getUrl()); updateDebugger(url, "save48", true); } else { - Tool.executeCallback(trackerListener, Tool.CallbackType.warning, "Hit could not be saved : " + hit.getUrl()); + Tool.executeCallback(trackerListener, Tool.CallbackType.WARNING, "Hit could not be saved : " + hit.getUrl()); updateDebugger("Hit could not be saved : " + hit.getUrl(), "warning48", false); } } @@ -858,7 +862,7 @@ private void updateDebugger(final String message, final String type, final boole @Override public void run() { Debugger.getDebuggerEvents().add(0, new Debugger.DebuggerEvent(message, type, isHit)); - if (Debugger.currentViewVisibleId == com.atinternet.tracker.R.id.eventViewer) { + if (Debugger.getCurrentViewVisibleId() == com.atinternet.tracker.R.id.eventViewer) { Debugger.getDebuggerEventListAdapter().notifyDataSetChanged(); } } @@ -881,9 +885,8 @@ void dispatch(BusinessObject... businessObjects) { businessObject.setEvent(); if (businessObject instanceof AbstractScreen) { - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); boolean hasOrder = false; @@ -907,9 +910,8 @@ void dispatch(BusinessObject... businessObjects) { tracker.Cart().setEvent(); } } else if (businessObject instanceof Gesture) { - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); if (((Gesture) businessObject).getAction() == Gesture.Action.InternalSearch) { for (BusinessObject object : trackerObjects) { @@ -922,9 +924,8 @@ void dispatch(BusinessObject... businessObjects) { } tracker.getBusinessObjects().remove(businessObject.getId()); - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); for (BusinessObject object : trackerObjects) { if ((object instanceof CustomObject || object instanceof NuggAd) && object.getTimestamp() < businessObject.getTimestamp()) { @@ -935,11 +936,12 @@ void dispatch(BusinessObject... businessObjects) { } if (Hit.getHitType(tracker.getBuffer().getVolatileParams(), tracker.getBuffer().getPersistentParams()) == Hit.HitType.Screen) { - TechnicalContext.screenName = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Screen.stringValue())); - CrashDetectionHandler.setCrashLastScreen(TechnicalContext.screenName); + String sn = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Screen.stringValue())); + TechnicalContext.setScreenName(sn); + CrashDetectionHandler.setCrashLastScreen(sn); String level2 = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Level2.stringValue())); - TechnicalContext.level2 = (!TextUtils.isEmpty(level2)) ? Integer.parseInt(level2) : 0; + TechnicalContext.setLevel2((!TextUtils.isEmpty(level2)) ? Integer.parseInt(level2) : 0); SharedPreferences preferences = Tracker.getPreferences(); if (!preferences.getBoolean(TrackerConfigurationKeys.CAMPAIGN_ADDED_KEY, false)) { @@ -1034,14 +1036,18 @@ public void run() { scheduledExecutorService.execute(runnable); } } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } }).start(); } static TrackerQueue getInstance() { - return instance == null ? (instance = new TrackerQueue()) : instance; + if (instance == null) { + instance = new TrackerQueue(); + } + return instance; } @Override @@ -1051,7 +1057,8 @@ public void put(Runnable runnable) { super.put(runnable); } } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } } @@ -1062,7 +1069,10 @@ class EventQueue extends LinkedBlockingQueue { private final ExecutorService executorService; static EventQueue getInstance() { - return instance == null ? (instance = new EventQueue()) : instance; + if (instance == null) { + instance = new EventQueue(); + } + return instance; } private EventQueue() { @@ -1077,7 +1087,8 @@ public void run() { executorService.execute(task); } } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } }).start(); @@ -1090,17 +1101,18 @@ EventQueue cancel(Runnable runnable) { } Runnable insert(final Runnable runnable, int... delay) { - Runnable cancelable; - handler.postDelayed(cancelable = new Runnable() { + Runnable cancelable = new Runnable() { @Override public void run() { try { put(runnable); } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } - }, delay.length == 1 ? delay[0] : 200); + }; + handler.postDelayed(cancelable, delay.length == 1 ? delay[0] : 200); return cancelable; } } @@ -1108,8 +1120,24 @@ public void run() { class TechnicalContext { - static String screenName = ""; - static int level2 = 0; + private static String screenName = ""; + private static int level2 = 0; + + static void setScreenName(String sn) { + screenName = sn; + } + + static String getScreenName() { + return screenName; + } + + static void setLevel2(int lv) { + level2 = lv; + } + + static int getLevel2() { + return level2; + } private static final int RETRY_GET_ADVERTISING_COUNT = 3; private static final String ANDROID_ID_KEY = "androidId"; @@ -1118,7 +1146,7 @@ class TechnicalContext { static final Closure VTAG = new Closure() { @Override public String execute() { - return "2.8.3s"; + return "2.8.4s"; } }; @@ -1130,7 +1158,7 @@ public String execute() { }; enum ConnectionType { - gprs, edge, twog, threeg, threegplus, fourg, wifi, offline, unknown + GPRS, EDGE, TWOG, THREEG, THREEGPLUS, FOURG, WIFI, OFFLINE, UNKNOWN } static ConnectionType getConnection() { @@ -1142,34 +1170,34 @@ static ConnectionType getConnection() { if (networkInfo != null) { if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { - return ConnectionType.wifi; + return ConnectionType.WIFI; } else { switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_GPRS: - return ConnectionType.gprs; + return ConnectionType.GPRS; case TelephonyManager.NETWORK_TYPE_EDGE: - return ConnectionType.edge; + return ConnectionType.EDGE; case TelephonyManager.NETWORK_TYPE_1xRTT: - return ConnectionType.twog; + return ConnectionType.TWOG; case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_B: - return ConnectionType.threeg; + return ConnectionType.THREEG; case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: - return ConnectionType.threegplus; + return ConnectionType.THREEGPLUS; case TelephonyManager.NETWORK_TYPE_HSPAP: case TelephonyManager.NETWORK_TYPE_LTE: - return ConnectionType.fourg; + return ConnectionType.FOURG; default: - return ConnectionType.unknown; + return ConnectionType.UNKNOWN; } } } else { - return ConnectionType.offline; + return ConnectionType.OFFLINE; } } @@ -1178,21 +1206,21 @@ static Closure getConnectionType() { @Override public String execute() { switch (getConnection()) { - case gprs: + case GPRS: return "gprs"; - case edge: + case EDGE: return "edge"; - case twog: + case TWOG: return "2g"; - case threeg: + case THREEG: return "3g"; - case threegplus: + case THREEGPLUS: return "3g+"; - case fourg: + case FOURG: return "4g"; - case wifi: + case WIFI: return "wifi"; - case unknown: + case UNKNOWN: return "unknown"; default: return "offline"; @@ -1318,7 +1346,6 @@ public String execute() { .getDefaultDisplay(); d.getMetrics(metrics); - // since SDK_INT = 1; int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels; @@ -1337,7 +1364,8 @@ public String execute() { heightPixels = realSize.y; } - } catch (Exception ignored) { + } catch (Exception e) { + Log.e(Tracker.TAG, e.toString()); } double x = Math.pow(widthPixels / metrics.xdpi, 2); @@ -1396,7 +1424,7 @@ public String execute() { return "opt-out"; } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); return ""; } } @@ -1416,7 +1444,7 @@ static boolean doNotTrackEnabled(android.content.Context context) { class Tool { enum CallbackType { - firstLaunch, build, send, partner, warning, save, error + FIRST_LAUNCH, BUILD, SEND, PARTNER, WARNING, SAVE, ERROR } static String upperCaseFirstLetter(String s) { @@ -1427,7 +1455,7 @@ static String percentEncode(String s) { try { s = URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return s.replace("+", "%20") .replace("*", "%2A") @@ -1440,7 +1468,7 @@ static String percentDecode(String s) { try { s = URLDecoder.decode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return s; } @@ -1456,7 +1484,7 @@ static String removeCharacters(String s, String... charTobeRemoved) { @SuppressWarnings("unchecked") static String convertToString(Object value, String separator) { separator = (!TextUtils.isEmpty(separator)) ? separator : ","; - String result = ""; + StringBuilder result = new StringBuilder(); boolean isFirst = true; if (value != null) { @@ -1465,10 +1493,10 @@ static String convertToString(Object value, String separator) { for (Object object : listResult) { value = object; if (isFirst) { - result = convertToString(value, separator); + result = new StringBuilder(convertToString(value, separator)); isFirst = false; } else { - result += separator + convertToString(value, separator); + result.append(separator).append(convertToString(value, separator)); } } } else if (value instanceof Object[]) { @@ -1476,13 +1504,13 @@ static String convertToString(Object value, String separator) { value = Arrays.asList(objects); return convertToString(value, separator); } else if (value instanceof Map) { - result = new JSONObject((Map) value).toString(); + result = new StringBuilder(new JSONObject((Map) value).toString()); } else { - result = String.valueOf(value); + result = new StringBuilder(String.valueOf(value)); } } - return result; + return result.toString(); } static ArrayList> findParametersWithPosition(String key, ArrayList parameters) { @@ -1530,22 +1558,22 @@ static Tracker.OfflineMode convertStringToOfflineMode(String offlineMode) { static void executeCallback(TrackerListener trackerListener, CallbackType callbackType, String message, TrackerListener.HitStatus... hitStatuses) { if (trackerListener != null) { switch (callbackType) { - case firstLaunch: + case FIRST_LAUNCH: trackerListener.trackerNeedsFirstLaunchApproval(message); break; - case build: + case BUILD: trackerListener.buildDidEnd(hitStatuses[0], message); break; - case send: + case SEND: trackerListener.sendDidEnd(hitStatuses[0], message); break; - case partner: + case PARTNER: trackerListener.didCallPartner(message); break; - case warning: + case WARNING: trackerListener.warningDidOccur(message); break; - case save: + case SAVE: trackerListener.saveDidEnd(message); break; default://error @@ -1568,16 +1596,16 @@ static int getSecondsBetweenTimes(long latestTimeMillis, long oldestTimeMillis) } static String formatNumberLength(String s, int length) { - String result = ""; + StringBuilder sb = new StringBuilder(); for (int i = s.length(); i < length; i++) { - result += "0"; + sb.append('0'); } - return result + s; + return sb.append(s).toString(); } static boolean isJSON(String s) { try { - JSONObject object = new JSONObject(s); + new JSONObject(s); return true; } catch (JSONException e) { return false; @@ -1586,7 +1614,7 @@ static boolean isJSON(String s) { static boolean isArray(String s) { try { - JSONArray array = new JSONArray(s); + new JSONArray(s); return true; } catch (JSONException e) { return false; @@ -1603,7 +1631,7 @@ static Map toMap(JSONObject jsonObject) { try { value = jsonObject.get(key); } catch (JSONException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } map.put(key, value); } @@ -1643,27 +1671,27 @@ static String appendParameterValues(Param param) { return result.toString(); } - static String SHA_256(String s) { + static String SHA256(String s) { String baseString = "AT" + s; - String result = ""; + StringBuilder sb = new StringBuilder(); try { MessageDigest md; md = MessageDigest.getInstance("SHA-256"); md.update(baseString.getBytes()); - byte byteData[] = md.digest(); + byte[] byteData = md.digest(); for (byte aByteData : byteData) { String hex = Integer.toHexString(0xff & aByteData); if (hex.length() == 1) { - result += "0"; + sb.append('0'); } - result += hex; + sb.append(hex); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } - return result; + return sb.toString(); } static Drawable getResizedImage(int imageID, android.content.Context context, int width, int height) { @@ -1711,7 +1739,7 @@ static LinkedHashMap getParameters(String hit) { } } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return map; } @@ -1745,6 +1773,7 @@ class Storage extends SQLiteOpenHelper { private static final String HIT = "hit"; private static final String RETRY = "retry"; private static final String DATE = "date"; + private static final String SELECT_ALL_QUERY = "SELECT * FROM " + HITS_STORAGE_TABLE + " "; private static final String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS " + HITS_STORAGE_TABLE + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT , " + @@ -1798,22 +1827,22 @@ void deleteHit(String hit) { String buildHitToStore(String hit, String olt) { String[] hitComponents = hit.split("&"); - String newHit = hitComponents[0]; + StringBuilder newHitBuilder = new StringBuilder(hitComponents[0]); for (int i = 1; i < hitComponents.length; i++) { String[] parameterComponents = hitComponents[i].split("="); if (parameterComponents[0].equals("cn")) { - newHit += "&cn=offline"; + newHitBuilder.append("&cn=offline"); } else { - newHit += "&" + hitComponents[i]; + newHitBuilder.append('&').append(hitComponents[i]); } if (parameterComponents[0].equals("ts") || parameterComponents[0].equals("mh")) { - newHit += "&olt=" + olt; + newHitBuilder.append("&olt=").append(olt); } } - return newHit; + return newHitBuilder.toString(); } void updateRetry(String hit, int retry) { @@ -1827,7 +1856,7 @@ void updateRetry(String hit, int retry) { int getCountOfflineHits() { int result = -1; SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE, null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY, null); if (c != null) { result = c.getCount(); c.close(); @@ -1855,7 +1884,7 @@ void removeOldOfflineHits(int storageDuration) { ArrayList getOfflineHits() { ArrayList hits = new ArrayList<>(); SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " ORDER BY " + ID + " ASC", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "ORDER BY " + ID + " ASC", null); if (c != null && c.getCount() > 0) { c.moveToFirst(); do { @@ -1873,7 +1902,7 @@ ArrayList getOfflineHits() { Hit getOldestOfflineHit() { SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " WHERE " + DATE + " = (SELECT MIN(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "WHERE " + DATE + " = (SELECT MIN(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); if (c != null && c.moveToFirst()) { String hit = c.getString(c.getColumnIndex(HIT)); String time = c.getString(c.getColumnIndex(DATE)); @@ -1891,7 +1920,7 @@ Hit getOldestOfflineHit() { Hit getLatestOfflineHit() { SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " WHERE " + DATE + " = (SELECT MAX(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "WHERE " + DATE + " = (SELECT MAX(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); if (c != null && c.moveToFirst()) { String hit = c.getString(c.getColumnIndex(HIT)); String time = c.getString(c.getColumnIndex(DATE)); @@ -1910,59 +1939,62 @@ Hit getLatestOfflineHit() { class Lists { + private Lists() { + throw new IllegalStateException("Private class"); + } + static HashMap getProcessedTypes() { - return new HashMap() {{ - put("audio", Hit.HitType.Audio); - put("video", Hit.HitType.Video); - put("vpre", Hit.HitType.Video); - put("vmid", Hit.HitType.Video); - put("vpost", Hit.HitType.Video); - put("animation", Hit.HitType.Animation); - put("anim", Hit.HitType.Animation); - put("podcast", Hit.HitType.PodCast); - put("rss", Hit.HitType.RSS); - put("email", Hit.HitType.Email); - put("pub", Hit.HitType.Publicite); - put("ad", Hit.HitType.Publicite); - put("click", Hit.HitType.Touch); - put("clic", Hit.HitType.Touch); - put("AT", Hit.HitType.AdTracking); - put("pdt", Hit.HitType.ProduitImpression); - put("mvt", Hit.HitType.MvTesting); - put("wbo", Hit.HitType.Weborama); - put("screen", Hit.HitType.Screen); - }}; + HashMap map = new HashMap<>(); + map.put("audio", Hit.HitType.Audio); + map.put("video", Hit.HitType.Video); + map.put("vpre", Hit.HitType.Video); + map.put("vmid", Hit.HitType.Video); + map.put("vpost", Hit.HitType.Video); + map.put("animation", Hit.HitType.Animation); + map.put("anim", Hit.HitType.Animation); + map.put("podcast", Hit.HitType.PodCast); + map.put("rss", Hit.HitType.RSS); + map.put("email", Hit.HitType.Email); + map.put("pub", Hit.HitType.Publicite); + map.put("ad", Hit.HitType.Publicite); + map.put("click", Hit.HitType.Touch); + map.put("clic", Hit.HitType.Touch); + map.put("AT", Hit.HitType.AdTracking); + map.put("pdt", Hit.HitType.ProduitImpression); + map.put("mvt", Hit.HitType.MvTesting); + map.put("wbo", Hit.HitType.Weborama); + map.put("screen", Hit.HitType.Screen); + return map; } static HashSet getReadOnlyConfigs() { - return new HashSet() {{ - }}; + return new HashSet<>(); } static HashSet getReadOnlyParams() { - return new HashSet() {{ - add("vtag"); - add("ptag"); - add("lng"); - add("mfmd"); - add("manufacturer"); - add("model"); - add("os"); - add("apvr"); - add("hl"); - add("r"); - add("car"); - add("cn"); - add("ts"); - }}; + HashSet set = new HashSet<>(); + set.add("vtag"); + set.add("ptag"); + set.add("lng"); + set.add("mfmd"); + set.add("manufacturer"); + set.add("model"); + set.add("os"); + set.add("apvr"); + set.add("hl"); + set.add("r"); + set.add("car"); + set.add("cn"); + set.add("ts"); + return set; } static HashSet getSliceReadyParams() { - return new HashSet() {{ - add("ati"); - add("atc"); - add("pdtl"); - add("stc"); - }}; + HashSet set = new HashSet<>(); + set.add("ati"); + set.add("atc"); + set.add("pdtl"); + set.add("stc"); + return set; } } \ No newline at end of file diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/CoreFeatures.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/CoreFeatures.java index 54b88751..bec401c5 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/CoreFeatures.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/CoreFeatures.java @@ -31,6 +31,7 @@ of this software and associated documentation files (the "Software"), to deal import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; +import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -130,14 +131,10 @@ static Closure getCrashInformation() { public String execute() { boolean hasCrashed = preferences.getBoolean(CRASH_DETECTION, false); if (hasCrashed) { - final String lastScreen = preferences.getString(CRASH_LAST_SCREEN, ""); - final String className = preferences.getString(CRASH_CLASS_CAUSE, ""); - final String exceptionName = preferences.getString(CRASH_EXCEPTION_NAME, ""); - LinkedHashMap map = new LinkedHashMap() {{ - put("lastscreen", lastScreen); - put("classname", className); - put("error", exceptionName); - }}; + LinkedHashMap map = new LinkedHashMap<>(); + map.put("lastscreen", preferences.getString(CRASH_LAST_SCREEN, "")); + map.put("classname", preferences.getString(CRASH_CLASS_CAUSE, "")); + map.put("error", preferences.getString(CRASH_EXCEPTION_NAME, "")); preferences.edit().putBoolean(CRASH_DETECTION, false).apply(); try { return new JSONObject().put("crash", new JSONObject(map)).toString(); @@ -168,6 +165,11 @@ private String getClassNameException(Throwable t) { class LifeCycle { + /** + * Key representing if it's first launch (backward compat) + */ + static final String AT_FIRST_LAUNCH = "ATFirstLaunch"; + /** * Key representing version code app */ @@ -243,10 +245,9 @@ class LifeCycle { */ private static String versionCode; - /** - * Date format - */ - private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); + private LifeCycle() { + throw new IllegalStateException("Private class"); + } /** * Init lifecycle @@ -274,14 +275,15 @@ static void initLifeCycle(Context context) { static void firstSessionInit(SharedPreferences preferences, SharedPreferences backwardPreferences) { // If SDKV1 lifecycle exists - if (backwardPreferences != null && backwardPreferences.getString("ATFirstLaunch", null) != null) { + if (backwardPreferences != null && backwardPreferences.getString(AT_FIRST_LAUNCH, null) != null) { preferences.edit().putBoolean(FIRST_SESSION, false) - .putString(FIRST_SESSION_DATE, backwardPreferences.getString("ATFirstLaunch", "")) + .putString(FIRST_SESSION_DATE, backwardPreferences.getString(AT_FIRST_LAUNCH, "")) .putInt(SESSION_COUNT, backwardPreferences.getInt("ATLaunchCount", 0)) .putString(LAST_SESSION_DATE, backwardPreferences.getString("ATLastLaunch", "")).apply(); - backwardPreferences.edit().putString("ATFirstLaunch", null).apply(); + backwardPreferences.edit().putString(AT_FIRST_LAUNCH, null).apply(); } else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); preferences.edit() .putBoolean(FIRST_SESSION, true) .putBoolean(FIRST_SESSION_AFTER_UPDATE, false) @@ -309,7 +311,7 @@ static void updateFirstSession(SharedPreferences preferences) { static void newSessionInit(SharedPreferences preferences) { try { - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); updateFirstSession(preferences); // Calcul dsfs String firstLaunchDate = preferences.getString(FIRST_SESSION_DATE, ""); @@ -352,7 +354,7 @@ static void newSessionInit(SharedPreferences preferences) { .apply(); } } catch (ParseException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } sessionId = UUID.randomUUID().toString(); } @@ -426,8 +428,8 @@ public void run() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - TechnicalContext.screenName = null; - TechnicalContext.level2 = 0; + TechnicalContext.setScreenName(null); + TechnicalContext.setLevel2(0); if (savedActivityName == null || activity == null || !activity.getClass().getCanonicalName().equals(savedActivityName) || activity.getTaskId() == savedActivityTaskId) { timeInBackground = -1; @@ -447,7 +449,7 @@ public void onActivityStarted(Activity activity) { @Override public void onActivityResumed(Activity activity) { - if (Debugger.isActive) { + if (Debugger.isActive()) { handler.removeCallbacks(debuggerCancelable); Debugger.setViewerVisibility(true); } @@ -458,7 +460,7 @@ public void onActivityPaused(Activity activity) { savedActivityName = activity.getClass().getCanonicalName(); savedActivityTaskId = activity.getTaskId(); timeInBackground = System.currentTimeMillis(); - if (Debugger.isActive) { + if (Debugger.isActive()) { handler.postDelayed(debuggerCancelable, DELAY); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Debugger.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Debugger.java index 9aec2601..b9aff2b8 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Debugger.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Debugger.java @@ -22,6 +22,7 @@ of this software and associated documentation files (the "Software"), to deal */ package com.atinternet.tracker; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -31,6 +32,7 @@ of this software and associated documentation files (the "Software"), to deal import android.os.Build; import android.provider.Settings; import android.util.DisplayMetrics; +import android.util.Log; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; @@ -65,8 +67,17 @@ public class Debugger extends GestureDetector.SimpleOnGestureListener implements private static final float ALPHA_BACKGROUND = .3f; private static final float DELTA = 100; - static boolean isActive; - static int currentViewVisibleId = -1; + private static boolean active; + private static int currentViewVisibleId = -1; + + static boolean isActive() { + return active; + } + + static int getCurrentViewVisibleId() { + return currentViewVisibleId; + } + private static int itemPosition = -1; private static final ArrayList debuggerEvents = new ArrayList<>(); private static final ArrayList offlineHits = new ArrayList<>(); @@ -129,8 +140,7 @@ public static void show(Context context, Tracker tracker) { public static void create(Context context, Tracker tracker) { if (Build.VERSION.SDK_INT >= 26) { windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; - } - else { + } else { windowType = WindowManager.LayoutParams.TYPE_PHONE; } if (Build.VERSION.SDK_INT >= 23) { @@ -189,7 +199,7 @@ static ArrayList getDebuggerEvents() { } private Debugger(Context ctx, Tracker tr) { - isActive = true; + active = true; context = new WeakReference<>(ctx); remove(); if (context.get().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -220,6 +230,7 @@ public boolean onSingleTapConfirmed(MotionEvent event) { return true; } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event) || viewerVisibility == View.VISIBLE) { @@ -253,6 +264,9 @@ public boolean onTouch(View v, MotionEvent event) { + (int) (event.getRawY() - initialTouchY); ((WindowManager) context.get().getSystemService(Context.WINDOW_SERVICE)).updateViewLayout(bubbleImage.get(), bubbleImageLayoutParams); break; + default: + Log.i(Tracker.TAG, "ignored action"); + break; } return true; } @@ -328,6 +342,7 @@ private void onUpdateAfterItemClick(int position, boolean animate) { } } + @SuppressLint("ClickableViewAccessibility") private void inflateViews(Context context) { debuggerViewerLayout = new WeakReference<>((ATFrameLayout) View.inflate(context, R.layout.debugger_layout, null)); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/DynamicScreen.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/DynamicScreen.java index 55f68542..9f49b872 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/DynamicScreen.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/DynamicScreen.java @@ -184,7 +184,7 @@ void setEvent() { if (screenId.length() > 255) { screenId = ""; - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "screenId too long, replaced by empty value"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "screenId too long, replaced by empty value"); } tracker.setParam(Hit.HitParam.DynamicScreenId.stringValue(), screenId); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Endpoints.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Endpoints.java index 784f6c3c..97149a4d 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Endpoints.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Endpoints.java @@ -2,28 +2,27 @@ import android.text.TextUtils; -import java.util.HashMap; +import java.util.EnumMap; class Endpoints { enum Resource { - Socket, GetConfig, CheckConfig + SOCKET, GET_CONFIG, CHECK_CONFIG } private static final String SOCKET_FORMAT = "https://smartsdk.%1$satinternet-solutions.com"; private static final String GETCONFIG_FORMAT = "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/%1$s/token/%2$s/version/%3$s"; private static final String CHECKCONFIG_FORMAT = "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/%1$s/token/%2$s/version/%3$s/lastUpdate"; - private final HashMap endpointsMap; + private final EnumMap endpointsMap; Endpoints(final String env, final String... args) { final String token = args[0]; - endpointsMap = new HashMap() {{ - put(Resource.Socket, String.format(SOCKET_FORMAT, (env == null || env.equals("prod")) ? "" : env + ".aws.")); - put(Resource.GetConfig, TextUtils.isEmpty(token) ? "" : String.format(GETCONFIG_FORMAT, env, token, args[1])); - put(Resource.CheckConfig, TextUtils.isEmpty(token) ? "" : String.format(CHECKCONFIG_FORMAT, env, args[0], args[1])); - }}; + endpointsMap = new EnumMap<>(Resource.class); + endpointsMap.put(Resource.SOCKET, String.format(SOCKET_FORMAT, (env == null || env.equals("prod")) ? "" : env + ".aws.")); + endpointsMap.put(Resource.GET_CONFIG, TextUtils.isEmpty(token) ? "" : String.format(GETCONFIG_FORMAT, env, token, args[1])); + endpointsMap.put(Resource.CHECK_CONFIG, TextUtils.isEmpty(token) ? "" : String.format(CHECKCONFIG_FORMAT, env, args[0], args[1])); } String getResourceEndpoint(Resource res) { diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Gesture.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Gesture.java index da7afd85..aa4bbc27 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Gesture.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Gesture.java @@ -79,7 +79,10 @@ public String stringValue() { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Gesture(Tracker tracker) { @@ -99,9 +102,12 @@ LinkedHashMap getCustomObjectsMap() { */ @Deprecated public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber); + } + return internalSearch; } /** @@ -113,10 +119,13 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return the InternalSearch instance */ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber, int resultPosition) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber) - .setResultPosition(resultPosition)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber) + .setResultPosition(resultPosition); + } + return internalSearch; } /** @@ -125,7 +134,10 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -298,12 +310,14 @@ public void sendSearch() { @Override void setEvent() { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.TouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.TouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.TouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.TouchLevel2.stringValue(), lvl2); } if (level2 > 0) { diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/GetConfigRequester.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/GetConfigRequester.java index 39fbc536..25682da8 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/GetConfigRequester.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/GetConfigRequester.java @@ -1,6 +1,7 @@ package com.atinternet.tracker; import android.text.TextUtils; +import android.util.Log; import org.json.JSONObject; @@ -10,6 +11,7 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.Random; class GetConfigRequester implements Runnable { @@ -19,9 +21,11 @@ class GetConfigRequester implements Runnable { private static final int CONFIGURATION_TIME_TO_LIVE_RANDOM = 1200; private String endpoint; + private Random random; GetConfigRequester(String endpoint) { this.endpoint = endpoint; + random = new Random(); } @Override @@ -31,7 +35,7 @@ public void run() { if (!TextUtils.isEmpty(endpoint)) { int timeToLive = -1; if (AutoTracker.getInstance().isEnabledAutoTracking()) { - timeToLive = CONFIGURATION_TIME_TO_LIVE + (int) (Math.random() * CONFIGURATION_TIME_TO_LIVE_RANDOM); + timeToLive = CONFIGURATION_TIME_TO_LIVE + random.nextInt() * CONFIGURATION_TIME_TO_LIVE_RANDOM; } if (AutoTracker.getInstance().isEnabledLiveTagging()) { timeToLive = 0; @@ -72,7 +76,7 @@ public void run() { } AutoTracker.getInstance().setAutoTrackingConfiguration(new JSONObject(conf)); } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Hit.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Hit.java index 786de3a2..d2747159 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Hit.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Hit.java @@ -272,10 +272,9 @@ public boolean isOffline() { } static HitType getHitType(final LinkedHashMap volatileParams, final LinkedHashMap persistentParams) { - LinkedHashMap buffer = new LinkedHashMap() {{ - putAll(volatileParams); - putAll(persistentParams); - }}; + LinkedHashMap buffer = new LinkedHashMap<>(); + buffer.putAll(volatileParams); + buffer.putAll(persistentParams); HitType type = HitType.Screen; diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveAudios.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveAudios.java index b95209d0..6937e2d7 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveAudios.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveAudios.java @@ -43,22 +43,15 @@ public class LiveAudios { * @return LiveAudio instance */ public LiveAudio add(String name) { - int index = -1; - int length = list.size(); + int index = searchLiveAudioIndexByName(name); LiveAudio liveAudio; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { liveAudio = new LiveAudio(player) .setName(name); list.add(liveAudio); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "This liveAudio already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "This liveAudio already exists"); liveAudio = list.get(index); } @@ -107,15 +100,7 @@ public LiveAudio add(String name, String chapter1, String chapter2, String chapt * @param name live audio name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchLiveAudioIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -132,4 +117,15 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchLiveAudioIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + + return -1; + } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveVideos.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveVideos.java index 8dc0e05d..7d26fb60 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveVideos.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/LiveVideos.java @@ -43,22 +43,15 @@ public class LiveVideos { * @return LiveVideo instance */ public LiveVideo add(String name) { - int index = -1; - int length = list.size(); + int index = searchLiveVideoIndexByName(name); LiveVideo liveVideo; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { liveVideo = new LiveVideo(player) .setName(name); list.add(liveVideo); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "LiveVideo with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "LiveVideo with the same name already exists"); liveVideo = list.get(index); } @@ -107,15 +100,7 @@ public LiveVideo add(String name, String chapter1, String chapter2, String chapt * @param name live video name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchLiveVideoIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -132,4 +117,15 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchLiveVideoIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + + return -1; + } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayer.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayer.java index dded6213..04ea517c 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayer.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayer.java @@ -49,7 +49,10 @@ Tracker getTracker() { * @return the Videos instance */ public Videos Videos() { - return videos == null ? (videos = new Videos(this)) : videos; + if (videos == null) { + videos = new Videos(this); + } + return videos; } /** @@ -58,7 +61,10 @@ public Videos Videos() { * @return the Audios instance */ public Audios Audios() { - return audios == null ? (audios = new Audios(this)) : audios; + if (audios == null) { + audios = new Audios(this); + } + return audios; } /** @@ -67,7 +73,10 @@ public Audios Audios() { * @return the LiveVideos instance */ public LiveVideos LiveVideos() { - return liveVideos == null ? (liveVideos = new LiveVideos(this)) : liveVideos; + if (liveVideos == null) { + liveVideos = new LiveVideos(this); + } + return liveVideos; } /** @@ -76,7 +85,10 @@ public LiveVideos LiveVideos() { * @return the LiveAudios instance */ public LiveAudios LiveAudios() { - return liveAudios == null ? (liveAudios = new LiveAudios(this)) : liveAudios; + if (liveAudios == null) { + liveAudios = new LiveAudios(this); + } + return liveAudios; } /** diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayers.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayers.java index f91f8767..e80e16ce 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayers.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/MediaPlayers.java @@ -63,7 +63,7 @@ public MediaPlayer add(int playerId) { return player; } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Player with the same id already exists"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Player with the same id already exists"); return players.get(playerId); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/NuggAd.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/NuggAd.java index 5363ab9c..ad1c8a51 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/NuggAd.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/NuggAd.java @@ -58,7 +58,7 @@ void setEvent() { e.printStackTrace(); } } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "NuggAd not enabled"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "NuggAd not enabled"); } } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Order.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Order.java index f180ff96..08975a2b 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Order.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Order.java @@ -58,7 +58,10 @@ OrderCustomVars getCustomVariables() { * @return OrderDiscount instance */ public OrderDiscount Discount() { - return orderDiscount == null ? (orderDiscount = new OrderDiscount(this)) : orderDiscount; + if (orderDiscount == null) { + orderDiscount = new OrderDiscount(this); + } + return orderDiscount; } /** @@ -67,7 +70,10 @@ public OrderDiscount Discount() { * @return OrderAmount instance */ public OrderAmount Amount() { - return orderAmount == null ? (orderAmount = new OrderAmount(this)) : orderAmount; + if (orderAmount == null) { + orderAmount = new OrderAmount(this); + } + return orderAmount; } /** @@ -76,7 +82,10 @@ public OrderAmount Amount() { * @return OrderDelivery instance */ public OrderDelivery Delivery() { - return orderDelivery == null ? (orderDelivery = new OrderDelivery(this)) : orderDelivery; + if (orderDelivery == null) { + orderDelivery = new OrderDelivery(this); + } + return orderDelivery; } /** @@ -85,7 +94,10 @@ public OrderDelivery Delivery() { * @return OrderCustomVars instance */ public OrderCustomVars CustomVars() { - return customVariables = (customVariables == null) ? new OrderCustomVars() : customVariables; + if (customVariables == null) { + customVariables = new OrderCustomVars(); + } + return customVariables; } /** diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ParamOption.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ParamOption.java index 91ef8f29..0b72ae99 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ParamOption.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ParamOption.java @@ -28,7 +28,7 @@ of this software and associated documentation files (the "Software"), to deal public class ParamOption { enum Type { - JSON, Array, Default, + JSON, ARRAY, DEFAULT, } /** @@ -204,6 +204,6 @@ public ParamOption() { encode = false; persistent = false; append = false; - type = Type.Default; + type = Type.DEFAULT; } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Product.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Product.java index 912dfbc6..92bdd144 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Product.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Product.java @@ -65,7 +65,10 @@ public String stringValue() { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Product(Tracker tracker) { @@ -360,7 +363,10 @@ public Product setPromotionalCode(String promotionalCode) { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Products.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Products.java index 55b5480c..0a69ff70 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Products.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Products.java @@ -177,9 +177,8 @@ public void remove(String productId) { cart.getProductsList().remove(index); } } else { - ArrayList objects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + ArrayList objects = new ArrayList<>(); + objects.addAll(tracker.getBusinessObjects().values()); length = objects.size(); for (int i = 0; i < length; i++) { if (objects.get(i) instanceof Product && ((Product) objects.get(i)).getProductId().equals(productId)) { @@ -197,9 +196,8 @@ public void removeAll() { if (cart != null) { cart.getProductsList().clear(); } else { - ArrayList objects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + ArrayList objects = new ArrayList<>(); + objects.addAll(tracker.getBusinessObjects().values()); for (BusinessObject obj : objects) { if (obj instanceof Product) { tracker.getBusinessObjects().remove(obj.getId()); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Publisher.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Publisher.java index 12d1ac37..cc2b2ff2 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Publisher.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Publisher.java @@ -47,7 +47,10 @@ public class Publisher extends OnAppAd { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Publisher(Tracker tracker) { @@ -232,7 +235,10 @@ public Publisher setAction(Action action) { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } @Override @@ -260,12 +266,14 @@ void setEvent() { } if (action == Action.Touch) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), lvl2); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/PublisherImpression.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/PublisherImpression.java index 8c77e95d..effef4bb 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/PublisherImpression.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/PublisherImpression.java @@ -46,12 +46,12 @@ public Publisher setAction(Action action) { @Override public void sendImpression() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } @Override public void sendTouch() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ReflectionAPI.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ReflectionAPI.java index ee31942f..57a8eb46 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ReflectionAPI.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/ReflectionAPI.java @@ -40,6 +40,10 @@ of this software and associated documentation files (the "Software"), to deal final class ReflectionAPI { + private ReflectionAPI() { + throw new IllegalStateException("Private Class"); + } + /** * Takes screenshot of provided activity and puts it into bitmap. * @@ -136,12 +140,13 @@ static List getViewRootDatas(Activity activity) { List rootObjects = null; List paramsObject = null; - Object result; + Object result = getFieldValue("mRoots", globalWindowManager); - if ((result = getFieldValue("mRoots", globalWindowManager)) instanceof List) { + if (result instanceof List) { rootObjects = (List) result; } - if ((result = getFieldValue("mParams", globalWindowManager)) instanceof List) { + result = getFieldValue("mParams", globalWindowManager); + if (result instanceof List) { paramsObject = (List) result; } @@ -182,10 +187,10 @@ private static ArrayList getTouchablesByReflection(ViewGroup baseView) { for (int i = 0; i < baseView.getChildCount(); i++) { View child = baseView.getChildAt(i); Object mListenerInfo; - if (child.isShown() && (mListenerInfo = getFieldValue("mListenerInfo", child)) != null) { - if (getFieldValue("mOnClickListener", mListenerInfo) != null || getFieldValue("mOnTouchListener", mListenerInfo) != null) { - touchables.add(child); - } + if (child.isShown() + && (mListenerInfo = getFieldValue("mListenerInfo", child)) != null + && (getFieldValue("mOnClickListener", mListenerInfo) != null || getFieldValue("mOnTouchListener", mListenerInfo) != null)) { + touchables.add(child); } if (child instanceof ViewGroup) { touchables.addAll(getTouchablesByReflection((ViewGroup) child)); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/RichMedia.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/RichMedia.java index 17dd9d40..49a51c42 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/RichMedia.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/RichMedia.java @@ -218,12 +218,14 @@ void setEvent() { } if (!isEmbedded) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.RichMediaScreen.stringValue(), TechnicalContext.screenName, encode); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.RichMediaScreen.stringValue(), sn, encode); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.RichMediaLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.RichMediaLevel2.stringValue(), lvl2); } } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Screen.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Screen.java index 886c52c6..f9fb7739 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Screen.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Screen.java @@ -59,8 +59,8 @@ String getTitle() { Screen() { super(); - className = (SmartContext.currentFragment != null && SmartContext.currentFragment.get() != null) ? SmartContext.currentFragment.get().getClass().getSimpleName() : - (SmartContext.currentActivity != null && SmartContext.currentActivity.get() != null) ? SmartContext.currentActivity.get().getClass().getSimpleName() : null; + String activityClassName = (SmartContext.currentActivity != null && SmartContext.currentActivity.get() != null) ? SmartContext.currentActivity.get().getClass().getSimpleName() : null; + className = (SmartContext.currentFragment != null && SmartContext.currentFragment.get() != null) ? SmartContext.currentFragment.get().getClass().getSimpleName() : activityClassName; title = className; app = AutoTracker.getInstance().getApplication(); if (app != null) { diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotion.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotion.java index 4e38f4d8..a2c5c6a5 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotion.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotion.java @@ -42,7 +42,10 @@ public class SelfPromotion extends OnAppAd { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } SelfPromotion(Tracker tracker) { @@ -127,7 +130,10 @@ public SelfPromotion setAction(Action action) { * @return the CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } @Override @@ -151,12 +157,14 @@ void setEvent() { } if (action == Action.Touch) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), lvl2); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java index 6b05afc1..57ca209c 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java @@ -47,12 +47,12 @@ public SelfPromotion setAction(Action action) { @Override public void sendImpression() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } @Override public void sendTouch() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartClasses.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartClasses.java index 10c8fea6..c07ec88a 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartClasses.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartClasses.java @@ -22,6 +22,7 @@ of this software and associated documentation files (the "Software"), to deal */ package com.atinternet.tracker; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -34,6 +35,7 @@ of this software and associated documentation files (the "Software"), to deal import android.os.Build; import android.os.Handler; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Pair; import android.view.Display; import android.view.GestureDetector; @@ -127,6 +129,11 @@ public void onShow(DialogInterface dialogInterface) { } final class SmartContext { + + private SmartContext() { + throw new IllegalStateException("Private class"); + } + static boolean listenersSet = false; static WeakReference currentActivity; static WeakReference currentFragment; @@ -135,30 +142,18 @@ final class SmartContext { class SmartSender implements View.OnClickListener { enum LiveConnectionState { - Disconnected, Pending, Connected + DISCONNECTED, PENDING, CONNECTED } enum AliveState { - Aborted, Stopped, Refused, Asked, None + ABORTED, STOPPED, REFUSED, ASKED, NONE } long startTime = System.currentTimeMillis(); static final int COOLDOWN = 3000; private static final int DELAY = 3000; - private static final HashSet NOT_TRACKABLE_EVENT_LIST = new HashSet() {{ - add("DeviceAcceptedLive"); - add("DeviceAskedForLive"); - add("DeviceRefusedLive"); - add("DeviceTokenAlreadyUsed"); - add("DeviceVersion"); - add("DeviceAbortedLiveRequest"); - add("DeviceStoppedLive"); - add("ScreenshotUpdated"); - add("app"); - add("screenshot"); - add("screenRotation"); - }}; + private static final HashSet NOT_TRACKABLE_EVENT_LIST = new HashSet<>(); private JSONObject lastViewDidAppear; private LiveConnectionState liveConnectionState; @@ -175,6 +170,17 @@ enum AliveState { SmartSender(String token, String socketEndpoint) { this.token = token; this.socketEndpoint = socketEndpoint; + NOT_TRACKABLE_EVENT_LIST.add("DeviceAcceptedLive"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceAskedForLive"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceRefusedLive"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceTokenAlreadyUsed"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceVersion"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceAbortedLiveRequest"); + NOT_TRACKABLE_EVENT_LIST.add("DeviceStoppedLive"); + NOT_TRACKABLE_EVENT_LIST.add("ScreenshotUpdated"); + NOT_TRACKABLE_EVENT_LIST.add("app"); + NOT_TRACKABLE_EVENT_LIST.add("screenshot"); + NOT_TRACKABLE_EVENT_LIST.add("screenRotation"); } Toolbar getToolbar() { @@ -191,8 +197,8 @@ void showPopup(Popup popup) { void reset() { this.popup.dismiss(); - aliveState = AliveState.None; - setLiveConnectionState(LiveConnectionState.Disconnected); + aliveState = AliveState.NONE; + setLiveConnectionState(LiveConnectionState.DISCONNECTED); } AliveState getAliveState() { @@ -215,7 +221,7 @@ void setLiveConnectionState(final LiveConnectionState liveConnectionState, final Tool.runOnMainThread(currentActivity, new Runnable() { @Override public void run() { - if (liveConnectionState == LiveConnectionState.Connected) { + if (liveConnectionState == LiveConnectionState.CONNECTED) { toolbar.setConnectedState(); handler.removeCallbacks(runnable); if (args.length == 1 && args[0].equals("DeviceAcceptedLive")) { @@ -225,7 +231,7 @@ public void run() { if (lastViewDidAppear != null) { sendMessage(lastViewDidAppear); } - } else if (liveConnectionState == LiveConnectionState.Pending) { + } else if (liveConnectionState == LiveConnectionState.PENDING) { toolbar.setPendingState(); if (args.length == 1 && args[0].equals("Device")) { runnable = new Runnable() { @@ -237,7 +243,7 @@ public void run() { }; handler.postDelayed(runnable, 0); } - } else if (liveConnectionState == LiveConnectionState.Disconnected) { + } else if (liveConnectionState == LiveConnectionState.DISCONNECTED) { toolbar.setDisconnectedState(); handler.removeCallbacks(runnable); if (args.length == 1) { @@ -261,7 +267,7 @@ void init() { } private void initWebSocket() { - liveConnectionState = LiveConnectionState.Disconnected; + liveConnectionState = LiveConnectionState.DISCONNECTED; try { io.socket.client.IO.Options opts = new io.socket.client.IO.Options(); opts.query = "token=" + token; @@ -299,7 +305,7 @@ public void call(Object... args) { .on("InterfaceAbortedLiveRequest", listener); } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -320,16 +326,15 @@ private ArrayList getEventsCombination(String eventName, JSONObject json final String view = "." + data.getJSONObject("view").getString("className"); final String screen = "." + data.getJSONObject("screen").getString("className"); - arrayList = new ArrayList() {{ - add(eventKeyBase + position + view + screen); - add(eventKeyBase + position + view); - add(eventKeyBase + position); - add(eventKeyBase + position + screen); - add(eventKeyBase); - add(eventKeyBase + view); - add(eventKeyBase + screen); - add(eventKeyBase + view + screen); - }}; + arrayList = new ArrayList<>(); + arrayList.add(eventKeyBase + position + view + screen); + arrayList.add(eventKeyBase + position + view); + arrayList.add(eventKeyBase + position); + arrayList.add(eventKeyBase + position + screen); + arrayList.add(eventKeyBase); + arrayList.add(eventKeyBase + view); + arrayList.add(eventKeyBase + screen); + arrayList.add(eventKeyBase + view + screen); } catch (JSONException e) { e.printStackTrace(); @@ -495,22 +500,19 @@ void sendMessage(final JSONObject jsonObject, boolean... force) { if (event.equals("viewDidAppear")) { lastViewDidAppear = jsonObject; } - if (AutoTracker.getInstance().isEnabledAutoTracking()) { - if (shouldTrackEvent(event)) { - TrackerQueue.getInstance().put(new Runnable() { - @Override - public void run() { - mapConfAndSend(jsonObject); - } - }); - } - } - if (AutoTracker.getInstance().isEnabledLiveTagging()) { - if (socketIOClient != null && socketIOClient.connected()) { - if (liveConnectionState == LiveConnectionState.Connected || (force.length == 1 && force[0])) { - socketIOClient.emit("message", jsonObject); + if (AutoTracker.getInstance().isEnabledAutoTracking() && shouldTrackEvent(event)) { + TrackerQueue.getInstance().put(new Runnable() { + @Override + public void run() { + mapConfAndSend(jsonObject); } - } + }); + } + if (AutoTracker.getInstance().isEnabledLiveTagging() + && socketIOClient != null + && socketIOClient.connected() + && (liveConnectionState == LiveConnectionState.CONNECTED || (force.length == 1 && force[0]))) { + socketIOClient.emit("message", jsonObject); } } catch (JSONException e) { e.printStackTrace(); @@ -522,14 +524,14 @@ public void onClick(View view) { int currentId = view.getId(); if (currentId == R.id.recordButtonView) { switch (liveConnectionState) { - case Disconnected: - setLiveConnectionState(LiveConnectionState.Pending, "Device"); + case DISCONNECTED: + setLiveConnectionState(LiveConnectionState.PENDING, "Device"); break; - case Pending: - setLiveConnectionState(LiveConnectionState.Disconnected, "DeviceAbortedLiveRequest"); + case PENDING: + setLiveConnectionState(LiveConnectionState.DISCONNECTED, "DeviceAbortedLiveRequest"); break; - case Connected: - setLiveConnectionState(LiveConnectionState.Disconnected, "DeviceStoppedLive"); + case CONNECTED: + setLiveConnectionState(LiveConnectionState.DISCONNECTED, "DeviceStoppedLive"); break; } } else if (currentId == R.id.cameraImageView) { @@ -559,7 +561,7 @@ private void takeScreenshot(final Activity currentAct) { flash.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { - + // Do Nothing because event must be ignored } @Override @@ -570,7 +572,7 @@ public void onAnimationEnd(Animation animation) { @Override public void onAnimationRepeat(Animation animation) { - + // Do Nothing because event must be ignored } }); @@ -584,14 +586,20 @@ public void onAnimationRepeat(Animation animation) { class UI { + private UI() { + throw new IllegalStateException("Private class"); + } + private static HashMap fonts; static HashMap getFonts(final Context c) { - return fonts == null ? fonts = new HashMap() {{ - put("OpenSans-Regular", Typeface.createFromAsset(c.getAssets(), "fonts/OpenSans-Regular.ttf")); - put("Montserrat-Bold", Typeface.createFromAsset(c.getAssets(), "fonts/Montserrat-Bold.ttf")); - put("Montserrat-Regular", Typeface.createFromAsset(c.getAssets(), "fonts/Montserrat-Regular.ttf")); - }} : fonts; + if (fonts == null) { + fonts = new HashMap<>(); + fonts.put("OpenSans-Regular", Typeface.createFromAsset(c.getAssets(), "fonts/OpenSans-Regular.ttf")); + fonts.put("Montserrat-Bold", Typeface.createFromAsset(c.getAssets(), "fonts/Montserrat-Bold.ttf")); + fonts.put("Montserrat-Regular", Typeface.createFromAsset(c.getAssets(), "fonts/Montserrat-Regular.ttf")); + } + return fonts; } static Pair getScreenSize(Display d) { @@ -606,7 +614,8 @@ static Pair getScreenSize(Display d) { Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize); return new Pair<>(realSize.x, realSize.y); } - } catch (Exception ignored) { + } catch (Exception e) { + Log.e(Tracker.TAG, e.toString()); } } DisplayMetrics metrics = new DisplayMetrics(); @@ -662,8 +671,8 @@ class Toolbar extends GestureDetector.SimpleOnGestureListener implements View.On private static final int TIMER = 1000; private static final String TIMER_FORMAT = "%02d : %02d : %02d"; - private static int TOOLBAR_WIDTH; - private static int TOOLBAR_HEIGHT; + private static int TOOLBARWIDTH; + private static int TOOLBARHEIGHT; private static WeakReference toolbarLayout; private final View recordButtonView; @@ -671,7 +680,7 @@ class Toolbar extends GestureDetector.SimpleOnGestureListener implements View.On private final TextView timerTextView; private final Handler handler; - private final Runnable timer; + private final Runnable timerRunnable; private final WindowManager wm; private final WindowManager.LayoutParams toolbarLayoutParams; private final GestureDetector gestureDetector; @@ -681,11 +690,11 @@ class Toolbar extends GestureDetector.SimpleOnGestureListener implements View.On private int hours; private void startTimer() { - handler.postDelayed(timer, TIMER); + handler.postDelayed(timerRunnable, TIMER); } private void stopTimer() { - handler.removeCallbacks(timer); + handler.removeCallbacks(timerRunnable); seconds = 0; min = 0; hours = 0; @@ -715,17 +724,18 @@ void setVisible(boolean visible) { toolbarLayout.get().setVisibility(visible ? View.VISIBLE : View.GONE); } + @SuppressLint("ClickableViewAccessibility") Toolbar() { Context c = AutoTracker.appContext.get(); seconds = 0; min = 0; hours = 0; handler = new Handler(); - timer = new Runnable() { + timerRunnable = new Runnable() { @Override public void run() { updateTimer(); - handler.postDelayed(timer, TIMER); + handler.postDelayed(timerRunnable, TIMER); } }; @@ -733,13 +743,13 @@ public void run() { wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(metrics); - TOOLBAR_WIDTH = (int) (200 * metrics.density); - TOOLBAR_HEIGHT = (int) (50 * metrics.density); + TOOLBARWIDTH = (int) (200 * metrics.density); + TOOLBARHEIGHT = (int) (50 * metrics.density); toolbarLayout = new WeakReference<>((ATRelativeLayout) View.inflate(c, R.layout.toolbar_layout, null)); recordButtonView = toolbarLayout.get().findViewById(R.id.recordButtonView); - connectionTextView = (TextView) toolbarLayout.get().findViewById(R.id.connectionTextView); - timerTextView = (TextView) toolbarLayout.get().findViewById(R.id.timerTextView); + connectionTextView = toolbarLayout.get().findViewById(R.id.connectionTextView); + timerTextView = toolbarLayout.get().findViewById(R.id.timerTextView); Typeface tp = UI.getFonts(c).get("OpenSans-Regular"); connectionTextView.setTypeface(tp); @@ -748,16 +758,23 @@ public void run() { gestureDetector = new GestureDetector(c, this); toolbarLayout.get().setOnTouchListener(this); + int windowType; + if (Build.VERSION.SDK_INT >= 26) { + windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + windowType = WindowManager.LayoutParams.TYPE_PHONE; + } + toolbarLayoutParams = new WindowManager.LayoutParams( - TOOLBAR_WIDTH, - TOOLBAR_HEIGHT, - WindowManager.LayoutParams.TYPE_PHONE, + TOOLBARWIDTH, + TOOLBARHEIGHT, + windowType, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); toolbarLayoutParams.gravity = Gravity.TOP | Gravity.START; - toolbarLayoutParams.x = metrics.widthPixels / 2 - (TOOLBAR_WIDTH / 2); - toolbarLayoutParams.y = metrics.heightPixels - (TOOLBAR_HEIGHT * 2); + toolbarLayoutParams.x = metrics.widthPixels / 2 - (TOOLBARWIDTH / 2); + toolbarLayoutParams.y = metrics.heightPixels - (TOOLBARHEIGHT * 2); wm.addView(toolbarLayout.get(), toolbarLayoutParams); } @@ -784,18 +801,17 @@ void setClickListeners(View.OnClickListener cl) { toolbarLayout.get().findViewById(R.id.cameraImageView).setOnClickListener(cl); } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View view, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } else { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: - toolbarLayoutParams.x = (int) event.getRawX() - (TOOLBAR_WIDTH / 2); - toolbarLayoutParams.y = (int) event.getRawY() - TOOLBAR_HEIGHT; - wm.updateViewLayout(toolbarLayout.get(), toolbarLayoutParams); - break; + int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { + toolbarLayoutParams.x = (int) event.getRawX() - (TOOLBARWIDTH / 2); + toolbarLayoutParams.y = (int) event.getRawY() - TOOLBARHEIGHT; + wm.updateViewLayout(toolbarLayout.get(), toolbarLayoutParams); } return true; } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartFragment.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartFragment.java index 487df097..2e175a1d 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartFragment.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartFragment.java @@ -37,6 +37,7 @@ public abstract class SmartFragment extends android.support.v4.app.Fragment { /** * Abstract method to get the current fragment class : please use return this + * * @return the current fragment class */ public abstract android.support.v4.app.Fragment getFragment(); @@ -55,9 +56,8 @@ public void run() { @Override public View onCreateView(LayoutInflater inflater, @android.support.annotation.Nullable ViewGroup container, @android.support.annotation.Nullable Bundle savedInstanceState) { - - TechnicalContext.screenName = null; - TechnicalContext.level2 = 0; + TechnicalContext.setScreenName(null); + TechnicalContext.setLevel2(0); return super.onCreateView(inflater, container, savedInstanceState); } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartListeners.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartListeners.java index 19af362d..b5b97a8d 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartListeners.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartListeners.java @@ -87,6 +87,9 @@ public void onSensorChanged(SensorEvent event) { case Surface.ROTATION_270: newOrientation = 2; break; + default: + break; + } if (orientation != newOrientation) { orientation = newOrientation; @@ -96,7 +99,7 @@ public void onSensorChanged(SensorEvent event) { @Override public void onAccuracyChanged(Sensor sensor, int i) { - + // Do nothing } } @@ -124,7 +127,6 @@ Window.Callback getDefaultCallback() { @Override public boolean dispatchKeyEvent(KeyEvent keyEvent) { if (keyEvent.getAction() == KeyEvent.ACTION_UP && keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK) { - // TODO Track it ?? Log.d(TAG, "Back detected "); } return defaultCallback.dispatchKeyEvent(keyEvent); @@ -203,7 +205,7 @@ public void onWindowFocusChanged(boolean b) { if (!views.isEmpty()) { ViewRootData vrd = views.get(views.size() - 1); View v = vrd.getView(); - if(v instanceof ViewGroup) { + if (v instanceof ViewGroup) { ViewGroup vg = (ViewGroup) v; View child = vg.getChildAt(vg.getChildCount() - 1); if (!(child instanceof ATLayer) && vrd.isDialogType() && vg.findViewById(R.id.atCustomDialogTitle) == null) { @@ -515,7 +517,7 @@ public void onActivityPaused(Activity activity) { @Override public void onOrientationChange(final int orientation) { - if (smartSender.getLiveConnectionState() == SmartSender.LiveConnectionState.Pending) { + if (smartSender.getLiveConnectionState() == SmartSender.LiveConnectionState.PENDING) { smartSender.reset(); } else { final SmartEvent smartEvent = new SmartEvent(new SmartView(null, new int[2]).setClassName("UIRotation"), null, -1, -1, "deviceRotate", "-1"); diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartObjects.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartObjects.java index 72f1165e..e60f83e0 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartObjects.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SmartObjects.java @@ -38,8 +38,6 @@ of this software and associated documentation files (the "Software"), to deal import android.view.ViewGroup; import android.view.ViewParent; import android.view.WindowManager; -import android.widget.EditText; -import android.widget.TextView; import org.json.JSONException; import org.json.JSONObject; @@ -226,7 +224,6 @@ JSONObject getData() { class SmartView { private int id; private String className; - private String text; private String path; private String screenShot; private float x; @@ -246,7 +243,6 @@ class SmartView { height = view == null ? 0 : view.getHeight(); visible = view != null && view.isShown(); path = view == null ? "/" : getPath(view); - text = view == null ? "" : (view instanceof ViewGroup ? getTextViewGroup((ViewGroup) view) : detectViewText(view)); position = view == null ? -1 : getPositionInTreeView(view); } @@ -279,50 +275,18 @@ int getId() { } private String getPath(View view) { - StringBuilder path = new StringBuilder(view.getClass().getSimpleName()); + StringBuilder pathSb = new StringBuilder(view.getClass().getSimpleName()); ViewParent parent = view.getParent(); while (parent != null) { - path.insert(0, "/") + pathSb.insert(0, "/") .insert(0, parent.getClass().getSimpleName()); parent = parent.getParent(); } - return path.toString(); - } - - private String getTextViewGroup(ViewGroup view) { - String text = null; - for (int i = 0; i < view.getChildCount(); i++) { - View child = view.getChildAt(i); - if (child instanceof ViewGroup) { - text = getTextViewGroup((ViewGroup) child); - } else { - text = detectViewText(child); - } - if (!TextUtils.isEmpty(text)) { - break; - } - } - return text; - } - - private String detectViewText(View view) { - if (view instanceof EditText) { - EditText editText = (EditText) view; - CharSequence hint; - if ((hint = editText.getHint()) == null) { - return ""; - } else { - return hint.toString(); - } - } else if (view instanceof TextView) { - return ((TextView) view).getText().toString(); - } else { - return ""; - } + return pathSb.toString(); } private int getPositionInTreeView(View view) { - int position = -1; + int pos = -1; ViewParent parent = view.getParent(); if (!(parent instanceof ViewGroup)) { return 0; @@ -332,13 +296,13 @@ private int getPositionInTreeView(View view) { for (int i = 0; i < length; i++) { View child = parentVG.getChildAt(i); if (child.getClass().isAssignableFrom(view.getClass())) { - position++; + pos++; if (child.equals(view)) { - return position; + return pos; } } } - return position; + return pos; } JSONObject getData(float scale) { @@ -349,7 +313,6 @@ JSONObject getData(float scale) { .put("y", (int) (y / scale)) .put("width", (int) (width / scale)) .put("height", (int) (height / scale)) - .put("text", text) .put("path", path) .put("screenshot", screenShot) .put("visible", visible) diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SocketHelpers.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SocketHelpers.java index 718c95b0..b614f98e 100755 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SocketHelpers.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/SocketHelpers.java @@ -42,12 +42,19 @@ abstract class SocketReceivable { class SocketEmitterMessages { + private static final String EVENT = "event"; + private static final String DATA = "data"; + + private SocketEmitterMessages() { + throw new IllegalStateException("Private class"); + } + static JSONObject DeviceAskedForLive() { try { JSONObject jsonObject = new JSONObject(); - jsonObject.put("event", "DeviceAskedForLive") - .put("data", AutoTracker.getInstance().getApplication().getData()); + jsonObject.put(EVENT, "DeviceAskedForLive") + .put(DATA, AutoTracker.getInstance().getApplication().getData()); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -60,8 +67,8 @@ static JSONObject DeviceDisableLive(String eventName) { JSONObject jsonObject = new JSONObject(); JSONObject dataObject = new JSONObject(); dataObject.put("token", AutoTracker.getInstance().getToken()); - jsonObject.put("event", eventName) - .put("data", dataObject); + jsonObject.put(EVENT, eventName) + .put(DATA, dataObject); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -74,8 +81,8 @@ static JSONObject DeviceAcceptedLive() { JSONObject jsonObject = new JSONObject(); JSONObject dataObject = new JSONObject(); dataObject.put("token", AutoTracker.getInstance().getToken()); - jsonObject.put("event", "DeviceAcceptedLive") - .put("data", dataObject); + jsonObject.put(EVENT, "DeviceAcceptedLive") + .put(DATA, dataObject); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -87,8 +94,8 @@ static JSONObject DeviceVersion() { try { JSONObject jsonObject = new JSONObject(); - jsonObject.put("event", "DeviceVersion") - .put("data", AutoTracker.getInstance().getApplication().getData()); + jsonObject.put(EVENT, "DeviceVersion") + .put(DATA, AutoTracker.getInstance().getApplication().getData()); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -100,8 +107,8 @@ static JSONObject App() { try { JSONObject jsonObject = new JSONObject(); - jsonObject.put("event", "app") - .put("data", AutoTracker.getInstance().getApplication().getData()); + jsonObject.put(EVENT, "app") + .put(DATA, AutoTracker.getInstance().getApplication().getData()); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -113,8 +120,8 @@ static JSONObject DeviceTokenAlreadyUsed() { try { JSONObject jsonObject = new JSONObject(); - jsonObject.put("event", "DeviceTokenAlreadyUsed") - .put("data", AutoTracker.getInstance().getApplication().getData()); + jsonObject.put(EVENT, "DeviceTokenAlreadyUsed") + .put(DATA, AutoTracker.getInstance().getApplication().getData()); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -133,8 +140,8 @@ static JSONObject ViewDidAppear(String... className) { JSONObject screenObject = screen.getData(); dataObject.put("screen", screenObject); - jsonObject.put("event", "viewDidAppear") - .put("data", dataObject); + jsonObject.put(EVENT, "viewDidAppear") + .put(DATA, dataObject); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -146,8 +153,8 @@ static JSONObject Event(SmartEvent event) { try { JSONObject jsonObject = new JSONObject(); - jsonObject.put("event", event.getType()) - .put("data", event.getData()); + jsonObject.put(EVENT, event.getType()) + .put(DATA, event.getData()); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -173,8 +180,8 @@ static JSONObject ScreenRotation(String... className) { .put("direction", SensorOrientationManager.orientation); - jsonObject.put("event", "screenRotation") - .put("data", dataObject); + jsonObject.put(EVENT, "screenRotation") + .put(DATA, dataObject); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -197,8 +204,8 @@ static JSONObject Screenshot(String eventName, boolean withTree) { dataObject.put("tree", screen.getSuggestedEvents(sc.getAttachedRootView())); } - jsonObject.put("event", eventName) - .put("data", dataObject); + jsonObject.put(EVENT, eventName) + .put(DATA, dataObject); return jsonObject; } catch (JSONException e) { e.printStackTrace(); @@ -209,6 +216,10 @@ static JSONObject Screenshot(String eventName, boolean withTree) { class SocketFactory { + private SocketFactory() { + throw new IllegalStateException("Private class"); + } + static SocketReceivable create(SmartSender smartSender, JSONObject message) throws JSONException { String eventName = message.getString("event"); switch (eventName) { @@ -243,12 +254,12 @@ protected void process() throws JSONException { long now = System.currentTimeMillis(); long elapsed = now - smartSender.startTime; - if (elapsed < SmartSender.COOLDOWN ) { + if (elapsed < SmartSender.COOLDOWN) { return; } - if (smartSender.getAliveState() != SmartSender.AliveState.Asked) { - smartSender.setAliveState(SmartSender.AliveState.Asked); + if (smartSender.getAliveState() != SmartSender.AliveState.ASKED) { + smartSender.setAliveState(SmartSender.AliveState.ASKED); JSONObject data = message.getJSONObject("data"); boolean warning = false; @@ -258,16 +269,16 @@ protected void process() throws JSONException { smartSender.sendMessage(SocketEmitterMessages.DeviceTokenAlreadyUsed(), true); warning = true; } else if (data.has("version") && !AutoTracker.getInstance().getApplication().getVersion().equals(data.getString("version"))) { - if (smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.Pending) { + if (smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.PENDING) { smartSender.sendMessage(SocketEmitterMessages.DeviceVersion(), true); - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Pending); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.PENDING); } - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setAliveState(SmartSender.AliveState.NONE); warning = true; } } - if (!warning && smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.Connected) { - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Pending); + if (!warning && smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.CONNECTED) { + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.PENDING); final Activity currentActivity = SmartContext.currentActivity != null ? SmartContext.currentActivity.get() : null; if (currentActivity != null) { @@ -280,8 +291,8 @@ public void run() { .setNegativeButton(R.string.pairing_refuse_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Disconnected, "DeviceRefusedLive"); - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.DISCONNECTED, "DeviceRefusedLive"); + smartSender.setAliveState(SmartSender.AliveState.NONE); dialogInterface.dismiss(); smartSender.startTime = System.currentTimeMillis(); } @@ -289,8 +300,8 @@ public void onClick(DialogInterface dialogInterface, int i) { .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Connected, "DeviceAcceptedLive"); - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.CONNECTED, "DeviceAcceptedLive"); + smartSender.setAliveState(SmartSender.AliveState.NONE); dialogInterface.dismiss(); } })); @@ -310,7 +321,7 @@ class InterfaceAcceptedLiveReceivable extends SocketReceivable { @Override protected void process() throws JSONException { - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Connected); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.CONNECTED); } } @@ -322,9 +333,9 @@ class InterfaceRefusedLiveReceivable extends SocketReceivable { @Override protected void process() throws JSONException { - if (smartSender.getAliveState() != SmartSender.AliveState.Refused && smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.Disconnected) { - smartSender.setAliveState(SmartSender.AliveState.Refused); - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Disconnected); + if (smartSender.getAliveState() != SmartSender.AliveState.REFUSED && smartSender.getLiveConnectionState() != SmartSender.LiveConnectionState.DISCONNECTED) { + smartSender.setAliveState(SmartSender.AliveState.REFUSED); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.DISCONNECTED); final Activity currentActivity = SmartContext.currentActivity != null ? SmartContext.currentActivity.get() : null; if (currentActivity != null) { @@ -337,7 +348,7 @@ public void run() { .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setAliveState(SmartSender.AliveState.NONE); dialogInterface.dismiss(); } })); @@ -376,9 +387,9 @@ class InterfaceStoppedLiveReceivable extends SocketReceivable { @Override protected void process() throws JSONException { - if (smartSender.getAliveState() != SmartSender.AliveState.Stopped) { - smartSender.setAliveState(SmartSender.AliveState.Stopped); - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Disconnected); + if (smartSender.getAliveState() != SmartSender.AliveState.STOPPED) { + smartSender.setAliveState(SmartSender.AliveState.STOPPED); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.DISCONNECTED); final Activity currentActivity = SmartContext.currentActivity != null ? SmartContext.currentActivity.get() : null; if (currentActivity != null) { @@ -391,7 +402,7 @@ public void run() { .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setAliveState(SmartSender.AliveState.NONE); dialogInterface.dismiss(); } })); @@ -410,9 +421,9 @@ class InterfaceAbortedLiveRequestReceivable extends SocketReceivable { @Override protected void process() throws JSONException { - if (smartSender.getAliveState() != SmartSender.AliveState.Aborted) { - smartSender.setAliveState(SmartSender.AliveState.Aborted); - smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.Disconnected); + if (smartSender.getAliveState() != SmartSender.AliveState.ABORTED) { + smartSender.setAliveState(SmartSender.AliveState.ABORTED); + smartSender.setLiveConnectionState(SmartSender.LiveConnectionState.DISCONNECTED); final Activity currentActivity = SmartContext.currentActivity != null ? SmartContext.currentActivity.get() : null; if (currentActivity != null) { @@ -425,7 +436,7 @@ public void run() { .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - smartSender.setAliveState(SmartSender.AliveState.None); + smartSender.setAliveState(SmartSender.AliveState.NONE); dialogInterface.dismiss(); } })); @@ -447,21 +458,18 @@ protected void process() throws JSONException { JSONObject data = message.getJSONObject("data"); boolean valid = false; Activity currentActivity = SmartContext.currentActivity != null ? SmartContext.currentActivity.get() : null; - if (data != null) { - if (data.has("screen")) { - JSONObject screenObj = data.getJSONObject("screen"); - if (screenObj.has("className")) { - String className = screenObj.getString("className"); - if (currentActivity != null && currentActivity.getClass().getSimpleName().equals(className)) { + if (data != null && data.has("screen")) { + JSONObject screenObj = data.getJSONObject("screen"); + if (screenObj.has("className")) { + String className = screenObj.getString("className"); + if (currentActivity != null && currentActivity.getClass().getSimpleName().equals(className)) { + valid = true; + } else { + android.support.v4.app.Fragment frag = SmartContext.currentFragment != null ? SmartContext.currentFragment.get() : null; + if (frag != null && frag.getClass().getSimpleName().equals(className)) { valid = true; - } else { - android.support.v4.app.Fragment frag = SmartContext.currentFragment != null ? SmartContext.currentFragment.get() : null; - if (frag != null && frag.getClass().getSimpleName().equals(className)) { - valid = true; - } } } - } } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Tracker.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Tracker.java index 265f8e7b..2865bbb3 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Tracker.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Tracker.java @@ -85,12 +85,13 @@ public enum PluginKey { nuggad } - protected static WeakReference appContext; + static final String TAG = "ATINTERNET"; + static WeakReference appContext; private static Thread.UncaughtExceptionHandler defaultCrashHandler; private static boolean isTrackerActivityLifeCycleEnabled = false; private static Storage storage; - protected TrackerListener listener; + private TrackerListener listener; private Dispatcher dispatcher; private Buffer buffer; private String internalUserId; @@ -176,7 +177,7 @@ private void initTracker() { setTrackerActivityLifecycle(); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -185,7 +186,7 @@ private Tracker processSetParam(String key, Closure value) { if (!Lists.getReadOnlyParams().contains(key)) { buffer.getVolatileParams().put(key, new Param(key, value)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, String.format("Param %s is read only. Value will not be updated", key)); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format("Param %s is read only. Value will not be updated", key)); } return this; @@ -238,7 +239,7 @@ private Tracker processSetParam(String key, Closure value, ParamOption newParamO buffer.getVolatileParams().put(key, newParam); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, String.format("Param %s is read only. Value will not be updated", key)); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format("Param %s is read only. Value will not be updated", key)); } return this; @@ -328,12 +329,12 @@ public void run() { if (callback != null) { String userID = TechnicalContext.getUserId((String) configuration.get(TrackerConfigurationKeys.IDENTIFIER)).execute(); if ((Boolean) configuration.get(TrackerConfigurationKeys.HASH_USER_ID) && !doNotTrackEnabled()) { - callback.receiveUserId(Tool.SHA_256(userID)); + callback.receiveUserId(Tool.SHA256(userID)); } else { callback.receiveUserId(userID); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Enabled to get user id"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Enabled to get user id"); } } }); @@ -346,7 +347,7 @@ public void run() { */ public String getUserIdSync() { if (internalUserId == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "User id must be set"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "User id must be set"); } return internalUserId; } @@ -366,7 +367,10 @@ public void setUserId(String value) { * @return Screens instance */ public Screens Screens() { - return screens == null ? (screens = new Screens(this)) : screens; + if (screens == null) { + screens = new Screens(this); + } + return screens; } /** @@ -375,7 +379,10 @@ public Screens Screens() { * @return Gestures instance */ public Gestures Gestures() { - return gestures == null ? (gestures = new Gestures(this)) : gestures; + if (gestures == null) { + gestures = new Gestures(this); + } + return gestures; } /** @@ -384,7 +391,10 @@ public Gestures Gestures() { * @return Event */ Event Event() { - return event == null ? (event = new Event(this)) : event; + if (event == null) { + event = new Event(this); + } + return event; } /** @@ -393,7 +403,10 @@ Event Event() { * @return Offline instance */ public Offline Offline() { - return offline == null ? (offline = new Offline(this)) : offline; + if (offline == null) { + offline = new Offline(this); + } + return offline; } /** @@ -402,7 +415,10 @@ public Offline Offline() { * @return Context instance */ public Context Context() { - return context == null ? (context = new Context(this)) : context; + if (context == null) { + context = new Context(this); + } + return context; } /** @@ -411,7 +427,10 @@ public Context Context() { * @return NuggAd instance */ public NuggAds NuggAds() { - return nuggAds == null ? (nuggAds = new NuggAds(this)) : nuggAds; + if (nuggAds == null) { + nuggAds = new NuggAds(this); + } + return nuggAds; } /** @@ -420,7 +439,10 @@ public NuggAds NuggAds() { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -429,7 +451,10 @@ public CustomObjects CustomObjects() { * @return IdentifiedVisitor instance */ public IdentifiedVisitor IdentifiedVisitor() { - return identifiedVisitor == null ? (identifiedVisitor = new IdentifiedVisitor(this)) : identifiedVisitor; + if (identifiedVisitor == null) { + identifiedVisitor = new IdentifiedVisitor(this); + } + return identifiedVisitor; } /** @@ -438,7 +463,10 @@ public IdentifiedVisitor IdentifiedVisitor() { * @return Publishers instance */ public Publishers Publishers() { - return publishers == null ? (publishers = new Publishers(this)) : publishers; + if (publishers == null) { + publishers = new Publishers(this); + } + return publishers; } /** @@ -447,7 +475,10 @@ public Publishers Publishers() { * @return SelfPromotions instance */ public SelfPromotions SelfPromotions() { - return selfPromotions == null ? (selfPromotions = new SelfPromotions(this)) : selfPromotions; + if (selfPromotions == null) { + selfPromotions = new SelfPromotions(this); + } + return selfPromotions; } /** @@ -456,7 +487,10 @@ public SelfPromotions SelfPromotions() { * @return DynamicScreens instance */ public DynamicScreens DynamicScreens() { - return dynamicScreens == null ? (dynamicScreens = new DynamicScreens(this)) : dynamicScreens; + if (dynamicScreens == null) { + dynamicScreens = new DynamicScreens(this); + } + return dynamicScreens; } /** @@ -465,7 +499,10 @@ public DynamicScreens DynamicScreens() { * @return Products instance */ public Products Products() { - return products == null ? (products = new Products(this)) : products; + if (products == null) { + products = new Products(this); + } + return products; } /** @@ -474,7 +511,10 @@ public Products Products() { * @return Cart instance */ public Cart Cart() { - return cart == null ? (cart = new Cart(this)) : cart; + if (cart == null) { + cart = new Cart(this); + } + return cart; } /** @@ -483,7 +523,10 @@ public Cart Cart() { * @return MediaPlayers instance */ public MediaPlayers Players() { - return mediaPlayers == null ? (mediaPlayers = new MediaPlayers(this)) : mediaPlayers; + if (mediaPlayers == null) { + mediaPlayers = new MediaPlayers(this); + } + return mediaPlayers; } /** @@ -494,7 +537,10 @@ public MediaPlayers Players() { */ @Deprecated public Locations Locations() { - return locations == null ? (locations = new Locations(this)) : locations; + if (locations == null) { + locations = new Locations(this); + } + return locations; } /** @@ -505,7 +551,10 @@ public Locations Locations() { */ @Deprecated public CustomVars CustomVars() { - return customVars == null ? (customVars = new CustomVars(this)) : customVars; + if (customVars == null) { + customVars = new CustomVars(this); + } + return customVars; } /** @@ -516,7 +565,10 @@ public CustomVars CustomVars() { */ @Deprecated public Aisles Aisles() { - return aisles == null ? (aisles = new Aisles(this)) : aisles; + if (aisles == null) { + aisles = new Aisles(this); + } + return aisles; } /** @@ -525,7 +577,10 @@ public Aisles Aisles() { * @return Campaigns instance */ public Campaigns Campaigns() { - return campaigns == null ? (campaigns = new Campaigns(this)) : campaigns; + if (campaigns == null) { + campaigns = new Campaigns(this); + } + return campaigns; } /** @@ -536,7 +591,10 @@ public Campaigns Campaigns() { */ @Deprecated public CustomTreeStructures CustomTreeStructures() { - return customTreeStructures == null ? (customTreeStructures = new CustomTreeStructures(this)) : customTreeStructures; + if (customTreeStructures == null) { + customTreeStructures = new CustomTreeStructures(this); + } + return customTreeStructures; } /** @@ -547,7 +605,10 @@ public CustomTreeStructures CustomTreeStructures() { */ @Deprecated public InternalSearches InternalSearches() { - return internalSearches == null ? (internalSearches = new InternalSearches(this)) : internalSearches; + if (internalSearches == null) { + internalSearches = new InternalSearches(this); + } + return internalSearches; } /** @@ -556,7 +617,10 @@ public InternalSearches InternalSearches() { * @return Orders instance */ public Orders Orders() { - return orders == null ? (orders = new Orders(this)) : orders; + if (orders == null) { + orders = new Orders(this); + } + return orders; } /** @@ -568,7 +632,7 @@ public Orders Orders() { */ public void setLog(String log, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(log)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for log, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for log, default value retained"); } else { setConfig(TrackerConfigurationKeys.LOG, log, setConfigCallback, sync); } @@ -583,7 +647,7 @@ public void setLog(String log, SetConfigCallback setConfigCallback, boolean... s */ public void setSecuredLog(String securedLog, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(securedLog)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for secured log, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for secured log, default value retained"); } else { setConfig(TrackerConfigurationKeys.LOG_SSL, securedLog, setConfigCallback, sync); } @@ -598,7 +662,7 @@ public void setSecuredLog(String securedLog, SetConfigCallback setConfigCallback */ public void setDomain(String domain, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(domain)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for domain, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for domain, default value retained"); } else { setConfig(TrackerConfigurationKeys.DOMAIN, domain, setConfigCallback, sync); } @@ -613,7 +677,7 @@ public void setDomain(String domain, SetConfigCallback setConfigCallback, boolea */ public void setSiteId(int siteId, SetConfigCallback setConfigCallback, boolean... sync) { if (siteId <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for site id, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for site id, default value retained"); } else { setConfig(TrackerConfigurationKeys.SITE, siteId, setConfigCallback, sync); } @@ -628,7 +692,7 @@ public void setSiteId(int siteId, SetConfigCallback setConfigCallback, boolean.. */ public void setOfflineMode(OfflineMode offlineMode, SetConfigCallback setConfigCallback, boolean... sync) { if (offlineMode == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for offline mode, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for offline mode, default value retained"); } else { setConfig(TrackerConfigurationKeys.OFFLINE_MODE, offlineMode.toString(), setConfigCallback, sync); } @@ -654,7 +718,7 @@ public void setSecureModeEnabled(boolean enabled, SetConfigCallback setConfigCal */ public void setIdentifierType(IdentifierType identifierType, SetConfigCallback setConfigCallback, boolean... sync) { if (identifierType == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for identifier type, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for identifier type, default value retained"); } else { setConfig(TrackerConfigurationKeys.IDENTIFIER, identifierType.toString(), setConfigCallback, sync); } @@ -682,17 +746,17 @@ public void setPlugins(List plugins, SetConfigCallback setConfigCallb if (plugins == null) { setConfig(TrackerConfigurationKeys.PLUGINS, "", setConfigCallback, sync); } else { - String value = ""; + StringBuilder value = new StringBuilder(); boolean isFirst = true; for (PluginKey plugin : plugins) { if (isFirst) { isFirst = false; } else { - value += ","; + value.append(','); } - value += plugin.toString(); + value.append(plugin.toString()); } - setConfig(TrackerConfigurationKeys.PLUGINS, value, setConfigCallback, sync); + setConfig(TrackerConfigurationKeys.PLUGINS, value.toString(), setConfigCallback, sync); } } @@ -705,7 +769,7 @@ public void setPlugins(List plugins, SetConfigCallback setConfigCallb */ public void setPixelPath(String pixelPath, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(pixelPath)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for pixel path, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for pixel path, default value retained"); } else { setConfig(TrackerConfigurationKeys.PIXEL_PATH, pixelPath, setConfigCallback, sync); } @@ -753,7 +817,7 @@ public void setCampaignLastPersistenceEnabled(boolean enabled, SetConfigCallback */ public void setCampaignLifetime(int lifetime, SetConfigCallback setConfigCallback, boolean... sync) { if (lifetime <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for campaign lifetime, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for campaign lifetime, default value retained"); } else { setConfig(TrackerConfigurationKeys.CAMPAIGN_LIFETIME, lifetime, setConfigCallback, sync); } @@ -768,7 +832,7 @@ public void setCampaignLifetime(int lifetime, SetConfigCallback setConfigCallbac */ public void setSessionBackgroundDuration(int duration, SetConfigCallback setConfigCallback, boolean... sync) { if (duration <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for session background duration, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for session background duration, default value retained"); } else { setConfig(TrackerConfigurationKeys.SESSION_BACKGROUND_DURATION, duration, setConfigCallback, sync); } @@ -783,41 +847,43 @@ public TrackerListener createDefaultTrackerListener() { return new TrackerListener() { @Override public void trackerNeedsFirstLaunchApproval(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: First Launch \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: First Launch \n\tMessage: " + message); } @Override public void buildDidEnd(HitStatus status, String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Building Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Building Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); } @Override public void sendDidEnd(HitStatus status, String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Sending Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Sending Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); } @Override public void didCallPartner(String response) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Calling Partner \n\tResponse: " + response); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Calling Partner \n\tResponse: " + response); } @Override public void warningDidOccur(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Warning \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Warning \n\tMessage: " + message); } @Override public void saveDidEnd(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Saving Hit \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Saving Hit \n\tMessage: " + message); } @Override public void errorDidOccur(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Error \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Error \n\tMessage: " + message); } }; } + private final String ERROR_OVERWRITE_KEY_CONFIG_FORMAT = "Cannot to overwrite %s configuration"; + /** * Set a new configuration * @@ -838,7 +904,7 @@ public void setConfig(final HashMap conf, final boolean override if (!Lists.getReadOnlyConfigs().contains(key)) { configuration.put(key, conf.get(key)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } refreshConfigurationDependencies(); @@ -854,7 +920,7 @@ public void run() { if (!Lists.getReadOnlyConfigs().contains(key)) { configuration.put(key, conf.get(key)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } refreshConfigurationDependencies(); @@ -891,7 +957,7 @@ public void setConfig(final String key, final Object value, final SetConfigCallb configuration.put(key, value); refreshConfigurationDependencies(); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } else { TrackerQueue.getInstance().put(new Runnable() { @@ -904,7 +970,7 @@ public void run() { setConfigCallback.setConfigEnd(); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } }); @@ -943,16 +1009,16 @@ public Tracker setDefaultListener() { */ public Tracker() { try { - android.content.Context context = ((Application) Class.forName("android.app.ActivityThread") + android.content.Context ctx = ((Application) Class.forName("android.app.ActivityThread") .getMethod("currentApplication").invoke(null, (Object[]) null)); - appContext = new WeakReference<>(context); + appContext = new WeakReference<>(ctx); configuration = new Configuration(appContext.get()); initTracker(); if (!LifeCycle.isInitialized) { LifeCycle.initLifeCycle(appContext.get()); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -987,7 +1053,7 @@ public Tracker(final HashMap configuration) { LifeCycle.initLifeCycle(appContext.get()); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -1143,8 +1209,8 @@ public Tracker setParam(String key, String value) { public Tracker setParam(String key, final String value, ParamOption options) { if (options.getType() != ParamOption.Type.JSON && Tool.isJSON(value)) { options.setType(ParamOption.Type.JSON); - } else if (options.getType() != ParamOption.Type.Array && Tool.isArray(value)) { - options.setType(ParamOption.Type.Array); + } else if (options.getType() != ParamOption.Type.ARRAY && Tool.isArray(value)) { + options.setType(ParamOption.Type.ARRAY); } return handleNotClosureStringParameterSetting(key, value, options); } @@ -1169,7 +1235,7 @@ public Tracker setParam(String key, List value) { * @return Tracker instance */ public Tracker setParam(String key, List value, ParamOption options) { - options.setType(ParamOption.Type.Array); + options.setType(ParamOption.Type.ARRAY); return handleNotClosureStringParameterSetting(key, value, options); } @@ -1193,7 +1259,7 @@ public Tracker setParam(String key, Object[] value) { * @return Tracker instance */ public Tracker setParam(String key, Object[] value, ParamOption options) { - options.setType(ParamOption.Type.Array); + options.setType(ParamOption.Type.ARRAY); return handleNotClosureStringParameterSetting(key, value, options); } @@ -1235,8 +1301,8 @@ public void unsetParam(String key) { * Reset Screen context to prevent bad link between screen and gesture */ public void resetScreenContext() { - TechnicalContext.screenName = null; - TechnicalContext.level2 = 0; + TechnicalContext.setScreenName(null); + TechnicalContext.setLevel2(0); } /** @@ -1245,10 +1311,11 @@ public void resetScreenContext() { public void dispatch() { if (businessObjects.size() > 0) { ArrayList onAppAds = new ArrayList<>(); - ArrayList customObjects = new ArrayList<>(); - ArrayList objects = new ArrayList() {{ - addAll(businessObjects.values()); - }}; + ArrayList customObjs = new ArrayList<>(); + + ArrayList objects = new ArrayList<>(); + objects.addAll(businessObjects.values()); + ArrayList screenObjects = new ArrayList<>(); ArrayList salesTrackerObjects = new ArrayList<>(); ArrayList internalSearchObjects = new ArrayList<>(); @@ -1257,13 +1324,13 @@ public void dispatch() { for (BusinessObject businessObject : objects) { if (!(businessObject instanceof Product)) { - dispatchObjects(productsObjects, customObjects); + dispatchObjects(productsObjects, customObjs); } // Dispatch onAppAds before sending other object if (!(businessObject instanceof OnAppAd || businessObject instanceof ScreenInfo || businessObject instanceof AbstractScreen || businessObject instanceof InternalSearch || businessObject instanceof Cart || businessObject instanceof Order) || (businessObject instanceof OnAppAd && ((OnAppAd) businessObject).getAction() == OnAppAd.Action.Touch)) { - dispatchObjects(onAppAds, customObjects); + dispatchObjects(onAppAds, customObjs); } if (businessObject instanceof OnAppAd) { @@ -1271,12 +1338,12 @@ public void dispatch() { if (ad.getAction() == OnAppAd.Action.View) { onAppAds.add(ad); } else { - customObjects.add(businessObject); - dispatcher.dispatch((BusinessObject[]) customObjects.toArray(new BusinessObject[customObjects.size()])); - customObjects.clear(); + customObjs.add(businessObject); + dispatcher.dispatch((BusinessObject[]) customObjs.toArray(new BusinessObject[customObjs.size()])); + customObjs.clear(); } } else if (businessObject instanceof CustomObject || businessObject instanceof NuggAd) { - customObjects.add(businessObject); + customObjs.add(businessObject); } else if (businessObject instanceof ScreenInfo) { screenObjects.add(businessObject); } else if (businessObject instanceof InternalSearch) { @@ -1286,27 +1353,27 @@ public void dispatch() { } else if (businessObject instanceof Order || businessObject instanceof Cart) { salesTrackerObjects.add(businessObject); } else if (businessObject instanceof AbstractScreen) { - onAppAds.addAll(customObjects); + onAppAds.addAll(customObjs); onAppAds.addAll(screenObjects); onAppAds.addAll(internalSearchObjects); //Sales tracker - ArrayList orders = new ArrayList<>(); - Cart cart = null; + ArrayList ordersObjects = new ArrayList<>(); + Cart crt = null; for (BusinessObject obj : salesTrackerObjects) { if (obj instanceof Cart) { - cart = (Cart) obj; + crt = (Cart) obj; } else { - orders.add(obj); + ordersObjects.add(obj); } } - if (cart != null && (((AbstractScreen) businessObject).isBasketScreen() || !orders.isEmpty())) { - onAppAds.add(cart); + if (crt != null && (((AbstractScreen) businessObject).isBasketScreen() || !ordersObjects.isEmpty())) { + onAppAds.add(crt); } - onAppAds.addAll(orders); + onAppAds.addAll(ordersObjects); onAppAds.add(businessObject); dispatcher.dispatch((BusinessObject[]) onAppAds.toArray(new BusinessObject[onAppAds.size()])); @@ -1314,31 +1381,31 @@ public void dispatch() { salesTrackerObjects.clear(); internalSearchObjects.clear(); onAppAds.clear(); - customObjects.clear(); + customObjs.clear(); } else { if (businessObject instanceof Gesture && ((Gesture) businessObject).getAction() == Gesture.Action.InternalSearch) { onAppAds.addAll(internalSearchObjects); internalSearchObjects.clear(); } - onAppAds.addAll(customObjects); + onAppAds.addAll(customObjs); onAppAds.add(businessObject); dispatcher.dispatch((BusinessObject[]) onAppAds.toArray(new BusinessObject[onAppAds.size()])); onAppAds.clear(); - customObjects.clear(); + customObjs.clear(); } } - dispatchObjects(onAppAds, customObjects); + dispatchObjects(onAppAds, customObjs); - dispatchObjects(productsObjects, customObjects); + dispatchObjects(productsObjects, customObjs); - if (!customObjects.isEmpty() || !screenObjects.isEmpty() || !internalSearchObjects.isEmpty()) { - customObjects.addAll(screenObjects); - customObjects.addAll(internalSearchObjects); - dispatcher.dispatch((BusinessObject[]) customObjects.toArray(new BusinessObject[customObjects.size()])); + if (!customObjs.isEmpty() || !screenObjects.isEmpty() || !internalSearchObjects.isEmpty()) { + customObjs.addAll(screenObjects); + customObjs.addAll(internalSearchObjects); + dispatcher.dispatch((BusinessObject[]) customObjs.toArray(new BusinessObject[customObjs.size()])); - customObjects.clear(); + customObjs.clear(); screenObjects.clear(); internalSearchObjects.clear(); } diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java index 4e267119..543b6df7 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java @@ -27,6 +27,10 @@ of this software and associated documentation files (the "Software"), to deal */ public class TrackerConfigurationKeys { + private TrackerConfigurationKeys() { + throw new IllegalStateException("Utility class"); + } + // Key representing the namespace used for preferences static final String PREFERENCES = "ATPreferencesKey"; diff --git a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Videos.java b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Videos.java index c536359a..35266e79 100644 --- a/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Videos.java +++ b/ATMobileAnalytics/SmartTracker/src/main/java/com/atinternet/tracker/Videos.java @@ -44,15 +44,8 @@ public class Videos { * @return Video instance */ public Video add(String name, int duration) { - int index = -1; - int length = list.size(); + int index = searchVideoIndexByName(name); Video video; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { video = new Video(player) .setName(name) @@ -60,7 +53,7 @@ public Video add(String name, int duration) { list.add(video); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "Video with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "Video with the same name already exists"); video = list.get(index); } @@ -112,14 +105,7 @@ public Video add(String name, String chapter1, String chapter2, String chapter3, * @param name video identified by name */ public void remove(String name) { - int length = list.size(); - int index = -1; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchVideoIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -136,4 +122,15 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchVideoIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + + return -1; + } } diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/AudioTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/AudioTest.java index 045a7ad5..190cc73e 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/AudioTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/AudioTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/BuilderTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/BuilderTest.java index 37e1ba0e..c3f4b5fc 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/BuilderTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/BuilderTest.java @@ -24,7 +24,6 @@ of this software and associated documentation files (the "Software"), to deal import android.util.Pair; -import org.json.JSONArray; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -75,11 +74,11 @@ public void multiHitsFailedNotSplittableParameterTest() { @Test public void multiHitsFailedNotSplittableValueTest() { - String s = ""; + StringBuilder s = new StringBuilder(); for (int i = 1; i <= 150; i++) { - s += "verybigvalue" + i; + s.append("verybigvalue").append(i); } - buffer.getVolatileParams().put("stc", new Param("stc", closureValue(s))); + buffer.getVolatileParams().put("stc", new Param("stc", closureValue(s.toString()))); builder = new Builder(tracker); ArrayList hits = (ArrayList) builder.build()[0]; diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java index 5cbff2e8..9978032f 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java @@ -24,7 +24,6 @@ of this software and associated documentation files (the "Software"), to deal import org.json.JSONException; import org.json.JSONObject; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java index dc6e113b..b3c4b159 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; @Config(sdk = 21) diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java index abd56b0e..e55c6623 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java @@ -22,7 +22,6 @@ of this software and associated documentation files (the "Software"), to deal */ package com.atinternet.tracker; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java index 1c57bb0b..4e997c3c 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java @@ -90,11 +90,11 @@ public void setEventTest() { @Test public void setEventWithTooLongScreenIdTest() { Date date = new Date(); - String id = ""; + StringBuilder id = new StringBuilder(); for (int i = 0; i < 256; i++) { - id += i; + id.append(i); } - dynamicScreen.setScreenId(id).setName("name").setChapter1("chapter1").setUpdate(date).setEvent(); + dynamicScreen.setScreenId(id.toString()).setName("name").setChapter1("chapter1").setUpdate(date).setEvent(); assertEquals(7, buffer.getVolatileParams().size()); assertEquals(0, buffer.getPersistentParams().size()); diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/EndpointsTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/EndpointsTest.java index 24adeb51..89949899 100755 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/EndpointsTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/EndpointsTest.java @@ -36,24 +36,24 @@ public class EndpointsTest extends AbstractTestClass { @Test public void getResourceEndpointDevTest() { Endpoints endpoints = new Endpoints("dev", "tokenTest", "1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.Socket), "https://smartsdk.dev.aws.atinternet-solutions.com"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GetConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/dev/token/tokenTest/version/1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CheckConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/dev/token/tokenTest/version/1.0.0/lastUpdate"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.SOCKET), "https://smartsdk.dev.aws.atinternet-solutions.com"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GET_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/dev/token/tokenTest/version/1.0.0"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CHECK_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/dev/token/tokenTest/version/1.0.0/lastUpdate"); } @Test public void getResourceEndpointPreprodTest() { Endpoints endpoints = new Endpoints("preprod", "tokenTest", "1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.Socket), "https://smartsdk.preprod.aws.atinternet-solutions.com"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GetConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/preprod/token/tokenTest/version/1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CheckConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/preprod/token/tokenTest/version/1.0.0/lastUpdate"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.SOCKET), "https://smartsdk.preprod.aws.atinternet-solutions.com"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GET_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/preprod/token/tokenTest/version/1.0.0"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CHECK_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/preprod/token/tokenTest/version/1.0.0/lastUpdate"); } @Test public void getResourceEndpointProdTest() { Endpoints endpoints = new Endpoints("prod", "tokenTest", "1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.Socket), "https://smartsdk.atinternet-solutions.com"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GetConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/prod/token/tokenTest/version/1.0.0"); - assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CheckConfig), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/prod/token/tokenTest/version/1.0.0/lastUpdate"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.SOCKET), "https://smartsdk.atinternet-solutions.com"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.GET_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/prod/token/tokenTest/version/1.0.0"); + assertEquals(endpoints.getResourceEndpoint(Endpoints.Resource.CHECK_CONFIG), "https://8me4zn67yd.execute-api.eu-west-1.amazonaws.com/prod/token/tokenTest/version/1.0.0/lastUpdate"); } } \ No newline at end of file diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java index 00231786..e20f4001 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java index 3f4fb3db..88a68fe5 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java @@ -28,11 +28,8 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @Config(sdk = 21) diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LocationsTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LocationsTest.java index 87b2c4af..3a1bd56d 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LocationsTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/LocationsTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; @Config(sdk =21) diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/OrdersTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/OrdersTest.java index d11ebb33..ba616134 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/OrdersTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/OrdersTest.java @@ -28,10 +28,7 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; @Config(sdk = 21) @RunWith(RobolectricTestRunner.class) diff --git a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/VideosTest.java b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/VideosTest.java index acb109d6..a0bdd9ef 100644 --- a/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/VideosTest.java +++ b/ATMobileAnalytics/SmartTracker/src/test/java/com/atinternet/tracker/VideosTest.java @@ -28,11 +28,8 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @Config(sdk = 21) diff --git a/ATMobileAnalytics/TestApp/build.gradle b/ATMobileAnalytics/TestApp/build.gradle index 1fa3634e..ae9496bf 100755 --- a/ATMobileAnalytics/TestApp/build.gradle +++ b/ATMobileAnalytics/TestApp/build.gradle @@ -23,6 +23,9 @@ android { } repositories { + maven { + url "https://dl.bintray.com/atinternet/maven/" + } flatDir { dirs 'libs' } @@ -30,6 +33,10 @@ repositories { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:26.0.2' - api project(':Tracker') -} + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation('io.socket:socket.io-client:0.8.3') { + // excluding org.json which is provided by Android + exclude group: 'org.json', module: 'json' + } + implementation 'com.atinternet:SmartTracker:2.8.3s' +} \ No newline at end of file diff --git a/ATMobileAnalytics/TestApp/src/main/java/com/atinternet/MainActivity.java b/ATMobileAnalytics/TestApp/src/main/java/com/atinternet/MainActivity.java index 524bcd58..18e290e7 100755 --- a/ATMobileAnalytics/TestApp/src/main/java/com/atinternet/MainActivity.java +++ b/ATMobileAnalytics/TestApp/src/main/java/com/atinternet/MainActivity.java @@ -1,23 +1,28 @@ package com.atinternet; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.atinternet.tracker.ATInternet; +import com.atinternet.tracker.AutoTracker; import com.atinternet.tracker.Debugger; -import com.atinternet.tracker.Tracker; public class MainActivity extends AppCompatActivity { - Tracker tracker; + private static final String TOKEN = "test"; + AutoTracker tracker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - tracker = ATInternet.getInstance().getDefaultTracker(); + tracker = ATInternet.getInstance().getAutoTracker(TOKEN); tracker.setSiteId(410501, null, true); tracker.setLog("logdev", null, true); @@ -28,7 +33,32 @@ public void onClick(View v) { } }); - Debugger.create(this, tracker); + if (overlayPermission()) { + tracker.enableLiveTagging(true); + } + } + + private boolean overlayPermission() { + if (Build.VERSION.SDK_INT >= 23) { + if (!Settings.canDrawOverlays(this)) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getPackageName())); + startActivityForResult(intent, ATInternet.ALLOW_OVERLAY_INTENT_RESULT_CODE); + return false; + } + } + return true; + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // Add code below to enable live tagging + if (requestCode == ATInternet.ALLOW_OVERLAY_INTENT_RESULT_CODE) { + if (Build.VERSION.SDK_INT >= 23) { + if (Settings.canDrawOverlays(this)) { + tracker.enableLiveTagging(true); + } + } + } } } diff --git a/ATMobileAnalytics/Tracker/build.gradle b/ATMobileAnalytics/Tracker/build.gradle index a2ea8737..db581636 100644 --- a/ATMobileAnalytics/Tracker/build.gradle +++ b/ATMobileAnalytics/Tracker/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' +apply plugin: 'jacoco' android { - compileSdkVersion 26 - buildToolsVersion '27.0.1' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 14 - targetSdkVersion 26 + targetSdkVersion 27 versionCode 1 versionName "1.0.0" } @@ -29,7 +30,7 @@ android { def siteUrl = 'https://github.com/at-internet/atinternet-android-sdk' def gitUrl = 'https://github.com/at-internet/atinternet-android-sdk.git' group = "com.atinternet" -version = "2.8.3" +version = "2.8.4" install { repositories.mavenInstaller { @@ -72,7 +73,7 @@ bintray { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - compileOnly 'com.google.android.gms:play-services-ads:11.6.0' + compileOnly 'com.google.android.gms:play-services-ads:11.8.0' testImplementation 'org.robolectric:robolectric:3.3.2' testImplementation 'junit:junit:4.12' } @@ -126,4 +127,36 @@ task createBuildFile { def file = new File(project.rootDir, "build.properties") file.createNewFile() file.text = "version=" + version + "\n" +} + +jacoco { + toolVersion = "0.7.1.201405082137" +} + +def coverageSourceDirs = [ + project.rootDir.absolutePath + '/Tracker/src/main/java/com/atinternet/Tracker' +] + +task jacocoTestReport(type: JacocoReport, dependsOn: "testReleaseUnitTest") { + group = "Reporting" + + description = "Generate Jacoco coverage reports" + + classDirectories = fileTree( + dir: project.rootDir.absolutePath + '/Tracker/build/intermediates/classes/release/com/atinternet/tracker', + excludes: ['**/R.class', + '**/R$*.class', + '**/*$ViewInjector*.*', + '**/BuildConfig.*', + '**/Manifest*.*'] + ) + + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files(project.rootDir.absolutePath + '/Tracker/build/jacoco/testReleaseUnitTest.exec') + + reports { + xml.enabled = true + html.enabled = true + } } \ No newline at end of file diff --git a/ATMobileAnalytics/Tracker/core.manifest.json b/ATMobileAnalytics/Tracker/core.manifest.json index 6d833352..6c269c93 100755 --- a/ATMobileAnalytics/Tracker/core.manifest.json +++ b/ATMobileAnalytics/Tracker/core.manifest.json @@ -1,7 +1,7 @@ { "name": "Core", "description": "Geode_Tag_Android_Description", - "version": "2.8.3", + "version": "2.8.4", "type": "core", "config": { "storage": { @@ -141,7 +141,7 @@ "global": true }, "autoTrackerToken": { - "title" : "Geode_Tag_SDK_Config_Title_autoTrackerToken", + "title": "Geode_Tag_SDK_Config_Title_autoTrackerToken", "description": "Geode_Tag_SDK_Config_Description_autoTrackerToken", "defaultValue": "", "type": "string", @@ -149,7 +149,7 @@ "global": true }, "atEnv": { - "title" : "Geode_Tag_SDK_Config_Title_atEnv", + "title": "Geode_Tag_SDK_Config_Title_atEnv", "description": "Geode_Tag_SDK_Config_Description_Geode_Tag_SDK_Config_Title_atEnv", "defaultValue": "prod", "type": "string", diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/AbstractScreen.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/AbstractScreen.java index 00ad1c9f..38daaba6 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/AbstractScreen.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/AbstractScreen.java @@ -70,19 +70,31 @@ public String stringValue() { private SelfPromotionImpressions selfPromotionImpressions; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } LinkedHashMap getCustomVarsMap() { - return customVarsMap == null ? (customVarsMap = new LinkedHashMap<>()) : customVarsMap; + if (customVarsMap == null) { + customVarsMap = new LinkedHashMap<>(); + } + return customVarsMap; } LinkedHashMap getSelfPromotionImpressionsMap() { - return selfPromotionImpressionsMap == null ? (selfPromotionImpressionsMap = new LinkedHashMap<>()) : selfPromotionImpressionsMap; + if (selfPromotionImpressionsMap == null) { + selfPromotionImpressionsMap = new LinkedHashMap<>(); + } + return selfPromotionImpressionsMap; } LinkedHashMap getPublisherImpressionsMap() { - return publisherImpressionsMap == null ? (publisherImpressionsMap = new LinkedHashMap<>()) : publisherImpressionsMap; + if (publisherImpressionsMap == null) { + publisherImpressionsMap = new LinkedHashMap<>(); + } + return publisherImpressionsMap; } /** @@ -166,9 +178,10 @@ public void setCart(Cart cart) { * @return the Location instance */ public Location Location(double latitude, double longitude) { - return location == null ? (location = new Location(tracker) - .setLatitude(latitude) - .setLongitude(longitude)) : location; + if (location == null) { + location = new Location(tracker).setLatitude(latitude).setLongitude(longitude); + } + return location; } /** @@ -178,7 +191,10 @@ public Location Location(double latitude, double longitude) { * @return the Aisle instance */ public Aisle Aisle(String level1) { - return aisle == null ? (aisle = new Aisle(tracker).setLevel1(level1)) : aisle; + if (aisle == null) { + aisle = new Aisle(tracker).setLevel1(level1); + } + return aisle; } /** @@ -188,7 +204,10 @@ public Aisle Aisle(String level1) { * @return the CustomTreeStructure instance */ public CustomTreeStructure CustomTreeStructure(int category1) { - return customTreeStructure == null ? (customTreeStructure = new CustomTreeStructure(tracker).setCategory1(category1)) : customTreeStructure; + if (customTreeStructure == null) { + customTreeStructure = new CustomTreeStructure(tracker).setCategory1(category1); + } + return customTreeStructure; } /** @@ -198,7 +217,10 @@ public CustomTreeStructure CustomTreeStructure(int category1) { * @return the Campaign identifier */ public Campaign Campaign(String campaignId) { - return campaign == null ? (campaign = new Campaign(tracker).setCampaignId(campaignId)) : campaign; + if (campaign == null) { + campaign = new Campaign(tracker).setCampaignId(campaignId); + } + return campaign; } /** @@ -211,7 +233,10 @@ public Campaign Campaign(String campaignId) { */ @Deprecated public Order Order(String orderId, double turnover) { - return order == null ? (order = new Order(tracker).setOrderId(orderId).setTurnover(turnover)) : order; + if (order == null) { + order = new Order(tracker).setOrderId(orderId).setTurnover(turnover); + } + return order; } /** @@ -222,9 +247,12 @@ public Order Order(String orderId, double turnover) { * @return the InternalSearch instance */ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber); + } + return internalSearch; } /** @@ -233,7 +261,10 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return CustomVars instance */ public CustomVars CustomVars() { - return customVars == null ? (customVars = new CustomVars(this)) : customVars; + if (customVars == null) { + customVars = new CustomVars(this); + } + return customVars; } /** @@ -242,7 +273,10 @@ public CustomVars CustomVars() { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -251,7 +285,10 @@ public CustomObjects CustomObjects() { * @return PublisherImpressions instance */ public PublisherImpressions Publishers() { - return publisherImpressions == null ? (publisherImpressions = new PublisherImpressions(this)) : publisherImpressions; + if (publisherImpressions == null) { + publisherImpressions = new PublisherImpressions(this); + } + return publisherImpressions; } /** @@ -260,7 +297,10 @@ public PublisherImpressions Publishers() { * @return SelfPromotionImpressions instance */ public SelfPromotionImpressions SelfPromotions() { - return selfPromotionImpressions == null ? (selfPromotionImpressions = new SelfPromotionImpressions(this)) : selfPromotionImpressions; + if (selfPromotionImpressions == null) { + selfPromotionImpressions = new SelfPromotionImpressions(this); + } + return selfPromotionImpressions; } /** diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Audios.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Audios.java index bab030e9..6e372c21 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Audios.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Audios.java @@ -44,15 +44,8 @@ public class Audios { * @return the Audio instance */ public Audio add(String name, int duration) { - int index = -1; - int length = list.size(); Audio audio; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchAudioIndexByName(name); if (index == -1) { audio = new Audio(player) .setName(name) @@ -60,7 +53,7 @@ public Audio add(String name, int duration) { list.add(audio); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "Audio with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "Audio with the same name already exists"); audio = list.get(index); } @@ -112,15 +105,7 @@ public Audio add(String name, String chapter1, String chapter2, String chapter3, * @param name audio identified by name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchAudioIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -137,4 +122,14 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchAudioIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + return -1; + } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Cart.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Cart.java index 2a9519b8..f2f10a19 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Cart.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Cart.java @@ -35,7 +35,10 @@ public class Cart extends BusinessObject { ArrayList getProductsList() { - return productsList == null ? (productsList = new ArrayList<>()) : productsList; + if (productsList == null) { + productsList = new ArrayList<>(); + } + return productsList; } Cart(Tracker tracker) { @@ -50,7 +53,10 @@ ArrayList getProductsList() { * @return the Products instance */ public Products Products() { - return products == null ? (products = new Products(this)) : products; + if (products == null) { + products = new Products(this); + } + return products; } /** diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Configuration.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Configuration.java index 4f584ec4..cb000ea8 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Configuration.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Configuration.java @@ -71,7 +71,8 @@ public class Configuration extends LinkedHashMap { } } } - for (String key : configuration.keySet()) { + for (Entry entry : configuration.entrySet()) { + String key = entry.getKey(); put(key, configuration.get(key)); } } @@ -125,6 +126,7 @@ private JSONObject getDefaultConfiguration(boolean isTablet) { * * @return the pretty printed configuration */ + @Override public String toString() { StringBuilder sb = new StringBuilder("Tracker configuration : \n"); Iterator> iter = entrySet().iterator(); diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Context.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Context.java index 6ac5aa96..ff5aa049 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Context.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Context.java @@ -95,13 +95,10 @@ public void setBackgroundMode(BackgroundMode backgroundMode) { this.backgroundMode = backgroundMode; if (backgroundMode != null) { - switch (backgroundMode) { - case Task: - tracker.setParam(Hit.HitParam.BackgroundMode.stringValue(), "task", new ParamOption().setPersistent(true)); - break; - default: - tracker.unsetParam(Hit.HitParam.BackgroundMode.stringValue()); - break; + if (backgroundMode == BackgroundMode.Task) { + tracker.setParam(Hit.HitParam.BackgroundMode.stringValue(), "task", new ParamOption().setPersistent(true)); + } else { + tracker.unsetParam(Hit.HitParam.BackgroundMode.stringValue()); } } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Core.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Core.java index 9c3a389b..7345b9b7 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Core.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Core.java @@ -45,6 +45,7 @@ of this software and associated documentation files (the "Software"), to deal import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Pair; import android.view.Display; import android.view.View; @@ -133,9 +134,7 @@ boolean isPersistent() { Param(String key, final Closure value) { this(); this.key = key; - this.values = new ArrayList() {{ - add(value); - }}; + this.values.add(value); } Param(String key, Closure value, ParamOption paramOption) { @@ -285,6 +284,7 @@ class Builder implements Runnable { private static final String MH_PARAMETER_FORMAT = "%1$s-%2$s-%3$s"; private static final String MHID_FORMAT = "%02d%02d%02d%d"; private static final String OPT_OUT = "opt-out"; + private static final String MHERR = "mherr"; private static final int REFCONFIGCHUNKS = 4; private static final int MH_PARAMETER_MAX_LENGTH = 30; private static final int MHERR_PARAMETER_LENGTH = 8; @@ -344,7 +344,7 @@ String buildConfiguration() { if (hitConfigChunks != REFCONFIGCHUNKS) { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.error, "There is something wrong with configuration : " + conf); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.ERROR, "There is something wrong with configuration : " + conf); conf = new StringBuilder(); } @@ -359,23 +359,23 @@ Object[] build() { StringBuilder queryString = new StringBuilder(); - String configuration = buildConfiguration(); + String configStr = buildConfiguration(); String idClient = ""; // Calcul pour connaitre la longueur maximum du hit String oltParameter = Tool.getTimeStamp().execute(); - int MAX_LENGTH_AVAILABLE = HIT_MAX_LENGTH - (configuration.length() + oltParameter.length() + MH_PARAMETER_MAX_LENGTH); - MAX_LENGTH_AVAILABLE -= idClient.length(); + int maxLengthAvailable = HIT_MAX_LENGTH - (configStr.length() + oltParameter.length() + MH_PARAMETER_MAX_LENGTH); + maxLengthAvailable -= idClient.length(); LinkedHashMap> dictionary; - if (!TextUtils.isEmpty(configuration)) { + if (!TextUtils.isEmpty(configStr)) { dictionary = prepareQuery(); Set keySet = dictionary.keySet(); if (dictionary.get(Hit.HitParam.UserId.stringValue()) != null) { idClient = dictionary.get(Hit.HitParam.UserId.stringValue()).first; - MAX_LENGTH_AVAILABLE -= idClient.length(); + maxLengthAvailable -= idClient.length(); } // Outerloop est un label de référence si jamais une boucle doit être interrompue @@ -387,7 +387,7 @@ Object[] build() { // Si la valeur du paramètre est trop grande - if (value.length() > MAX_LENGTH_AVAILABLE) { + if (value.length() > maxLengthAvailable) { // Si le paramètre est découpable if (Lists.getSliceReadyParams().contains(parameterKey)) { @@ -404,11 +404,11 @@ Object[] build() { String currentSplitValue = valuesList[i]; // Si la valeur courante est trop grande - if (currentSplitValue.length() > MAX_LENGTH_AVAILABLE) { + if (currentSplitValue.length() > maxLengthAvailable) { // Erreur : Valeur trop longue non découpable indexError = countSplitHits; queryString.append(currentKey); - int currentMaxLength = MAX_LENGTH_AVAILABLE - (MHERR_PARAMETER_LENGTH + queryString.length()); + int currentMaxLength = maxLengthAvailable - (MHERR_PARAMETER_LENGTH + queryString.length()); // On cherche la position du dernier % afin d'éviter les exceptions au moment de la découpe brutale String splitError = currentSplitValue.substring(0, currentMaxLength); @@ -419,13 +419,13 @@ Object[] build() { } else { queryString.append(splitError); } - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: Param " + parameterKey + " value still too long after slicing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: Param " + parameterKey + " value still too long after slicing"); // On retourne à l'endroit du code où se trouve outerloop break outerloop; } // Sinon si le hit déjà construit + la valeur courante est trop grand - else if (queryString.length() + currentSplitValue.length() > MAX_LENGTH_AVAILABLE) { + else if (queryString.length() + currentSplitValue.length() > maxLengthAvailable) { // On créé un nouveau tronçon countSplitHits++; prepareHitsList.add(queryString.toString()); @@ -442,12 +442,12 @@ else if (queryString.length() + currentSplitValue.length() > MAX_LENGTH_AVAILABL } else { // Erreur : le paramètre n'est pas découpable indexError = countSplitHits; - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: parameter " + parameterKey + " value not allowed to be sliced"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: parameter " + parameterKey + " value not allowed to be sliced"); break; } } // Sinon, si le hit est trop grand, on le découpe entre deux paramètres - else if (queryString.length() + value.length() > MAX_LENGTH_AVAILABLE) { + else if (queryString.length() + value.length() > maxLengthAvailable) { countSplitHits++; prepareHitsList.add(queryString.toString()); queryString = new StringBuilder() @@ -463,15 +463,15 @@ else if (queryString.length() + value.length() > MAX_LENGTH_AVAILABLE) { // Si un seul hit est construit if (countSplitHits == 1) { if (indexError == countSplitHits) { - hitsList.add(configuration + makeSubQuery("mherr", "1") + queryString); + hitsList.add(configStr + makeSubQuery(MHERR, "1") + queryString); } else { - hitsList.add(configuration + queryString); + hitsList.add(configStr + queryString); } } // Sinon, si le nombre de tronçons > 999, erreur else if (countSplitHits > HIT_MAX_COUNT) { - hitsList.add(configuration + makeSubQuery("mherr", "1") + queryString); - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Multihits: too much hit parts"); + hitsList.add(configStr + makeSubQuery(MHERR, "1") + queryString); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Multihits: too much hit parts"); } // Sinon, on ajoute les hits construits à la liste de hits à envoyer else { @@ -481,21 +481,21 @@ else if (countSplitHits > HIT_MAX_COUNT) { String countSplitHitsString = countSplitHits.toString(); String mhParameter = makeSubQuery("mh", String.format(MH_PARAMETER_FORMAT, Tool.formatNumberLength(Integer.toString(i + 1), countSplitHitsString.length()), countSplitHitsString, mhID)); if (indexError == (i + 1)) { - hitsList.add(configuration + mhParameter + makeSubQuery("mherr", "1") + prepareHitsList.get(i)); + hitsList.add(configStr + mhParameter + makeSubQuery(MHERR, "1") + prepareHitsList.get(i)); } else { - hitsList.add(configuration + mhParameter + prepareHitsList.get(i)); + hitsList.add(configStr + mhParameter + prepareHitsList.get(i)); } } } if (tracker.getListener() != null) { - String message = ""; + StringBuilder message = new StringBuilder(); for (String hit : hitsList) { - message += hit + "\n"; + message.append(hit).append('\n'); } - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.build, message, TrackerListener.HitStatus.Success); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.BUILD, message.toString(), TrackerListener.HitStatus.Success); } } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.build, "Empty configuration", TrackerListener.HitStatus.Failed); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.BUILD, "Empty configuration", TrackerListener.HitStatus.Failed); } return new Object[]{hitsList, oltParameter}; @@ -565,19 +565,17 @@ ArrayList organizeParameters(LinkedHashMap completeBuffer) LinkedHashMap> prepareQuery() { LinkedHashMap> formattedParameters = new LinkedHashMap<>(); - LinkedHashMap completeBuffer = new LinkedHashMap() {{ - putAll(persistentParams); - putAll(volatileParams); - }}; + LinkedHashMap completeBuffer = new LinkedHashMap<>(); + completeBuffer.putAll(persistentParams); + completeBuffer.putAll(volatileParams); // ORGANISE PARAMS ArrayList params = organizeParameters(completeBuffer); // PREPARE for (final Param p : params) { - List paramValues = new ArrayList() {{ - addAll(p.getValues()); - }}; + List paramValues = new ArrayList<>(); + paramValues.addAll(p.getValues()); String strValue = paramValues.remove(0).execute(); if (strValue != null) { @@ -592,14 +590,14 @@ LinkedHashMap> prepareQuery() { if (Tool.isJSON(appendValue)) { result.putAll(Tool.toMap(new JSONObject(appendValue))); } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Couldn't append value to a JSONObject"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Couldn't append value to a JSONObject"); } } strValue = new JSONObject(result).toString(); } catch (JSONException e) { e.printStackTrace(); } - } else if (p.getOptions().getType() == ParamOption.Type.Array) { + } else if (p.getOptions().getType() == ParamOption.Type.ARRAY) { try { List result = new ArrayList(); JSONArray valArray = new JSONArray(strValue); @@ -623,17 +621,21 @@ LinkedHashMap> prepareQuery() { } } else { // NOT JSON + StringBuilder strBuilder = new StringBuilder(strValue); for (Closure closureValue : paramValues) { - strValue += p.getOptions().getSeparator(); - strValue += closureValue.execute(); + strBuilder.append(p.getOptions().getSeparator()) + .append(closureValue.execute()); } + strValue = strBuilder.toString(); } } else { // NOT JSON + StringBuilder strBuilder = new StringBuilder(strValue); for (Closure closureValue : paramValues) { - strValue += ","; - strValue += closureValue.execute(); + strBuilder.append(',') + .append(closureValue.execute()); } + strValue = strBuilder.toString(); } String key = p.getKey(); @@ -642,7 +644,7 @@ LinkedHashMap> prepareQuery() { if (TechnicalContext.doNotTrackEnabled(Tracker.getAppContext())) { strValue = OPT_OUT; } else if (((Boolean) configuration.get(TrackerConfigurationKeys.HASH_USER_ID))) { - strValue = Tool.SHA_256(strValue); + strValue = Tool.SHA256(strValue); } tracker.setInternalUserId(strValue); } else if (key.equals(Hit.HitParam.Referrer.stringValue())) { @@ -713,7 +715,7 @@ private void send(final Hit hit) { saveHitDatabase(hit); } // Si pas de connexion - else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.offline || (!hit.isOffline() && storage.getCountOfflineHits() > 0)) { + else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.OFFLINE || (!hit.isOffline() && storage.getCountOfflineHits() > 0)) { // Si le hit ne provient pas du offline if (storage.getOfflineMode() != Tracker.OfflineMode.never && !hit.isOffline()) { saveHitDatabase(hit); @@ -740,7 +742,7 @@ else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.off updateRetryCount(hit); } } - Tool.executeCallback(trackerListener, Tool.CallbackType.send, message, TrackerListener.HitStatus.Failed); + Tool.executeCallback(trackerListener, Tool.CallbackType.SEND, message, TrackerListener.HitStatus.Failed); updateDebugger(message, "error48", false); } // Le hit a été envoyé @@ -749,7 +751,7 @@ else if (TechnicalContext.getConnection() == TechnicalContext.ConnectionType.off if (hit.isOffline()) { storage.deleteHit(hit.getUrl()); } - Tool.executeCallback(trackerListener, Tool.CallbackType.send, hit.getUrl(), TrackerListener.HitStatus.Success); + Tool.executeCallback(trackerListener, Tool.CallbackType.SEND, hit.getUrl(), TrackerListener.HitStatus.Success); updateDebugger(hit.getUrl(), "sent48", true); } } catch (final Exception e) { @@ -790,30 +792,31 @@ void send(boolean includeOfflineHits) { } static void sendOfflineHits(TrackerListener listener, Storage storage, boolean forceSendOfflineHits, boolean async) { - if ((storage.getOfflineMode() != Tracker.OfflineMode.always || forceSendOfflineHits) && TechnicalContext.getConnection() != TechnicalContext.ConnectionType.offline && !OfflineHitProcessing) { - - if (TrackerQueue.getEnabledFillQueueFromDatabase() && storage.getCountOfflineHits() > 0) { - ArrayList offlineHits = storage.getOfflineHits(); - if (async) { - TrackerQueue.setEnabledFillQueueFromDatabase(false); - for (Hit hit : offlineHits) { - Sender sender = new Sender(listener, hit, forceSendOfflineHits); - TrackerQueue.getInstance().put(sender); - } - TrackerQueue.getInstance().put(new Runnable() { - @Override - public void run() { - TrackerQueue.setEnabledFillQueueFromDatabase(true); - } - }); - } else { - OfflineHitProcessing = true; - for (Hit hit : offlineHits) { - Sender sender = new Sender(listener, hit, forceSendOfflineHits); - sender.send(false); + if ((storage.getOfflineMode() != Tracker.OfflineMode.always || forceSendOfflineHits) + && TechnicalContext.getConnection() != TechnicalContext.ConnectionType.OFFLINE + && !OfflineHitProcessing && TrackerQueue.getEnabledFillQueueFromDatabase() + && storage.getCountOfflineHits() > 0) { + + ArrayList offlineHits = storage.getOfflineHits(); + if (async) { + TrackerQueue.setEnabledFillQueueFromDatabase(false); + for (Hit hit : offlineHits) { + Sender sender = new Sender(listener, hit, forceSendOfflineHits); + TrackerQueue.getInstance().put(sender); + } + TrackerQueue.getInstance().put(new Runnable() { + @Override + public void run() { + TrackerQueue.setEnabledFillQueueFromDatabase(true); } - OfflineHitProcessing = false; + }); + } else { + OfflineHitProcessing = true; + for (Hit hit : offlineHits) { + Sender sender = new Sender(listener, hit, forceSendOfflineHits); + sender.send(false); } + OfflineHitProcessing = false; } } } @@ -830,10 +833,10 @@ private void updateRetryCount(Hit hit) { void saveHitDatabase(final Hit hit) { final String url = storage.saveHit(hit.getUrl(), System.currentTimeMillis(), oltParameter); if (!TextUtils.isEmpty(url)) { - Tool.executeCallback(trackerListener, Tool.CallbackType.save, hit.getUrl()); + Tool.executeCallback(trackerListener, Tool.CallbackType.SAVE, hit.getUrl()); updateDebugger(url, "save48", true); } else { - Tool.executeCallback(trackerListener, Tool.CallbackType.warning, "Hit could not be saved : " + hit.getUrl()); + Tool.executeCallback(trackerListener, Tool.CallbackType.WARNING, "Hit could not be saved : " + hit.getUrl()); updateDebugger("Hit could not be saved : " + hit.getUrl(), "warning48", false); } } @@ -856,7 +859,7 @@ private void updateDebugger(final String message, final String type, final boole @Override public void run() { Debugger.getDebuggerEvents().add(0, new Debugger.DebuggerEvent(message, type, isHit)); - if (Debugger.currentViewVisibleId == com.atinternet.tracker.R.id.eventViewer) { + if (Debugger.getCurrentViewVisibleId() == com.atinternet.tracker.R.id.eventViewer) { Debugger.getDebuggerEventListAdapter().notifyDataSetChanged(); } } @@ -879,9 +882,8 @@ void dispatch(BusinessObject... businessObjects) { businessObject.setEvent(); if (businessObject instanceof AbstractScreen) { - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); boolean hasOrder = false; @@ -905,9 +907,8 @@ void dispatch(BusinessObject... businessObjects) { tracker.Cart().setEvent(); } } else if (businessObject instanceof Gesture) { - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); if (((Gesture) businessObject).getAction() == Gesture.Action.InternalSearch) { for (BusinessObject object : trackerObjects) { @@ -920,9 +921,8 @@ void dispatch(BusinessObject... businessObjects) { } tracker.getBusinessObjects().remove(businessObject.getId()); - trackerObjects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + trackerObjects = new ArrayList<>(); + trackerObjects.addAll(tracker.getBusinessObjects().values()); for (BusinessObject object : trackerObjects) { if ((object instanceof CustomObject || object instanceof NuggAd) && object.getTimestamp() < businessObject.getTimestamp()) { @@ -933,11 +933,12 @@ void dispatch(BusinessObject... businessObjects) { } if (Hit.getHitType(tracker.getBuffer().getVolatileParams(), tracker.getBuffer().getPersistentParams()) == Hit.HitType.Screen) { - TechnicalContext.screenName = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Screen.stringValue())); - CrashDetectionHandler.setCrashLastScreen(TechnicalContext.screenName); + String sn = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Screen.stringValue())); + TechnicalContext.setScreenName(sn); + CrashDetectionHandler.setCrashLastScreen(sn); String level2 = Tool.appendParameterValues(tracker.getBuffer().getVolatileParams().get(Hit.HitParam.Level2.stringValue())); - TechnicalContext.level2 = (!TextUtils.isEmpty(level2)) ? Integer.parseInt(level2) : 0; + TechnicalContext.setLevel2((!TextUtils.isEmpty(level2)) ? Integer.parseInt(level2) : 0); SharedPreferences preferences = Tracker.getPreferences(); if (!preferences.getBoolean(TrackerConfigurationKeys.CAMPAIGN_ADDED_KEY, false)) { @@ -1032,14 +1033,18 @@ public void run() { scheduledExecutorService.execute(runnable); } } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } }).start(); } static TrackerQueue getInstance() { - return instance == null ? (instance = new TrackerQueue()) : instance; + if (instance == null) { + instance = new TrackerQueue(); + } + return instance; } @Override @@ -1049,15 +1054,33 @@ public void put(Runnable runnable) { super.put(runnable); } } catch (InterruptedException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); + Thread.currentThread().interrupt(); } } } class TechnicalContext { - static String screenName = ""; - static int level2 = 0; + private static String screenName = ""; + private static int level2 = 0; + + static void setScreenName(String sn) { + screenName = sn; + } + + static String getScreenName() { + return screenName; + } + + static void setLevel2(int lv) { + level2 = lv; + } + + static int getLevel2() { + return level2; + } + private static final int RETRY_GET_ADVERTISING_COUNT = 3; private static final String ANDROID_ID_KEY = "androidId"; @@ -1066,7 +1089,7 @@ class TechnicalContext { static final Closure VTAG = new Closure() { @Override public String execute() { - return "2.8.3"; + return "2.8.4"; } }; @@ -1078,7 +1101,7 @@ public String execute() { }; enum ConnectionType { - gprs, edge, twog, threeg, threegplus, fourg, wifi, offline, unknown + GPRS, EDGE, TWOG, THREEG, THREEGPLUS, FOURG, WIFI, OFFLINE, UNKNOWN } static ConnectionType getConnection() { @@ -1090,34 +1113,34 @@ static ConnectionType getConnection() { if (networkInfo != null) { if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { - return ConnectionType.wifi; + return ConnectionType.WIFI; } else { switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_GPRS: - return ConnectionType.gprs; + return ConnectionType.GPRS; case TelephonyManager.NETWORK_TYPE_EDGE: - return ConnectionType.edge; + return ConnectionType.EDGE; case TelephonyManager.NETWORK_TYPE_1xRTT: - return ConnectionType.twog; + return ConnectionType.TWOG; case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_B: - return ConnectionType.threeg; + return ConnectionType.THREEG; case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: - return ConnectionType.threegplus; + return ConnectionType.THREEGPLUS; case TelephonyManager.NETWORK_TYPE_HSPAP: case TelephonyManager.NETWORK_TYPE_LTE: - return ConnectionType.fourg; + return ConnectionType.FOURG; default: - return ConnectionType.unknown; + return ConnectionType.UNKNOWN; } } } else { - return ConnectionType.offline; + return ConnectionType.OFFLINE; } } @@ -1126,21 +1149,21 @@ static Closure getConnectionType() { @Override public String execute() { switch (getConnection()) { - case gprs: + case GPRS: return "gprs"; - case edge: + case EDGE: return "edge"; - case twog: + case TWOG: return "2g"; - case threeg: + case THREEG: return "3g"; - case threegplus: + case THREEGPLUS: return "3g+"; - case fourg: + case FOURG: return "4g"; - case wifi: + case WIFI: return "wifi"; - case unknown: + case UNKNOWN: return "unknown"; default: return "offline"; @@ -1266,7 +1289,6 @@ public String execute() { .getDefaultDisplay(); d.getMetrics(metrics); - // since SDK_INT = 1; int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels; @@ -1285,7 +1307,8 @@ public String execute() { heightPixels = realSize.y; } - } catch (Exception ignored) { + } catch (Exception e) { + Log.e(Tracker.TAG, e.toString()); } double x = Math.pow(widthPixels / metrics.xdpi, 2); @@ -1344,7 +1367,7 @@ public String execute() { return "opt-out"; } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); return ""; } } @@ -1364,7 +1387,7 @@ static boolean doNotTrackEnabled(android.content.Context context) { class Tool { enum CallbackType { - firstLaunch, build, send, partner, warning, save, error + FIRST_LAUNCH, BUILD, SEND, PARTNER, WARNING, SAVE, ERROR } static String upperCaseFirstLetter(String s) { @@ -1375,7 +1398,7 @@ static String percentEncode(String s) { try { s = URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return s.replace("+", "%20") .replace("*", "%2A") @@ -1388,7 +1411,7 @@ static String percentDecode(String s) { try { s = URLDecoder.decode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return s; } @@ -1404,7 +1427,7 @@ static String removeCharacters(String s, String... charTobeRemoved) { @SuppressWarnings("unchecked") static String convertToString(Object value, String separator) { separator = (!TextUtils.isEmpty(separator)) ? separator : ","; - String result = ""; + StringBuilder result = new StringBuilder(); boolean isFirst = true; if (value != null) { @@ -1413,10 +1436,10 @@ static String convertToString(Object value, String separator) { for (Object object : listResult) { value = object; if (isFirst) { - result = convertToString(value, separator); + result = new StringBuilder(convertToString(value, separator)); isFirst = false; } else { - result += separator + convertToString(value, separator); + result.append(separator).append(convertToString(value, separator)); } } } else if (value instanceof Object[]) { @@ -1424,13 +1447,13 @@ static String convertToString(Object value, String separator) { value = Arrays.asList(objects); return convertToString(value, separator); } else if (value instanceof Map) { - result = new JSONObject((Map) value).toString(); + result = new StringBuilder(new JSONObject((Map) value).toString()); } else { - result = String.valueOf(value); + result = new StringBuilder(String.valueOf(value)); } } - return result; + return result.toString(); } static ArrayList> findParametersWithPosition(String key, ArrayList parameters) { @@ -1478,22 +1501,22 @@ static Tracker.OfflineMode convertStringToOfflineMode(String offlineMode) { static void executeCallback(TrackerListener trackerListener, CallbackType callbackType, String message, TrackerListener.HitStatus... hitStatuses) { if (trackerListener != null) { switch (callbackType) { - case firstLaunch: + case FIRST_LAUNCH: trackerListener.trackerNeedsFirstLaunchApproval(message); break; - case build: + case BUILD: trackerListener.buildDidEnd(hitStatuses[0], message); break; - case send: + case SEND: trackerListener.sendDidEnd(hitStatuses[0], message); break; - case partner: + case PARTNER: trackerListener.didCallPartner(message); break; - case warning: + case WARNING: trackerListener.warningDidOccur(message); break; - case save: + case SAVE: trackerListener.saveDidEnd(message); break; default://error @@ -1516,16 +1539,16 @@ static int getSecondsBetweenTimes(long latestTimeMillis, long oldestTimeMillis) } static String formatNumberLength(String s, int length) { - String result = ""; + StringBuilder sb = new StringBuilder(); for (int i = s.length(); i < length; i++) { - result += "0"; + sb.append('0'); } - return result + s; + return sb.append(s).toString(); } static boolean isJSON(String s) { try { - JSONObject object = new JSONObject(s); + new JSONObject(s); return true; } catch (JSONException e) { return false; @@ -1534,7 +1557,7 @@ static boolean isJSON(String s) { static boolean isArray(String s) { try { - JSONArray array = new JSONArray(s); + new JSONArray(s); return true; } catch (JSONException e) { return false; @@ -1591,27 +1614,27 @@ static String appendParameterValues(Param param) { return result.toString(); } - static String SHA_256(String s) { + static String SHA256(String s) { String baseString = "AT" + s; - String result = ""; + StringBuilder sb = new StringBuilder(); try { MessageDigest md; md = MessageDigest.getInstance("SHA-256"); md.update(baseString.getBytes()); - byte byteData[] = md.digest(); + byte[] byteData = md.digest(); for (byte aByteData : byteData) { String hex = Integer.toHexString(0xff & aByteData); if (hex.length() == 1) { - result += "0"; + sb.append('0'); } - result += hex; + sb.append(hex); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } - return result; + return sb.toString(); } static Drawable getResizedImage(int imageID, android.content.Context context, int width, int height) { @@ -1659,7 +1682,7 @@ static LinkedHashMap getParameters(String hit) { } } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } return map; } @@ -1693,6 +1716,7 @@ class Storage extends SQLiteOpenHelper { private static final String HIT = "hit"; private static final String RETRY = "retry"; private static final String DATE = "date"; + private static final String SELECT_ALL_QUERY = "SELECT * FROM " + HITS_STORAGE_TABLE + " "; private static final String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS " + HITS_STORAGE_TABLE + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT , " + @@ -1746,22 +1770,22 @@ void deleteHit(String hit) { String buildHitToStore(String hit, String olt) { String[] hitComponents = hit.split("&"); - String newHit = hitComponents[0]; + StringBuilder newHitBuilder = new StringBuilder(hitComponents[0]); for (int i = 1; i < hitComponents.length; i++) { String[] parameterComponents = hitComponents[i].split("="); if (parameterComponents[0].equals("cn")) { - newHit += "&cn=offline"; + newHitBuilder.append("&cn=offline"); } else { - newHit += "&" + hitComponents[i]; + newHitBuilder.append('&').append(hitComponents[i]); } if (parameterComponents[0].equals("ts") || parameterComponents[0].equals("mh")) { - newHit += "&olt=" + olt; + newHitBuilder.append("&olt=").append(olt); } } - return newHit; + return newHitBuilder.toString(); } void updateRetry(String hit, int retry) { @@ -1775,7 +1799,7 @@ void updateRetry(String hit, int retry) { int getCountOfflineHits() { int result = -1; SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE, null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY, null); if (c != null) { result = c.getCount(); c.close(); @@ -1803,7 +1827,7 @@ void removeOldOfflineHits(int storageDuration) { ArrayList getOfflineHits() { ArrayList hits = new ArrayList<>(); SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " ORDER BY " + ID + " ASC", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "ORDER BY " + ID + " ASC", null); if (c != null && c.getCount() > 0) { c.moveToFirst(); do { @@ -1821,7 +1845,7 @@ ArrayList getOfflineHits() { Hit getOldestOfflineHit() { SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " WHERE " + DATE + " = (SELECT MIN(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "WHERE " + DATE + " = (SELECT MIN(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); if (c != null && c.moveToFirst()) { String hit = c.getString(c.getColumnIndex(HIT)); String time = c.getString(c.getColumnIndex(DATE)); @@ -1839,7 +1863,7 @@ Hit getOldestOfflineHit() { Hit getLatestOfflineHit() { SQLiteDatabase db = getReadableDatabase(); - Cursor c = db.rawQuery("SELECT * FROM " + HITS_STORAGE_TABLE + " WHERE " + DATE + " = (SELECT MAX(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); + Cursor c = db.rawQuery(SELECT_ALL_QUERY + "WHERE " + DATE + " = (SELECT MAX(" + DATE + ") FROM " + HITS_STORAGE_TABLE + " )", null); if (c != null && c.moveToFirst()) { String hit = c.getString(c.getColumnIndex(HIT)); String time = c.getString(c.getColumnIndex(DATE)); @@ -1858,59 +1882,62 @@ Hit getLatestOfflineHit() { class Lists { + private Lists() { + throw new IllegalStateException("Private class"); + } + static HashMap getProcessedTypes() { - return new HashMap() {{ - put("audio", Hit.HitType.Audio); - put("video", Hit.HitType.Video); - put("vpre", Hit.HitType.Video); - put("vmid", Hit.HitType.Video); - put("vpost", Hit.HitType.Video); - put("animation", Hit.HitType.Animation); - put("anim", Hit.HitType.Animation); - put("podcast", Hit.HitType.PodCast); - put("rss", Hit.HitType.RSS); - put("email", Hit.HitType.Email); - put("pub", Hit.HitType.Publicite); - put("ad", Hit.HitType.Publicite); - put("click", Hit.HitType.Touch); - put("clic", Hit.HitType.Touch); - put("AT", Hit.HitType.AdTracking); - put("pdt", Hit.HitType.ProduitImpression); - put("mvt", Hit.HitType.MvTesting); - put("wbo", Hit.HitType.Weborama); - put("screen", Hit.HitType.Screen); - }}; + HashMap map = new HashMap<>(); + map.put("audio", Hit.HitType.Audio); + map.put("video", Hit.HitType.Video); + map.put("vpre", Hit.HitType.Video); + map.put("vmid", Hit.HitType.Video); + map.put("vpost", Hit.HitType.Video); + map.put("animation", Hit.HitType.Animation); + map.put("anim", Hit.HitType.Animation); + map.put("podcast", Hit.HitType.PodCast); + map.put("rss", Hit.HitType.RSS); + map.put("email", Hit.HitType.Email); + map.put("pub", Hit.HitType.Publicite); + map.put("ad", Hit.HitType.Publicite); + map.put("click", Hit.HitType.Touch); + map.put("clic", Hit.HitType.Touch); + map.put("AT", Hit.HitType.AdTracking); + map.put("pdt", Hit.HitType.ProduitImpression); + map.put("mvt", Hit.HitType.MvTesting); + map.put("wbo", Hit.HitType.Weborama); + map.put("screen", Hit.HitType.Screen); + return map; } static HashSet getReadOnlyConfigs() { - return new HashSet() {{ - }}; + return new HashSet<>(); } static HashSet getReadOnlyParams() { - return new HashSet() {{ - add("vtag"); - add("ptag"); - add("lng"); - add("mfmd"); - add("manufacturer"); - add("model"); - add("os"); - add("apvr"); - add("hl"); - add("r"); - add("car"); - add("cn"); - add("ts"); - }}; + HashSet set = new HashSet<>(); + set.add("vtag"); + set.add("ptag"); + set.add("lng"); + set.add("mfmd"); + set.add("manufacturer"); + set.add("model"); + set.add("os"); + set.add("apvr"); + set.add("hl"); + set.add("r"); + set.add("car"); + set.add("cn"); + set.add("ts"); + return set; } static HashSet getSliceReadyParams() { - return new HashSet() {{ - add("ati"); - add("atc"); - add("pdtl"); - add("stc"); - }}; + HashSet set = new HashSet<>(); + set.add("ati"); + set.add("atc"); + set.add("pdtl"); + set.add("stc"); + return set; } } \ No newline at end of file diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/CoreFeatures.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/CoreFeatures.java index 54b88751..6e7578cb 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/CoreFeatures.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/CoreFeatures.java @@ -31,6 +31,7 @@ of this software and associated documentation files (the "Software"), to deal import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; +import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -130,14 +131,10 @@ static Closure getCrashInformation() { public String execute() { boolean hasCrashed = preferences.getBoolean(CRASH_DETECTION, false); if (hasCrashed) { - final String lastScreen = preferences.getString(CRASH_LAST_SCREEN, ""); - final String className = preferences.getString(CRASH_CLASS_CAUSE, ""); - final String exceptionName = preferences.getString(CRASH_EXCEPTION_NAME, ""); - LinkedHashMap map = new LinkedHashMap() {{ - put("lastscreen", lastScreen); - put("classname", className); - put("error", exceptionName); - }}; + LinkedHashMap map = new LinkedHashMap<>(); + map.put("lastscreen", preferences.getString(CRASH_LAST_SCREEN, "")); + map.put("classname", preferences.getString(CRASH_CLASS_CAUSE, "")); + map.put("error", preferences.getString(CRASH_EXCEPTION_NAME, "")); preferences.edit().putBoolean(CRASH_DETECTION, false).apply(); try { return new JSONObject().put("crash", new JSONObject(map)).toString(); @@ -168,6 +165,11 @@ private String getClassNameException(Throwable t) { class LifeCycle { + /** + * Key representing if it's first launch (backward compat) + */ + static final String AT_FIRST_LAUNCH = "ATFirstLaunch"; + /** * Key representing version code app */ @@ -243,10 +245,9 @@ class LifeCycle { */ private static String versionCode; - /** - * Date format - */ - private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); + private LifeCycle() { + throw new IllegalStateException("Private class"); + } /** * Init lifecycle @@ -274,14 +275,15 @@ static void initLifeCycle(Context context) { static void firstSessionInit(SharedPreferences preferences, SharedPreferences backwardPreferences) { // If SDKV1 lifecycle exists - if (backwardPreferences != null && backwardPreferences.getString("ATFirstLaunch", null) != null) { + if (backwardPreferences != null && backwardPreferences.getString(AT_FIRST_LAUNCH, null) != null) { preferences.edit().putBoolean(FIRST_SESSION, false) - .putString(FIRST_SESSION_DATE, backwardPreferences.getString("ATFirstLaunch", "")) + .putString(FIRST_SESSION_DATE, backwardPreferences.getString(AT_FIRST_LAUNCH, "")) .putInt(SESSION_COUNT, backwardPreferences.getInt("ATLaunchCount", 0)) .putString(LAST_SESSION_DATE, backwardPreferences.getString("ATLastLaunch", "")).apply(); - backwardPreferences.edit().putString("ATFirstLaunch", null).apply(); + backwardPreferences.edit().putString(AT_FIRST_LAUNCH, null).apply(); } else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); preferences.edit() .putBoolean(FIRST_SESSION, true) .putBoolean(FIRST_SESSION_AFTER_UPDATE, false) @@ -308,8 +310,8 @@ static void updateFirstSession(SharedPreferences preferences) { } static void newSessionInit(SharedPreferences preferences) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); try { - updateFirstSession(preferences); // Calcul dsfs String firstLaunchDate = preferences.getString(FIRST_SESSION_DATE, ""); @@ -352,7 +354,7 @@ static void newSessionInit(SharedPreferences preferences) { .apply(); } } catch (ParseException e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } sessionId = UUID.randomUUID().toString(); } @@ -426,8 +428,8 @@ public void run() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - TechnicalContext.screenName = null; - TechnicalContext.level2 = 0; + TechnicalContext.setScreenName(null); + TechnicalContext.setLevel2(0); if (savedActivityName == null || activity == null || !activity.getClass().getCanonicalName().equals(savedActivityName) || activity.getTaskId() == savedActivityTaskId) { timeInBackground = -1; @@ -447,7 +449,7 @@ public void onActivityStarted(Activity activity) { @Override public void onActivityResumed(Activity activity) { - if (Debugger.isActive) { + if (Debugger.isActive()) { handler.removeCallbacks(debuggerCancelable); Debugger.setViewerVisibility(true); } @@ -458,7 +460,7 @@ public void onActivityPaused(Activity activity) { savedActivityName = activity.getClass().getCanonicalName(); savedActivityTaskId = activity.getTaskId(); timeInBackground = System.currentTimeMillis(); - if (Debugger.isActive) { + if (Debugger.isActive()) { handler.postDelayed(debuggerCancelable, DELAY); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Debugger.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Debugger.java index 9aec2601..ad912016 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Debugger.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Debugger.java @@ -22,6 +22,7 @@ of this software and associated documentation files (the "Software"), to deal */ package com.atinternet.tracker; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -31,6 +32,7 @@ of this software and associated documentation files (the "Software"), to deal import android.os.Build; import android.provider.Settings; import android.util.DisplayMetrics; +import android.util.Log; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; @@ -65,8 +67,8 @@ public class Debugger extends GestureDetector.SimpleOnGestureListener implements private static final float ALPHA_BACKGROUND = .3f; private static final float DELTA = 100; - static boolean isActive; - static int currentViewVisibleId = -1; + private static boolean active; + private static int currentViewVisibleId = -1; private static int itemPosition = -1; private static final ArrayList debuggerEvents = new ArrayList<>(); private static final ArrayList offlineHits = new ArrayList<>(); @@ -101,6 +103,14 @@ public class Debugger extends GestureDetector.SimpleOnGestureListener implements private float initialTouchY; private final int ratio; + static boolean isActive() { + return active; + } + + static int getCurrentViewVisibleId() { + return currentViewVisibleId; + } + static Context getContext() { if (context != null) { return context.get(); @@ -129,8 +139,7 @@ public static void show(Context context, Tracker tracker) { public static void create(Context context, Tracker tracker) { if (Build.VERSION.SDK_INT >= 26) { windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; - } - else { + } else { windowType = WindowManager.LayoutParams.TYPE_PHONE; } if (Build.VERSION.SDK_INT >= 23) { @@ -189,7 +198,7 @@ static ArrayList getDebuggerEvents() { } private Debugger(Context ctx, Tracker tr) { - isActive = true; + active = true; context = new WeakReference<>(ctx); remove(); if (context.get().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -220,6 +229,7 @@ public boolean onSingleTapConfirmed(MotionEvent event) { return true; } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event) || viewerVisibility == View.VISIBLE) { @@ -253,6 +263,9 @@ public boolean onTouch(View v, MotionEvent event) { + (int) (event.getRawY() - initialTouchY); ((WindowManager) context.get().getSystemService(Context.WINDOW_SERVICE)).updateViewLayout(bubbleImage.get(), bubbleImageLayoutParams); break; + default: + Log.i(Tracker.TAG, "ignored action"); + break; } return true; } @@ -291,7 +304,7 @@ public void onClick(View v) { offlineHitsListView.setVisibility(!offlineHits.isEmpty() ? View.VISIBLE : View.GONE); } else if (id == R.id.backToPreviousView) { itemPosition = -1; - ViewGroup parametersListView = (ViewGroup) hitDetailViewer.findViewById(R.id.parametersListView); + ViewGroup parametersListView = hitDetailViewer.findViewById(R.id.parametersListView); parametersListView.removeAllViews(); Tool.setVisibleViewWithAnimation(hitDetailViewer, false); } @@ -304,7 +317,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) } private void onUpdateAfterItemClick(int position, boolean animate) { - ViewGroup parametersListView = (ViewGroup) hitDetailViewer.findViewById(R.id.parametersListView); + ViewGroup parametersListView = hitDetailViewer.findViewById(R.id.parametersListView); if (currentViewVisibleId == R.id.eventViewer) { DebuggerEvent event = debuggerEvents.get(position); if (event.isHit()) { @@ -328,16 +341,17 @@ private void onUpdateAfterItemClick(int position, boolean animate) { } } + @SuppressLint("ClickableViewAccessibility") private void inflateViews(Context context) { debuggerViewerLayout = new WeakReference<>((ATFrameLayout) View.inflate(context, R.layout.debugger_layout, null)); - eventViewer = (LinearLayout) debuggerViewerLayout.get().findViewById(R.id.eventViewer); - offlineViewer = (LinearLayout) debuggerViewerLayout.get().findViewById(R.id.offlineViewer); - eventListView = (ListView) debuggerViewerLayout.get().findViewById(R.id.eventListView); - offlineHitsListView = (ListView) debuggerViewerLayout.get().findViewById(R.id.offlineHitsListView); - noEventsLayout = (RelativeLayout) debuggerViewerLayout.get().findViewById(R.id.noEvents); - noOfflineHitsLayout = (RelativeLayout) debuggerViewerLayout.get().findViewById(R.id.noOfflineHits); - hitDetailViewer = (LinearLayout) debuggerViewerLayout.get().findViewById(R.id.hitDetailViewer); + eventViewer = debuggerViewerLayout.get().findViewById(R.id.eventViewer); + offlineViewer = debuggerViewerLayout.get().findViewById(R.id.offlineViewer); + eventListView = debuggerViewerLayout.get().findViewById(R.id.eventListView); + offlineHitsListView = debuggerViewerLayout.get().findViewById(R.id.offlineHitsListView); + noEventsLayout = debuggerViewerLayout.get().findViewById(R.id.noEvents); + noOfflineHitsLayout = debuggerViewerLayout.get().findViewById(R.id.noOfflineHits); + hitDetailViewer = debuggerViewerLayout.get().findViewById(R.id.hitDetailViewer); bubbleImage = new WeakReference<>(new ATImageView(context)); bubbleImage.get().setImageDrawable(Tool.getResizedImage(R.drawable.atinternet_logo, context, (int) (94 * metrics.density), (int) (73 * metrics.density))); @@ -575,10 +589,10 @@ public View getView(int position, View convertView, ViewGroup parent) { noEventsLayout.setVisibility(View.GONE); - ImageView iconHitImageView = (ImageView) convertView.findViewById(R.id.iconHitImageView); - TextView timeTextView = (TextView) convertView.findViewById(R.id.timeTextView); - TextView hitTextView = (TextView) convertView.findViewById(R.id.hitTextView); - ImageView typeHitImageView = (ImageView) convertView.findViewById(R.id.typeHitImageView); + ImageView iconHitImageView = convertView.findViewById(R.id.iconHitImageView); + TextView timeTextView = convertView.findViewById(R.id.timeTextView); + TextView hitTextView = convertView.findViewById(R.id.hitTextView); + ImageView typeHitImageView = convertView.findViewById(R.id.typeHitImageView); timeTextView.setText(timeString); hitTextView.setText(event.getMessage()); @@ -679,11 +693,11 @@ public View getView(int position, View convertView, ViewGroup parent) { noOfflineHitsLayout.setVisibility(View.GONE); - TextView hitTextView = (TextView) convertView.findViewById(R.id.hitTextView); - TextView timeTextView = (TextView) convertView.findViewById(R.id.timeTextView); - TextView dateTextView = (TextView) convertView.findViewById(R.id.dateTextView); - ImageView typeHitImageView = (ImageView) convertView.findViewById(R.id.typeHitImageView); - ImageView removeOfflineHit = (ImageView) convertView.findViewById(R.id.removeOfflineHit); + TextView hitTextView = convertView.findViewById(R.id.hitTextView); + TextView timeTextView = convertView.findViewById(R.id.timeTextView); + TextView dateTextView = convertView.findViewById(R.id.dateTextView); + ImageView typeHitImageView = convertView.findViewById(R.id.typeHitImageView); + ImageView removeOfflineHit = convertView.findViewById(R.id.removeOfflineHit); timeTextView.setText(hourString); dateTextView.setText(dateString); diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/DynamicScreen.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/DynamicScreen.java index 55f68542..9f49b872 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/DynamicScreen.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/DynamicScreen.java @@ -184,7 +184,7 @@ void setEvent() { if (screenId.length() > 255) { screenId = ""; - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "screenId too long, replaced by empty value"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "screenId too long, replaced by empty value"); } tracker.setParam(Hit.HitParam.DynamicScreenId.stringValue(), screenId); diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Gesture.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Gesture.java index da7afd85..aa4bbc27 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Gesture.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Gesture.java @@ -79,7 +79,10 @@ public String stringValue() { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Gesture(Tracker tracker) { @@ -99,9 +102,12 @@ LinkedHashMap getCustomObjectsMap() { */ @Deprecated public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber); + } + return internalSearch; } /** @@ -113,10 +119,13 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return the InternalSearch instance */ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber, int resultPosition) { - return internalSearch == null ? (internalSearch = new InternalSearch(tracker) - .setKeyword(keywordLabel) - .setResultScreenNumber(resultScreenNumber) - .setResultPosition(resultPosition)) : internalSearch; + if (internalSearch == null) { + internalSearch = new InternalSearch(tracker) + .setKeyword(keywordLabel) + .setResultScreenNumber(resultScreenNumber) + .setResultPosition(resultPosition); + } + return internalSearch; } /** @@ -125,7 +134,10 @@ public InternalSearch InternalSearch(String keywordLabel, int resultScreenNumber * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -298,12 +310,14 @@ public void sendSearch() { @Override void setEvent() { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.TouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.TouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.TouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.TouchLevel2.stringValue(), lvl2); } if (level2 > 0) { diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Hit.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Hit.java index 786de3a2..d2747159 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Hit.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Hit.java @@ -272,10 +272,9 @@ public boolean isOffline() { } static HitType getHitType(final LinkedHashMap volatileParams, final LinkedHashMap persistentParams) { - LinkedHashMap buffer = new LinkedHashMap() {{ - putAll(volatileParams); - putAll(persistentParams); - }}; + LinkedHashMap buffer = new LinkedHashMap<>(); + buffer.putAll(volatileParams); + buffer.putAll(persistentParams); HitType type = HitType.Screen; diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveAudios.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveAudios.java index b95209d0..ba785e48 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveAudios.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveAudios.java @@ -43,22 +43,15 @@ public class LiveAudios { * @return LiveAudio instance */ public LiveAudio add(String name) { - int index = -1; - int length = list.size(); + int index = searchLiveAudioIndexByName(name); LiveAudio liveAudio; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { liveAudio = new LiveAudio(player) .setName(name); list.add(liveAudio); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "This liveAudio already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "This liveAudio already exists"); liveAudio = list.get(index); } @@ -107,15 +100,7 @@ public LiveAudio add(String name, String chapter1, String chapter2, String chapt * @param name live audio name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchLiveAudioIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -132,4 +117,14 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchLiveAudioIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + return -1; + } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveVideos.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveVideos.java index 8dc0e05d..0d7df27a 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveVideos.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/LiveVideos.java @@ -43,22 +43,15 @@ public class LiveVideos { * @return LiveVideo instance */ public LiveVideo add(String name) { - int index = -1; - int length = list.size(); + int index = searchLiveVideoIndexByName(name); LiveVideo liveVideo; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { liveVideo = new LiveVideo(player) .setName(name); list.add(liveVideo); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "LiveVideo with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "LiveVideo with the same name already exists"); liveVideo = list.get(index); } @@ -107,15 +100,7 @@ public LiveVideo add(String name, String chapter1, String chapter2, String chapt * @param name live video name */ public void remove(String name) { - int length = list.size(); - int index = -1; - - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchLiveVideoIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -132,4 +117,14 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchLiveVideoIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + return -1; + } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayer.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayer.java index dded6213..04ea517c 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayer.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayer.java @@ -49,7 +49,10 @@ Tracker getTracker() { * @return the Videos instance */ public Videos Videos() { - return videos == null ? (videos = new Videos(this)) : videos; + if (videos == null) { + videos = new Videos(this); + } + return videos; } /** @@ -58,7 +61,10 @@ public Videos Videos() { * @return the Audios instance */ public Audios Audios() { - return audios == null ? (audios = new Audios(this)) : audios; + if (audios == null) { + audios = new Audios(this); + } + return audios; } /** @@ -67,7 +73,10 @@ public Audios Audios() { * @return the LiveVideos instance */ public LiveVideos LiveVideos() { - return liveVideos == null ? (liveVideos = new LiveVideos(this)) : liveVideos; + if (liveVideos == null) { + liveVideos = new LiveVideos(this); + } + return liveVideos; } /** @@ -76,7 +85,10 @@ public LiveVideos LiveVideos() { * @return the LiveAudios instance */ public LiveAudios LiveAudios() { - return liveAudios == null ? (liveAudios = new LiveAudios(this)) : liveAudios; + if (liveAudios == null) { + liveAudios = new LiveAudios(this); + } + return liveAudios; } /** diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayers.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayers.java index f91f8767..e80e16ce 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayers.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/MediaPlayers.java @@ -63,7 +63,7 @@ public MediaPlayer add(int playerId) { return player; } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "Player with the same id already exists"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "Player with the same id already exists"); return players.get(playerId); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/NuggAd.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/NuggAd.java index 5363ab9c..ad1c8a51 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/NuggAd.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/NuggAd.java @@ -58,7 +58,7 @@ void setEvent() { e.printStackTrace(); } } else { - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "NuggAd not enabled"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "NuggAd not enabled"); } } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Order.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Order.java index f180ff96..08975a2b 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Order.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Order.java @@ -58,7 +58,10 @@ OrderCustomVars getCustomVariables() { * @return OrderDiscount instance */ public OrderDiscount Discount() { - return orderDiscount == null ? (orderDiscount = new OrderDiscount(this)) : orderDiscount; + if (orderDiscount == null) { + orderDiscount = new OrderDiscount(this); + } + return orderDiscount; } /** @@ -67,7 +70,10 @@ public OrderDiscount Discount() { * @return OrderAmount instance */ public OrderAmount Amount() { - return orderAmount == null ? (orderAmount = new OrderAmount(this)) : orderAmount; + if (orderAmount == null) { + orderAmount = new OrderAmount(this); + } + return orderAmount; } /** @@ -76,7 +82,10 @@ public OrderAmount Amount() { * @return OrderDelivery instance */ public OrderDelivery Delivery() { - return orderDelivery == null ? (orderDelivery = new OrderDelivery(this)) : orderDelivery; + if (orderDelivery == null) { + orderDelivery = new OrderDelivery(this); + } + return orderDelivery; } /** @@ -85,7 +94,10 @@ public OrderDelivery Delivery() { * @return OrderCustomVars instance */ public OrderCustomVars CustomVars() { - return customVariables = (customVariables == null) ? new OrderCustomVars() : customVariables; + if (customVariables == null) { + customVariables = new OrderCustomVars(); + } + return customVariables; } /** diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/ParamOption.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/ParamOption.java index 91ef8f29..0b72ae99 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/ParamOption.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/ParamOption.java @@ -28,7 +28,7 @@ of this software and associated documentation files (the "Software"), to deal public class ParamOption { enum Type { - JSON, Array, Default, + JSON, ARRAY, DEFAULT, } /** @@ -204,6 +204,6 @@ public ParamOption() { encode = false; persistent = false; append = false; - type = Type.Default; + type = Type.DEFAULT; } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Product.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Product.java index 912dfbc6..92bdd144 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Product.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Product.java @@ -65,7 +65,10 @@ public String stringValue() { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Product(Tracker tracker) { @@ -360,7 +363,10 @@ public Product setPromotionalCode(String promotionalCode) { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Products.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Products.java index 55b5480c..0a69ff70 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Products.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Products.java @@ -177,9 +177,8 @@ public void remove(String productId) { cart.getProductsList().remove(index); } } else { - ArrayList objects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + ArrayList objects = new ArrayList<>(); + objects.addAll(tracker.getBusinessObjects().values()); length = objects.size(); for (int i = 0; i < length; i++) { if (objects.get(i) instanceof Product && ((Product) objects.get(i)).getProductId().equals(productId)) { @@ -197,9 +196,8 @@ public void removeAll() { if (cart != null) { cart.getProductsList().clear(); } else { - ArrayList objects = new ArrayList() {{ - addAll(tracker.getBusinessObjects().values()); - }}; + ArrayList objects = new ArrayList<>(); + objects.addAll(tracker.getBusinessObjects().values()); for (BusinessObject obj : objects) { if (obj instanceof Product) { tracker.getBusinessObjects().remove(obj.getId()); diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Publisher.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Publisher.java index 12d1ac37..cc2b2ff2 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Publisher.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Publisher.java @@ -47,7 +47,10 @@ public class Publisher extends OnAppAd { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } Publisher(Tracker tracker) { @@ -232,7 +235,10 @@ public Publisher setAction(Action action) { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } @Override @@ -260,12 +266,14 @@ void setEvent() { } if (action == Action.Touch) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), lvl2); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/PublisherImpression.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/PublisherImpression.java index 8c77e95d..effef4bb 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/PublisherImpression.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/PublisherImpression.java @@ -46,12 +46,12 @@ public Publisher setAction(Action action) { @Override public void sendImpression() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } @Override public void sendTouch() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/RichMedia.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/RichMedia.java index 17dd9d40..49a51c42 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/RichMedia.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/RichMedia.java @@ -218,12 +218,14 @@ void setEvent() { } if (!isEmbedded) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.RichMediaScreen.stringValue(), TechnicalContext.screenName, encode); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.RichMediaScreen.stringValue(), sn, encode); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.RichMediaLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.RichMediaLevel2.stringValue(), lvl2); } } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotion.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotion.java index 4e38f4d8..a2c5c6a5 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotion.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotion.java @@ -42,7 +42,10 @@ public class SelfPromotion extends OnAppAd { private CustomObjects customObjects; LinkedHashMap getCustomObjectsMap() { - return customObjectsMap == null ? (customObjectsMap = new LinkedHashMap<>()) : customObjectsMap; + if (customObjectsMap == null) { + customObjectsMap = new LinkedHashMap<>(); + } + return customObjectsMap; } SelfPromotion(Tracker tracker) { @@ -127,7 +130,10 @@ public SelfPromotion setAction(Action action) { * @return the CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } @Override @@ -151,12 +157,14 @@ void setEvent() { } if (action == Action.Touch) { - if (!TextUtils.isEmpty(TechnicalContext.screenName)) { - tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), TechnicalContext.screenName, new ParamOption().setEncode(true)); + String sn = TechnicalContext.getScreenName(); + if (!TextUtils.isEmpty(sn)) { + tracker.setParam(Hit.HitParam.OnAppAdTouchScreen.stringValue(), sn, new ParamOption().setEncode(true)); } - if (TechnicalContext.level2 > 0) { - tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), TechnicalContext.level2); + int lvl2 = TechnicalContext.getLevel2(); + if (lvl2 > 0) { + tracker.setParam(Hit.HitParam.OnAppAdTouchLevel2.stringValue(), lvl2); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java index 6b05afc1..57ca209c 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/SelfPromotionImpression.java @@ -47,12 +47,12 @@ public SelfPromotion setAction(Action action) { @Override public void sendImpression() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } @Override public void sendTouch() { // Do Nothing - Tool.executeCallback(tracker.getListener(), Tool.CallbackType.warning, "This method is overrided to do nothing"); + Tool.executeCallback(tracker.getListener(), Tool.CallbackType.WARNING, "This method is overrided to do nothing"); } } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Tracker.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Tracker.java index 265f8e7b..2865bbb3 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Tracker.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Tracker.java @@ -85,12 +85,13 @@ public enum PluginKey { nuggad } - protected static WeakReference appContext; + static final String TAG = "ATINTERNET"; + static WeakReference appContext; private static Thread.UncaughtExceptionHandler defaultCrashHandler; private static boolean isTrackerActivityLifeCycleEnabled = false; private static Storage storage; - protected TrackerListener listener; + private TrackerListener listener; private Dispatcher dispatcher; private Buffer buffer; private String internalUserId; @@ -176,7 +177,7 @@ private void initTracker() { setTrackerActivityLifecycle(); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -185,7 +186,7 @@ private Tracker processSetParam(String key, Closure value) { if (!Lists.getReadOnlyParams().contains(key)) { buffer.getVolatileParams().put(key, new Param(key, value)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, String.format("Param %s is read only. Value will not be updated", key)); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format("Param %s is read only. Value will not be updated", key)); } return this; @@ -238,7 +239,7 @@ private Tracker processSetParam(String key, Closure value, ParamOption newParamO buffer.getVolatileParams().put(key, newParam); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, String.format("Param %s is read only. Value will not be updated", key)); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format("Param %s is read only. Value will not be updated", key)); } return this; @@ -328,12 +329,12 @@ public void run() { if (callback != null) { String userID = TechnicalContext.getUserId((String) configuration.get(TrackerConfigurationKeys.IDENTIFIER)).execute(); if ((Boolean) configuration.get(TrackerConfigurationKeys.HASH_USER_ID) && !doNotTrackEnabled()) { - callback.receiveUserId(Tool.SHA_256(userID)); + callback.receiveUserId(Tool.SHA256(userID)); } else { callback.receiveUserId(userID); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Enabled to get user id"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Enabled to get user id"); } } }); @@ -346,7 +347,7 @@ public void run() { */ public String getUserIdSync() { if (internalUserId == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "User id must be set"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "User id must be set"); } return internalUserId; } @@ -366,7 +367,10 @@ public void setUserId(String value) { * @return Screens instance */ public Screens Screens() { - return screens == null ? (screens = new Screens(this)) : screens; + if (screens == null) { + screens = new Screens(this); + } + return screens; } /** @@ -375,7 +379,10 @@ public Screens Screens() { * @return Gestures instance */ public Gestures Gestures() { - return gestures == null ? (gestures = new Gestures(this)) : gestures; + if (gestures == null) { + gestures = new Gestures(this); + } + return gestures; } /** @@ -384,7 +391,10 @@ public Gestures Gestures() { * @return Event */ Event Event() { - return event == null ? (event = new Event(this)) : event; + if (event == null) { + event = new Event(this); + } + return event; } /** @@ -393,7 +403,10 @@ Event Event() { * @return Offline instance */ public Offline Offline() { - return offline == null ? (offline = new Offline(this)) : offline; + if (offline == null) { + offline = new Offline(this); + } + return offline; } /** @@ -402,7 +415,10 @@ public Offline Offline() { * @return Context instance */ public Context Context() { - return context == null ? (context = new Context(this)) : context; + if (context == null) { + context = new Context(this); + } + return context; } /** @@ -411,7 +427,10 @@ public Context Context() { * @return NuggAd instance */ public NuggAds NuggAds() { - return nuggAds == null ? (nuggAds = new NuggAds(this)) : nuggAds; + if (nuggAds == null) { + nuggAds = new NuggAds(this); + } + return nuggAds; } /** @@ -420,7 +439,10 @@ public NuggAds NuggAds() { * @return CustomObjects instance */ public CustomObjects CustomObjects() { - return customObjects == null ? (customObjects = new CustomObjects(this)) : customObjects; + if (customObjects == null) { + customObjects = new CustomObjects(this); + } + return customObjects; } /** @@ -429,7 +451,10 @@ public CustomObjects CustomObjects() { * @return IdentifiedVisitor instance */ public IdentifiedVisitor IdentifiedVisitor() { - return identifiedVisitor == null ? (identifiedVisitor = new IdentifiedVisitor(this)) : identifiedVisitor; + if (identifiedVisitor == null) { + identifiedVisitor = new IdentifiedVisitor(this); + } + return identifiedVisitor; } /** @@ -438,7 +463,10 @@ public IdentifiedVisitor IdentifiedVisitor() { * @return Publishers instance */ public Publishers Publishers() { - return publishers == null ? (publishers = new Publishers(this)) : publishers; + if (publishers == null) { + publishers = new Publishers(this); + } + return publishers; } /** @@ -447,7 +475,10 @@ public Publishers Publishers() { * @return SelfPromotions instance */ public SelfPromotions SelfPromotions() { - return selfPromotions == null ? (selfPromotions = new SelfPromotions(this)) : selfPromotions; + if (selfPromotions == null) { + selfPromotions = new SelfPromotions(this); + } + return selfPromotions; } /** @@ -456,7 +487,10 @@ public SelfPromotions SelfPromotions() { * @return DynamicScreens instance */ public DynamicScreens DynamicScreens() { - return dynamicScreens == null ? (dynamicScreens = new DynamicScreens(this)) : dynamicScreens; + if (dynamicScreens == null) { + dynamicScreens = new DynamicScreens(this); + } + return dynamicScreens; } /** @@ -465,7 +499,10 @@ public DynamicScreens DynamicScreens() { * @return Products instance */ public Products Products() { - return products == null ? (products = new Products(this)) : products; + if (products == null) { + products = new Products(this); + } + return products; } /** @@ -474,7 +511,10 @@ public Products Products() { * @return Cart instance */ public Cart Cart() { - return cart == null ? (cart = new Cart(this)) : cart; + if (cart == null) { + cart = new Cart(this); + } + return cart; } /** @@ -483,7 +523,10 @@ public Cart Cart() { * @return MediaPlayers instance */ public MediaPlayers Players() { - return mediaPlayers == null ? (mediaPlayers = new MediaPlayers(this)) : mediaPlayers; + if (mediaPlayers == null) { + mediaPlayers = new MediaPlayers(this); + } + return mediaPlayers; } /** @@ -494,7 +537,10 @@ public MediaPlayers Players() { */ @Deprecated public Locations Locations() { - return locations == null ? (locations = new Locations(this)) : locations; + if (locations == null) { + locations = new Locations(this); + } + return locations; } /** @@ -505,7 +551,10 @@ public Locations Locations() { */ @Deprecated public CustomVars CustomVars() { - return customVars == null ? (customVars = new CustomVars(this)) : customVars; + if (customVars == null) { + customVars = new CustomVars(this); + } + return customVars; } /** @@ -516,7 +565,10 @@ public CustomVars CustomVars() { */ @Deprecated public Aisles Aisles() { - return aisles == null ? (aisles = new Aisles(this)) : aisles; + if (aisles == null) { + aisles = new Aisles(this); + } + return aisles; } /** @@ -525,7 +577,10 @@ public Aisles Aisles() { * @return Campaigns instance */ public Campaigns Campaigns() { - return campaigns == null ? (campaigns = new Campaigns(this)) : campaigns; + if (campaigns == null) { + campaigns = new Campaigns(this); + } + return campaigns; } /** @@ -536,7 +591,10 @@ public Campaigns Campaigns() { */ @Deprecated public CustomTreeStructures CustomTreeStructures() { - return customTreeStructures == null ? (customTreeStructures = new CustomTreeStructures(this)) : customTreeStructures; + if (customTreeStructures == null) { + customTreeStructures = new CustomTreeStructures(this); + } + return customTreeStructures; } /** @@ -547,7 +605,10 @@ public CustomTreeStructures CustomTreeStructures() { */ @Deprecated public InternalSearches InternalSearches() { - return internalSearches == null ? (internalSearches = new InternalSearches(this)) : internalSearches; + if (internalSearches == null) { + internalSearches = new InternalSearches(this); + } + return internalSearches; } /** @@ -556,7 +617,10 @@ public InternalSearches InternalSearches() { * @return Orders instance */ public Orders Orders() { - return orders == null ? (orders = new Orders(this)) : orders; + if (orders == null) { + orders = new Orders(this); + } + return orders; } /** @@ -568,7 +632,7 @@ public Orders Orders() { */ public void setLog(String log, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(log)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for log, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for log, default value retained"); } else { setConfig(TrackerConfigurationKeys.LOG, log, setConfigCallback, sync); } @@ -583,7 +647,7 @@ public void setLog(String log, SetConfigCallback setConfigCallback, boolean... s */ public void setSecuredLog(String securedLog, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(securedLog)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for secured log, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for secured log, default value retained"); } else { setConfig(TrackerConfigurationKeys.LOG_SSL, securedLog, setConfigCallback, sync); } @@ -598,7 +662,7 @@ public void setSecuredLog(String securedLog, SetConfigCallback setConfigCallback */ public void setDomain(String domain, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(domain)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for domain, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for domain, default value retained"); } else { setConfig(TrackerConfigurationKeys.DOMAIN, domain, setConfigCallback, sync); } @@ -613,7 +677,7 @@ public void setDomain(String domain, SetConfigCallback setConfigCallback, boolea */ public void setSiteId(int siteId, SetConfigCallback setConfigCallback, boolean... sync) { if (siteId <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for site id, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for site id, default value retained"); } else { setConfig(TrackerConfigurationKeys.SITE, siteId, setConfigCallback, sync); } @@ -628,7 +692,7 @@ public void setSiteId(int siteId, SetConfigCallback setConfigCallback, boolean.. */ public void setOfflineMode(OfflineMode offlineMode, SetConfigCallback setConfigCallback, boolean... sync) { if (offlineMode == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for offline mode, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for offline mode, default value retained"); } else { setConfig(TrackerConfigurationKeys.OFFLINE_MODE, offlineMode.toString(), setConfigCallback, sync); } @@ -654,7 +718,7 @@ public void setSecureModeEnabled(boolean enabled, SetConfigCallback setConfigCal */ public void setIdentifierType(IdentifierType identifierType, SetConfigCallback setConfigCallback, boolean... sync) { if (identifierType == null) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for identifier type, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for identifier type, default value retained"); } else { setConfig(TrackerConfigurationKeys.IDENTIFIER, identifierType.toString(), setConfigCallback, sync); } @@ -682,17 +746,17 @@ public void setPlugins(List plugins, SetConfigCallback setConfigCallb if (plugins == null) { setConfig(TrackerConfigurationKeys.PLUGINS, "", setConfigCallback, sync); } else { - String value = ""; + StringBuilder value = new StringBuilder(); boolean isFirst = true; for (PluginKey plugin : plugins) { if (isFirst) { isFirst = false; } else { - value += ","; + value.append(','); } - value += plugin.toString(); + value.append(plugin.toString()); } - setConfig(TrackerConfigurationKeys.PLUGINS, value, setConfigCallback, sync); + setConfig(TrackerConfigurationKeys.PLUGINS, value.toString(), setConfigCallback, sync); } } @@ -705,7 +769,7 @@ public void setPlugins(List plugins, SetConfigCallback setConfigCallb */ public void setPixelPath(String pixelPath, SetConfigCallback setConfigCallback, boolean... sync) { if (TextUtils.isEmpty(pixelPath)) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for pixel path, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for pixel path, default value retained"); } else { setConfig(TrackerConfigurationKeys.PIXEL_PATH, pixelPath, setConfigCallback, sync); } @@ -753,7 +817,7 @@ public void setCampaignLastPersistenceEnabled(boolean enabled, SetConfigCallback */ public void setCampaignLifetime(int lifetime, SetConfigCallback setConfigCallback, boolean... sync) { if (lifetime <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for campaign lifetime, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for campaign lifetime, default value retained"); } else { setConfig(TrackerConfigurationKeys.CAMPAIGN_LIFETIME, lifetime, setConfigCallback, sync); } @@ -768,7 +832,7 @@ public void setCampaignLifetime(int lifetime, SetConfigCallback setConfigCallbac */ public void setSessionBackgroundDuration(int duration, SetConfigCallback setConfigCallback, boolean... sync) { if (duration <= 0) { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Bad value for session background duration, default value retained"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, "Bad value for session background duration, default value retained"); } else { setConfig(TrackerConfigurationKeys.SESSION_BACKGROUND_DURATION, duration, setConfigCallback, sync); } @@ -783,41 +847,43 @@ public TrackerListener createDefaultTrackerListener() { return new TrackerListener() { @Override public void trackerNeedsFirstLaunchApproval(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: First Launch \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: First Launch \n\tMessage: " + message); } @Override public void buildDidEnd(HitStatus status, String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Building Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Building Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); } @Override public void sendDidEnd(HitStatus status, String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Sending Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Sending Hit \n\tStatus: " + status.toString() + "\n\tMessage: " + message); } @Override public void didCallPartner(String response) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Calling Partner \n\tResponse: " + response); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Calling Partner \n\tResponse: " + response); } @Override public void warningDidOccur(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Warning \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Warning \n\tMessage: " + message); } @Override public void saveDidEnd(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Saving Hit \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Saving Hit \n\tMessage: " + message); } @Override public void errorDidOccur(String message) { - Log.d("ATINTERNET", "Debugging message: \n\tEvent: Error \n\tMessage: " + message); + Log.d(Tracker.TAG, "Debugging message: \n\tEvent: Error \n\tMessage: " + message); } }; } + private final String ERROR_OVERWRITE_KEY_CONFIG_FORMAT = "Cannot to overwrite %s configuration"; + /** * Set a new configuration * @@ -838,7 +904,7 @@ public void setConfig(final HashMap conf, final boolean override if (!Lists.getReadOnlyConfigs().contains(key)) { configuration.put(key, conf.get(key)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } refreshConfigurationDependencies(); @@ -854,7 +920,7 @@ public void run() { if (!Lists.getReadOnlyConfigs().contains(key)) { configuration.put(key, conf.get(key)); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } refreshConfigurationDependencies(); @@ -891,7 +957,7 @@ public void setConfig(final String key, final Object value, final SetConfigCallb configuration.put(key, value); refreshConfigurationDependencies(); } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } else { TrackerQueue.getInstance().put(new Runnable() { @@ -904,7 +970,7 @@ public void run() { setConfigCallback.setConfigEnd(); } } else { - Tool.executeCallback(listener, Tool.CallbackType.warning, "Cannot to overwrite " + key + " configuration"); + Tool.executeCallback(listener, Tool.CallbackType.WARNING, String.format(ERROR_OVERWRITE_KEY_CONFIG_FORMAT, key)); } } }); @@ -943,16 +1009,16 @@ public Tracker setDefaultListener() { */ public Tracker() { try { - android.content.Context context = ((Application) Class.forName("android.app.ActivityThread") + android.content.Context ctx = ((Application) Class.forName("android.app.ActivityThread") .getMethod("currentApplication").invoke(null, (Object[]) null)); - appContext = new WeakReference<>(context); + appContext = new WeakReference<>(ctx); configuration = new Configuration(appContext.get()); initTracker(); if (!LifeCycle.isInitialized) { LifeCycle.initLifeCycle(appContext.get()); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -987,7 +1053,7 @@ public Tracker(final HashMap configuration) { LifeCycle.initLifeCycle(appContext.get()); } } catch (Exception e) { - e.printStackTrace(); + Log.e(Tracker.TAG, e.toString()); } } @@ -1143,8 +1209,8 @@ public Tracker setParam(String key, String value) { public Tracker setParam(String key, final String value, ParamOption options) { if (options.getType() != ParamOption.Type.JSON && Tool.isJSON(value)) { options.setType(ParamOption.Type.JSON); - } else if (options.getType() != ParamOption.Type.Array && Tool.isArray(value)) { - options.setType(ParamOption.Type.Array); + } else if (options.getType() != ParamOption.Type.ARRAY && Tool.isArray(value)) { + options.setType(ParamOption.Type.ARRAY); } return handleNotClosureStringParameterSetting(key, value, options); } @@ -1169,7 +1235,7 @@ public Tracker setParam(String key, List value) { * @return Tracker instance */ public Tracker setParam(String key, List value, ParamOption options) { - options.setType(ParamOption.Type.Array); + options.setType(ParamOption.Type.ARRAY); return handleNotClosureStringParameterSetting(key, value, options); } @@ -1193,7 +1259,7 @@ public Tracker setParam(String key, Object[] value) { * @return Tracker instance */ public Tracker setParam(String key, Object[] value, ParamOption options) { - options.setType(ParamOption.Type.Array); + options.setType(ParamOption.Type.ARRAY); return handleNotClosureStringParameterSetting(key, value, options); } @@ -1235,8 +1301,8 @@ public void unsetParam(String key) { * Reset Screen context to prevent bad link between screen and gesture */ public void resetScreenContext() { - TechnicalContext.screenName = null; - TechnicalContext.level2 = 0; + TechnicalContext.setScreenName(null); + TechnicalContext.setLevel2(0); } /** @@ -1245,10 +1311,11 @@ public void resetScreenContext() { public void dispatch() { if (businessObjects.size() > 0) { ArrayList onAppAds = new ArrayList<>(); - ArrayList customObjects = new ArrayList<>(); - ArrayList objects = new ArrayList() {{ - addAll(businessObjects.values()); - }}; + ArrayList customObjs = new ArrayList<>(); + + ArrayList objects = new ArrayList<>(); + objects.addAll(businessObjects.values()); + ArrayList screenObjects = new ArrayList<>(); ArrayList salesTrackerObjects = new ArrayList<>(); ArrayList internalSearchObjects = new ArrayList<>(); @@ -1257,13 +1324,13 @@ public void dispatch() { for (BusinessObject businessObject : objects) { if (!(businessObject instanceof Product)) { - dispatchObjects(productsObjects, customObjects); + dispatchObjects(productsObjects, customObjs); } // Dispatch onAppAds before sending other object if (!(businessObject instanceof OnAppAd || businessObject instanceof ScreenInfo || businessObject instanceof AbstractScreen || businessObject instanceof InternalSearch || businessObject instanceof Cart || businessObject instanceof Order) || (businessObject instanceof OnAppAd && ((OnAppAd) businessObject).getAction() == OnAppAd.Action.Touch)) { - dispatchObjects(onAppAds, customObjects); + dispatchObjects(onAppAds, customObjs); } if (businessObject instanceof OnAppAd) { @@ -1271,12 +1338,12 @@ public void dispatch() { if (ad.getAction() == OnAppAd.Action.View) { onAppAds.add(ad); } else { - customObjects.add(businessObject); - dispatcher.dispatch((BusinessObject[]) customObjects.toArray(new BusinessObject[customObjects.size()])); - customObjects.clear(); + customObjs.add(businessObject); + dispatcher.dispatch((BusinessObject[]) customObjs.toArray(new BusinessObject[customObjs.size()])); + customObjs.clear(); } } else if (businessObject instanceof CustomObject || businessObject instanceof NuggAd) { - customObjects.add(businessObject); + customObjs.add(businessObject); } else if (businessObject instanceof ScreenInfo) { screenObjects.add(businessObject); } else if (businessObject instanceof InternalSearch) { @@ -1286,27 +1353,27 @@ public void dispatch() { } else if (businessObject instanceof Order || businessObject instanceof Cart) { salesTrackerObjects.add(businessObject); } else if (businessObject instanceof AbstractScreen) { - onAppAds.addAll(customObjects); + onAppAds.addAll(customObjs); onAppAds.addAll(screenObjects); onAppAds.addAll(internalSearchObjects); //Sales tracker - ArrayList orders = new ArrayList<>(); - Cart cart = null; + ArrayList ordersObjects = new ArrayList<>(); + Cart crt = null; for (BusinessObject obj : salesTrackerObjects) { if (obj instanceof Cart) { - cart = (Cart) obj; + crt = (Cart) obj; } else { - orders.add(obj); + ordersObjects.add(obj); } } - if (cart != null && (((AbstractScreen) businessObject).isBasketScreen() || !orders.isEmpty())) { - onAppAds.add(cart); + if (crt != null && (((AbstractScreen) businessObject).isBasketScreen() || !ordersObjects.isEmpty())) { + onAppAds.add(crt); } - onAppAds.addAll(orders); + onAppAds.addAll(ordersObjects); onAppAds.add(businessObject); dispatcher.dispatch((BusinessObject[]) onAppAds.toArray(new BusinessObject[onAppAds.size()])); @@ -1314,31 +1381,31 @@ public void dispatch() { salesTrackerObjects.clear(); internalSearchObjects.clear(); onAppAds.clear(); - customObjects.clear(); + customObjs.clear(); } else { if (businessObject instanceof Gesture && ((Gesture) businessObject).getAction() == Gesture.Action.InternalSearch) { onAppAds.addAll(internalSearchObjects); internalSearchObjects.clear(); } - onAppAds.addAll(customObjects); + onAppAds.addAll(customObjs); onAppAds.add(businessObject); dispatcher.dispatch((BusinessObject[]) onAppAds.toArray(new BusinessObject[onAppAds.size()])); onAppAds.clear(); - customObjects.clear(); + customObjs.clear(); } } - dispatchObjects(onAppAds, customObjects); + dispatchObjects(onAppAds, customObjs); - dispatchObjects(productsObjects, customObjects); + dispatchObjects(productsObjects, customObjs); - if (!customObjects.isEmpty() || !screenObjects.isEmpty() || !internalSearchObjects.isEmpty()) { - customObjects.addAll(screenObjects); - customObjects.addAll(internalSearchObjects); - dispatcher.dispatch((BusinessObject[]) customObjects.toArray(new BusinessObject[customObjects.size()])); + if (!customObjs.isEmpty() || !screenObjects.isEmpty() || !internalSearchObjects.isEmpty()) { + customObjs.addAll(screenObjects); + customObjs.addAll(internalSearchObjects); + dispatcher.dispatch((BusinessObject[]) customObjs.toArray(new BusinessObject[customObjs.size()])); - customObjects.clear(); + customObjs.clear(); screenObjects.clear(); internalSearchObjects.clear(); } diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java index 4e267119..543b6df7 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/TrackerConfigurationKeys.java @@ -27,6 +27,10 @@ of this software and associated documentation files (the "Software"), to deal */ public class TrackerConfigurationKeys { + private TrackerConfigurationKeys() { + throw new IllegalStateException("Utility class"); + } + // Key representing the namespace used for preferences static final String PREFERENCES = "ATPreferencesKey"; diff --git a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Videos.java b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Videos.java index c536359a..8ee011b6 100644 --- a/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Videos.java +++ b/ATMobileAnalytics/Tracker/src/main/java/com/atinternet/tracker/Videos.java @@ -44,15 +44,8 @@ public class Videos { * @return Video instance */ public Video add(String name, int duration) { - int index = -1; - int length = list.size(); + int index = searchVideoIndexByName(name); Video video; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } if (index == -1) { video = new Video(player) .setName(name) @@ -60,7 +53,7 @@ public Video add(String name, int duration) { list.add(video); } else { - Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.warning, "Video with the same name already exists"); + Tool.executeCallback(player.getTracker().getListener(), Tool.CallbackType.WARNING, "Video with the same name already exists"); video = list.get(index); } @@ -112,14 +105,7 @@ public Video add(String name, String chapter1, String chapter2, String chapter3, * @param name video identified by name */ public void remove(String name) { - int length = list.size(); - int index = -1; - for (int i = 0; i < length; i++) { - if (list.get(i).getName().equals(name)) { - index = i; - break; - } - } + int index = searchVideoIndexByName(name); if (index > -1) { if (list.get(index).executor != null && !list.get(index).executor.isShutdown()) { list.get(index).sendStop(); @@ -136,4 +122,14 @@ public void removeAll() { remove(list.get(0).getName()); } } + + private int searchVideoIndexByName(String name) { + int length = list.size(); + for (int i = 0; i < length; i++) { + if (list.get(i).getName().equals(name)) { + return i; + } + } + return -1; + } } diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/AudioTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/AudioTest.java index 045a7ad5..190cc73e 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/AudioTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/AudioTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/BuilderTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/BuilderTest.java index 37e1ba0e..d230dfa4 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/BuilderTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/BuilderTest.java @@ -24,7 +24,6 @@ of this software and associated documentation files (the "Software"), to deal import android.util.Pair; -import org.json.JSONArray; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -75,11 +74,11 @@ public void multiHitsFailedNotSplittableParameterTest() { @Test public void multiHitsFailedNotSplittableValueTest() { - String s = ""; + StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 150; i++) { - s += "verybigvalue" + i; + sb.append("verybigvalue").append(i); } - buffer.getVolatileParams().put("stc", new Param("stc", closureValue(s))); + buffer.getVolatileParams().put("stc", new Param("stc", closureValue(sb.toString()))); builder = new Builder(tracker); ArrayList hits = (ArrayList) builder.build()[0]; diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java index 5cbff2e8..9978032f 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomObjectsTest.java @@ -24,7 +24,6 @@ of this software and associated documentation files (the "Software"), to deal import org.json.JSONException; import org.json.JSONObject; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java index dc6e113b..b3c4b159 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomTreeStructuresTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; @Config(sdk = 21) diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java index abd56b0e..e55c6623 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/CustomVarsTest.java @@ -22,7 +22,6 @@ of this software and associated documentation files (the "Software"), to deal */ package com.atinternet.tracker; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java index 1c57bb0b..4e997c3c 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/DynamicScreenTest.java @@ -90,11 +90,11 @@ public void setEventTest() { @Test public void setEventWithTooLongScreenIdTest() { Date date = new Date(); - String id = ""; + StringBuilder id = new StringBuilder(); for (int i = 0; i < 256; i++) { - id += i; + id.append(i); } - dynamicScreen.setScreenId(id).setName("name").setChapter1("chapter1").setUpdate(date).setEvent(); + dynamicScreen.setScreenId(id.toString()).setName("name").setChapter1("chapter1").setUpdate(date).setEvent(); assertEquals(7, buffer.getVolatileParams().size()); assertEquals(0, buffer.getPersistentParams().size()); diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java index 00231786..e20f4001 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideoTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java index 3f4fb3db..88a68fe5 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LiveVideosTest.java @@ -28,11 +28,8 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @Config(sdk = 21) diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LocationsTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LocationsTest.java index 87b2c4af..3a1bd56d 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LocationsTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/LocationsTest.java @@ -28,8 +28,6 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; @Config(sdk =21) diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/OrdersTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/OrdersTest.java index d11ebb33..ba616134 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/OrdersTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/OrdersTest.java @@ -28,10 +28,7 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; @Config(sdk = 21) @RunWith(RobolectricTestRunner.class) diff --git a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/VideosTest.java b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/VideosTest.java index acb109d6..a0bdd9ef 100644 --- a/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/VideosTest.java +++ b/ATMobileAnalytics/Tracker/src/test/java/com/atinternet/tracker/VideosTest.java @@ -28,11 +28,8 @@ of this software and associated documentation files (the "Software"), to deal import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.Random; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @Config(sdk = 21) diff --git a/LICENSE b/LICENSE index f3774f22..a63e6f2d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ -This SDK is licensed under the MIT license (MIT) +MIT License + Copyright (c) 2015- Applied Technologies Internet SAS (registration number B 403 261 258 - Trade and Companies Register of Bordeaux – France) Permission is hereby granted, free of charge, to any person obtaining a copy @@ -17,4 +18,4 @@ 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. +SOFTWARE. \ No newline at end of file