glympse client sdk overview

42
Client API Technology Behind Glympse-enabled Applications Copyright (c) 2016 Glympse, Inc. All Rights Reserved. Patents Pending Egor Pushkin [email protected] Chief Architect Glympse, Inc.

Upload: egor-pushkin

Post on 12-Feb-2017

954 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Glympse Client SDK Overview

Client APITechnology Behind

Glympse-enabled Applications

Copyright (c) 2016 Glympse, Inc.All Rights Reserved. Patents Pending

Egor [email protected]

Chief ArchitectGlympse, Inc.

Page 2: Glympse Client SDK Overview

Partners

http://www.glympse.com/partners

Page 3: Glympse Client SDK Overview

Applications

Street Pilot

App Radio

Verizon Messages

for

HERE for

Page 4: Glympse Client SDK Overview

Terminology

Client API / API / Library / Platformclass library encapsulating Glympse related functionality

Client Application / Host Application / Application3rd party Glympse-enabled application

Device / Phoneany device supported by Glympse API

Glympse Services / REST API / ServerGlympse cloud services

Glympse / TicketA location sharing activity on the system…

Glympse © 2016All Rights Reserved

Page 5: Glympse Client SDK Overview

Send a GlympseView a GlympseGlympse RequestGlympse Groups "!"

Fundamental Features

Glympse

Glympse

Request

Glympse !Group

Sender Viewer

Requester

Viewer Sender

Requestee

Group Members

Group Followers

Glymps

e

Glym

pse

Gly

mps

e

Glympse © 2016All Rights Reserved

Page 6: Glympse Client SDK Overview

API Highlights

Extreme Level of PortabilityCommon code base is shared across C++/Java/C#

Supported Mobile PlatformsAndroid, iOS, BlackBerry 10, Windows Phone 8

Common Public Interface and DocumentationPublic interfaces of all exposed objects are identical across all platformsProgramming paradigms and patterns are identical across all platforms

Component-oriented Architecture API functionality is splitted into independent components, which makes it extremely easy to extend and maintain library feature set

Highly CustomizableMost aspects of library behavior are configurable both locally and globally

Glympse © 2016All Rights Reserved

Page 7: Glympse Client SDK Overview

High-Level ViewGlympse API

Public Interface

Concurrency

Mutex, Semaphore, Thread, Event Thread, Timer, Handler

Core

Strings, Containers

Images

NetworkingStorage

Files, Cache, Keychain

GPS

Location, Proximity

Battery Messaging

Provider, Receiver

Contacts CalendarDebug

Device Info, Crash Reporting, Logging

HAL

Glympse Business

Logic

Config

Server Interaction

JSON Parser

Image Cache

Contacts Manager

External Services

Glympse REST API

Search, Directions

Groups Manager

User Manager

History Manager

Battery Manager

Accounts Manager

Network Manager

Location Manager

Social Manager

Directions Manager

Notification Center

Glympse Facade

Portable Code

Glympse © 2016All Rights Reserved

Page 8: Glympse Client SDK Overview

Object Model

Glympse

User Manager User Ticket

History Manager

Place

Message

InviteGroup Manager

Image

Network Manager

Track

Social Manager

Network Transport Layer,Device APIs (location, persistence, etc.)

Applications,Extensions

Battery Manager

Glympse © 2016All Rights Reserved

Page 9: Glympse Client SDK Overview

Listener

Eventing ModelSink

IEventSink IEventListener

1 *

Sink interfacesIGlympseINetworkManagerILocationManagerIBatteryManagerIUserITicketIImage

Event properties- Glympse platform instance- Listener type- Events mask- Parameter object

event

Glympse

User Manager

User

Ticket

Listener

GE::LISTENER_PLATFORMGE::PLATFORM_USER_ADDEDIUser

GE::LISTENER_USERGE::USER_ACTIVE_TICKET_CHANGEDIUser GE::LISTENER_TICKET

GE::TICKET_TRACK_CHANGEDITicket

2

1

3

Glympse © 2016All Rights Reserved

Page 10: Glympse Client SDK Overview

Glympse

User Manager

User

Location Manager

Battery Manager

Network Manager

Major Events

Ticket

