Cordova Framework Wrapper

validic_cordova_1.16.5

📘

Legacy (v1) vs Inform (v2)

The same Validic Mobile SDKs are used by both Legacy (v1) and Inform (v2) API customers. To make the documentation easier to access, the Mobile Getting Started Guides and class documentation are hosted on our Inform (v2) documentation site.

The API documentation, however, is different between Legacy (v1) and Inform (v2). If you are an Inform (v2) API customer, you must use the Inform API documentation.

If you are a Legacy (v1) API customer, be sure to go back to the Legacy API documentation.

Requirements


To get started, download the Cordova framework from the Validic Mobile portal.

This plugin provides a bridge between a Cordova based application and native Validic Mobile libraries. The native libraries are required for use of this plugin.

Plugin requirements:

  • Cordova 6.3 and above.
    cordova-android >= 7.0.0
    cordova-ios >= 5.1
  • Specific supported phones, peripherals, and operating system versions are documented as part of the native libraries.

At minimum, the validic-cordova-session plugin is required to be installed. The following remaining plugins may be used as desired for the specific features you wish to implement in your app:

  • Bluetooth: validic-cordova-ble
  • Google Fit: validic-cordova-googlefit
  • Apple Health: validic-cordova-healthkit
  • VitalSnap: validic-cordova-ocr
  • Samsung Health: validic-cordova-shealth

Adding plugin to Cordova project

If you're just getting started with the Cordova wrapper, creating a Cordova project using the ValidicMobile plugin involves the following steps. Additional Cordova commands and options are available. Consult Cordova documentation for additional information.

  1. Install Cordova.
  2. Create Cordova project. cordova create <path> [id name]. id and name are optional. Additional Cordova options are available.
  3. Change directory to the root of the newly created project cd <path>
  4. Add the desired platforms to the project, cordova platform add [ios | android] --save
  5. Add the ValidicMobile plugin(s) to the cordova project, cordova plugin add <path to unzipped plugin> --save.

Upgrading plugin

To upgrade the plugin to a new version, the old version of the plugin should be removed and the new version added.

  • cordova plugin remove <plugin_to_remove>
  • cordova plugin add <path_to_plugin>

Android

Samsung Health

In order to use Samsung Health with ValidicMobile a valid copy of the Samsung Health SDK must be provided by the developer. This can be downloaded from the Samsung Health developer portal: Samsung Samsung Health Developer.

Add plugin with SHEALTH_DEPENDENCY variable to install the shealth dependency.

iOS

HealthKit

To enable use of HealthKit in the app, within the build settings of your target, select the ‘Capabilities’ tab and enable ‘HealthKit’.

If HealthKit is not enabled, an error is reported in the console log on app launch but will not report a error during build.

Bluetooth

Passive Bluetooth support requires enabling background mode support. To enable it:

  1. Edit info.plist
  2. Create new top level entry, Required background modes.
  3. Select App communicates using CoreBluetooth as the value.

Info.plist configuration

iOS requires usage descriptions to be declared in project’s Info.plist for usage of the camera, Bluetooth and to access and update health data.

The plugins create these entries in the Info.plist when the iOS platform is added to the project. Custom descriptions can be specified when the plugin is added to the project by specifying values for the following variables in the cordova plugin add CLI command:

  • validic-cordova-ocr
    • CAMERA_USAGE_DESCRIPTION for NSCameraUsageDescription
  • validic-cordova-healthkit
    • HEALTH_SHARE_USAGE_DESCRIPTION for NSHealthShareUsageDescription
    • HEALTH_UPDATE_USAGE_DESCRIPTION for NSHealthUpdateUsageDescription
  • validic-cordova-ble
    • BLUETOOTH_USAGE_DESCRIPTION for NSBluetoothPeripheralUsageDescription
    • BLUETOOTH_ALWAYS_USAGE_DESCRIPTION for NSBluetoothAlwaysUsageDescription

The extended command to add the plugin is of the following form:

cordova plugin add <path to unzipped plugin> --variable CAMERA_USAGE_DESCRIPTION=<usage message> --variable HEALTH_SHARE_USAGE_DESCRIPTION=<usage message> --variable HEALTH_UPDATE_USAGE_DESCRIPTION=<usage message> --variable BLUETOOTH_USAGE_DESCRIPTION=<usage message>

BLUETOOTH_ALWAYS_USAGE_DESCRIPTION=

If you don’t pass a variable on plugin installation, the plugin provides a generic default message.

Session


Provision a User

In order to use the Validic Mobile Library, you will need a valid organization id and valid user credentials.

If you do not already have an organization id, you will need to first apply for one.

After your organization is set up, you will need a Validic user id and access token.

Validic user can be provisioned using the Validic API, documentation is available for both Legacy API (V1) and Inform API (V2) APIs. The credentials needed are a Validic user ID, an organization ID and a user access token. The user access token value you provide to the SDK is the "user access token" value if you use the Legacy (V1) API. The user access token value you provide to the SDK is the "mobile token" value if you use the Inform (V2) API.

Record types

The Validic Mobile library supports the following record types:

  • Biometrics - comprised of a user’s biometric health data such as blood pressure, cholesterol, heart rate, and blood and hormone levels.
  • Diabetes - comprised of a user’s blood glucose and hormone levels related to diabetes treatment and management.
  • Fitness - comprised of a user’s activities that are undertaken with the express purpose of exercising. These activities have a defined duration (time, distance, elevation, etc.)
  • Nutrition - comprised of a user’s activities related to calorie intake and consumption and nutritional information (such as fat, protein, carbohydrates, sodium, etc.)
  • Routine - comprised of a user’s activities that occur regularly throughout the day, without the specific goal of exercise, for example calories burned and consumed, steps taken, stairs climbed. These activities are aggregated throughout the day.
  • Sleep - comprised of a user’s measurements related to the length of time spent in various sleep cycles, as well as number of times awakened during the night.
  • Weight - comprised of a user’s weight and body mass.

Record Identifiers

The Validic Mobile SDK uses log_id (for the Inform/V2 API) or activity_id (for the Legacy/V1 API) as the unique identifier for a given record. These IDs are created by the mobile SDK before submission to the server.

The Validic server also assigns an id (for the Inform/V2 API) or _id (for the Legacy/V1 API) for each unique record. It is recommended to use the server-side id / _id to identify and/or de-duplicate records post-submission.

Manage a Session

Overview

The Session stores a user, their current HealthKit, Google Fit, or Samsung Health subscriptions and all pending record uploads. This data is persisted between app launches but is deleted if the ValidicMobile.Session.endSession() function is called.

A new Session is started by passing previously provisioned Validic user credentials to the startSession function.

ValidicMobile.Session.startSession(user.USER_ID, user.ORGANIZATION_ID, user.USER_ACCESS_TOKEN);

The supplied credentials are not validated when the session is created. Records will fail to upload if invalid credentials have been provided. Credentials are stored persistently. To change credentials, call:

ValidicMobile.Session.endSession();

or uninstall the app. When a new session is created, pending record uploads and subscriptions are reset. For this reason, a new session should only be created if a session is not already active.

The app can be informed of record upload success and failure by registering callbacks using:

ValidicMobile.Session.setSessionListener(logSuccess, logFail)

The success callback is invoked after each record has successfully uploaded to the server. Fail is invoked if a record upload fails. Setting the session listeners is optional.

Registration of listeners is typically done during app initialization to catch events for record uploads which may occur upon app restart.

Session initialization is typically done when your users log in to your (non-Validic) system, and retrieve your user’s Validic authentication information as stored on your system. The Validic authentication information for your user is then used with the Validic Mobile Library to initialize your Session.

The following example starts a session if a session is not already active and registers session listeners.

var user = {
    "USER_ID": "replace with userid",
    "USER_ACCESS_TOKEN": "replace with access token",
    "ORGANIZATION_ID": "replace with organization id"
};
var logSuccess = function (object) {
    console.log(object);
};
var logFail = function (object) {
    console.log(object)
};
ValidicMobile.Session.setSessionListener(logSuccess, logFail);
ValidicMobile.Session.isSessionActive(function (response) {
    if (!response.isActive) {
        // Only do this if your user is logging in
        ValidicMobile.Session.startSession(user.USER_ID, user.ORGANIZATION_ID, user.USER_ACCESS_TOKEN);
    }
});

Logging

Logging can be enabled and messages will be logged to the javascript console. All logs from the Validic SDK begin with ValidicLog#.

ValidicMobile.Logger.enable();

to disable:

ValidicMobile.Logger.disable();

Bluetooth


Requirements

  • Cordova 6.3 and above
  • cordova-android >= 7.0.0
  • cordova-ios >= 4.4
  • validic-cordova-session plugin
  • validic-cordova-ble plugin

Peripherals

Peripheral objects contain information regarding supported Bluetooth peripherals. Several function calls are provided to retrieve one or more peripherals.

A peripheral object contains various properties used during the reading and pairing process:

  • Manufacturer - Manufacturer name.
  • Model - Model number.
  • PairingInstruction - Text telling the user how to pair the peripheral, if the peripheral requires pairing.
  • Instruction - Text telling the user how to initialize the reading process with the peripheral.
  • ReadingInstruction - Text telling the user what to do during the reading process.
  • PeripheralImageURL - URL for an image of the peripheral.
  • RequiresPairing - Boolean indicating if the peripheral requires pairing.
  • ID - Peripheral identifier.

Supported Peripherals

To retrieve an array of supported peripherals:

ValidicMobile.BLE.getSupportedPeripherals(function (response) {
    var peripherals = response.peripherals;
};

To retrieve a specific peripheral:

ValidicMobile.BLE.getPeripheral(3, function (response) {
    var peripheral = response.peripheral;
}, function (err) {
    alert(err.error);
});

Peripherals are grouped by type, such as thermometer, glucose, scale, etc. To retrieve an array of peripherals of a specific type, use the ValidicMobile.BLE.PeripheralType constants and invoke the following function:

ValidicMobile.BLE.getPeripheralsOfType(ValidicMobile.PeripheralType.THERMOMETER, function (response) {
    app.peripheral = response.peripheral;
}, function (err) {
    alert(err.error);
});

Permissions

The following permissions must be in the consuming application's mergedAndroidManifest.xml:

  • android.permission.BLUETOOTH
  • android.permission.BLUETOOTH_ADMIN
  • android.permission.FOREGROUND_SERVICE
  • android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION

Android 10

  • Starting with Android 10, android.permission.ACCESS_FINE_LOCATION is required by the OS.
  • android.permission.ACCESS_BACKGROUND_LOCATION must be requested along with android.permission.ACCESS_FINE_LOCATION in order for Passive Bluetooth reading to succeed if the device is in DOZE mode for devices running api 26 or later

Android 11

  • Starting with Android 11, on devices running api >= Android 11 (api 30), the android.permission.ACCESS_BACKGROUND_LOCATION must be granted manually by end user's in the application settings. To navigate to the application settings use the following code
                       Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                                Uri.parse("package:" + getApplication().getPackageName())); intent.addCategory(Intent.CATEGORY_DEFAULT);                            startActivityForResult(intent, BLE_BACKGROUND_CODE);

Pair

Certain peripherals require pairing with the mobile device before a reading can be taken. You can check the RequiresPairing property on the peripheral object to know if it must be paired. To begin a pairing process, the PairingInstruction property of a Bluetooth peripheral object can be displayed to the user. To start the pairing process, call:

ValidicMobile.BLE.pair(peripheralID, successCallback(), failCallback())

The pairing process can generate multiple callbacks. A response object is passed to the successCallback which includes an event property and a payload containing information specific to the request.

var success = function (response) {
    console.log('Successful pair with peripheral ID:' + response.payload.peripheralID);
};
var fail = function(response) {
    console.log('Error: ' + response.payload.error);
};
ValidicMobile.BLE.pair(15, success, fail);

Read

When the BLE read process is first initiated, the user should be presented with instructions from the peripheral object using the Instruction property.

When the ValidicMobile.BLE.EventName.ON_READY_TO_READ event is received, the user should be presented with instructions from the peripheral object using the ReadingInstruction property.

Assuming event listeners have been registered as shown below, the BLE read process is initiated as follows:

ValidicMobile.BLE.read(peripheral.ID);

The ValidicMobile.BLE.EventName.ON_READ_SUCCESS event is posted when the read successfully completes and is passed an object with a records property containing an array of records read via BLE.

Some peripherals return a single record while others may return multiple records.

Passive Reading

Some Bluetooth peripherals support passive reading (collecting readings without the app in the foreground). For information on permissions setup and other requirements, please review the iOS and Android native documentation.
To start passively listening to certain peripherals, pass an array of peripheralIDs to ValidicMobile.BLE.setPassiveReadPeripheralIDs:

ValidicMobile.BLE.setPassiveReadPeripheralIDs({
    peripheralIDs: [18],
    notificationOptions: app.notificationOptions,
});

To stop passively listening, pass an empty array:

ValidicMobile.BLE.setPassiveReadPeripheralIDs({
    peripheralIDs: [],
});

Handle Events

Events are generated for the possible responses from bluetooth pair and read requests. These events are posted from the window. Event names are defined within the ValidicMobile.BLE.EventName set of constants.

Event listeners for the pairing events can be registered as follows:

window.addEventListener(ValidicMobile.BLE.EventName.ON_PAIR_SUCCESS, this.onBLEPairingSuccess);
window.addEventListener(ValidicMobile.BLE.EventName.ON_PAIR_FAIL, this.onBLEPairingFailed);
window.addEventListener(ValidicMobile.BLE.EventName.ON_PAIR_START, this.onBLEPairingStarted);

Note: The ValidicMobile.BLE.Event.ON_PAIR_START event is only posted on Android, not on iOS.

If using event listeners, callbacks can be left off of the pair request. The event listener receives the payload object.

