Slide 1

Slide 1 text

Exploring Google's Nearby APIs The Human Context

Slide 2

Slide 2 text

Stuart Kent, @skentphd Mobile developer @ Detroit Labs 2¼ years 9 months ~2 months

Slide 3

Slide 3 text

The Nearby APIs "Build simple interactions between nearby devices and people"

Slide 4

Slide 4 text

The Process friedomelet.wordpress.com

Slide 5

Slide 5 text

Google I/O

Slide 6

Slide 6 text

Roadmap Background & Motivation

Slide 7

Slide 7 text

Roadmap Background & Motivation Capabilities

Slide 8

Slide 8 text

Roadmap Background & Motivation Practicalities Capabilities

Slide 9

Slide 9 text

Roadmap Background & Motivation Practicalities Responsibilities Capabilities

Slide 10

Slide 10 text

Roadmap Background & Motivation Practicalities Responsibilities Opportunities Capabilities

Slide 11

Slide 11 text

Context Aware Apps Background & Motivation

Slide 12

Slide 12 text

Context Aware Apps Observe, interpret, and act based on their environment.

Slide 13

Slide 13 text

Context Aware Apps Environment

Slide 14

Slide 14 text

Context Aware Apps Environment Observers

Slide 15

Slide 15 text

Context Aware Apps Environment Interpreters/Actors Observers

Slide 16

Slide 16 text

2001 "My internet browser heard us saying the word Fry and it found a movie about Philip J. Fry for us. It also opened my calendar to Friday and ordered me some french fries."

Slide 17

Slide 17 text

2016

Slide 18

Slide 18 text

The Human Context "Man is by nature a social animal"

Slide 19

Slide 19 text

The Nearby APIs Environment Interpreters/Actors Observers Easier Refined

Slide 20

Slide 20 text

Capabilities

Slide 21

Slide 21 text

The Nearby APIs "Build simple interactions between nearby devices and people"

Slide 22

Slide 22 text

Current Categories Nearby Connections Local Multiplayer Games Nearby Messages General purpose

Slide 23

Slide 23 text

Current Categories Nearby Connections Local Multiplayer Games Nearby Messages General purpose

Slide 24

Slide 24 text

Current Categories Nearby Connections Local Multiplayer Games Nearby Messages General purpose

Slide 25

Slide 25 text

• detect and communicate with nearby devices The Nearby Messages API

Slide 26

Slide 26 text

• detect and communicate with nearby devices • simple pub/sub API The Nearby Messages API

Slide 27

Slide 27 text

• detect and communicate with nearby devices • simple pub/sub API • iOS & Android The Nearby Messages API

Slide 28

Slide 28 text

• detect and communicate with nearby devices • simple pub/sub API • iOS & Android • unauthenticated* The Nearby Messages API

Slide 29

Slide 29 text

• detect and communicate with nearby devices • simple pub/sub API • iOS & Android • unauthenticated* • default (~100ft) and earshot (~ 5ft) ranges The Nearby Messages API

Slide 30

Slide 30 text

• detect and communicate with nearby devices • simple pub/sub API • iOS & Android • unauthenticated* • default (~100ft) and earshot (~ 5ft) ranges • [BLE beacon support] The Nearby Messages API

Slide 31

Slide 31 text

Roles Publisher 0 or 1 messages Subscriber Multiple messages

Slide 32

Slide 32 text

Roles Publisher 0 or 1 messages Handheld (dynamic) Subscriber Multiple messages Handheld

Slide 33

Slide 33 text

Roles Publisher 0 or 1 messages Handheld (dynamic) + Beacon (static) Subscriber Multiple messages Handheld

Slide 34

Slide 34 text

Roles Publisher 0 or 1 messages Handheld (dynamic) + Beacon (static) Subscriber Multiple messages Handheld

Slide 35

Slide 35 text

• Byte array (JSON, protocol buffers) • Reco iOS) 
 Messages

Slide 36

Slide 36 text

• Byte array (JSON, protocol buffers) • Recommended: < 3kb (Android); "fairly small" (iOS) 
 Messages

Slide 37

Slide 37 text

