@Override
    public void properties(SAPropertiesFetcher saPropertiesFetcher) {
        // read super property
        JSONObject superProperties = mSensorsDataAPI.getSuperProperties();
        // read dynamic property
        JSONObject dynamicProperty = mSensorsDataAPI.getDynamicProperty();
        // merge super and dynamic property
        JSONObject removeDuplicateSuperProperties = JSONUtils.mergeSuperJSONObject(dynamicProperty, superProperties);
        // merge custom property and super property
        JSONUtils.mergeJSONObject(removeDuplicateSuperProperties, saPropertiesFetcher.getProperties());
    }
@Test
    public void properties() {
        JSONObject superProperty = new JSONObject();
        try {
            superProperty.put("superProperty", "superProperty");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SensorsDataAPI sensorsDataAPI = SAHelper.initSensors(mApplication);
        sensorsDataAPI.registerSuperProperties(superProperty);
        sensorsDataAPI.setTrackEventCallBack(new SensorsDataTrackEventCallBack() {
            @Override
            public boolean onTrackEvent(String eventName, JSONObject eventProperties) {
                if ("AppTest".equals(eventName)) {
                    Assert.assertTrue(eventProperties.has("superProperty"));
                }
                return false;
            }
        });
        sensorsDataAPI.track("AppTest");
    }