GE::TICKET_FIRST_VIEWED GE::TICKET_DURATION_CHANGED GE::TICKET_MESSAGE_CHANGED GE::TICKET_DESTINATION_CHANGEDGE::TICKET_TRACK_CHANGED GE::TICKET_ETA_CHANGED GE::TICKET_ROUTE_CHANGED GE::TICKET_DATA_APPENDED GE::TICKET_DATA_CLEAREDGE::TICKET_EXPIRED GE::TICKET_COMPLETED GE::TICKET_INVALID_CODE

GE::LISTENER_TICKET

GE::USER_NICKNAME_CHANGED GE::USER_ACTIVE_TICKET_RESIGNING GE::USER_ACTIVE_TICKET_CHANGED GE::USER_TICKET_ADDED GE::USER_TICKET_REMOVED

GE::LISTENER_USER

History Manager

Ticket

Image

GE::IMAGE_CHANGED

GE::LISTENER_IMAGE

GE::NETWORK_START_FAILING GE::NETWORK_RECOVERED

GE::LISTENER_NETWORK

GE::BATTERY_STATE_CHANGED

GE::LISTENER_BATTERY

GE::LOCATION_STATE_CHANGED GE::LOCATION_REGION_ENTEREDGE::LOCATION_REGION_LEFTGE::LOCATION_PROFILE_CHANGED

GE::LISTENER_LOCATION

GE::PLATFORM_ACCOUNT_CREATEDGE::PLATFORM_ACCOUNT_CREATE_FAILEDGE::PLATFORM_LOGIN_SUCCEEDEDGE::PLATFORM_LOGIN_FAILEDGE::PLATFORM_SESSION_FAILEDGE::PLATFORM_FIRST_LAUNCHGE::PLATFORM_STARTED GE::PLATFORM_STOPPED GE::PLATFORM_SYNCED_WITH_SERVERGE::PLATFORM_RATE_LIMITEDGE::PLATFORM_LOCATION

GE::LISTENER_PLATFORM

GE::PLATFORM_USER_ADDED GE::PLATFORM_USER_REMOVED GE::PLATFORM_USER_CHANGED GE::PLATFORM_USER_LIST_REORDERED GE::PLATFORM_TICKET_ADDED GE::PLATFORM_TICKET_REMOVED GE::PLATFORM_TICKET_CHANGED GE::PLATFORM_TICKET_LIST_REORDERED GE::PLATFORM_TICKET_ARRIVED GE::PLATFORM_INVITE_TICKET GE::PLATFORM_INVITE_REQUEST

GE::TICKET_CREATED GE::TICKET_DURATION_CHANGED GE::TICKET_MESSAGE_CHANGED

GE::TICKET_DESTINATION_CHANGEDGE::TICKET_TRACK_CHANGED

GE::TICKET_ETA_CHANGED GE::TICKET_ROUTE_CHANGED

GE::TICKET_ARRIVED GE::TICKET_INVITE_CREATED

GE::TICKET_INVITE_SENT GE::TICKET_INVITE_UPDATED GE::TICKET_INVITE_REMOVED GE::TICKET_INVITE_FAILED

GE::TICKET_FAILED GE::TICKET_EXPIRED

GE::TICKET_COMPLETED

GE::LISTENER_TICKET

Linked Accounts Manager

GE::ACCOUNT_LINK_SUCCEEDED GE::ACCOUNT_LINK_FAILED

GE::ACCOUNT_UNLINK_SUCCEEDED GE::ACCOUNT_UNLINK_FAILED

GE::ACCOUNT_REFRESH_SUCCEEDED GE::ACCOUNT_REFRESH_FAILED

GE::ACCOUNT_LIST_REFRESH_SUCCEEDED GE::ACCOUNT_LIST_REFRESH_FAILED

GE::LISTENER_LINKED_ACCOUNTS

Glympse © 2016All Rights Reserved

Page 11: Glympse Client SDK Overview

Federated Login

Glympse Server

3rd-party Service

GlympseClient API

if ( !glympse.hasUserAccount() ){ GPrimitive profile = GlympseFactory. createFacebookAccountProfile(token); glympse.login(profile);}

Login using 3rd-party account profile

f / t

Acquire 3rd-party [oAuth] token

1

Pass token to Glympse API

2

Create/get user account associated

with the token3

Validate the token and extract user identifier

4

Respond with status and requested details

5Internal account lookup based on user ID in 3rd party service

6

Glympse user identity in the form of Glympse user ID and long-lived Glympse token

7

Access token

Glympse © 2016All Rights Reserved

Page 12: Glympse Client SDK Overview

API Lifecycle

NOT STARTED

STOPPED

ACTIVE NOT ACTIVE

IGlympse::start()

IGlympse::stop()IGlympse::stop()

IGlympse::setActive(false)

IGlympse::setActive(true)

GLYGlympse* glympse = [[GLYGlympse alloc]

initWitServer:@”SERVER BASE URL” andApiKey:@"API KEY"];

[glympse raw]->start();

Instantiate and start Glympse platform

Major platform states

Glympse © 2016All Rights Reserved

Page 13: Glympse Client SDK Overview

User Profile

GUser user = [glympse raw]->getUserManager()->getSelf();

GString nickname = CoreFactory::createString(“Sylvia”);

UIImage* avatarImage = [UIImage imageNamed:@"sylvia.jpg"];

GDrawable avatar = [GLYGlympse createDrawable:avatarImage];

user->modify(nickname, avatar);

Set user nickname and avatar

Local properties (persisted on device)- API configuration- Incoming tickets- Public groups- Social tokens- Favorites- Recents

Global properties (synced with server)- Account credentials- Nickname- Avatar- Outgoing tickets

Glympse © 2016All Rights Reserved

Page 14: Glympse Client SDK Overview

Ticket Lifecycle

Sender

Ticket lifetime

Invite 1 lifetime

Invite 2 lifetime

Ticket always expires naturally. No special data is sent from server to viewers upon expiration.

Create ticket

Create another invite

Create invite

Timeline

12

3

Viewer 1

Viewer 2

Ticket duration

Pull updates

Pull updates

Viewer can only access ticket data within a window bounded by invite creation time and ticket expiration time (or invite removal time).

Glympse © 2016All Rights Reserved

Page 15: Glympse Client SDK Overview

Ticket Creation

Ticket

Invite

GlympseServer

Viewer

Sender

Create ticket1

Upload locations and data

5

Create invite(s)2

XXX-XXX

Send invite overemail, sms or PUSH3.1

Send invite oversms3.2

Pull updates4

Only one of 3.1 and 3.2 actually takes place.4 and 5 go in parallel.

Glympse in the Cloud

Glympse © 2016All Rights Reserved

Page 16: Glympse Client SDK Overview

Send a Ticket

GTicket ticket = GlympseFactory::createTicket(

3600000, CoreFactory::createString("Going home!"), NULL);

1. Create ticket object

GGlympse glympse = ...;

glympse->sendTicket(ticket);

GInvite invite = GlympseFactory::createInvite(

GC::INVITE_TYPE_EMAIL,

CoreFactory::createString(“Sylvia”),

CoreFactory::createString(“[email protected]”));

ticket->addInvite(invite);

2. Create and add invite

3. Send a ticket

Glympse © 2016All Rights Reserved

Page 17: Glympse Client SDK Overview

Supported Services

FacebookTwitterEvernote

Social Integration

GPrimitive profile = GlympseFactory::createFacebookAccountProfile(...);glympse->getLinkedAccountsManager()->link( GC::LINKED_ACCOUNT_TYPE_FACEBOOK(), profile);

GInvite invite = GlympseFactory::createInvite( GC::INVITE_TYPE_FACEBOOK, NULL, NULL);

2. Create ticket invite

1. Link required 3rd-party account (if not yet linked)

ticket->addInvite(invite);glympse->sendTicket(ticket);

3. Send a ticket Glympse Server

Facebook Graph API

Glympse © 2016All Rights Reserved

Page 18: Glympse Client SDK Overview

Expire On Arrival

GConfig config = glympse->getConfig();

config->setExpireOnArrival(GC::EXPIRE_ON_ARRIVAL_AUTO);

Modify global XoA preference

Ticket

Proximity Provider

Glympse

Location Manager

History Manager

GE::PLATFORM_TICKET_ARRIVED

GE::LISTENER_PLATFORM

GE::TICKET_ARRIVED

GE::LISTENER_TICKET

5

Proximity event (region entered)1

Proximity notificationGE::LOCATION_REGION_ENTERED2

Expire ticket. This only happens in GC::EXPIRE_ON_ARRIVAL_AUTO mode. 3

4

Mechanism above is only involved in GC::EXPIRE_ON_ARRIVAL_AUTO and GC::EXPIRE_ON_ARRIVAL_PROMPT modes.

Glympse © 2016All Rights Reserved

Page 19: Glympse Client SDK Overview

Estimated Time of Arrival

Glympse API

Glympse Server

Directions Service

glympse->setEtaMode(GC::ETA_MODE_EXTERNAL);

Enable manual ETA mode (default)

Request ETA and predicted route n-1 Append new ETA

to the ticketn+1

ticket->updateEta(NEW ETA IN MILLISECONDS);

ticket->updateRoute(NEW ROUTE);

n. Update ETA/route for the ticket

Host ApplicationUpdate ETAn

It only makes sense to update ETA every 5 seconds or less, when user is moving OR each 30 otherwise.

As for the route, the updates should be even less frequent taking amount of data that needs to be sent into account.

Glympse © 2016All Rights Reserved

Page 20: Glympse Client SDK Overview

Estimated Time of Arrival

Glympse API

Create ticket with destination and start uploading locations

1

Glympse Server

Directions Service

glympse->setEtaMode(GC::ETA_MODE_INTERNAL);

Enable automatic ETA mode

Request ETA and predicted route

n

Append new ETA and route (optional) to the ticket

n+1

Ticket destination must be specified for Client APi to be able to calculate ETA automatically.

Steps n and n+1 are repeated periodically during ticket lifetime.

Host Application

iOS, Android Activity Recognition unit

orDevice activity is detected automatically by the OS

User's activity is determined by host application or explicitly specified by user

Glympse © 2016All Rights Reserved

Page 21: Glympse Client SDK Overview

Glympse Request Lifecycle

RequesteeRequester

Send ticket6

Create request- invite- duration- end time- message- destination

1

3 is potentially done by server. It depends on request delivery mechanism.

Glympse Server

Request codeXXX-XXX2

Send request inviteXXX-XXX3

Decode inviteXXX-XXX 4

Request details- invite- duration- message- destination

5

Invite points back to requester

Glympse © 2016All Rights Reserved

Page 22: Glympse Client SDK Overview

GInvite requestInvite = GlympseFactory:: createInvite(Glympse::GC::INVITE_TYPE_EMAIL,

Glympse::CoreFactory::createString(“Roger”),

Glympse::CoreFactory::createString(“ [email protected] ”));

requestInvite->setRequestTicket(requestTicket);

GInvite selfInvite = GlympseFactory:: createInvite(Glympse::GC::INVITE_TYPE_EMAIL,

Glympse::CoreFactory::createString(“Sylvia”),

Glympse::CoreFactory::createString(“sylvia @glympse.com ”));

requestTicket-> addInvite(selfInvite);

GTicket requestTicket = Glympse::GlympseFactory:: createTicket(3600000, NULL, NULL);

Request a Ticket

5. Send a request

1. Create ticket to be requested

2. Create invite pointing to requester (self user)

glympse->requestTicket(ticketContainer);

3. Create invite pointing to requestee

Sylvia requests a ticket from Roger

4. Create a container ticket

GTicket ticketContainer = Glympse::GlympseFactory::createTicket(0, NULL, NULL);ticketContainer->addInvite(requestInvite);

Glympse © 2016All Rights Reserved

Page 23: Glympse Client SDK Overview

Anatomy of Glympse Invite

https://glympse.com/XXXX-XXXXglympse:?XXXX-XXXX

Invite URIInvite types- Ticket invite- Request invite

Client delivery mechanisms (3)- SMS (most devices)- Facebook- Twitter- Share (Android devices)- Clipboard (Android devices)- Link (custom method)

Server delivery mechanisms (4)- Email- SMS (selective regions)- Glympse account- Facebook- Twitter- Group

SenderGlympse Server

Client side invite delivery3

Create invite of specific type1

Invite code and delivery status2

Receiver

Server side invite delivery 4

Delivery status update3.1

OR

Glympse server is always responsible for the generation of invite code, invite URI and even accompanying message text indifferently from invite type and delivery mechanism.

Glympse © 2016All Rights Reserved

Page 24: Glympse Client SDK Overview

IGlympse::decodeInvite(...) Supported decoding modes:GC::INVITE_MODE_DEFAULTGC::INVITE_MODE_PROMPT_BEFORE_VIEWING