• Byte array (JSON, protocol buffers) • Recommended: < 3kb (Android); "fairly small" (iOS) • Max: 100kb (Android & iOS)
 Messages

Slide 38

Slide 38 text

• Byte array (JSON, protocol buffers) • Recommended: < 3kb (Android); "fairly small" (iOS) • Max: 100kb (Android & iOS)
 ↳ Send references, not resources Messages

Slide 39

Slide 39 text

Communication Methods Practicalities

Slide 40

Slide 40 text

Discovery & Messaging Image credit: p2pkit.io

Slide 41

Slide 41 text

Discovery & Messaging Image credit: p2pkit.io

Slide 42

Slide 42 text

Discovery & Messaging Image credit: p2pkit.io

Slide 43

Slide 43 text

Discovery & Messaging Image credit: p2pkit.io

Slide 44

Slide 44 text

Discovery & Messaging Image credit: p2pkit.io

Slide 45

Slide 45 text

Discovery & Messaging Image credit: p2pkit.io

Slide 46

Slide 46 text

Discovery & Messaging Image credit: p2pkit.io

Slide 47

Slide 47 text

Discovery & Messaging Image credit: p2pkit.io

Slide 48

Slide 48 text

Ultrasound Image credit: p2pkit.io

Slide 49

Slide 49 text

Ultrasound Image credit: p2pkit.io

Slide 50

Slide 50 text

• Tokens communicated using Bluetooth/speaker+mic Summary

Slide 51

Slide 51 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control Summary

Slide 52

Slide 52 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage Summary

Slide 53

Slide 53 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage • Message content delivered via Google servers Summary

Slide 54

Slide 54 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage • Message content delivered via Google servers
 ↳ security/insecurity? Summary

Slide 55

Slide 55 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage • Message content delivered via Google servers
 ↳ security/insecurity? 
 ↳ connectivity requirement Summary

Slide 56

Slide 56 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage • Message content delivered via Google servers
 ↳ security/insecurity?
 ↳ connectivity requirement • Apps must share Google Developers Console project Summary

Slide 57

Slide 57 text

• Tokens communicated using Bluetooth/speaker+mic
 ↳ range control
 ↳ heavy battery usage • Message content delivered via Google servers
 ↳ security/insecurity?
 ↳ connectivity requirement • Apps must share Google Developers Console project
 ↳ more security Summary

Slide 58

Slide 58 text

Demo & Code! Practicalities

Slide 59

Slide 59 text

Calling Card

Slide 60

Slide 60 text

• Auth with Google account • Publish photo, name, email • See nearby users (100ft) • Save users Calling Card

Slide 61

Slide 61 text

• Auth with Google account • Publish photo, name, email • See nearby users (100ft) • Save users Calling Card

Slide 62

Slide 62 text

• Auth with Google account • Publish photo, name, email • See nearby users (100ft) Calling Card

Slide 63

Slide 63 text

• Auth with Google account • Publish photo, name, email • See nearby users (100ft) • Save contact info Calling Card

Slide 64

Slide 64 text

Calling Card Android
 
 Play Store
 goo.gl/dkmGxa
 
 GitHub
 stkent/calling-card iOS
 
 
 
 
 GitHub
 stkent/calling-card-ios

Slide 65

Slide 65 text

Apps must handle: • runtime permission (Bluetooth/Audio) Implementation Notes

Slide 66

Slide 66 text

Apps must handle: • runtime permission (Bluetooth/Audio) • message serialization & deserialization Implementation Notes

Slide 67

Slide 67 text

Apps must handle: • runtime permission (Bluetooth/Audio) • message serialization & deserialization • notification kill (Android) Implementation Notes

Slide 68

Slide 68 text

Apps must handle: • runtime permission (Bluetooth/Audio) • message serialization & deserialization • notification kill (Android) • teardown Implementation Notes

Slide 69

Slide 69 text

Android

Slide 70

Slide 70 text

dependencies { ... 
 compile 'com.google.android.gms:play-services-nearby:9.0.0' ... } build.gradle

Slide 71

Slide 71 text


 ... 
 
 ... 
 AndroidManifest.xml

Slide 72

Slide 72 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) NearbyActivity.java

Slide 73

Slide 73 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// googleApiClient = new GoogleApiClient.Builder(this)
 .addApi(Nearby.MESSAGES_API)
 .addConnectionCallbacks(this)
 .addOnConnectionFailedListener(this)
 .build(); NearbyActivity.java

Slide 74

Slide 74 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// @Override
 protected void onStart() {
 super.onStart();
 googleApiClient.connect();
 } NearbyActivity.java

Slide 75

Slide 75 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// @Override
 public void onConnectionFailed(ConnectionResult result) {
 if (result.hasResolution()) {
 try {
 result.startResolutionForResult(this, NEARBY_CODE);
 } catch (final IntentSender.SendIntentException e) {
 // cancel all Nearby operations
 }
 } else { // cancel all Nearby operations }
 } NearbyActivity.java

Slide 76

Slide 76 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// @Override
 public void onConnectionFailed(ConnectionResult result) {
 if (result.hasResolution()) {
 try {
 result.startResolutionForResult(this, NEARBY_CODE);
 } catch (final IntentSender.SendIntentException e) {
 // cancel all Nearby operations
 }
 } else { // cancel all Nearby operations }
 } NearbyActivity.java

Slide 77

Slide 77 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// NearbyActivity.java

Slide 78

Slide 78 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// @Override
 protected void onActivityResult( int requestCode, int resultCode, Intent data) {
 
 if (requestCode == NEARBY_CODE) {
 if (resultCode == RESULT_OK) { googleApiClient.connect(); } else { // cancel all Nearby operations }
 } else {
 super.onActivityResult(requestCode, resultCode, data);
 }
 } NearbyActivity.java

Slide 79

Slide 79 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// @Override
 protected void onActivityResult( int requestCode, int resultCode, Intent data) {
 
 if (requestCode == NEARBY_CODE) {
 if (resultCode == RESULT_OK) { googleApiClient.connect(); } else { // cancel all Nearby operations }
 } else {
 super.onActivityResult(requestCode, resultCode, data);
 }
 } NearbyActivity.java

Slide 80

Slide 80 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// private Message message; ... User user = getIntent().getParcelableExtra(USER_EXTRA_KEY); message = new Message(GSON.toJson(user).getBytes()); NearbyActivity.java

Slide 81

Slide 81 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// // can also be used to set role and range private PublishOptions pubOptions = new PublishOptions.Builder() .setCallback(publishCallback) .build(); NearbyActivity.java

Slide 82

Slide 82 text

Nearby.Messages.publish(googleApiClient, message, pubOptions) //////////////////////////////////////////////////////////////////// // can also be used to set role and range private PublishOptions pubOptions = new PublishOptions.Builder() .setCallback(publishCallback) .build(); ... private PublishCallback publishCallback = new PublishCallback() {
 @Override
 public void onExpired() { // cancel all Nearby operations }
 }; NearbyActivity.java

Slide 83

Slide 83 text

private Message message; ... 
 Nearby.Messages.unpublish(googleApiClient, message); // show inactive UI NearbyActivity.java

Slide 84

Slide 84 text

private Message message; ... 
 Nearby.Messages.unpublish(googleApiClient, message); // show inactive UI NearbyActivity.java

Slide 85

Slide 85 text

Nearby.Messages.subscribe(googleApiClient, listener, subOptions) NearbyActivity.java

Slide 86

Slide 86 text

Nearby.Messages.subscribe(googleApiClient, listener, subOptions) //////////////////////////////////////////////////////////////////// NearbyActivity.java As before.

Slide 87

Slide 87 text

Nearby.Messages.subscribe(googleApiClient, listener, subOptions) //////////////////////////////////////////////////////////////////// private MessageListener listener = new MessageListener() {
 @Override
 public void onFound(Message message) {
 // received once; deserialize data and cache it }
 
 @Override
 public void onLost(Message message) {
 // received once; deserialize data and remove from cache
 }
 }; NearbyActivity.java

Slide 88

Slide 88 text

Nearby.Messages.subscribe(googleApiClient, listener, subOptions) //////////////////////////////////////////////////////////////////// NearbyActivity.java Same API as publish options.

Slide 89

Slide 89 text

private MessageListener listener; ... 
 Nearby.Messages.unsubscribe(googleApiClient, listener); // show inactive UI NearbyActivity.java

Slide 90

Slide 90 text

private MessageListener listener; ... 
 Nearby.Messages.unsubscribe(googleApiClient, listener); // show inactive UI NearbyActivity.java

Slide 91

Slide 91 text

@Override
 protected void onStop() {
 // cancel all Nearby operations // disconnect GoogleApiClient
 super.onStop();
 } NearbyActivity.java

Slide 92

Slide 92 text

iOS

Slide 93

Slide 93 text

source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' pod 'NearbyMessages', '0.10.0' Podfile (0.39)

Slide 94

Slide 94 text

#import Nearby-Bridging-Header.h

Slide 95

Slide 95 text

private lazy var messageManager: GNSMessageManager = { GNSMessageManager(APIKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") }() NearbyViewController.swift

Slide 96

Slide 96 text

private var message: GNSMessage? { guard let userData = user?.toNSData() else { return nil } return GNSMessage(content: userData) } NearbyViewController.swift

Slide 97

Slide 97 text

private var message: GNSMessage? { guard let userData = user?.toNSData() else { return nil } return GNSMessage(content: userData) } NearbyViewController.swift

Slide 98

Slide 98 text

private var permissionProxy: GNSPermission? ... override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) permissionProxy = GNSPermission { [weak self] granted in if granted { // show active UI } else { // show inactive UI } } } NearbyViewController.swift

Slide 99

Slide 99 text

private var permissionProxy: GNSPermission? ... override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) permissionProxy = GNSPermission { [weak self] granted in if granted { // show active UI } else { // show inactive UI } } } NearbyViewController.swift

Slide 100

Slide 100 text

private var currentPub: GNSPublication? ... if let message = message { // shows permissions request dialog // can also pass params to set role and range currentPub = messageManager.publicationWithMessage(message) } NearbyViewController.swift

Slide 101

Slide 101 text

private var currentPub: GNSPublication? ... private func stopPublishing() { currentPub = nil // show inactive UI } NearbyViewController.swift

Slide 102

Slide 102 text

private var currentSub: GNSSubscription? ... // can also pass params to set role and range currentSub = messageManager.subscriptionWithMessageFoundHandler( { [weak self] foundMessage in // received once; deserialize data and cache it }, messageLostHandler: { [weak self] lostMessage in // received once; deserialize data and remove from cache } ) NearbyViewController.swift

Slide 103

Slide 103 text

private var currentSub: GNSSubscription? ... private func stopSubscribing() { currentSub = nil // show inactive UI } NearbyViewController.swift

Slide 104

Slide 104 text

override func viewWillDisappear(animated: Bool) { // cancel all Nearby operations super.viewWillDisappear(animated) } NearbyViewController.swift

Slide 105

Slide 105 text

responsibilities

Slide 106

Slide 106 text

Battery Be a good citizen

Slide 107

Slide 107 text

Privacy Anonymity vs Authenticity

Slide 108

Slide 108 text

Privacy Anonymity vs Authenticity "Yik Yak is a location-based social network that helps people discover their local community, letting them share news, crack jokes, offer support, ask questions, and interact freely."

Slide 109

Slide 109 text

Privacy Anonymity vs Authenticity

Slide 110

Slide 110 text

Privacy Anonymity vs Authenticity

Slide 111

Slide 111 text

opportunities

Slide 112

Slide 112 text

• Augmentation Trajectories

Slide 113

Slide 113 text

• Augmentation • Foundation Trajectories

Slide 114

Slide 114 text

• Augmentation • Foundation • Competition Trajectories

Slide 115

Slide 115 text

• Augmentation • Foundation • Competition • Evolution Trajectories

Slide 116

Slide 116 text

Augmentation Pocket Casts

Slide 117

Slide 117 text

Foundation Radon Card Case

Slide 118

Slide 118 text

Competition

Slide 119

Slide 119 text

Evolution Nearby Notifications

Slide 120

Slide 120 text

Questions? Stuart Kent • [email protected] • @skentphd thanks!