ValidicMobile.BLE.pair(15);

To register for events associated with the BLE reading process:

window.addEventListener(ValidicMobile.BLE.EventName.ON_READY_TO_READ, this.onBLEReadyToRead);
window.addEventListener(ValidicMobile.BLE.EventName.ON_READ_SUCCESS, this.onBLEReadSuccess);
window.addEventListener(ValidicMobile.BLE.EventName.ON_READ_FAIL, this.onBLEReadFailed);
window.addEventListener(ValidicMobile.BLE.EventName.ON_READ_CANCEL, this.onBLEReadCancelled);

Pairing and reading is initiated using pair and read functions which can be invoked with optional success and fail callbacks. These callbacks are invoked passing a response object that described the event. The response includes an event property with the event name, and a payload property containing the appropriate data.

When event listeners are registered, the object passed to the listener is simplified. The passed object is the value of the payload property.

HealthKit


Requirements

  • Cordova 6.3 and above
  • cordova-ios >= 4.4
  • validic-cordova-session plugin
  • validic-cordova-healthkit plugin

Check Heathkit support

Calls to HealthKit functions should only be performed on devices supporting HealthKit. In particular, HealthKit does not function on Android devices. To determine if HealthKit is available on the current device the following call is provided:

var success = function (response) {
    if (response.isAvailable) {
        console.log("HealthKit is available");
    }
}
ValidicMobile.HealthKit.isHealthKitAvailable(success);

Manage subscriptions

The Validic Mobile library provides a simple way to read and upload data from HealthKit to Validic. The ValidicMobile plugin can subscribe to specific HealthKit sample types and automatically upload them to Validic in the background as new data is recorded, even if the app is no longer active.

Subscribing to HealthKit updates only needs to be done once for a user. The subscriptions will be persisted across app launches in the Session object. A typical use of the HealthKit component would be to create a checkbox or equivalent that adds the required subscriptions when turned on and removes them when turned off.

Healthkit subscriptions are based on sample types. Constants representing each available sample type are defined within ValidicMobile.HealthKit.SampleType.

The Validic Mobile library provides subscription sets which are a collection of predefined sample types declared in ValidicMobile.HealthKit.SubscriptionSet. Sample types for a subscription set can be retrieved using the getSampleTypesForSubscriptionSet function. The following subscription sets are available:

  • ROUTINE: Includes Flights Climbed, Active Energy Burned, Distance Walking, Step Count, and Basal Energy Burned. In iOS 9 and later this also includes Apple Stand Hours (from the Apple Watch).
  • DIABETES: Blood Glucose sample type.
  • WEIGHT: Includes Body Mass (weight), Height, Body Fat Percentage, Lean Body Mass, and Body Mass Index.
  • FITNESS: Includes Workout, Nike Fuel, and Cycling Distance.
  • SLEEP: Sleep Analysis sample type, this is the total number of sleep seconds in the “Asleep” Sleep State.
  • BASIC_NUTRITION: Includes Calcium, Carbohydrates, Cholesterol, Fiber, Iron, Potassium, Protein, Saturated Fat, Sodium, Sugar, Total Fat, and Energy Consumed. in iOS 9 and later this will also include Dietary Water.
  • REPRODUCTIVE_HEALTH: Includes Sexual Activity, Cervical Mucus Quality, Intermenstrual Bleeding, Menstrual Flow, Ovulation Test Result, and BasalBodyTemperature. These sample types are only available in iOS 9 and later.
  • BIOMETRICS: Includes Systolic Blood Pressure, Diastolic Blood Pressure, Heart Rate, Body Temperature, and SpO2 (oxygen saturation).

To subscribe to HealthKit sample types:

ValidicMobile.HealthKit.setSubscriptions(sampleTypes, successCallback, errorCallback);

The function accepts an array of strings mapping to HealthKit sample types. Sample types can be aggregated into an array using various calls to retrieve sample types.

The following example retrieves sample types for a subscription set for WEIGHT, adds a specific sample type for step count, and sets those subscriptions.

var success = function (object) {
    var sampleTypes = object.sampleTypes;
    sampleTypes.push(ValidicMobile.HealthKit.SampleType.HKQuantityTypeIdentifierStepCount);
    ValidicMobile.HealthKit.setSubscriptions(sampleTypes);
};
ValidicMobile.HealthKit.getSampleTypesForSubscriptionSet(ValidicMobile.HealthKit.SubscriptionSet.WEIGHT, success);

Note: Calling

ValidicMobile.Session.endSession();

will remove all HealthKit subscriptions and stop listening for new data.

Historical Fetch

The Validic Mobile library provides the ability to query up to 180 days of data for a subset of data types provided by HealthKit by specifying one of more values of the HealthKit.HistoricalSet enum.