1

Handling Invites

See where I am: https://glympse.com/XXX-XXX

glympse.enableSmsScraping(true);

Enable automatic SMS scraping (Android)

Host Application

Glympse API

Invite delivered overSMS/Email/Pushor user input

1Invite scraped from SMS

When invite code is scraped from SMS, Client API behaves as if IGlympse::decodeInvite is called in GC::INVITE_MODE_PROMPT_BEFORE_VIEWING mode

IGlympse::decodeInvite(...)IGlympse::openUrl(...)2

Glympse

Invite Sink

1.1 Returns

GE::INVITE_DECODED

OR GE::INVITE_INVALID_CODE

GE::LISTENER_INVITE3

GE::PLATFORM_INVITE_TICKET

OR GE::PLATFORM_INVITE_REQUEST

GE::LISTENER_PLATFORM2

GE::PLATFORM_INVITE_TICKET event is only spread in GC::INVITE_MODE_PROMPT_BEFORE_VIEWING mode

Glympse © 2016All Rights Reserved

Page 25: Glympse Client SDK Overview

View a GlympseThe following pattern of listening to object model events allows to keep track of all standalone incoming tickets

Glympse

User Manager

User

TicketGE::TICKET_FIRST_VIEWED GE::TICKET_DURATION_CHANGED GE::TICKET_MESSAGE_CHANGED GE::TICKET_DESTINATION_CHANGEDGE::TICKET_TRACK_CHANGED GE::TICKET_ETA_CHANGED GE::TICKET_ROUTE_CHANGED GE::TICKET_DATA_APPENDED GE::TICKET_EXPIRED GE::TICKET_INVALID_CODE

GE::LISTENER_TICKET

GE::USER_ACTIVE_TICKET_CHANGED GE::USER_TICKET_REMOVED

GE::LISTENER_USER

GE::PLATFORM_USER_ADDED GE::PLATFORM_USER_REMOVED

GE::LISTENER_PLATFORM

Subscribe on user eventsSubscribe on user's active ticket (if any)

Unsubscribe from user eventsUnsubscribe from user's active ticket (if any)

Subscribe events from new active ticket

Unsubscribe from ticket events

Handle ticket events in application specific manner

Glympse © 2016All Rights Reserved

Page 26: Glympse Client SDK Overview

Custom Ticket Properties

History Manager

Ticket

Glympse Server

User

TicketGE::TICKET_DATA_APPENDEDGE::TICKET_DATA_CLEARED

GE::LISTENER_TICKET

ITicket::appendData(...)

1

2

int32 partnerId = PARTNER ID;GString name = CoreFactory::createString("mood");GPrimitive value = CoreFactory::createPrimitive( CoreFactory::createString("good"));ticket->appendData(partnerId, name, value);

if ( GE::LISTENER_TICKET == listener ){ if ( 0 != ( events & GE::TICKET_DATA_APPENDED ) ) { GDataEvent data = (GDataEvent)object; for ( GDataRow property : data->getProperties() ) { GDataRow property = data->getProperties()->at(i); GString mood = property->getValue()->getString(); } }}

1. Appending property to ticket

2. Handling custom properties

Sender

Viewer

GTicket ticket = ...;int32 partnerId = PARTNER ID;GString name = CoreFactory::createString("mood");GPrimitive property = ticket->getProperty(partnerId, name);GString mood = property->getString();

Glympse © 2016All Rights Reserved

Page 27: Glympse Client SDK Overview

Public Group Concept

User

Group Manager

Ticket

Group Member

Group

Glympse

History Manager

Ticket

Invite

User Manager

GlympseServer

Group!group_name

type: GC::INVITE_TYPE_GROUPaddress: !group_name

Follower

Member

GE::LISTENER_GROUPS

GE::GROUPS_GROUP_ADDED GE::GROUPS_GROUP_REMOVED

GE::GROUP_FIRST_VIEWEDGE::GROUP_ORDER_CHANGEDGE::GROUP_MEMBER_ADDEDGE::GROUP_MEMBER_REMOVEDGE::GROUP_MEMBER_TICKET_RESIGNINGGE::GROUP_MEMBER_TICKET_CHANGEDGE::GROUP_INVALID_CODEGE::GROUP_FAILED

GE::LISTENER_GROUP

