Skip to content

Commit

Permalink
Merge pull request #26 from capacitor-community/analytics-android-sup…
Browse files Browse the repository at this point in the history
…port

Analytics android support
  • Loading branch information
johnborges authored Sep 15, 2021
2 parents ad75524 + 0a0f078 commit e0d2180
Show file tree
Hide file tree
Showing 12 changed files with 201 additions and 55 deletions.
4 changes: 4 additions & 0 deletions appcenter-analytics/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change Log

## 0.3.0

* add support for Android

## 0.2.1

* Update `Appcenter/Analytics` to 4.2.0
Expand Down
14 changes: 7 additions & 7 deletions appcenter-analytics/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Once you add App Center Analytics to your app and the SDK is started, it will au

<docgen-index>

* [`enable(...)`](#enable)
* [`setEnabled(...)`](#setenabled)
* [`isEnabled()`](#isenabled)
* [`pause()`](#pause)
* [`resume()`](#resume)
Expand All @@ -52,19 +52,19 @@ Once you add App Center Analytics to your app and the SDK is started, it will au
<docgen-api>
<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->

### enable(...)
### setEnabled(...)

```typescript
enable(options: { enableFlag: boolean; }) => Promise<void>
setEnabled(options: { enable: boolean; }) => Promise<void>
```

You can enable and disable App Center Analytics at runtime. If you disable it, the SDK won't collect any more analytics information for the app.

| Param | Type |
| ------------- | ------------------------------------- |
| **`options`** | <code>{ enableFlag: boolean; }</code> |
| Param | Type |
| ------------- | --------------------------------- |
| **`options`** | <code>{ enable: boolean; }</code> |

**Since:** 0.1.0
**Since:** 0.3.0

--------------------

Expand Down
12 changes: 7 additions & 5 deletions appcenter-analytics/android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
ext {
junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.12'
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.1.0'
androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.1'
androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.2.0'
junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.1'
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.2.0'
androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.2'
androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.3.0'
}

buildscript {
Expand All @@ -11,7 +11,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
classpath 'com.android.tools.build:gradle:4.2.1'
}
}

Expand Down Expand Up @@ -49,6 +49,8 @@ repositories {


dependencies {
api 'com.microsoft.appcenter:appcenter-analytics:4.2.0'
api 'com.microsoft.appcenter.reactnative:appcenter-react-native:4.2.0' // change to own version
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':capacitor-android')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
2 changes: 1 addition & 1 deletion appcenter-analytics/android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.plugins.example">
package="com.getcapacitor.plugin.appcenter.analytics">
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.getcapacitor.plugin.appcenter.analytics;

import java.util.Map;

import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.analytics.Analytics;
import com.microsoft.appcenter.Flags;

public class AnalyticsBase {

public void trackEvent(String name, Map<String, String> properties, String flag) {
int analyticsFlag;

switch (flag) {
case "critical":
analyticsFlag = Flags.CRITICAL;
break;
case "normal":
analyticsFlag = Flags.NORMAL;
break;
default:
analyticsFlag = Flags.NORMAL;
break;
}
Analytics.trackEvent(name, properties, analyticsFlag);
}

public void setTransmissionInterval(int seconds) {
Analytics.setTransmissionInterval(seconds);
}

public void start() {
AppCenter.start(Analytics.class);
}

public void pause() {
Analytics.pause();
}

public void resume() {
Analytics.resume();
}

public void enable(boolean enable) {
Analytics.setEnabled(enable).get();
}

public boolean isEnabled() {
return Analytics.isEnabled().get();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package com.getcapacitor.plugin.appcenter.analytics;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;

import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.analytics.Analytics;
import com.microsoft.appcenter.reactnative.shared.AppCenterReactNativeShared;

@CapacitorPlugin(name = "Analytics")
public class AnalyticsPlugin extends Plugin {

private AnalyticsBase implementation = new AnalyticsBase();

@Override
public void load() {
AppCenterReactNativeShared.configureAppCenter(this.getActivity().getApplication());

// todo: get additional config options

if (AppCenter.isConfigured()) {
AppCenter.start(Analytics.class);
// if (!startEnabled) {
// Analytics.setEnabled(false);
// }
}
}

@PluginMethod(returnType = PluginMethod.RETURN_NONE)
public void setEnabled(PluginCall call) {
implementation.enable(call.getBoolean("enable", false));
call.resolve();
}

@PluginMethod(returnType = PluginMethod.RETURN_NONE)
public void pause(PluginCall call) {
implementation.pause();
call.resolve();
}

@PluginMethod(returnType = PluginMethod.RETURN_NONE)
public void resume(PluginCall call) {
implementation.resume();
call.resolve();
}

@PluginMethod
public void isEnabled(PluginCall call) {
JSObject ret = new JSObject();
ret.put("value", implementation.isEnabled());
call.resolve(ret);
}

@PluginMethod(returnType = PluginMethod.RETURN_NONE)
public void trackEvent(PluginCall call) {
if (!call.getData().has("name")) {
call.reject("Must provide an event name");
return;
}
String name = call.getString("name");

String flag = call.getString("flag", "normal");

Map<String, String> properties = mapFromJSON(call.getObject("properties", new JSObject()));

implementation.trackEvent(name, properties, flag);
}

private static Map<String, String> mapFromJSON(JSONObject jsonObject) {
if (jsonObject == null) {
return null;
}
Map<String, String> map = new HashMap<>();
Iterator<String> keysIter = jsonObject.keys();
while (keysIter.hasNext()) {
String key = keysIter.next();
// Only support storing strings. Non-string data must be stringified in JS.
String value = jsonObject.optString(key);
if (value != null) {
map.put(key, value);
}
}
return map;
}

private static Object getObject(Object value) {
if (value instanceof JSONObject) {
value = mapFromJSON((JSONObject) value);
} else if (value instanceof JSONArray) {
value = listFromJSON((JSONArray) value);
}
return value;
}

private static List<Object> listFromJSON(JSONArray jsonArray) {
List<Object> list = new ArrayList<>();
for (int i = 0, count = jsonArray.length(); i < count; i++) {
Object value = getObject(jsonArray.opt(i));
if (value != null) {
list.add(value);
}
}
return list;
}

}

This file was deleted.

This file was deleted.

10 changes: 5 additions & 5 deletions appcenter-analytics/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@capacitor-community/appcenter-analytics",
"version": "0.2.1",
"version": "0.3.0",
"description": "Capacitor plugin for AppCenter Analytics",
"main": "dist/plugin.cjs.js",
"module": "dist/esm/index.js",
Expand Down Expand Up @@ -47,10 +47,10 @@
"prepublishOnly": "npm run build"
},
"devDependencies": {
"@capacitor/android": "3.0.0",
"@capacitor/core": "3.0.0",
"@capacitor/android": "3.2.2",
"@capacitor/core": "3.2.2",
"@capacitor/docgen": "^0.0.17",
"@capacitor/ios": "3.0.0",
"@capacitor/ios": "3.2.2",
"@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^1.0.1",
"@ionic/swiftlint-config": "^1.1.2",
Expand All @@ -63,7 +63,7 @@
"typescript": "~4.0.3"
},
"peerDependencies": {
"@capacitor/core": "next"
"@capacitor/core": "3.2.2"
},
"prettier": "@ionic/prettier-config",
"swiftlint": "@ionic/swiftlint-config",
Expand Down
6 changes: 3 additions & 3 deletions appcenter-analytics/src/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ export interface AnalyticsEvent {
export interface AnalyticsPlugin {
/**
* You can enable and disable App Center Analytics at runtime. If you disable it, the SDK won't collect any more analytics information for the app.
* @param {enableFlag: boolean} options
* @param {enable: boolean} options
* @returns {Promise<void>}
* @since 0.1.0
* @since 0.3.0
*/
enable(options: {enableFlag: boolean}): Promise<void>;
setEnabled(options: {enable: boolean}): Promise<void>;
/**
* Check if Analytics is enabled or not.
* @returns {Promise<{value: boolean}>}
Expand Down
6 changes: 3 additions & 3 deletions appcenter-analytics/src/web.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { WebPlugin } from '@capacitor/core';
import type { AnalyticsPlugin } from './definitions';

export class AnalyticsWeb extends WebPlugin implements AnalyticsPlugin {
setEnabled(): Promise<void> {
throw this.unimplemented('Not supported on web.');
}
trackEvent(): Promise<void> {
throw this.unimplemented('Not supported on web.');
}
Expand All @@ -15,7 +18,4 @@ export class AnalyticsWeb extends WebPlugin implements AnalyticsPlugin {
isEnabled(): Promise<{ value: boolean; }> {
throw this.unimplemented('Not supported on web.');
}
enable(): Promise<void> {
throw this.unimplemented('Not supported on web.');
}
}

0 comments on commit e0d2180

Please sign in to comment.