Two historical sets are available

  • HealthKit.HistoricalSet.ROUTINE - Step data
  • HealthKit.HistoricalSet.FITNESS - Workout data

To fetch historical HealthKit data, call the HealthKit.fetchHistoricalSets function and pass in an object with the datasets you want to fetch under the historicalSets key. You can also pass ISO8601 date strings in from and to keys to limit the time period that gets fetched. The function accepts a success function parameter which is called when historical records have been queued for upload to the server. The success function is called with an object that contains the number of records processed for each record type. An error function can also be passed which is invoked if invalid parameters are passed.

// Define dates to fetch (optional - if omitted, last 180 days will be fetched)
const start = new Date();
const end = new Date();
start.setDate(end.getDate()-29);

ValidicMobile.HealthKit.fetchHistoricalSets(
    {
        historicalSets: [ValidicMobile.HealthKit.HistoricalSet.ROUTINE, ValidicMobile.HealthKit.HistoricalSet.FITNESS],
        from: start.toISOString(),
        to: end.toISOString()
    }
    function (response) {
        document.getElementById("recordsLog").innerHTML += "HealthKit historical records processed: "
            + JSON.stringify(response) + "<br/><br/>";
    },
    function (response) {
        document.getElementById("recordsLog").innerHTML += "HealthKit historical error: "
            + JSON.stringify(response) + "<br/><br/>";
    });

Doing this may display a permission dialogue from HealthKit, so it's important to call this at an appropriate time in your app. It is recommended to explain to the user why you want this data before attempting to fetch it. This operation may take several seconds to complete, so it would be advisable to display an activity indicator to the user until the completion block is called. When the fetch completes all the data will have been fetched locally and queued up for submission to the server. The amount of time needed to upload the records may vary based on the user's internet speed. The queued records are uploaded automatically by the library based on connectivity, but it is possible for the user to suspend the app before all the records have been uploaded, in which case the remaining records will be uploaded when the user resumes the app. This should be kept in mind when receiving records from the Validic server.

There should be no need to call this method more than once for a user.

When the fetch completes all the data will have been fetched locally and queued up for submission to the server. The amount of time needed to upload the records may vary based on the user’s internet speed.

The queued records are uploaded automatically by the library based on connectivity, but it is possible for the user to suspend the app before all the records have been uploaded, the remaining records will be uploaded when the user resumes the app. This should be kept in mind when receiving records from the Validic server.

Google Fit


❗️

Google Fit

As of May 1, 2024 Google has decided to stop accepting new applications for the Google Fit Android SDKs that are used in the Validic Mobile Google Fit integration.

As of this update, the Fit Android SDKs are deprecated and will be officially sunset on June 30, 2025. You can find the latest information from Google at any time by visiting their help pages.

During this time, clients who have already been approved by Google to use the Google Fit Android SDKs may continue to use the Google Fit integration.

Validic is currently working on a beta Mobile SDK integration to Android Health Connect, which can be used to retrieve Google Fit data. Please stay tuned for updates when this integration is available for testing.

Requirements

  • Cordova 6.3 and above
  • cordova-android >= 7.0.0
  • validic-cordova-session plugin
  • validic-cordova-googlefit plugin

Overview

This project integrates Google Fit with the Validic Mobile Aggregator to passively collect data on behalf of an end user. Validic ensures that our Mobile SDK makes use of the minimal scopes needed for our supported data types. Additionally, when using Google Fit version com.google.android.gms:play-services-fitness:19.0.0 or lower, Validic does not request or use any scopes indicated as sensitive or restricted by Google.

As of Google Fit version com.google.android.gms:play-services-fitness:20.0.0, all read scopes are restricted and will require completing Google’s sensitive scope verification or restricted scope verification and security assessment to retrieve data. Please see Google's announcement for further details: https://developers.google.com/fit/improvements

Initialize

ValidicMobile.GoogleFit will be initialized at app startup and will immediately start listening for previously subscribed data types. It is recommended that you set listeners on the ValidicMobile.GoogleFit events during your onDeviceReady() method:

onDeviceReady {
    document.addListener('validic:googlefit:onrecords',(summary)=>{
        console.log("Proccessed Google Fit Data");
        console.log(summary);
    });
    document.addListener('validic:googlefit:onerror', (callback)=>{
        console.warn(callback.error);
    });

Request Permissions

Before collecting any data from Google Fit, a Google Account must be associated with the ValididMobile.GoogleFit instance, and the end user must authorize the app to collect data on their behalf.

Check previously granted permissions

To check if permissions have already been granted the hasPermissions(dataTypes) method can be used:

ValidicMobile.GoogleFit.hasPermissions(["com.google.step_count.delta"], function(permissions){
        if(permissions["com.google.step_count.delta"]){
            ValidicMobile.GoogleFit.subscribe(["com.google.step_count.delta"], function(){
                console.log("Subscribed to steps")
            
             });
        }
})

The callback returned from hasDataAccess(dataTypes) associates a DataType with true, if a valid Google account exists and permission has previously been granted, or false otherwise.

Request new permissions

To request permission from the end user to authorize data collection the requestPermissions(dataTypes) function can be used to authorize your application

 ValidicMobile.GoogleFit.requestPermissions(["com.google.step_count.delta"], function(permissions){
         if(permissions["com.google.step_count.delta"]){
             ValidicMobile.GoogleFit.subscribe(["com.google.step_count.delta"], function(){
                 console.log("Subscribed to steps")
                 document.getElementById("echo_log").innerHTML += "\nSubscribed to steps\n"
             });
         }
     }, 
     function(error){
         console.log(error)
     }
 )

Android 10

For the Android client Apps that target API 28 the permission below is required in the AndroidManifest.xml. The Validic SDK will add this permission to its manifest so that it will be merged with the client when they add our library to their application.

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

This permission is required to subscribe to the following data types:

  • com.google.step_count.delta
  • com.google.step_count.cumulative
  • com.google.step_count.cadence
  • com.google.activity.segment
  • com.google.activity.exercise

For apps targeting Android 10, this permission must be requested from the user at runtime

    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACTIVITY_RECOGNITION)
              != PackageManager.PERMISSION_GRANTED) {
          // Permission is not granted
    }

    ActivityCompat.requestPermissions(thisActivity,
                      arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
                      MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);

Manage subscriptions

After Permissions have been granted for a DataType the ValidicMobile.GoogleFit can be used to add subscriptions to data change events from Google Fit. Data will automatically be queued for submission to the Validic API when internet is available on the device.

     ValidicMobile.GoogleFit.subscribe([ValidicMobile.GoogleFit.DataType.STEP_COUNT], function(){
         console.log("Subscribing to steps")
     });

To unregister from receiving data update events use ValidicMobile.GoogleFit.unsubscribe() to unsubscribe

     ValidicMobile.GoogleFit.unsubscribe(ValidicMobile.GoogleFit.DataType.STEP_COUNT);

Get a list of currently subscribed DataTypes

 ValidicMobile.GoogleFit.subscriptions(function(dataTypes){
        console.log(dataTypes)
    })

Currently supported DataTypes

Available DataTypes can be referenced from the ValidicMobile.GoogleFit.datatype

  • STEP_COUNT
  • WEIGHT
  • HEART_RATE
  • CALORIES_EXPENDED
  • MOVE_MINUTES
  • DISTANCE
  • NUTRITION

Records collected are automatically submitted to the Validic Inform API and a summary of records processed will be sent as an event named validic:googlefit:onrecords.

For an example of setting a listener see Initialize.

Historical Fetch

Validic provides the ability to query up to 180 days of data for a subset of data types provided by Google Fit by querying for a HistoryType

  • ValidicMobile.GoogleFit.HistoryType.SUMMARY - Summary record data including steps, distance and calories burned
    ValidicMobile.GoogleFit.fetchHistory(ValidicMobile.GoogleFit.HistoryType.SUMMARY)

To fetch a range of days of historical data, create a HistoryOptions object and pass it as an argument.

        //fetch the last 30 days of data
        const start = new Date();
        const end = new Date();
        start.setDate(end.getDate() - 29);
        ValidicMobile.GoogleFit.fetchHistory(
            {
                historyTypes: [ValidicMobile.GoogleFit.HistoryType.SUMMARY],
                from: start,
                to: end
            }
        );

This will fire a document event with a summary of records gathered that can be registered for

    document.regsiterListener("validic:googlefit:onrecords", function(summary){
        // summary is a dictionary of how many of each record type were processed
        console.log(summary)

    })

Logout

To remove all subscriptions and log an end user out simply call

ValidicGoogleFit.disconnect()

Samsung Health


❗️

Approval Required

The Samsung Health integration requires pre-approval for Samsung's Device SDK.

Currently, Samsung is going through an update to better support their partners and, for that reason, they are not accepting applications for the Partner Apps Program. We will keep this section up to date as we hear any updates from the Samsung team.

The Validic Mobile library provides a simple way to read and upload data from S Health to Validic. Through ValidicMobile.SHealth you can subscribe to specific Samsung Health data types and automatically upload them to Validic in the background as new data is recorded.

Requirements

  • Cordova 6.3 and above
  • cordova-android >= 7.0.0
  • validic-cordova-session plugin
  • samsung-health-data-1.5.0.aar downloaded from Samsung Health

