Subtitles section Play video Print subtitles JENNY MURPHY: So welcome to Building Glassware With the Google Mirror API. Today, we're going to show you some code on building some Glassware. Before we get into that, let's tell you a little bit about ourselves. ALAIN VONGSOUVANH: Hi, everyone. My name's Alain Vongsouvanh. I'm a Developer Programs Engineer on Glass, and this is-- JENNY MURPHY: Hi. I'm Jenny Murphy. I'm also a Developer Programs Engineer on Glass. So here's our menu for today. We're going to briefly touch on the guidelines so you know how to build some awesome Glassware. We're going to cover this really briefly because it's a lot of the same information that Timothy covered early in a session. In fact, we assume a little bit of foreknowledge here. We assume you're familiar with Glass, either you attended Timothy's session, or you have Glass on right now, or maybe you visited some of our partners in the Glass Sandbox earlier. But even if you haven't, just hang tight, take some notes, and make sure to follow up with that information like seeing Timothy's video. Once we're done with that, we're going to go through the components of the Mirror API. These are the building blocks that you use to build Glassware. We're going to go through each one and show you some code of using them in isolation. Once we're done with that, we're going to show you a couple of examples of how you can put them together to build some interesting Glassware. We hope that this will give you the context that you can use to build your own Glassware. ALAIN VONGSOUVANH: All right. Thank you, Jenny. Sounds really interesting. But before we dive into the code and learn how we can use the Mirror API to build Glass services, or what we call Glassware, we'd like to take a few moments to talk about guidelines. So keep in mind that the Glassware you write [INAUDIBLE] user, and with the technology being so close to the user, it's really important that the experience we provide is the best possible. That is why we designed guidelines around those four points. I won't go into details into those because Timothy really did a great job explaining them. If you managed to attend his sessions-- I bet many of you have-- you should be good to go. If not, make sure to check his session when it's back online. And always keep those guidelines in mind when you are designing in Glassware, [INAUDIBLE] in Glassware, and testing in Glassware. Sounds good? All right. JENNY MURPHY: Hi. Let's move on to the Mirror API, those building blocks I mentioned before. Before I get into that, how many of you here have built software using RESTful web services before? Wow. Almost everyone. How about mobile applications like Android apps? A good number, and quite a bit of overlap. You're going to find that you can leverage a lot of the knowledge you already have, a lot of the experience you have from those two. But our perspective is a little bit different so please try to keep an open mind. And as many technical presentations start, we have our architecture diagram, and this one is no different. We have the Mirror API, the 10,000 foot view. Up at the top, we have a green circle representing the Mirror API itself, and this is a collection of RESTful web services, which is really just a bunch of directories of JSON that you work with over HTTPS. Over on the right side, we have a box representing Glass and its connection to the Mirror API with Glass Sync. This is something you actually don't need to worry too much about. This is one of the cool parts of the Mirror API. We take care of the synchronization for you. We handle connectivity, we handle power, all that kind of stuff. You get to focus on the stuff to the other side, those JSON messages you send back over HTTPS and your Glassware, the code that interacts with the Mirror API. And if you're observant, you may have noticed I missed one thing. There were directories of JSON up there, but we currently have no way to tell the Mirror API what user you're interacting with and no way to verify that they've given you access to their data. This is where OAuth comes in. We use OAuth to install Glassware and to give the user the opportunity to provide you access to their data. OAuth is kind of like the valet keys for the internet. It gives users the ability to give you access to just some of their data out there. Valet keys that kind of dance, and I'm going to walk you through the dance that we use to do this. So a new user arrives at your Glassware. You don't know who they are. Maybe it's time to install, maybe it's time just to hit a Settings page. In either case, what you're going to do is you're going to redirect then to Google's OS servers, or maybe open a pop-up. You're going to send over all the permissions you want. Typically, this is going to be glass.timeline, but we have some other permissions like glass.location which I'll be going into a little bit later. The user logs into their Google account if they're not already logged in, and then they see a page where they see a list of permissions that you've asked for. Since your Glassware has been prudent on the permissions you're asking for and you have some really compelling functionality, of course they're going say yes and grant you those permissions. They get redirected back to your service, and along with that redirection comes a code. Now it's your turn to complete that three way handshake. You take that code and you make a back end request, along with some details of your service, and we send you an access token. You use this access token to both identify the user when you make those requests and to verify that you have those permissions. You include it in a header on all those requests. There are a bunch of steps here. One cool thing is we have client libraries in our Resources that care of almost all of this heavy lifting for you, so you don't need to worry about these details. But if you want to, you can code at this level, too. So now we have access tokens and we can start using the Mirror API. ALAIN VONGSOUVANH: Thank you, Jenny. So now that the user has installed your Glassware, it's time to do stuff with it. Before we dive into how to write Glassware, let's talk about the Mirror API and what it's made of. I'm pretty sure many of you already know, but it's always good to get a reminder. So Jenny mentioned that the Mirror API is a RESTful API, so it means that it's an API composed of connections that you manipulate through HTTP requests. So you can update, retrieve, delete, insert new items to your collections. The main collection you're going to use when you write your Glassware is the Timeline collection. This is how you insert content into the user's Glass, what we call Timeline Card, and this is how you retrieve Timeline Card from the user's Glass as well. Each Glassware has their own Timeline, so you don't get access to another Glassware Timeline. For example, the Google+ Glassware doesn't have access to the Gmail Glassware, and so forth. Very few exceptions, but that needs user input and we'll get into that later. Now, the example you see on screen is the most simple Timeline Card you can insert. It's text only. So this is a JSON representation of a Timeline item, set the text property to Hello World, and then send an authorized post request to the Timeline collection, and boom, it's going to be in the user's Glass. MALE SPEAKER: Hi everyone. ALAIN VONGSOUVANH: It's as simple as that. Thanks for the noise. All right. Let's jump to the other example. So we inserted text, but you can also insert rich media to the user's Glass. The Glass client supports images and videos, and you insert those using HTTP requests as well. So you can insert media only, or you can also provide metadata along with the media. This is an example of a multipart HTTP request, but as Jenny mentioned, we have client libraries that leverage all of that for you so you don't have to do all the heavy lifting. And we have extensive documentation on how to do that in our reference documentation. So now, we have text, we have media, but sometimes, you want to add your own branding as well. You want to customize your Timeline Card. You want to do more stuff, provide a better experience to the user. For that, we have HTML support. So you can set HTML payload into the Timeline item metadata. It's as simple as just setting the HTML into the HTML Property, and we have a list of tags that we support and tags that we don't, like Script and Link. All of that is documented in our Reference Guide as well. And we also have a built-in CSS that we encourage you to use to provide a consistent experience across all the Glassware. Now, let's look at how it looks like to the code. So in our slide, we decided to use Java, but again, the Mirror API is a RESTful API, so as long as you have a language that can communicate over HTTP, you're good to go. And Google does provide many client libraries in different languages like Java, Python, PHP, .NET, and so forth. We have documentation again, and then you can also check the Client Libraries Project page to learn more about those. So for Java, how to insert a Timeline Item, you just create a new Timeline Item Resource and then set the text or the metadata properties you want for the Timeline Item. In this example, we're only saying hello to our Explorers. And then once you're good with your Timeline Item, use an authorized Mirror service and send an authorized HTTP request to the user's Glass. And that's it. You're done. You just sent a Timeline Item to your user's Glass. It's so simple. Now, I could talk about this for 20 more minutes, or I can jump to a demo. All right. So we have a tool we built for you called the Playground where you can experiment with the API. So the Playground is actually using the Mirror API to send data to your user's Glass. So we have a bunch of templates. Let's start with a much simpler one, text only. So you can simply edit the text. Glass Explorers are awesome! You can see on the right side of the screen, the JSON representation. And then when you're good with the Timeline Item, just hit Insert Item. It's going to use the API and then send it to the user's Glass. Now, let me go to my demo device with a cable. Hang into it so I can show you what the screen looks like for me. There we go. Just now, I just received the item I just inserted. It's as simple as that. Cool. Now, let's jump back to the Playground. We also have template support, HTML support, and we have built some templates for you so you can get started building your own. So use the ones you like, do some modifications like JFK, et cetera. Modify it. You have the JSON on the right side. It's kind of complicated to modify via HTML from the JSON payload, so you can also just edit the HTML by clicking on the tab. And then when you're happy with your template, just push it into your Glass, make sure it looks the same, copy the template over into your code, and you're good to go. Sounds good? Cool. Let's jump back to the slide. All right. So right now, we've been doing one way interaction. We've been pushing content to a user of Glass. But the Glass also lets users take action on the card you insert to the users. You do that by adding more information into a Timeline Item Resource that we call Menu Items. There are two main categories of Menu Items, the built-in ones that usually leverage the Glass client, like sharing, which would create a new item-- more on that later-- Get Directions, that uses the Glass GPS and internal navigation mode to navigate to the location provided in the Timeline Item, and Reply, that will use a microphone from Glass to get text input from the user. There are many others built in menu items that we have in our documentation. And then we also have custom menu items. This is what you use when you want to provide custom features to the user. For example, if you're a news agency and you're pushing news content to a user of Glass, you might want to provide a way for the user to save an article or to vote on an article. Glass doesn't know what to do with that, so you simply provide more information to us. You provide an ID, so you get to know when the user took an action, you get to know which action the user took. And then when we push that to you, it's up to you to process the notification. And then you also need to provide more information to us, like the display name, because we don't know how to display your custom menu item in an icon URL that will be displayed alongside the display name. All right. Now, let's take a quick look at the code. So as I mentioned, adding a menu item is simply adding more property to the Timeline Resource. So again, we create a new Timeline Item Resource, set the text, and then set a built-in menu item. In our case, we want to let the user be able to share this card with other Glassware. So you simply set the action to menu item to share, and then add it to the list of menu items to the Timeline Resource. Add other properties, use the service object to push it to Glass, and you're good to go. Now let's take a quick look at custom menu items. So it's almost the same thing. Create a new Timeline Item, create a new Menu Item, set the action to Custom, but now we need more information from you so we know what to do. So you need to set the ID so when the user takes the action, the API will push a notification back to you and let you know which action was taken by the user. And also, we need to know how to display the menu item. So simply provide a list of values with a display name that will be displayed when the user selects the list of menu items and an icon that will be displayed alongside the display name. Add other properties and then add the Menu Items to the Timeline Resource and push it to Glass, and you're good to go. That's pretty simple, right? Cool. JENNY MURPHY: Next collection. Next collection. Contacts. Here's a flow you're probably familiar with on Glass. Pick a photo, in this case, a wonderful photo of Chipotle the cat. Of course you want to share that with all your friends. So you tap, you share, and you share it with your friends on Google+. This is a flow of sharing that shares to contacts. In this case, the contact represents that Circle on Google+. But contacts can represent other things, too, anything you might want to share to. They might represent an individual person, they might represent a group of people like that circle, or they can represent things that are a little bit more abstract, like a whole Glassware or a feature within a Glassware like Path. So let's look at the code that makes this possible. So we're going to create a Contact Resource, we're going to create an object. We're going to set an ID. This ID is passed back in the notification so that you can figure out which contact was tripped when an item was shared. It's how you do the correlation of the round trip. We're going to set some display properties. We're going to set a name and an icon. This is what shows up on your user's Glass. And one property that's a little more sophisticated, we're going to set Accept Type. By default, contacts accept any kind of content on Glass. Any Timeline Item that has been marked sharable could be copied and shared. So this includes text Timeline Items, HTML, images, video. But sometimes, the Glassware may only want to process one kind of content. In this case, this example, we only want to process images, so we're only going to accept cards. And we specify that using a Mime Content Type, in this case, image/*. Accept any type of image. Then we insert it, and that's it. The contact is made available, and users can turn it on in My Glass and start sharing content with it. And one more collection, location. So say we want to render something cool, like this map, in a card. We want to get the user's location. There's a special collection, which has its own scope that you can request, and the user can opt to share their location with your Glassware. If they've done that, you can check for their latest location. It's updated about every 10 minutes. This one is super easy to use because we're just pulling from a collection. So the code is very simple. We just do a Get request for the latest location, which will give us their location within about the past 10 minutes. Then we do cool stuff with it. In this case, we're doing something pretty simple. We're just printing out the latitude, longitude, and accuracy. That's all there really is to location. We read it, we get the latest location. So up until now, we've been talking about pushing content to Glass and having users interact with the content you've pushed to their Glass device. But there's really no mechanism yet for that information to get from their Glass back to your Glassware. What you could actually do is you could poll all these collections every couple minutes and look for changes. You could look for new cards that have been shared with you. But that's not very efficient. So we have a better way with subscriptions. Subscriptions allow you to subscribe to notifications about changes in collections on Glass. Kind of flips the API on its head. Instead of you posting JSON to the Mirror API, the Mirror API will post JSON back to you. Here's some code that allows you to do it. This is code that captures kind of the first half of this, subscribing to notifications. To subscribe to notifications, you insert an object into a collection called subscriptions, you specify the collection you want to monitor. There are a couple of options. In this case, you're subscribing to changes in the Timeline Collection. You specify a couple of identifiers. These are user-specific identifiers that are passed back in all of the notifications so that you can verify that this is a bona fide notification, a true notification, and you can identify the user that triggered that change. And of course, we need somewhere to send those notifications. So as part of this description, you specify a URL, and you'll want to use an HTTPS URL to keep things secure. Once you have all that together, you insert it, and after this point, any changes to the Timeline Collection will be sent back to your service. When the user takes action, or over time, for the case of locations, you're going to be receiving these pingbacks to that URL. The structure looks a lot like the subscription we just inserted. Up at the top, we have the collection. On one side, we have the Timeline. On another case, we have the Locations. We have an identifier of the object that caused the change in notifications. If there's a shared item, this is going to be the ID of that card in the timeline, same for a menu trigger. Another case for Locations on the other side, that's always going to be the same ID because Locations always surfaces the latest location. In both cases, in all notifications that come back, we're going to echo back to you the User Token and the Verify Token so that you can verify the authenticity and the user who made that request. And in the case of Timeline, we're also going to share some metadata. In this case, we're telling you upfront from the notification that this is a share that triggered this so you can write cleaner code that takes advantage of that. So let's take a look at the code for processing that notification. This code looks a little different than the code we've had up here before. Instead of doing an Insert, we're responding to a request. Since we're talking Java today, we're going to use a servelet method. In this case, we're going to handle a post. So a post comes on in. The notification is given to us in the request body. So the first thing we're going to do is pull that request body and parse the JSON. We're going to build an object. We're going to push it into a notification using Jackson, so then we can take action. First thing we're going to do is we're going to verify that data. We're going to find the user, we're going to verify the Verify Token to make sure everything's on the up and up, and then we're going to create a Client Object that allows us to make calls on their request using their credentials that we got from that OAuth flow. And then the fun stuff starts. In this case, what we're doing is if it was a Timeline notification, we're going to go fetch that Timeline Item, we can inspect it, and then we can take action based on it. That's the flow you're going to use for most of your notifications coming in. That's all the pieces of the Mirror API that you can use to build stuff. Here they are, Timeline, Menu Items, Contacts, Subscriptions, and Locations. And now let's see how we can put them together to build some cool stuff. ALAIN VONGSOUVANH: All right. Thank you, Jenny. So now we know what the Mirror API is made of. It's quite simple but still pretty powerful. We'd like now to take a moment to actually dive into some demos of Glassware we brought for you, and we actually have two of them. First one, it's probably the most simple Glassware you might start with, and we encourage you to start with such a Glassware. Cat Facts. So everybody loves Cat Facts, right? Just simple Glassware. Just receive new Cat Facts every few minutes, every few hours, or when new Cat Facts are available. But on a more serious note, it's actually how the "New York Times" Glassware or the CNN Glassware is working. Every time they get a news update, they go through a user database and then send push notifications to all users who have subscribed. Cool. Now, let's take a look at the demo. So again, this is a live demo, and we've been using random Cat Facts, so we might have funny things showing up. Let's go back to my Gmail Glass. Let's see what I got while talking. Cats are very lazy and yet very warm creatures. I didn't know that. Did you? JENNY MURPHY: No, I didn't. ALAIN VONGSOUVANH: Wow. Cool. Now I know. It's awesome. It's really simple. Let's try another one. We've seen this one, it's the item I inserted. Let's see if I have one. Pure black cats are part of an ancient cat voodoo cult. Might be why some people are scared of black cats. Cool. All right. So this is Cat Facts. It's actually quite simple. And we also had a placeholder for you. Did you know that cats can see in the dark? Again, I didn't know. That's why I got so spooked many times by my cat. Let's see what Cat Facts used from the Mirror API. Well, this is a pretty simple Glassware. This is the most simple Glassware you can write. It's only using the Timeline collection. We don't need any other features from the Mirror API because we're only pushing contents to the Glass. But for instance, if you wanted to provide a way for a user to save Cat Facts or to share Cat Facts with their friends, you might want to add menu items, et cetera. Let's see what the user flow looks like. Again, it's pretty simple. So the user starts on your website, authenticate using OAuth 2.0. Then once you get the user's token, store the token in your database. And when you get a new Cat Fact or when your Chron Job runs, just go through your list of users, get the credentials, insert a new service object, insert the item into the Mirror API, and we'll take care of the rest from here. Google's server will sync with the user's Glass and eventually, Cat Facts will be pushed to the user's Glass and make the user happy. Let's take a look at the code. Again very simple. We start by getting a random cat fact. So this is case, we're only setting the text, but in your Glassware, you might want to use HTML to be able to add your own branding. Then we are getting a random cat fact, but you should get push notifications from the news provider you're getting your information from. And then you go through all of your users in your database, get their credentials, build a Mirror service. This is Java. It might change according to the language you're using. And then push the item to the user's Glass, to the user's Timeline. Of course, always check for exceptions. Something bad might happen and you want to catch that so you don't break the process for all the rest of the users. And then that's it. You just send all the cat facts to all of the users. But what we did here was sending a request for all of our users. There might be a better way to do that. Instead of sending tons of HTTP requests every hour when you get a new update, you might be able to have a better process. And actually, API Stacks, on which the Mirror API is built on, supports batching requests. The way it works is that you simply build a multipart HTTP request composed of sub-HTTP requests, and you send a single HTTP request for all the users. So all the current libraries might not support batch requests. You should check on the Project page. The Java that we're using here does support batching requests. And the way it works is that you first need to create a batch callback class that extends the JSON batch callback interface. You need to implement two methods, on success and on failure. This is to keep track of which requests have failed or which requests have succeeded. In our case, we're only keeping track of the number of requests. But in your case, you might want to keep the request and retry again, or if the user had revoked your token, just remove the user from the database. Once you're done implementing your class, simply create a Batch Request from the Mirror service. So this is unauthorized. You don't need to authorize a Batch Request. Create the new callback object and then go through all your users again, get a credentials from the database, same as before. Create a new Insert Request, but don't execute the request right now. Simply add them to the queue of a Batch Request. Once you've added all the sub-requests to the batch, execute the Batch Request and check out the results. That's it. You just saved bandwidth. You sent multiple requests into one SQL request, and with gzip encoding you might actually save a lot of bandwidth and data. But batching requests doesn't save you quota, though. All right, this was really simple. Let's jump into another demo that leverages the API more. JENNY MURPHY: Now we're going to show you another Glassware. This one's a little bit more sophisticated. It makes photos better by adding cats to them. Let's take a look at it. So switch into the demo Glass device. Does anyone mind if I take a photograph? Here we go. So here's a photo of all of you. What I can do now is I can share it with not a circle, but with Add a Cat to That. And we'll loop back in a moment just to see what happens. So right now, that's being sent off to the server to get processed, have a cat added to it. So let's take a look at how that works. This uses a few more features of the Mirror API. In addition to the Timeline, which we used to work with the card up there and also to change the card once the proof photo comes back, we also used the Contacts Collection to add a contact for adding a cat. And we subscribed to changes in the Timeline Collection so we know when it's time to add a cat to a photo. The flow of this Glassware has a couple different chunks. First chunk is the Bootstrap phase. This is a design pattern we see in a lot of Glassware, especially the more sophisticated ones. This gets executed whenever a user installs this Glassware. We do a few different things to set them up. So it starts with the user authenticating for the first time. We store their authentication credentials so that we can make requests on their behalf later, and we immediately do a couple things. We're going to insert that contact so they can share photos to a Glassware, and we're also going to insert the subscription to their changes in the Timeline so we know when they share a photo with us. Later, when our user is out about running around, taking pictures that could be a little bit better with the addition of a cat, we do our interesting stuff. They take the photo, they share it with us. That causes a notification to be sent to our Glassware. We fetch the bytes of the photo, take those bytes and composite them with the pictures of the cat, making it better. Then we go back to their Timeline and find the card that was created when they shared that, and replace the image with our improved image. Let's take a look. It's already back. And here is that photo improved. [APPLAUSE] JENNY MURPHY: So let's take a look at the code that made that possible. First, we're going to go through that Bootstrap phase again. This code will look really familiar because we're just using the basic features of those two different collections. First, we're adding that contact. We're giving it a name, we're setting display properties and then ID so we can correlate it later, and we're setting an accept type. Our software can make any image better. But we could have made it more narrow. For example, if we only wanted to process JPEGs, we could have said image/JPEG here. And then we insert it. We're also subscribing to notifications on the Timeline Collection. This is pretty much the same code you saw before. We're setting an endpoint, HTTPS, setting tokens, and subscribing. Once the Bootstrap phase is complete, then we are ready to start handling those notifications as they come in from photos being shared. Pretty similar to last time, we're using Jackson to parse those notifications as they come in. We're verifying the notification, we're inspecting that token and making sure everything looks clean. Fetching the user, creating a client so that we can make requests and manipulate their Timeline Item. And then we call the Add a Cat to that function to add a cat to that Timeline Item. Let's dig into there. First thing we do up here is we get the Timeline Item that impacted. This is a copy of the original photo that we took that is accessible to our Glassware so that we can make changes in place. We're going to go through all of the attachments that are on this Timeline Item. Typically, a card that's taken from the built-in camera will only have one attachment, but another Glassware could have created and made sharable a Timeline Item with many attachments. We're going to iterate through all of them and make them all better, because of course, they want cats in all of them. We're going to get the bytes and process the photo. We're going to do the composition in that function. Then what we're going to do is we're going to go through each one of those attachments and we're going to remove the one that came to us and replace it with the improved one so that the card is replaced in place. And then finally, we're going to update the card itself and make it sharable. Because of course, you're going to want to share these cat improved photos with social networks and other Glassware. Then we insert it. And that was Add a Cat to That. Slightly more sophisticated Glassware. And yeah, it's silly, but it shows you how some of those features in the API can come together to maybe produce something you didn't think was quite obvious. So let's talk about next steps. So we're now two sessions into the track. I hope you've enjoyed them so far. There are a couple more left and we'd like to encourage you to go check them out. We have Hack Your Glass coming up in a little while where you can dive deeper in beyond the Mirror API on the bleeding edge in maybe void your warranty in the process. And immediately after, we have a fireside chat with a lot of the leaders of our team. Alain and myself and a whole bunch of developers from the Glass team are hanging out in the Sandbox so please come by later today, maybe tomorrow, and ask us questions, share your ideas, and just chat with us about Glass. We love hearing from you. And now and beyond I/O, we have community on the web, of course. You can come and find us on StackOverflow to ask your questions about the Mirror API in Glass. You can find our sample code on GitHub. And if you found an issue or have a feature request, you can go to our Issue Track and report it. You can find links to all of these up on developers.googl e.com/glass/community. And just for you Explorers in the audience-- I see a bunch of you-- we have a special community for you to discuss Glass and the Mirror API. So if you have Glass already, you can go there right now and discuss with your co-explorers, and if you haven't picked up Glass yet, you'll gain access once you pick it up. And that's it. We have a few minutes for questions now. Thank you for listening to us. So if you'd like to come up to the microphone to ask questions, please do. And after that, we're going to be in the Sandbox. So if you have questions we don't have time to answer, come ask me there. [APPLAUSE] ALAIN VONGSOUVANH: Thank you. Question? AUDIENCE: Yeah. So in the Add a Cat example, you describe removing the attachments, modifying them, and then doing an update. Why is that the pattern? Why isn't it creating a new update and pushing that? Could you describe the difference between both of those? ALAIN VONGSOUVANH: You mean the client, creating a copy. So it's that because the Glassware, so each Glassware has access to their own timeline only, so you don't get to share a common timeline. And so that the user still has access to the original photo if they want to share with other Glasswares. So we create a copy for you that only your Glassware has access to, and you have ownership over this item. AUDIENCE: Got it. ALAIN VONGSOUVANH: So you can do updates on it, and if you've been using the Path on Google+ Glassware, this is actually what we're doing. So when you share a photo with Google+, Google+ reports that photo and then updates the card to let the user know that it has been processed. And then when they get Plus One or comments, they'll be pushed into the bundle. AUDIENCE: So you don't have to create a new one and push it? ALAIN VONGSOUVANH: Yes. You update the existing one. AUDIENCE: And would there be any time that you would actually create a new one? ALAIN VONGSOUVANH: It really depends. JENNY MURPHY: For bundles. ALAIN VONGSOUVANH: Yeah, it really depends. If you have an Instagram Glassware, for instance, you might want to create multiple attachments and add them to the item so the user can choose which one they prefer. AUDIENCE: OK, got it. Thank you. ALAIN VONGSOUVANH: You're welcome. JENNY MURPHY: How about from this side? Question? AUDIENCE: Hello. I'm [INAUDIBLE] from Thailand. I'm wondering if it supports international language, for example, Thai language or any Asian language for displaying the timeline. JENNY MURPHY: So the Timeline Items themselves are UTFA, and you can actually see from some of our previous demos, we do translation. We're actually putting character sets from other languages in there. So they should work, and if you encounter a situation where they don't, please let us know. AUDIENCE: How can I know that it doesn't work? JENNY MURPHY: Sorry? AUDIENCE: I'm wondering if this works. I saw in the last session there is a "late-aral"? menu? JENNY MURPHY: Literal? AUDIENCE: Literal, yeah. And this works for non-English languages, too? JENNY MURPHY: Yeah, it's actually one of the really cool features of Glass is you can Google for a translation. So I can ask it how to say something in another language, and it reads to me in that language, too. AUDIENCE: OK, cool. Thank you. JENNY MURPHY: It's pretty neat. AUDIENCE: Hi. Billy Lo from Toronto. Specifically around the OAuth integration, it's not quite clear how a Glass Mirror API handles the OAuth Refresh of the token because generally, there's an expiration of the OAuth token, right? ALAIN VONGSOUVANH: This is actually part of the protocol and our API Stack. So usually, what you can do is either keep the expiry date you get when you retrieve an access token, or the other way you can do that is try to send a request and look for an authorized request back from the API. So if you get a 401 or 403 back, try to refresh the token, and if this is successful, just use the new token. AUDIENCE: I see. Thank you. ALAIN VONGSOUVANH: And our client libraries handle that for you as well. AUDIENCE: Excellent. Thank you. JENNY MURPHY: The slide we showed was a slight oversimplification to try and do OAuth in one slide, so there's a little more detail to it. This side? AUDIENCE: Hi there. JENNY MURPHY: Hi. AUDIENCE: How soon can we send audio attachments to the Mirror API? JENNY MURPHY: Audio attachments. So right now, you can attach photographs and video, and you can take the photos and embed them into the card. Audio attachments is something we want to support sometime. I don't have any specific timeline on it. You can actually attach them, they just don't play right now. But as we've mentioned before, it's in developer preview, so that'll be coming at some point. AUDIENCE: Thank you. JENNY MURPHY: You're welcome. AUDIENCE: Hey, this is Andreas from Minnesota. I'm interested in lower latency scenarios and wonder what round trip times could be in [INAUDIBLE] scenarios. And beyond Mirror, if you're looking at other APIs which enable like more real time things? ALAIN VONGSOUVANH: So Timothy this morning during his session announced that we're working on GDK, so Glass Development Kit. It's not ready yet. We're still working on it. Make sure to file feature requests if you have any, and we'll keep you updated when we have more information. JENNY MURPHY: And in the meantime, I recommend you go to the Hack Your Glass session. I think you'll like the content there. Switching sides again. Hi. AUDIENCE: Is there a character limit for the bodies of the messages, because it looks like in the Gmail app, emails are truncated? JENNY MURPHY: So for content and length. So you can fit about seven lines comfortably, but they're variable with fonts. AUDIENCE: So when you have multiple cards, though, the message will keep going? JENNY MURPHY: Yes, you can have multiple cards. AUDIENCE: Is there a limit on how many characters you can put? JENNY MURPHY: There are a couple ways to do this. If you're handcrafting HTML, you kind of frame it so it fits in there well. If you have plain text content, we'll actually page it for you automatically. That's how Gmail supports it. AUDIENCE: Is that a bug in the Gmail app then? If you have a long email, it truncates the message and you can't read the full email on Glass. JENNY MURPHY: You can't read the full email? It should be showing you the full email. So if you can show that to me, swing back by the Sandbox, and we'll take a peek. AUDIENCE: Thanks. JENNY MURPHY: I think we have time for one more quick one. ALAIN VONGSOUVANH: Seven seconds. JENNY MURPHY: Six seconds left. AUDIENCE: So I've been wondering-- Timothy showed this morning the Facebook application which allows you to add a caption to a photo after sharing it. I've been wondering what kind of menu item this is. ALAIN VONGSOUVANH: It's a reply menu item. AUDIENCE: So you can change the way the standard menu items are displayed? ALAIN VONGSOUVANH: Yes. So you can use built-in menu items and override the display name and the icon. AUDIENCE: OK, thanks. ALAIN VONGSOUVANH: So for other questions, we'll be at the Sandbox. Feel free to swing by and ask us any questions you have. JENNY MURPHY: Yes. Come talk to us. We love talking about Glass. ALAIN VONGSOUVANH: Thank you for coming. JENNY MURPHY: Thank you, everyone.
B1 glassware timeline user api jenny alain Google I/O 2013 - Building Glass Services with the Google Mirror API 70 7 田立瑋 posted on 2013/09/19 More Share Save Report Video vocabulary