HyperTrackDocs

[DEPRECATED] Views SDK

Deprecated reference for the legacy HyperTrack Views SDK (Android and iOS).

The Views SDK is deprecated. For real-time updates, use Webhook Payloads instead.

Android

Android Views are implemented using GraphQL subscriptions and enable server-to-client communication without the need to integrate Webhooks on the backend.

The module handles websockets and provides easy-to-consume methods to retrieve device status and subscribe to programmatic notifications about key moments in the movement tracking of devices and trips, as they happen.

This reference shows methods available in the Android Views module. You can also review the generated JavaDoc files.

Get device status

// Get SDK instance with Context reference
// replace <PUBLISHABLE_KEY> with your own key
HyperTrackViews hypertrackView = HyperTrackViews.getInstance(this, <PUBLISHABLE_KEY>);

// replace <DEVICE_ID> with your device ID
hypertrackView.getDeviceMovementStatus(<DEVICE_ID>,
    new Consumer<MovementStatus>() {
        @Override
        public void accept(MovementStatus movementStatus) {
            Log.d(TAG, "Got movement status data " + movementStatus);
        }
    });
val hyperTrackView = HyperTrackViews.getInstance(this, PUBLISHABLE_KEY)
        hyperTrackView.getDeviceMovementStatus(DEVICE_ID)
        {Log.d(TAG, "Got movement status $it")}

Get device information by device ID. The callback receives a MovementStatus object describing the device.

Movement Status

The device movement status object encapsulates all data associated with a device. It provides the latest snapshot of the device state, including:

  • Device location, including coordinates, speed, altitude, bearing, accuracy, and timestamp of record
  • Device status, including activity and timestamp of record
  • Battery information, can be one of BATTERY_CHARGING, BATTERY_LOW, and BATTERY_NORMAL
  • General device information
  • Share and embed view URLs associated with the device
  • Trips associated with the device
