On Github justinribeiro / google-glass-development-gdg-devfest-2014
Justin Ribeiro justin@stickmanventures.com
@justinribeiro +Justin Ribeiro justinribeiro
Slides: https://goo.gl/NG6bDU
Easiser way to design your app flow
connectServer: function() {
console.log(this.authResult.code);
$.ajax({
type: 'POST',
url: "//" + window.location.host + '/connect?state=' + this.state,
contentType: 'application/octet-stream; charset=utf-8',
success: function(result) {
console.log(result);
},
processData: false,
data: this.authResult.code
});
}
try:
user_credentials = _oauth_flow().step2_exchange(request.data)
except FlowExchangeError:
response = make_response(json.dumps('Failed to upgrade the authorization code.'), 401)
response.headers['Content-Type'] = 'application/json'
return response
# Set our session
session['credentials'] = user_credentials
session['user_id'] = user_credentials.id_token['sub']
mirror_service = _authorized_mirror_service(user_credentials)
mirror_service.timeline().insert(body={
'notification': {'level': 'DEFAULT'},
'text': 'Welcome to Glass! This is my very first timeline card insert.'
).execute()
mirror_service.timeline().insert(body={
'notification': {'level': 'DEFAULT'},
'html': '<article><section><p class="text-auto-size">Welcome to
<em class="yellow">Glass!</em> This is my very first timeline card insert.</p>
</section></article>'
).execute()
mirror_service.timeline().insert(body={
'notification': {'level': 'DEFAULT'},
'location': {
'latitude': 37.7692,
'longitude': 120.8569,
"displayName": "Season 6 Dreams Meetup",
"address": "Group Study Room F, Greendale Community College"
}
).execute()
mirror_service.timeline().insert(body={
'notification': {'level': 'DEFAULT'},
'text': 'Video time!',
'payload': 'http://mymystical.url/video.mp4',
'menuItems': [{'action': 'PLAY_VIDEO'}]
).execute()
mirror_service.timeline().insert(body={
'notification': {'level': 'DEFAULT'},
'text': 'Timeline card with a couple menu options.',
'menuItems': [
{'action': 'CUSTOM', 'id': 'my-id', 'values': [ { 'displayName': "My Menu Item" } ] },
{'action': 'DELETE'}]
}).execute()
mirror_service.subscriptions().insert(body={
'collection': 'timeline',
'userToken': user_id,
'verifyToken': 'something_only_you_know',
'callbackUrl': 'https://my-project-id.appspot.com/myGlassCallback',
'operation': ['UPDATE']
}).execute()
~ $ ngrok -authtoken YOURTOKEN TARGETPORT ~ $ ngrok 8080
mirror_service.subscriptions().insert(body={
'collection': 'timeline',
'userToken': user_id,
'verifyToken': 'something_only_you_know',
'callbackUrl': 'https://RANDOM.ngrok.com/myGlassCallback',
'operation': ['UPDATE']
}).execute()
@glassdailycard.route('/dailyjob')
def dailyjob():
today = datetime.date.today()
query_get_todays_card = CronCards.query(CronCards.date == today)
result_get_todays_card = query_get_todays_card.get()
# Do we have a card to send today?
if result_get_todays_card is not None:
timelinecard_body = {
'notification': {'level': 'DEFAULT'},
'text': result_get_todays_card.card,
'menuItems': [{'action': 'DELETE'}]
}
query_get_users = UserProperties.query()
for user in query_get_users.fetch():
user_credentials = _credentials_for_user(user.key.id()).get()
_authorized_mirror_service(user_credentials).timeline().insert(body=timelinecard_body).execute()
response = make_response("{}", 200)
response.headers['Content-Type'] = 'application/json'
return response
@glasstaskfuture.route('/glassCallback', methods=['POST'])
def glassCallback():
"""Our callback when the use selects out CUSTOM menu option on the start card."""
notification = request.data
if random.choice([True, False]):
# we're going to send it along to the task queue
google.appengine.api.taskqueue.add(
url='/taskHandler',
payload=notification,
countdown=60)
else:
now = datetime.datetime.now()
future = now + datetime.timedelta(0,60)
google.appengine.api.taskqueue.add(
url='/taskHandler',
payload=notification,
eta=future)
# It's cool Mirror API
#
# Remember, we must return 200 as quickly as we can!
#
return('OK')
LocationManager locationManager; // initialized elsewhere
// This example requests fine accuracy and requires altitude, but
// these criteria could be whatever you want.
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(true);
List<string> providers = locationManager.getProviders(
criteria, true /* enabledOnly */);
for (String provider : providers) {
locationManager.requestLocationUpdates(provider, minTime,
minDistance, listener);
}
</string>