With the newest version of Google TV, Google has transformed TV into tomorrow's hottest app development platform. Suddenly, developers can build TV apps for everything from Blu-Ray players to set-top boxes, leveraging the support of leaders ranging from Samsung to Vizio. Now, in just 24 lessons of one hour or less, top Android developer Carmen Delessio guides developers through every step of creating Google TV web, Android, and remote control apps. Each short, easy lesson builds on all that's come before, revealing what's unique about Google TV development, showing how all elements of the app lifecycle fit together, and introducing Google TV's key features in real-world context. Readers learn how to: * Develop for the "10 foot user experience" * Build logic to drive highly interactive and responsive apps * Use optimized templates and layouts * Integrate HTML5 and jQuery * Design effective user interaction, dialogs, navigation, and video sitemaps * Organize apps with tabs and the Action Bar * Use fragments to simplify development * Integrate SQLLite data * Create content providers * and more Step-by-step instructions walk readers through common questions, issues, and tasks... Quizzes and Exercises build and test knowledge... "Did You Know?" tips offer insider advice and shortcuts... and "Watch Out!" alerts help readers avoid problems. By the time they're finished, readers will be comfortable going way beyond the book, to build breakthrough TV apps of their own.
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