Location Object
Location location = movementStatus.location;
if (location != null) {
  Log.d(TAG, "Got device location " + location +
  " with latitude " + location.getLatitude() +
  " and longitude " + location.getLongitude());
}
val location = movementStatus?.location
location?.let {
  Log.d(TAG, "Got device location $location " +
          "with latitude ${location.latitude}" +
          "and longitude ${location.longitude}")
Accessor methodTypeDescription
getLatitude()doubleLatitude in degrees. Negatives are for southern hemisphere.
getLongitude()doubleLongitude in degrees. Negatives are for western hemisphere.
getAltitude()DoubleAltitude in m. Could be null, if value is not available.
getSpeed()DoubleSpeed in m/s. Could be null, if device is stationary
getBearing()DoubleBearing in degrees starting at due north and continuing clockwise around the compass
getAccuracy()DoubleHorizontal accuracy in m
getRecordedAt()StringISO 8601 date when the location was recorded
Device Status Object
DeviceStatus status = movementStatus.deviceStatus;
if (status != null) {
  Log.d(TAG, "Device is " + (status.isDisconnected() ? "disconnected" : "connected"));
}
val status = movementStatus?.deviceStatus
status?.let {
    Log.d(TAG, "Device is ${(if (status.isDisconnected) "disconnected"  else "connected")}")
}
MemberTypeDescription
createdAtStringISO 8601 date when the device status was created
isActive()booleanReturns true if device is active (its current location is known and updated) and false otherwise
isDisconnected()booleanReturns true if device is disconnected (its location wasn't updated for a while) and false otherwise
isInactive()booleanReturns true if tracking data is unavailable because of lack of permissions or tracking was stopped intentionally and false otherwise
statusintProvides a more extended description of current state, e.g. whether it is driving, if active, etc.
Device Info Properties
DeviceInfo deviceInfo = movementStatus.deviceInfo;
if (deviceInfo != null) {
    Log.d(TAG, "Got status for device " + deviceInfo.name);
}
val deviceInfo = movementStatus?.deviceInfo
deviceInfo?.let {
    Log.d(TAG, "Status from device ${deviceInfo.name}")
}
ParameterTypeDescription
appNameStringName of the hosting app
appVersionNumberStringVersion of the hosting app
appVersionStringStringVersion of the hosting app
deviceBrandStringThe device brand
deviceModelStringThe device model
nameStringThe name of the device
osNameStringThe operating system of the device, can be one of iOS or Android
osVersionStringThe version of the operating system on the device
sdkVersionStringThe HyperTrack SDK version on the device
DeviceViewUrls Properties

This object encapsulates resources that could be used to open a WebView Widget (embedded view) or for sharing location via link.

    String shareUrl = movementStatus.deviceViewUrls.embedUrl;
    Uri uri = Uri.parse(shareUrl + PUBLISHABLE_KEY);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
    val shareUrl = movementStatus.deviceViewUrls.embedUrl
    val uri = Uri.parse(shareUrl!! + PUBLISHABLE_KEY)
    val intent = Intent(Intent.ACTION_VIEW, uri)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(uri)
    }
ParameterTypeDescription
embedUrlStringEmbeddable view URL
shareUrlStringSharable view URL
Trip Properties
Trip{
    tripId="3737e382-b251-11e9-a7f6-f6b591671d93",
    startedAt="2019-07-29T22:35:49.963554Z",
    completedAt="",
    status="active",
    destination=Destination{
        geometry=Geometry{
            coordinates=[-122.437941, 37.800563]
        },
        radius=30,
        scheduledAt=""
    },
    estimate=Estimate{ ... },
    metadata="",
    summary=""
}
MethodTypeDescription
getTripId()StringUnique identifier of the newly created trip, case sensitive
getStatus()StringTrip status, can be either active or completed
getStartedAt()StringTimestamp for trip starting time
getMetadata()StringMetadata provided at trip start
getSummary()StringTrip summary, only provided upon completion of a trip
getDestination()Trip.DestinationDestination of the trip, or null if trip has no destination
getEstimate()Trip.EstimateTrip summary, only provided for trips with status active
getCompletedAt()StringISO 8601 date when the trip was completed
Trip Estimate Properties
Estimate{
    arriveAt="",
    route=Route{ ... }
}
MethodTypeDescription
getArriveAt()StringTimestamp for estimated arrival
getRoute()Trip.RoutePlanned route segments to destination
Trip Route Properties
Route{
    distance=210,
    duration=1720,
    startAddress="1 Embarcadero Center, San Francisco, CA, 94122",
    endAddress="353 Sacramento St, San Francisco, CA, 94122",
    polyline=Polyline{ ... }
}
MethodTypeDescription
getDistance()IntegerDistance in meters
getDuration()IntegerDuration in seconds
getStartAddress()StringStreet address lookup for segment start
getEndAddress()StringStreet address lookup for segment end
getPoints()List of List of DoublePlanned route segments to destination, as array of longitude, latitude and altitude (optional) tuples
Trip Destination Properties
Destination{
    geometry=Geometry{ ... },
    radius=30,
    scheduledAt="2019-07-29T22:35:49.963554Z"
}
MethodTypeDescription
getLatitude()DoubleLatitude coordinate of destination center point in degrees. Negatives are for southern hemisphere
getLongitude()DoubleLongitude coordinate of destination center point in degrees. Negatives are for western hemisphere
getRadius()IntegerRadius (in meters) of a circular trip destination
getScheduledAt()StringTimestamp for scheduled arrival

Subscribe to updates

// Get SDK instance with Context reference
// replace <PUBLISHABLE_KEY> with your own key
HyperTrackViews hypertrackView = HyperTrackViews.getInstance(this, <PUBLISHABLE_KEY>);

// replace <DEVICE_ID> with your device ID
hypertrackView.subscribeToDeviceUpdates(<DEVICE_ID>,
   new DeviceUpdatesHandler() {
       @Override
       public void onLocationUpdateReceived(@NonNull Location location) {
           Log.d(TAG, "onLocationUpdateReceived: " + location);
       }

       @Override
       public void onBatteryStateUpdateReceived(@BatteryState int i) {
           Log.d(TAG, "onBatteryStateUpdateReceived: " + i);
       }

       @Override
       public void onStatusUpdateReceived(@NonNull StatusUpdate statusUpdate) {
           Log.d(TAG, "onStatusUpdateReceived: " + statusUpdate);
       }

       @Override
       public void onTripUpdateReceived(@NonNull Trip trip) {
           Log.d(TAG, "onTripUpdateReceived: " + trip);
       }

       @Override
       public void onError(Exception e, String deviceId) {
           Log.w(TAG, "onError: ", e);
       }

       @Override
       public void onCompleted(String deviceId) {
           Log.d(TAG, "onCompleted: " + deviceId);
       }
   }
);

You can subscribe to receive device state changes as they come in. The DeviceUpdatesHandler should implement and override the following interface methods:

MethodParameterDescription
onLocationUpdateReceivedLocationLocation update
onBatteryStateUpdateReceivedBatteryStateBattery update, can be one of BATTERY_CHARGING, BATTERY_LOW, and BATTERY_NORMAL
onStatusUpdateReceivedStatusUpdateStatus update
onTripUpdateReceivedTripTrip update
onErrorException, Device ID (String)Error with exception details and device ID
onCompletedDevice ID (String)Completion with Device ID

StatusUpdate Properties

StatusUpdate{
    value="WALK",
    hint="",
    recordedAt="2019-07-29T22:35:49.963554Z"
}
ParameterTypeDescription
valueStringHealth event type, can be one of DRIVE, STOP, or WALK
hintStringHealth hint. Additional information about the health event
recordedAtStringISO 8601 date when the device status was recorded

Unsubscribe from updates

You can unsubscribe from all the updates that you are subscribed to using the below method:

MethodParameterDescription
stopAllUpdatesvoidStops all the updates that were scheduled for this SDK instance.
hypertrackView.stopAllUpdates();

Make sure you call this method once you're done in order to free up network resource handles. Otherwise, you might end up with leaked websockets.

iOS

iOS Views SDK Reference