HAPPY BOOKSGIVING
Use code BOOKSGIVING during checkout to save 40%-55% on books and eBooks. Shop now.
Register your product to gain access to bonus material or receive a coupon.
In just 24 sessions of one hour or less, Sams Teach Yourself Google TV App Development in 24 Hours will help you master app development with the radically improved new version of Google TV running Android 3.2 and Android second-screen apps using 4.2. Using its straightforward, step-by-step approach, you’ll gain the hands-on skills you need to build all three types of Google TV apps: Web, Android, and second-screen apps. You’ll learn today’s Google TV development best practices. Every lesson builds on what you’ve already learned, giving you a rock-solid foundation for real-world success!
Step-by-step instructions carefully walk you through the most common Google TV development tasks
Quizzes and Exercises at the end of each chapter help you test your knowledge
Notes present interesting information related to the discussion
Tips offer advice or show you easier ways to perform tasks
Cautions alert you to possible problems and give you advice on how to avoid them
Carmen Delessio is an expert Android and application developer who has worked as a programmer, technical architect, and CTO at large and small organizations. He began his online development career at Prodigy working on early Internet applications. He has written for Androidguys.com, Mashable, and ScreenItUp.com. His apps can be found at Bffmedia.com.
Learn how to…
n Develop for TV watchers and the “10-foot user experience”
n Create highly interactive and responsive TV apps
n Use Google TV’s optimized HTML templates and layouts
n Integrate HTML5 and jQuery into your Google TV apps
n Design effective user interaction, dialogs, navigation, and video sitemaps
n Organize Google TV apps intuitively with Tabs and the ActionBar
n Use Fragments to simplify your development process
n Store structured data locally in SQLite for instant user access
n Create and use ContentProviders
n Use the Channel Listing Provider for apps with TV listings and changing channels
n Build second-screen apps to connect Google TV with a second device
n Use the Anymote protocol to handle messaging between TVs and remote devices
n Bring it all together to build a complete Google TV app, from start to finish
Download a free pdf of code associated with Sams Teach Yourself Google TV App Development in 24 Hours here
Developing Second Screen Apps for Google TV
Download the sample pages (includes Chapter 23 and Index)
Introduction
Hour 1: Developing for Google TV and the 10-Foot User Experience 1
Google TV UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
TV as a Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . 3
Google TV Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
10-Foot User Experience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Hour 2: Optimizing Web Pages for Google TV 15
Displaying Content on TV Screens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Playing Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Displaying Text and Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Navigating the Big Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Hour 3: Using Google’s Video Templates 31
Google Video Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Examining the Template Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Understanding the JavaScript for Template 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Using Templates to Show Your Own Videos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Retrieving Videos Using AJAX . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Q&A . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Hour 4: HTML5 and jQuery UI Library for Google TV 45
Video Properties and Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Adding Video Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Adding Some Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Using the jQuery GTV UI Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Workshop . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Exercises . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Hour 5: Using the Google TV Closure UI Library 61
Using Closure for Google TV Web Apps . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 61
Using the Library to Create an HTML Page . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 63
Buttons, Lightboxes, and Other Components . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Summary . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Exercises . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Hour 6: Creating a Video Sitemap 83
Searching on Google TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Sitemaps and Google Webmaster Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Adding Details to Video Sitemaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Tags That Provide Additional Info on Google TV . . . . . . . . . . . . . . . . . . . . . . 87
Summary . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Hour 7: Android and Google TV 95
Android, the Google TV Operating System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Understanding the Development Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Testing Your Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Setting Up an Android Project in Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Exercises . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Hour 8: Using Android Layouts for Your Google TV App 113
Layout Basics with LinearLayout . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 113
Laying Out Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
FrameLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
RelativeLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Hour 9: Optimizing UI Components for Google TV 129
Form Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Using ImageViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Using VideoViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Putting Button Overlays on a Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Summary . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Hour 10: Organizing Google TV Apps Using the ActionBar 149
Implementing an ActionBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Adding Tabs . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Adding ActionItems and MenuItems . . . . . . . . . . . . . . . . . . . . . . . . 153
Using the LeftNavBar Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Exercises . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Hour 11: Understanding Activities and Fragments in a Complex App 163
Understanding the Activity Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . 163
Understanding Fragments . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Swapping Fragments in an Activity . . . . . . . . . . . . . . . . . . . . . . . . 166
Using Fragments with ActionBar . . .. . . . . . . . . . . . . . . . . . . . . . . . 174
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Hour 12: Using Specialized Fragments 181
DialogFragments. . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
ListFragments . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Grids and Galleries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Hour 13: Handling D-Pad and Key Events 195
Designing for the D-Pad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Controlling Focus . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 197
Programming D-Pad Key Events . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 199
Summary . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Q&A . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Hour 14: Accessing Remote Content for a Google TV App 207
Displaying Remote Images and Videos. . . . . . . . . . . . . . . . . . . . . . . 207
Fetching Remote Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Using and Parsing JSON Formatted Data . . . . .. . . . . . . . . . . . . . . 215
Putting the Pieces Together in the App . . . . . . . . . . . . . . . . . . . . . . . . 218
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Workshop . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Hour 15: Storing Data with SQLite 225
Organizing a Database with Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Managing Data with SQLiteOpenHelper . . . . . . . . . . . . . . . . . . . . . . . . 226
Adding, Deleting, and Updating Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Querying Data and Using Cursors . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . 231
Using a Database in the App . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Summary . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 237
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Hour 16: Creating a Content Provider 239
Using a URI for Data Retrieval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Building a ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Using PhotoProvider in Our App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Requesting a File from a ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Summary . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Hour 17: Using Loaders and CursorLoaders 257
How Loaders Work . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Loader Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Loader States and LoaderManager.Callbacks . . . . . . . . . . . . . . . . . . . . . . 258
Adding Loaders to ImageViewFragment . . . . . . . . . . . . . . . . . . . . . . . . 260
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Hour 18: Developing a Complete App 269
Determining What the App Will Do . . . . . .. . . . . . . . . . . 269
Developing the GridFragment . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Enhancing the Activity Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Adding the ActionBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Exercises . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Hour 19: Mastering the Android Manifest File 289
Android Manifest Basics . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Understanding Intents . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Adding Google TV Specifics to the Manifest File . . . . . . . . . . . . . 294
Publishing Your App . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Hour 20: Using the Channel Listing Provider 301
Getting Data from the Channel Listing Provider . . . . .. . . . . . . . . 301
Listing All Channels . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Changing the Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Understanding Audio Focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Q&A . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Hour 21: Using Second Screen Apps with Google TV 315
How Second Screen Apps Are Used . . . . . . . . . . . . . . . . . . . . . . 315
Types of Second Screen Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
User Interaction with Second Screen Apps . . . . .. . . . . . . . . . . . . . . . . . 316
Connecting a TV with a Second Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Hour 22: Examining an Example Second Screen App 325
Preparing the Blackjack Second Screen App . . . . . . .. . . . . . . . . . . . . . . 325
Running the Blackjack App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exploring the Blackjack App Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Exploring the Anymote Library Code . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 332
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Q&A . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Hour 23: Developing Second Screen Apps 337
Flinging a URL . . . . . . . .. . . . . . . . . . . . . . . . . . . . .. . . . . . . . 337
Sending KeyEvents to the TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Sending Mouse Events to the TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Workshop . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Exercises . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Hour 24: Working with Anymote and Pairing Protocols 353
The Anymote Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Pairing Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Using Anymote and Pairing in a Chrome Extension . . . . . . . . . . . . . . . . . . . 360
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Index 367