Views SDK


For the following chapter, please select Java to see relevant sample code on the right side.

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
    new Consumer<MovementStatus>() {
        public void accept(MovementStatus movementStatus) {
            Log.d(TAG, "Got movement status data " + movementStatus);
val hyperTrackView = HyperTrackViews.getInstance(this, PUBLISHABLE_KEY)
        {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, similar to the Device API. 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")}")
createdAtStringISO 8601 date when the device status was created
isActive()booleanReturns true if device is active (it's current location is known and updated) and false otherwise
isDisconnected()booleanReturns true if device is disconnected (it's 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
statusintProperty provides more extended description of current state, e.g. whether it it is driving, if active, etc. See JavaDoc for the list of possible values and their meaning.
Device Info Properties
DeviceInfo deviceInfo = movementStatus.deviceInfo;
if (deviceInfo != null) {
    Log.d(TAG, "Got status for device " +;
val deviceInfo = movementStatus?.deviceInfo
deviceInfo?.let {
    Log.d(TAG, "Status from device ${}")
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. Can be reviewed here: Android, iOS, React Native
DeviceViewUrls Properties

This object incapsulates resources that could be used to open 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) {
    val shareUrl = movementStatus.deviceViewUrls.embedUrl
    val uri = Uri.parse(shareUrl!! + PUBLISHABLE_KEY)
    val intent = Intent(Intent.ACTION_VIEW, uri)
    if (intent.resolveActivity(packageManager) != null) {
embedUrlStringEmbeddable view URL
shareUrlStringSharable view URL
Trip Properties
            coordinates=[-122.437941, 37.800563]
    estimate=Estimate{ ... },
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 trips was completed or null if it haven't been completed
Trip Estimate Properties
    route=Route{ ... }
getArriveAt()StringTimestamp for estimated arrival
getRoute()Trip.RoutePlanned route segments to destination
Trip Route Properties
    startAddress="1 Embarcadero Center, San Francisco, CA, 94122",
    endAddress="353 Sacramento St, San Francisco, CA, 94122",
    polyline=Polyline{ ... }
getDistance()IntegerTimestamp for estimated arrival
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
    geometry=Geometry{ ... },
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
   new DeviceUpdatesHandler() {
       public void onLocationUpdateReceived(@NonNull Location location) {
           Log.d(TAG, "onLocationUpdateReceived: " + location);

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

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

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

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

       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:

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

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 below method:

stopAllUpdatesvoidStops all the updates, that were scheduled for this SDK instance.
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 Views SDK Reference

Refer to the integration guide for additional details.

Device Status

A device is either active or inactive at any given time.


Location and activity data is tracking as expected.


Location or activity data are not tracking. Error codes for reasons are documented in this section.

See this example how Device API provides insight into device outage status. Also, see this example how you can use a webhook payload device status update to help you receive outage codes and act on them.


HyperTrack platform is unable to sync with the device.

HyperTrack is a cloud platform to track ground truth of the device. There are times when the platform goes out of sync with the device. If and when the connection between device and platform is restored, the platform syncs up offline data and updates it for consumption in the cloud.

In the event that the device never returns to sync with the platform (can happen when device is lost or app is uninstalled), the device status will remain disconnected.

Impact: Business intends to track this device and the device has lost connection with the HyperTrack platform. Reviewing and deleting devices that are disconnected for an extended period is recommended.

To understand how tracking status is defined and used in HyperTrack API, please refer to the following: