Skip to content

Commit

Permalink
feat: remove Ti.Analytics (iOS / Android) (#13316)
Browse files Browse the repository at this point in the history
* feat(android): cleanup analytics stuff

* remove tests

* update docs

* add deprecation log

* chore: remove a bunch of stuff

Revert "chore: remove a bunch of stuff"

This reverts commit 2b1d9fdea3a84244aeac846e1d3d737dad77fc6a.

Co-authored-by: Hans Knöchel <h.knoechel@lambus.com>
  • Loading branch information
m1ga and hansemannn committed Mar 21, 2022
1 parent a9fedbb commit 3e54924
Show file tree
Hide file tree
Showing 19 changed files with 34 additions and 618 deletions.
21 changes: 0 additions & 21 deletions android/cli/commands/_buildModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -286,9 +286,6 @@ AndroidModuleBuilder.prototype.run = async function run(logger, config, cli, fin
// Update module's config files, if necessary.
await this.migrate();

// Post build anlytics.
await this.doAnalytics();

// Initialize build variables and directory.
await this.initialize();
await this.loginfo();
Expand Down Expand Up @@ -358,24 +355,6 @@ AndroidModuleBuilder.prototype.dirWalker = async function dirWalker(directoryPat
}
};

AndroidModuleBuilder.prototype.doAnalytics = async function doAnalytics() {
var cli = this.cli,
manifest = this.manifest,
eventName = 'android.' + cli.argv.type;

cli.addAnalyticsEvent(eventName, {
name: manifest.name,
publisher: manifest.author,
appid: manifest.moduleid,
description: manifest.description,
type: cli.argv.type,
guid: manifest.guid,
version: manifest.version,
copyright: manifest.copyright,
date: (new Date()).toDateString()
});
};

AndroidModuleBuilder.prototype.initialize = async function initialize() {
// Create a "tiSymbols" dictionary. It's needed by our "process-js-task" node module.
this.tiSymbols = {};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,204 +6,70 @@
*/
package ti.modules.titanium.analytics;

import java.util.HashMap;
import java.util.Iterator;
import com.appcelerator.aps.APSAnalytics;

import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.titanium.util.TiConvert;
import org.json.JSONArray;
import org.json.JSONException;
import org.appcelerator.kroll.common.Log;
import org.json.JSONObject;

import android.util.Log;

import com.appcelerator.aps.APSAnalytics;

@Kroll.module
public class AnalyticsModule extends KrollModule
{
private static final String TAG = "AnalyticsModule";

protected static final String PROPERTY_APP_NAV = "app.nav";
protected static final String PROPERTY_APP_TIMED = "app.timed";
protected static final String PROPERTY_APP_FEATURE = "app.feature";
protected static final String PROPERTY_APP_SETTINGS = "app.settings";
protected static final String PROPERTY_APP_USER = "app.user";
private final APSAnalytics analytics = APSAnalytics.getInstance();

public static final int MAX_LEVELS = 5;
public static final int MAX_SERLENGTH = 1000;
public static final int MAX_KEYS = 25;
public static final int MAX_KEYLENGTH = 50;

public static final int SUCCESS = 0;
public static final int JSON_VALIDATION_FAILED = -1;
public static final int ANALYTICS_DISABLED = -2;
private static final String TAG = "AnalyticsModule";
private final APSAnalytics analytics = APSAnalytics.getInstance();

public AnalyticsModule()
{
super();
}

public static int validateJSON(JSONObject jsonObject, int level)
{
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
return SUCCESS;
}

@Kroll.getProperty
public boolean getOptedOut()
{
return APSAnalytics.getInstance().isOptedOut();
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
return true;
}

@Kroll.setProperty
public void setOptedOut(boolean optedOut)
{
APSAnalytics.getInstance().setOptedOut(optedOut);
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
}

@Kroll.method
public void navEvent(String from, String to, @Kroll.argument(optional = true) String event,
@Kroll.argument(optional = true) KrollDict data)
{
if (TiApplication.getInstance().isAnalyticsEnabled()) {
// Preserve legacy behavior allowing the argument to be optional. We set it to be an empty string now
// instead of "null".
if (event == null) {
event = "";
}
JSONObject payload = null;
if (data instanceof HashMap) {
payload = TiConvert.toJSON(data);
} else if (data != null) {
try {
payload = new JSONObject(data.toString());
} catch (JSONException e) {
Log.e(TAG, "Cannot convert data into JSON");
}
}
analytics.sendAppNavEvent(from, to, event, payload);
} else {
Log.e(
TAG,
"Analytics is disabled. To enable, please update the <analytics></analytics> node in your tiapp.xml");
}
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
}

@Kroll.method
public void filterEvents(Object eventsObj)
{
if (eventsObj instanceof Object[]) {
Object[] events = (Object[]) eventsObj;
String[] temp = new String[events.length];
for (int i = 0; i < events.length; ++i) {
temp[i] = TiConvert.toString(events[i]);
}
TiApplication.getInstance().setFilterAnalyticsEvents(temp);
}
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
}

@Kroll.method
public int featureEvent(String event, @Kroll.argument(optional = true) KrollDict data)
{
if (TiApplication.getInstance().isAnalyticsEnabled()) {
if (data instanceof HashMap) {
JSONObject jsonData = TiConvert.toJSON(data);
if (AnalyticsModule.validateJSON(jsonData, 0) == SUCCESS) {
analytics.sendAppFeatureEvent(event, jsonData);
return SUCCESS;
} else {
Log.e(TAG, "Feature event " + event + " not conforming to recommended usage.");
return JSON_VALIDATION_FAILED;
}
} else if (data != null) {
try {
JSONObject jsonData = new JSONObject(data.toString());
if (AnalyticsModule.validateJSON(jsonData, 0) == SUCCESS) {
analytics.sendAppFeatureEvent(event, jsonData);
return SUCCESS;
} else {
Log.e(TAG, "Feature event " + event + " not conforming to recommended usage.");
return JSON_VALIDATION_FAILED;
}
} catch (JSONException e) {
Log.e(TAG, "Cannot convert data into JSON");
return JSON_VALIDATION_FAILED;
}
} else {
analytics.sendAppFeatureEvent(event, null);
return SUCCESS;
}
} else {
Log.e(
TAG,
"Analytics is disabled. To enable, please update the <analytics></analytics> node in your tiapp.xml");
return ANALYTICS_DISABLED;
}
}

public static int validateJSON(JSONObject jsonObject, int level)
{

if (level > MAX_LEVELS) {
Log.w(TAG, "Feature event cannot have more than " + MAX_LEVELS + " nested JSONs");
return JSON_VALIDATION_FAILED;
}
if (jsonObject == null) {
return JSON_VALIDATION_FAILED;
}
if ((level == 0) & (jsonObject.toString().getBytes().length > MAX_SERLENGTH)) {
Log.w(TAG, "Feature event cannot exceed more than " + MAX_SERLENGTH + " total serialized bytes");
return JSON_VALIDATION_FAILED;
}
if (jsonObject.length() > MAX_KEYS) {
Log.w(TAG, "Feature event maximum keys should not exceed " + MAX_KEYS);
return JSON_VALIDATION_FAILED;
}

Iterator<String> keys = jsonObject.keys();

while (keys.hasNext()) {
String key = (String) keys.next();
if (key.length() > MAX_KEYLENGTH) {
Log.w(TAG, "Feature event key " + key + " length should not exceed " + MAX_KEYLENGTH + " characters");
return JSON_VALIDATION_FAILED;
}
try {
Object child;
child = jsonObject.get(key);
if (child instanceof JSONObject) {
if (validateJSON(((JSONObject) child), level + 1) != SUCCESS) {
return JSON_VALIDATION_FAILED;
}
} else if (jsonObject.get(key) instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) child;
for (int i = 0; i < jsonArray.length(); i++) {
Object o = jsonArray.get(i);
if (o instanceof JSONObject) {
if (validateJSON(((JSONObject) o), level + 1) != SUCCESS) {
return JSON_VALIDATION_FAILED;
}
}
}
}
} catch (JSONException e) {
Log.w(TAG, "Unable to validate JSON: " + e);
}
}
return SUCCESS;
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
return ANALYTICS_DISABLED;
}

@Kroll.getProperty
public String getLastEvent()
{
if (TiApplication.getInstance().isAnalyticsEnabled()) {
if (analytics.getLastEvent() != null) {
return analytics.getLastEvent().toString();
}
} else {
Log.e(
TAG,
"Analytics is disabled. To enable, please update the <analytics></analytics> node in your tiapp.xml");
}
Log.d(TAG, "Analytics is deprecated and should be removed from the app.");
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public String getSessionId()
@Kroll.getProperty
public boolean getAnalytics()
{
return appInfo.isAnalyticsEnabled();
return false;
}

@Kroll.method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,12 +365,6 @@ public void onDisposing(KrollRuntime runtime)

// Delete all Titanium temp files.
deleteTiTempFiles();

if (isAnalyticsEnabled()) {

// Force send `session.end` event.
APSAnalytics.getInstance().sendSessionEndEvent(true);
}
}
});
}
Expand Down Expand Up @@ -435,17 +429,6 @@ public void postAppInfo()
APSAnalyticsMeta.setDeployType(deployType);
APSAnalyticsMeta.setSdkVersion(getTiBuildVersion());
APSAnalytics.getInstance().setMachineId(this);

if (isAnalyticsEnabled()) {
APSAnalytics.getInstance().initialize(getAppGUID(), this);

final int cacheSize = this.appProperties.getInt("ti.analytics.cacheSize", -1);
if (cacheSize > -1) {
APSAnalytics.getInstance().setCacheSize(cacheSize);
}
} else {
Log.i(TAG, "Analytics have been disabled");
}
}

public void postOnCreate()
Expand Down Expand Up @@ -724,7 +707,7 @@ public KrollProxy unregisterProxy(String proxyId)

public boolean isAnalyticsEnabled()
{
return getAppInfo().isAnalyticsEnabled();
return false;
}

/**
Expand Down
Loading

0 comments on commit 3e54924

Please sign in to comment.