Glympse © 2016All Rights Reserved

Page 28: Glympse Client SDK Overview

Sending to a Group

GTicket ticket = GlympseFactory::createTicket(

3600000, CoreFactory::createString("Going home!"), NULL);

1. Create ticket object

GGlympse glympse = ...;

glympse->sendTicket(ticket);

GInvite invite = GlympseFactory::createInvite(

GC::INVITE_TYPE_GROUP, NULL,

CoreFactory::createString(“!GROUP_NAME”));

ticket->addInvite(invite);

2. Create and add invite

3. Send a ticket

Glympse © 2016All Rights Reserved

Page 29: Glympse Client SDK Overview

Following a Group

GGroupManager groupManager = glympse->getGroupManager();

groupManager->viewGroup(

CoreFactory::createString("!GROUP_NAME"));

Start following group via group name (starts with !)

glympse->openUrl(CoreFactory::createString(

"See where we are http://glympse.com/!GROUP_NAME"),

GC::INVITE_MODE_DEFAULT, NULL);

Start following group via message containing group URI

This method helps to avoid message processing and eventually leads to GGroupManager::viewGroup(...).

GConfig config = glympse->getConfig();

config->setAutoWatchPublicGroup(true);

Enable automatic watching

If this feature is enabled, Glympse API automatically starts watching a group, when ticket is sent to it.

Glympse © 2016All Rights Reserved

Page 30: Glympse Client SDK Overview

Location ProfilesIt is possible to apply different accuracy requirements to location provider based on system state. See ILocationManager and ILocationProfile for more details.

Variable Post RatePost rates (for different API states) are configurable on per API key basis.

Customizable Location ProviderGlympse API can consume location information from any source (potentially more battery efficient that standard location API provided by the OS).

Battery ThresholdsGlympse API is capable of shutting down most its activities, if device battery level falls below specified critical value (see IBatteryManager).

Concurrent NetworkingHost application is notified, when Glympse API is about to initiate network activity,which allows to combine requests and minimize battery drain caused by antenna.

Battery Saving Techniques

Glympse © 2016All Rights Reserved

Page 31: Glympse Client SDK Overview

Location Profiles

LocationManager

LocationProfile

LocationProvider

Glympse API

HAL

Host Application

Enable profiles

Internal events trigger profile switches

Configure profileproperties

Apply profile

ActiveWatching

Foreground

ActiveNot Watching

Background

Profiles and transitions

Glympse © 2016All Rights Reserved

Page 32: Glympse Client SDK Overview

Location Profiles Behavior

Sender Timeline

Optimized for battery consumption

Start viewing

... ...

GC::LOCATION_PROFILE_ACTIVE_NOT_WATCHED

Provider: Network (or even none)Accuracy: 300m

GC::LOCATION_PROFILE_ACTIVE_WATCHED

Provider: Network and GPSAccuracy: Best

Viewer Timeline

Optimized for quality

Location provider adjustment overheadCommunication overhead

(including network latency)

Glympse API switches between location profiles automatically. Host application only needs to specify actual profile properties.

Glympse © 2016All Rights Reserved

Page 33: Glympse Client SDK Overview

Location Usage

has active

tickets?

is in the foreground?

locationdisabled

yes

yes

no

is location requestedexplicitly?

yes no

IGlympse::setActive

ILocationManager::startLocationILocationManager::stopLocation

no

Is battery OK?

noyes

IBatteryManager::setBatteryLevels

start

are profiles

enabled?

locationenabled

Should provider be enabled?

ILocationProfile::getMode

no

yes

CC::LOCATION_MODE_DISABLEDCC::LOCATION_MODE_DEFAULT

Set of rules for determining location provider state (enabled vs. disabled)

Glympse © 2016All Rights Reserved

Page 34: Glympse Client SDK Overview

Custom Location Provider

Glympse

CustomLocation Source

Host Application

Specify custom provider

Default Location Provider

Location ManagerCustom Location Provider

Custom location source featuring high location quality, low battery consumption or both

Custom location provider implements ILocationProvider.

Standard Location

API

GLocationProvider customProvider = new CustomLocationProvider();

GLocationManager locationManager = glympse->getLocationManager();

locationManager->setLocationProvider(customProvider);

Override default location provider

Glympse © 2016All Rights Reserved

Page 35: Glympse Client SDK Overview

Sibling Tickets

History Manager

Self Active Tickets

Sibling Active Tickets

Expired Tickets Sorting order among expired

tickets is preserved based on expire time only (ticket ownership is ignored)

...

...

...

01

n

GGlympse glympse = ...;

glympse.allowSiblingTickets(true);

Make sibling tickets visible

History Manager

...

...

...

01

n

Self Active Tickets

Sibling Active Tickets

Expired Tickets

Process A

Process B

Glympse © 2016All Rights Reserved

Page 36: Glympse Client SDK Overview

GoGo Overview

GlympseAPI

Location Provider

WiFi Manager

Flight Detector

GroundAgentTickets

1

Glympse in the cloud

Tickets Flight details (tail number, destination)2

Plane location for local (on device) purposes2.1

[ optional ]

Location updates are pulled from a partner4

Platform finds itself on a plane

Server populates inherited tickets with

locations

5

Ticket ownership is passed to the ground agent

3

Transition happens transparently

to viewers

Viewing experience can be customized

with airline branding

Glympse © 2016All Rights Reserved

Page 37: Glympse Client SDK Overview

GoGo IntegrationGlympse

Handoff Manager

Handoff Provider

IHandoffManager

IHandoffProvider

Handoff functionality needs to be enabled for application API key in order for step 3 to succeed.

https://inflight.glympse.com...

Get user confirmation on populating location data without the need to keep

device on.

Is handoff available?

IHandoffProvider::isHandoffAvailable()

no yes

IHandoffProfile::allowHandoff()3

GE::LISTENER_HANDOFFGE::HANDOFF_PROVIDER_AVAILABLE1

2.1 2.2

Travel mode specifies the mode under which track points are generated:ITicket::getTravelMode()GE::TICKET_TRAVEL_MODE_CHANGED

Ticket owner property provides some details on application currently responsible for appending location data:ITicket::getOwner()GE::TICKET_TRANSFERRED

IGlympse

Accompanying Ticket Properties

Glympse © 2016All Rights Reserved

Page 38: Glympse Client SDK Overview

Host Application

OBD Location

Location Plugins

Glympse Platform

OBD Location Provider

OBD Location

FlightAware

Glympse Server

Ticket

...

OBD ID

Location flow

Workflow

Legend

Customer notificationhttps://glympse.com/YYY-ZZZ

Platform can be configured to use external source of location data.

Carrier service

GlympseInfrastructure

OBDInfrastructure

Create a ticket and hand it off to specific OBD ID providing

access credentials

SenderApplication

Glympse © 2016All Rights Reserved

Page 39: Glympse Client SDK Overview

Advanced Features

FavoritesProvides container for storing the most frequently used Glympses.

Recents (recipients, messages, places)

Collections of the most recently referred items. All these collections are automatically populated by Client API.

ContactsWrapper over standard contacts API providing some convenience helpers.

CalendarWrapper over standard calendar API.

AuthenticationProvides access to Glympse user account information and ability to extend/modify standard authentication process.

Glympse © 2016All Rights Reserved

Page 40: Glympse Client SDK Overview

Debugging & Troubleshooting

Crash ReportingDebug LoggingAPI Helpers

Object Model Explorer View a Glympse Tool Web API Explorer

Remote DebuggingBots Simulator

Glympse © 2016All Rights Reserved

Page 41: Glympse Client SDK Overview

InfrastructureProduction api.glympse.com

Sandbox sandbox.glympse.com

Partner PropertiesAPI Key (required) - defines partner and is required to instantiate Glympse APIPartner ID (optional) - required to append custom properties to tickets Brand (optional) - provides additional granularity level under API key

Glympse ConfigurationGCM Sender ID (Android) - allows partner applications to be woken up by Glympse-initiated PUSH messages.

Environment

Glympse © 2016All Rights Reserved

Page 42: Glympse Client SDK Overview

Partner Configuration

Branded Viewer ExperienceViewer experience can be customized based on either API key or Brand (or both)

Custom Invite Text With localization support

System PropertiesMaximum Glympse duration (default is 4 hours)Maximum active Glympses per user (default is 100)Maximum invites per Glympse (default is 100)Minimum interval between location points (default is 1 location per second)Adjustable post rate (for all library states)

Glympse © 2016All Rights Reserved