Installation

From the root directory of your application add the plugin to the app with a variable defining the location of the samsung health dependency

cordova plugin add <location of plugin> --variable SHEALTH_DEPENDENCY=<path to samsung health aar>

Developer mode

In order to test, you must enable developer mode in the Samsung Health app on your phone. For instructions on how to enable developer mode please see Samsung's website: https://developer.samsung.com/health/android/data/guide/dev-mode.html

Note: Starting with Samsung Health app version 6.11.0.061 (released August 2020), in order to gain access to Samsung Health data, with or without developer mode enabled, you must first be approved by Samsung and receive a Samsung dev access key.

Prior versions of the Samsung Health app do not require the dev access key when the Samsung Health app is in developer mode.

Check Samsung Health support

Samsung Health is only available if Samsung Health is installed on the device and the Samsung Health SDK Jar is available in the project. To check if both of these are true call:

ValidicMobile.SHealth.isSHealthAvailable(function(response) {
    if (response.isAvailable) {
        // Samsung Health is available
    } else {
        // Samsung Health is not available log error
        console.log(response.error);
    }   
});

Note: Calling a “ValidicMobile.SHealth’ function when Samsung Health is not available will fail and pass the error through the callback.

Manage subscriptions

Samsung provides several data types that can be subscribed to for notification when data changes.

The available data types are:

  • com.samsung.health.blood_glucose
  • com.samsung.health.blood_pressure
  • com.samsung.health.body_temperature
  • com.samsung.health.caffeine_intake
  • com.samsung.health.exercise
  • com.samsung.health.hba1c
  • com.samsung.health.heart_rate
  • com.samsung.health.oxygen_saturation
  • com.samsung.health.sleep
  • com.samsung.health.sleep_stage
  • com.samsung.health.uv_exposure
  • com.samsung.health.water_intake
  • com.samsung.health.weight
  • com.samsung.shealth.step_daily_trend

NOTE: Data types that are going to be used in your application must be added to the AndroidManifest.xml. It is recommended to not manually edit the AndroidManifest.xml directly. It could possibly be overwritten during the Cordova build process. As of Cordova version 6.3.0 it is possible to modify the AndroidManifest.xml file using the <config-file> tag from Cordova

Example

config.xml

    <platform name="android">
        <allow-intent href="market:*"/>
        <config-file parent="./application" target="AndroidManifest.xml">
            <meta-data android:name="com.samsung.android.health.platform_type" android:value="rel"/>
            <meta-data android:name="com.samsung.android.health.permission.read"
                       android:value="com.samsung.health.blood_glucose;com.samsung.health.exercise"/>
        </config-file>
    </platform>

Subscription Sets

Data types are grouped into logical sets, ValidicMobile.SHealth.SubscriptionSet is an Enum that groups several data types together to register for related data types. The available subscription sets are:

  • ROUTINE - Daily step data
    • com.samsung.shealth.step_daily_trend
  • DIABETES - Blood glucose and hba1c data
    • com.samsung.health.blood_glucose
    • com.samsung.health.hba1c
  • WEIGHT - Weight and height data
    • com.samsung.health.weight
  • FITNESS - Exercise data
    • com.samsung.health.exercise
  • SLEEP - Sleep and sleep stage data
    • com.samsung.health.sleep
    • com.samsung.health.sleep_stage
  • NUTRITION - Food and nutrition data
    • com.samsung.health.nutrition
    • com.samsung.health.caffeine_intake
    • com.samsung.health.water_intake
  • BLOOD_PRESSURE - Blood pressure data
    • com.samsung.health.blood_pressure

The group of data types for each subscription set can be found using:

    ValidicMobile.SHealth.getSubscriptionsFromSet(ValidicMobile.SHealth.SubscriptionSet.FITNESS);

Subscribe to data types

Current subscriptions will automatically be restarted inside your application’s initialization.

Data types can be subscribed to individually:

ValidicMobile.SHealth.addSubscriptions("com.samsung.health.exercise");

Or as part of a subscription set:

ValidicMobile.SHealth.addSubscriptionSets([ValidicMobile.SHealth.SubscriptionSet.NUTRITION]);

NOTE: Calling ValidicMobile.Session.endSession() will remove all Samsung Health subscriptions and stop listening for new data.

Historical Fetch

Validic provides the ability to query up to 180 days of historical data for a subset of data types provided by Samsung Health by querying
a group of SHealthSubscription.HistoricalSet

Currently 2 historical sets are available

  • ValidicMobile.SHealth.HistoricalSet.FITNESS - Exercise data
  • ValidicMobile.SHealth.HistoricalSet.ROUTINE - Step data

To Fetch up to 180 days of data in the past, create a HistoryOptions and add a from and to date range

const start = new Date();
const end = new Date();
start.setDate(end.getDate() - 29);
ValidicMobile.SHealth.fetchHistoricalSets({
    historicalSets:[ValidicMobile.SHealth.HistoricalSet.ROUTINE],
    from: start.toISOString(),
    to: end.toISOString()
})

After fetching data for all days requested an event will be emitted to listeners registered to the ValidicMobile.SHealth.EventName.ON_SHEALTH_HISTORY event.

Listener

To listen for events from Samsung Health an eventListener should be added to the window

window.addEventListener(ValidicMobile.SHealth.EventName.ON_SHEALTH_PERMISSIONS, function(event){
    // Samsung Health permissions have changed
});

window.addEventListener(ValidicMobile.SHealth.EventName.ON_SHEALTH_ERROR, function(event){
    // An error has occurred with Samsung Health
});

window.addEventListener(ValidicMobile.SHealth.EventName.ON_SHEALTH_RECORDS, function(event){
    // Validic has gathered records because of a data type subscription change
});

window.addEventListener(ValidicMobile.SHealth.EventName.ON_SHEALTH_HISTORY function(event){
    // Validic data has pulled historical records from Samsung Health
});

VitalSnap (OCR)


OCR provides the capability to obtain readings from devices without requiring Bluetooth, HealthKit, Google Fit, or Samsung Health integration.

Requirements

  • Cordova 6.3 and above
  • cordova-android >= 7.0.0
  • cordova-ios >= 4.4
  • validic-cordova-session plugin
  • validic-cordova-ocr plugin

Peripherals

Peripheral objects contain information regarding supported OCR peripherals. Several function calls are provided to retrieve one or more peripherals.

A peripheral object contains various properties to be displayed to the user:

  • Manufacturer - Manufacturer name.
  • Model - Model number.
  • PeripheralImageURL - URL for an image of the peripheral.
  • ID - Peripheral identifier.

Supported Peripherals

To retrieve a List of supported peripherals:

ValidicMobile.OCR.getSupportedPeripherals(function (response) {
    var peripherals = response.peripherals;
});

To retrieve a specific peripheral:

ValidicMobile.OCR.getPeripheral(3, function (response) {
    var peripheral = response.peripheral;
}, function (err) {
    alert(err.error);
});

Peripherals are grouped by type, such as thermometer, glucose, scale, etc. To retrieve an array of peripherals of a specific type, use the PeripheralType constants and invoke the following function:

ValidicMobile.OCR.getPeripheralsOfType(ValidicMobile.PeripheralType.THERMOMETER, function (response) {
    app.peripheral = response.peripheral;
}, function (err) {
    alert(err.error);
});

Note: OCR and BLE peripheral objects are similar yet different and are not interchangeable.

OCR read

To use OCR to scan a peripheral, the following call is provided:

ValidicMobile.OCR.read(app.peripheral.ID, successCallback, failCallback)

The ID parameter is the ID property from the OCR peripheral object. The successCallback is passed an object containing the generated record in the record property. The image which was recognized is also returned in the image property as a base64 encoded string.

The following snippet initiates a OCR read. On success the image is displayed and record submitted. On failure the error is displayed.

var success = function (obj) {
    var record = obj.record;
    if (obj.hasOwnProperty("image")) {
        document.getElementById("ocrImage").setAttribute("src", "data:image/png;base64," + obj.image);
    }
    var r = confirm("Would you like to submit a blood glucose of " + record.blood_glucose + "mg/dL");
    if (r) {
        ValidicMobile.Session.submitRecord(record, obj.image, function (obj) {
            console.log("Record was added to the processing queue");
        }, function (obj) {
            console.log("Record was not added to queue");
        });
    }
};
/**
 * Failure callback function. This indicates a failure by Validic to take a reading from the device. This could be due to
 * a timeout or for denying permissions for using the camera. Each failure callback e, has the form({peripheralId: 3, error: "..."}
 * @param e
 */
var fail = function (e) {
    alert(e.error);
};
ValidicMobile.OCR.read(app.ocrPeripheral.ID, success, fail); // 3

Runtime unit selection

For any glucose meter in our lineup of supported meters, you can now specify mmol/l or mg/dL at runtime for a given reading. If no unit is provided, mg/dL is assumed.

For the Zewa 11110 thermometer, you can specify Celsius or Fahrenheit at runtime for a given reading. If no unit is provided, Fahrenheit is assumed.

Example:

ValidicMobile.OCR.readWithGlucoseUnit(3, ValidicMobile.GlucoseUnits.MMOLL, success, fail); // Start reading a mmol/L one touch