nativescript-plugin-appsflyer
Version:
Appsflyer SDK for NativeScript applications
575 lines (529 loc) • 18.9 kB
text/typescript
// @ts-nocheck
import { Application, Utils } from "@nativescript/core";
import { InitSDKOptions, LogEventOptions } from "./index";
const stringSetToStringArray = Utils.ad.collections.stringSetToStringArray;
let _isDebugLocal = false;
let _appsFlyerConversionListener = undefined;
let _appsFlyerRequestListener = undefined;
const initSdk = function (args: InitSDKOptions) {
return new Promise(function (resolve, reject) {
try {
if (typeof com.appsflyer.AppsFlyerLib !== "undefined") {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
_isDebugLocal = args.isDebug;
appsFlyerLibInstance.setDebugLog(_isDebugLocal);
if (args.onConversionDataSuccess || args.onConversionDataFail) {
try {
_appsFlyerConversionListener =
new com.appsflyer.AppsFlyerConversionListener(<any>{
_gcdSuccessCallback: args.onConversionDataSuccess,
_gcdFailureCallback: args.onConversionDataFail,
_oaoaSuccessCallback: args.onAppOpenAttribution,
_oaoaFailureCallback: args.onAppOpenAttributionFailure,
onConversionDataSuccess(
conversionData: java.util.Map<string, string>
): void {
if (!this._gcdSuccessCallback) {
return;
}
if (typeof this._gcdSuccessCallback === "function") {
try {
const data = {};
for (const key of stringSetToStringArray(
conversionData.keySet()
)) {
data[key] = conversionData.get(key);
}
this._gcdSuccessCallback(data);
printLogs(
"onConversionDataSuccess: " + JSON.stringify(args)
);
} catch (e) {
printLogs(`onConversionDataSuccess Error: ${e}`);
}
} else {
printLogs(
`onConversionDataSuccess: callback is not a function`
);
}
},
onConversionDataFail(error: string): void {
if (!this._gcdFailureCallback) {
return;
}
if (typeof this._gcdFailureCallback === "function") {
try {
this._gcdFailureCallback(error);
printLogs("onConversionDataFail error: " + error);
} catch (e) {
printLogs(`onConversionDataFail Error: ${e}`);
}
} else {
printLogs(
"onConversionDataFail: callback is not a function"
);
}
},
onAttributionFailure(error: string): void {
if (!this._oaoaFailureCallback) {
return;
}
if (typeof this._oaoaFailureCallback === "function") {
try {
this._oaoaFailureCallback(error);
printLogs("onAttributionFailure error: " + error);
} catch (e) {
printLogs(`onAttributionFailure Error: ${e}`);
}
} else {
printLogs(
"onAttributionFailure: callback is not a function"
);
}
},
onAppOpenAttribution(
onAppOpenAttributionData: java.util.Map<any, any>
): void {
if (!this._oaoaSuccessCallback) {
return;
}
if (typeof this._oaoaSuccessCallback === "function") {
try {
let data = {};
for (const key of stringSetToStringArray(
onAppOpenAttributionData.keySet()
)) {
data[key] = onAppOpenAttributionData.get(key);
}
printLogs(
"onAppOpenAttribution: " + JSON.stringify(data)
);
} catch (e) {
printLogs(`onAppOpenAttribution Error: ${e}`);
}
} else {
printLogs(
`onAppOpenAttribution: callback is not a function`
);
}
},
});
} catch (e) {
printLogs(`registerConversionListener Error:${e}`);
}
}
if (args.onDeepLinking) {
try {
appsFlyerLibInstance.subscribeForDeepLink(
new com.appsflyer.deeplink.DeepLinkListener(<any>{
_onDeepLinkingCallback: args.onDeepLinking,
onDeepLinking(deepLinkResult: Object): void {
printLogs(`DeepLinkResult: ${deepLinkResult.toString()}`);
this._onDeepLinkingCallback(deepLinkResult);
},
})
);
} catch (e) {
printLogs(`onDeepLinking Error: ${e}`);
}
}
const platform_extension = com.appsflyer.internal.platform_extension;
const pluginInfoClass = new platform_extension.PluginInfo(
platform_extension.Plugin.NATIVE_SCRIPT,
"6.14.3",
new java.util.HashMap()
);
appsFlyerLibInstance.setPluginInfo(pluginInfoClass);
appsFlyerLibInstance.init(
args.devKey,
_appsFlyerConversionListener,
Application.android.context ||
(<any>com).tns.NativeScriptApplication.getInstance()
);
const shouldManuallyStart = args.manualStart === true;
if (!shouldManuallyStart) {
startSdk();
}
resolve({ status: "success" });
} else {
reject({
status: "failure",
message: "com.appsflyer.AppsFlyerLib is not defined",
});
}
} catch (ex) {
printLogs("Error: " + ex);
reject(ex);
}
});
};
const startSdk = function () {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
_start(appsFlyerLibInstance);
appsFlyerLibInstance.start(
(<any>com).tns.NativeScriptApplication.getInstance()
);
};
function _start(_instance: com.appsflyer.AppsFlyerLib) {
printLogs("start is called");
const c =
Application.android.context ||
(<any>com).tns.NativeScriptApplication.getInstance();
_instance.logEvent(c, null, null);
}
const logEvent = function (args: LogEventOptions) {
return new Promise(function (resolve, reject) {
try {
if (args.onSuccess || args.onError) {
try {
_appsFlyerRequestListener =
new com.appsflyer.attribution.AppsFlyerRequestListener(<any>{
_successCallback: args.onSuccess,
_failureCallback: args.onError,
onSuccess(): void {
if (!this._successCallback) {
return;
}
if (typeof this._successCallback === "function") {
try {
this._successCallback(args);
printLogs("logEvent success: " + JSON.stringify(args));
} catch (e) {
printLogs(`onLogEventRequestSuccess Error: ${e}`);
}
} else {
printLogs(
`onLogEventRequestSuccess: callback is not a function`
);
}
resolve({ status: args });
},
onError(error: string): void {
if (!this._failureCallback) {
return;
}
if (typeof this._failureCallback === "function") {
try {
this._failureCallback(error);
printLogs("logEvent error: " + error);
} catch (e) {
printLogs(`onLogEventRequestFailure Error: ${e}`);
}
} else {
printLogs(`onLogRequestFailure: callback is not a function`);
}
resolve({ status: "failure" });
},
});
} catch (e) {
printLogs(`AppsFlyerRequestListener Error:${e}`);
}
}
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
const c =
Application.android.context ||
(<any>com).tns.NativeScriptApplication.getInstance();
appsFlyerLibInstance.logEvent(
c,
args.eventName,
_toValue(args.eventValues),
_appsFlyerRequestListener
);
} catch (ex) {
printLogs("Error: " + ex);
reject(ex);
}
});
};
const getAppsFlyerUID = function () {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
const uid: string = appsFlyerLibInstance.getAppsFlyerUID(
Utils.android.getApplicationContext()
);
return uid;
} catch (error) {
throw new Error("Failed to get AppsFlyer UID: " + error.message);
}
};
const setCustomerUserId = function (userId: string) {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.setCustomerUserId(userId);
resolve({ status: "success" });
} catch (ex) {
printLogs("setCustomerUserId Error: " + ex);
reject(ex);
}
});
};
const enableTCFDataCollection = function (shouldCollect: boolean) {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.enableTCFDataCollection(shouldCollect);
resolve({ status: "success" });
} catch (ex) {
printLogs("enableTCFDataCollection Error: " + ex);
reject(ex);
}
});
};
const setConsentData = function (consent) {
return new Promise((resolve, reject) => {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
let consentData;
if (consent.isUserSubjectToGDPR) {
// Provide default values for booleans if not defined
const hasConsentForDataUsage = consent.hasConsentForDataUsage === true;
const hasConsentForAdsPersonalization = consent.hasConsentForAdsPersonalization === true;
consentData = com.appsflyer.AppsFlyerConsent.forGDPRUser(
hasConsentForDataUsage,
hasConsentForAdsPersonalization
);
} else {
consentData = com.appsflyer.AppsFlyerConsent.forNonGDPRUser();
}
appsFlyerLibInstance.setConsentData(consentData);
resolve({ status: "success" });
} catch (ex) {
console.error(`Error setting consent data: ${ex.message}`);
reject(new Error(`Error setting consent data: ${ex.message}`));
}
});
};
const setAppInviteOneLink = function (link: string) {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.setAppInviteOneLink(link);
resolve({ status: "success" });
} catch (ex) {
printLogs("setAppInviteOneLink Error: " + ex);
reject(ex);
}
});
};
const generateInviteUrl = function (args: AppsFlyerLinkGeneratorArgs) {
return new Promise(function (resolve, reject) {
try {
const params = args.params;
const channel: String = params.channel;
const campaign: String = params.campaign;
const referrerName: String = params.referrerName;
const referrerImageUrl: String = params.referrerImageUrl;
const customerID: String = params.customerID;
const baseDeepLink: String = params.baseDeepLink;
const brandDomain: String = params.brandDomain;
const appsflyerShareInviteHelper: com.appsflyer.share.ShareInviteHelper =
com.appsflyer.share.ShareInviteHelper;
const linkGenerator: com.appsflyer.share.LinkGenerator =
appsflyerShareInviteHelper.generateInviteUrl(
Application.android.context
);
if (channel != null && channel != "") {
linkGenerator.setChannel(String(channel));
}
if (campaign != null && campaign != "") {
linkGenerator.setCampaign(String(campaign));
}
if (referrerName != null && referrerName != "") {
linkGenerator.setReferrerName(String(referrerName));
}
if (referrerImageUrl != null && referrerImageUrl != "") {
linkGenerator.setReferrerImageURL(String(referrerImageUrl));
}
if (customerID != null && customerID != "") {
linkGenerator.setReferrerCustomerId(String(customerID));
}
if (baseDeepLink != null && baseDeepLink != "") {
linkGenerator.setBaseDeeplink(String(baseDeepLink));
}
if (brandDomain != null && brandDomain != "") {
linkGenerator.setBrandDomain(String(brandDomain));
}
if (!isEmpty(params.userParams)) {
Object.entries(params.userParams).forEach(([key, value]) => {
linkGenerator.addParameter(key, String(value));
});
}
if (args.onSuccess && args.onError) {
const listener: com.appsflyer.CreateOneLinkHttpTask.ResponseListener =
new com.appsflyer.CreateOneLinkHttpTask.ResponseListener(<any>{
_successCallback: args.onSuccess,
_failureCallback: args.onError,
onResponse(): void {
if (!this._successCallback) {
return;
}
if (typeof this._successCallback === "function") {
try {
this._successCallback(args);
printLogs(
"generateInviteUrl success: " + JSON.stringify(args)
);
} catch (e) {
printLogs(`generateInviteUrl Error: ${e}`);
}
} else {
printLogs(`generateInviteUrl: callback is not a function`);
}
resolve({ status: args });
},
onResponseError(error: string): void {
if (!this._failureCallback) {
return;
}
if (typeof this._failureCallback === "function") {
try {
this._failureCallback(error);
printLogs("generateInviteUrl error: " + error);
} catch (e) {
printLogs(`generateInviteUrl Error: ${e}`);
}
} else {
printLogs(`generateInviteUrl: callback is not a function`);
}
resolve({ status: "failure" });
},
});
linkGenerator.generateLink(Application.android.context, listener);
}
resolve({ status: "success" });
} catch (ex) {
printLogs("generateInviteUrl Error: " + ex);
reject(ex);
}
});
};
function isEmpty(obj) {
for (const prop in obj) {
if (Object.hasOwn(obj, prop)) {
return false;
}
}
return true;
}
const stop = function (isStopped: bool) {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.stop(isStopped, Application.android.context);
resolve({ status: "success" });
} catch (ex) {
printLogs("stop Error: " + ex);
reject(ex);
}
});
};
const setSharingFilter = function (partners: Array<string>) {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.setSharingFilter(partners);
resolve({ status: "success" });
} catch (ex) {
printLogs("setSharingFilter Error: " + ex);
reject(ex);
}
});
};
const setSharingFilterForAllPartners = function () {
return new Promise(function (resolve, reject) {
try {
const appsFlyerLibInstance = com.appsflyer.AppsFlyerLib.getInstance();
appsFlyerLibInstance.setSharingFilterForAllPartners();
resolve({ status: "success" });
} catch (ex) {
printLogs("setSharingFilterForAllPartners Error: " + ex);
reject(ex);
}
});
};
const _toHashMap = function (obj: Object) {
const node = new java.util.HashMap();
for (const property in obj) {
if (obj.hasOwnProperty(property)) {
if (obj[property] !== null) {
switch (typeof obj[property]) {
case "object":
// note: since this function has no second argument,
// it appears the "node" being passed in this recursive call is unused
// TypeScript detected this, so commenting out for now
node.put(property, _toHashMap(obj[property] /*, node*/));
break;
case "boolean":
node.put(
property,
java.lang.Boolean.valueOf(String(obj[property]))
);
break;
case "number":
if (
Number(obj[property]) === obj[property] &&
obj[property] % 1 === 0
) {
node.put(property, java.lang.Long.valueOf(String(obj[property])));
} else {
node.put(
property,
java.lang.Double.valueOf(String(obj[property]))
);
}
break;
case "string":
node.put(property, String(obj[property]));
break;
}
}
}
}
return node;
};
const _toValue = function (val: any) {
let returnVal = null;
if (val !== null) {
switch (typeof val) {
case "object":
returnVal = _toHashMap(val);
break;
case "boolean":
returnVal = java.lang.Boolean.valueOf(String(val));
break;
case "number":
if (Number(val) === val && val % 1 === 0) {
returnVal = java.lang.Long.valueOf(String(val));
} else {
returnVal = java.lang.Double.valueOf(String(val));
}
break;
case "string":
returnVal = String(val);
break;
}
}
return returnVal;
};
function printLogs(logs) {
if (_isDebugLocal) {
console.log("AppsFlyer :: " + logs);
}
}
export {
initSdk,
startSdk,
logEvent,
stop,
setCustomerUserId,
setAppInviteOneLink,
generateInviteUrl,
getAppsFlyerUID,
enableTCFDataCollection,
setConsentData,
setSharingFilter,
setSharingFilterForAllPartners,
_toHashMap,
_toValue,
};