After the launch of Music Key in November, we've had good reason to expect quite a bit from YouTube. We've seen things like 60 fps live streaming, 360-degree videos with cardboard support, and big updates to the Kids and Creator Studio apps – and that's just some of the stuff from the last two months. We also know there's plenty still to come, particularly an ad-free subscription model. The latest update doesn't seem to deliver any new features, not unless Google is planning to flip a switch server-side, but it gives a few hints about what to expect in the future.

TeardownHero

Teardown

Disclaimer: Teardowns are necessarily speculative and usually based on incomplete evidence. It's possible that the guesses made here are totally and completely wrong. There is always a chance that details may change or plans may be cancelled prior to the launch of a new feature discovered in a teardown. Much like rumors, nothing is certain until it's officially announced.

Google Now Actions

I don't know about anybody else, but once I've got a playlist put together and I'm streaming to a Chromecast, the last thing I want to do is regularly pick up my phone and screw with unlocking the screen or tapping buttons. I just want to yell out orders and have the right things happen. Is that too much to ask? The fine folks on YouTube's engineering team are way ahead of the game – they're working on "Google Now Actions" to control playback, and from the look of it, this is entirely about voice actions.

Most of the evidence isn't exactly new. In fact, I've had my eye on it for a few releases, but I didn't feel good about jumping to conclusions about the potential for a new feature. There are still plenty of unknowns, but I think the purpose is pretty clear at this point.

An activity in YouTube's Android manifest describes a series of intent filters that capture messages for a number of actions users might want to take during or after playback. A second file named google_now_actions.xml defines a series of actions Google Now will use to fire off these intents. Between the two, they form a mapping of commands so Google Now will know what to listen for and how to convert any instructions into messages for YouTube.

Each of these actions includes a set of phrases that roughly match human speech. They aren't perfect, and they aren't comprehensive, but they certainly read more like something a person would say than anything we might type or look for in a list. Here are the commands and their recognized phrases. Anything in quotes is something Google Now will listen for, anything labeled Example is sample text Google Now will show to users to let them know how a command is supposed to be said, and anything labeled Options describes Google's pre-defined list of options that can be substituted into the spoken phrase. Only the Search command allows for open-ended input.

  • Search
    • "search for ..."
    • Example: "search for hunger games"
  • Close Player
    • "close player"
  • Screen Change
    • "fullscreen", "go to fullscreen"
    • "mini screen", "go to mini screen"
    • "normal screen", "go to normal screen"
  • Connect
    • "play on ...", "connect on..."
    • Options: TV, Chromecast, Console
    • Example: "play on TV", "connect to TV"
  • Disconnect
    • "disconnect from ..."
    • Options: TV, Chromecast, Console
    • Example: "disconnect from TV"
  • Pause
    • "pause"
  • Play
    • "play"
    • "resume"
  • Stop
    • "stop"
  • Next
    • "next"
    • "play next"
  • Previous
    • "previous"
    • "play previous"
    • "play last"
  • Skip Ads
    • "skip ads"
  • Play Nth Video
    • "play the ... video"
    • Options: any ordinal 1-10 (e.g. first, second, third)
    • Example: "play the first video"

The list of actions is pretty comprehensive, covering just about everything except jumping to a specific time or toggling subtitles. Semi-advanced actions like connecting and disconnecting a Chromecast are supported. There's even a command to skip ads.

It's worth noting that there are currently some inconsistencies between the intent filters and the intents that would be fired by the Google Now Actions, particularly where the Screen Change group is concerned. If this feature were launched today, those voice commands would fail to switch between full screen, normal, and the mini player. There are also some oddly redundant entries for Next and Previous that could have been written more simply. Nevertheless, we can probably bet that it's a sign Google isn't really ready to flip the switch on this one.

Evidence

AndroidManifest.xml

<meta-data android:name="GoogleNowActions" android:resource="@xml/google_now_actions"/>
<activity android:configChanges="keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:name="com.google.android.apps.youtube.app.WatchWhileActivity" android:theme="@style/Theme.YouTube.Home" android:windowSoftInputMode="adjustResize">
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.CLOSE_PLAYER"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.SCREEN_CHANGE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.PAUSE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.PLAY"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.STOP"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.NEXT"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.PREVIOUS"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.SKIP_ADS"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.mdx.voice.CONNECT"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.mdx.voice.DISCONNECT"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.youtube.voice.PLAY_NTH_VIDEO"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>

google_now_actions.xml

<GoogleNowActions xsi:schemaLocation="https://developers.google.com/android/search/actions/1.0 https://developers.google.com/android/search/actions/1.0/example.xsd" xmlns=https://developers.google.com/android/search/actions/1.0 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<PackageName>com.google.android.youtube</PackageName>
<VersionCode>1073741824</VersionCode>
<AppName>YouTube</AppName>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>android.intent.action.SEARCH</Intent>
<Example>search for $SchemaOrg_Text:query</Example>
<DiscoverabilityExample>search for hunger games</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.CLOSE_PLAYER</Intent>
<Example>close player</Example>
<DiscoverabilityExample>close player</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.FULL_SCREEN</Intent>
<Example>full screen</Example>
<Example>fullscreen</Example>
<Example>go to full screen</Example>
<Example>go to fullscreen</Example>
<DiscoverabilityExample>fullscreen</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.MINI_SCREEN</Intent>
<Example>mini screen</Example>
<Example>miniscreen</Example>
<Example>go to mini screen</Example>
<Example>go to miniscreen</Example>
<DiscoverabilityExample>miniscreen</DiscoverabilityExample>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.NORMAL_SCREEN</Intent>
<Example>normal screen</Example>
<Example>normalscreen</Example>
<Example>go to normal screen</Example>
<Example>go to normalscreen</Example>
<DiscoverabilityExample>normalscreen</DiscoverabilityExample>
</Action>
<Action>
<VerbClass>SuspendAction</VerbClass>
<Intent>com.google.android.youtube.voice.PAUSE</Intent>
<Example>pause</Example>
<DiscoverabilityExample>pause</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ResumeAction</VerbClass>
<Intent>com.google.android.youtube.voice.PLAY</Intent>
<Example>play</Example>
<Example />
<DiscoverabilityExample>play</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ResumeAction</VerbClass>
<Intent>com.google.android.youtube.voice.PLAY</Intent>
<Example>continue</Example>
<DiscoverabilityExample>continue</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>DeactivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.STOP</Intent>
<Example>stop</Example>
<DiscoverabilityExample>stop</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.NEXT</Intent>
<Example>next</Example>
<DiscoverabilityExample>next</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.NEXT</Intent>
<Example>play next</Example>
<DiscoverabilityExample>next</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.PREVIOUS</Intent>
<Example>previous</Example>
<DiscoverabilityExample>previous</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.PREVIOUS</Intent>
<Example>play previous</Example>
<DiscoverabilityExample>play previous</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.PREVIOUS</Intent>
<Example>play last</Example>
<DiscoverabilityExample>play last</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.SKIP_ADS</Intent>
<Example>skip ads</Example>
<DiscoverabilityExample>skip ads</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.mdx.voice.CONNECT</Intent>
<Example>play on $FirstScreen:first_screen</Example>
<DiscoverabilityExample>play on TV</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<DeveloperProvidedType>
<Name>$FirstScreen</Name>
<Value>TV</Value>
<Value>Chromecast</Value>
<Value>Console</Value>
</DeveloperProvidedType>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.mdx.voice.CONNECT</Intent>
<Example>connect to $FirstScreen:first_screen</Example>
<DiscoverabilityExample>connect to TV</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>DeactivateAction</VerbClass>
<Intent>com.google.android.youtube.mdx.voice.DISCONNECT</Intent>
<Example>disconnect from $FirstScreen:first_screen</Example>
<DiscoverabilityExample>disconnect from TV</DiscoverabilityExample>
<AppInForegroundOnly>true</AppInForegroundOnly>
</Action>
<Action>
<VerbClass>ActivateAction</VerbClass>
<Intent>com.google.android.youtube.voice.PLAY_NTH_VIDEO</Intent>
<Example>play the $NumberTh:index video</Example>
<DiscoverabilityExample>play the first video</DiscoverabilityExample>
</Action>
<DeveloperProvidedType>
<Name>$NumberTh</Name>
<Value>first</Value>
<Value>second</Value>
<Value>third</Value>
<Value>forth</Value>
<Value>fifth</Value>
<Value>sixth</Value>
<Value>seventh</Value>
<Value>eighth</Value>
<Value>ninth</Value>
<Value>tenth</Value>
</DeveloperProvidedType>
</GoogleNowActions>

The biggest mystery is about how these commands will be surfaced to users. Will a phone or tablet have to be in a certain screen or mode, or can users call out a hotword followed by a command? What happens if two apps offer the same actionable terms (e.g. "Ok Google, Next")?

Accelerated Videos

YouTube is preparing something called "accelerated videos." The short description explains that accelerated videos are played without buffering. While there isn't much in the way of context, this is probably a feature for live video streams where viewers care more about seeing content as it happens rather than allowing it to pause for seconds at a time.

<string name="sc_discovery_notification_title">Accelerated videos available</string>
<string name="sc_discovery_notification_text">Tap to watch without buffering</string>
<string name="sc_badge_text">Accelerated</string>
<string name="sc_badge">Accelerated Badge</string>

Given the recent announcement of YouTube Gaming, it's likely accelerated videos are intended for viewers with connections that can't quite stand up to the pressure of 60 fps live streams Google intends to provide. Live broadcasts of any kind, particularly sporting events, are usually meant to be seen in real time and with as little delay as possible, which means it's usually better to drop a few frames than it is to fall behind on the action.

On the other hand, this could also be a great feature for viewers with legitimately poor connectivity, particularly those living in countries where bandwidth is limited or unreliable. Imagine trying to watch an urgent 3-minute news bulletin that takes 30 minutes to load, it would be hopeless, and potentially life-threatening. If a steady stream of audio and a few frames of video can make it through without buffering, that would be sufficient for many situations.

Improved (And Reliable) Notifications

It's no secret that YouTube has had some problems with notifications. Subscribers often don't see notifications for many hours (or days) after a new video is posted, and that's if they even get anything at all. A couple of months ago, the YouTube Creators channel released a video (embedded below) that acknowledged the problems and made a clear statement that a lot of work was going into fixing the situation.

This 2-month-old video acknowledges the problem, and yesterday a video was posted that promises some real fixes are coming. So, it's probably not a coincidence that the YouTube update that also came out yesterday includes a string that directly references channel notifications.

<string name="channels_notification_tutorial_description">Never miss an update! Tap the bell to get every notification for this channel.</string>

The text belongs to a tutorial page, like those you would see the first time running an app. The message is clear enough about getting every single notification for a channel, which at least is a promise that they will be more reliable. There's no mention about being more timely, but that could be an intentional choice to not draw attention to a problem of the past. The text also mentions tapping on a bell to get these notifications, which is specifically represented in a short animation during the video (cued up below). The real interface will obviously look different, but YouTube is making a real effort to teach users what to look for.

A single string hardly means that there's a timeframe for launch; but given the relative urgency for improvements, it feels like Google might be gearing up to roll out these improvements.

Ad-Free Subscriptions?

It's not a secret, YouTube is working on an ad-free subscription model. Google gave this information away back in April, and many of us were disappointed that I/O didn't bring an official announcement. Unfortunately, I can't promise a launch is right around the corner, either. But that doesn't mean there aren't a couple of hints suggesting things are moving along. The latest version adds Wallet support and what appears to be a couple of activities that will be used for setting up the subscription.

New service and activities

<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>
<activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme"/>
<receiver android:exported="false" android:name="com.google.android.gms.wallet.EnableWalletOptimizationReceiver">
<intent-filter>
<action android:name="com.google.android.gms.wallet.ENABLE_WALLET_OPTIMIZATION"/>
</intent-filter>
</receiver>

Sadly, there's no sign of promo materials for publicizing the subscription, nor are there any text descriptions, titles, or graphics for basic badges or settings. Put simply, this is almost certainly not the version that will launch the ad-free option. However, it probably is the version Google's employees are using to test with.

This would make a lot of sense given that the new terms of service that include the ad-free subscription only went into effect two weeks ago on June 15th. While completely internal testing could have been done without violating content licensing, expanding to a wider group of test subjects would ideally be done after the new terms are active.

nexus2cee_upload

If I'm right and YouTube has pushed subscriptions to an external group of testers, we could see it go live as early as next month. On the other hand, this is a really big announcement and Google might hold it back for a more formal launch event.

Allow for a moment of wild speculation... The Chromecast turns 2 years old next month. Maybe it's time for a refresh? After all, what pair of products would go together better than ad-free YouTube and a brand new 2015 Chromecast? There could even be a free trial included with each Chromecast. All I'm saying is it makes sense.

Disclaimer: The last part is just playful speculation. I have no evidence or credible rumors to suggest an updated Chromecast is coming. (But I'll totally take credit for the prediction if it happens.)

Download

The APK is signed by Google and upgrades your existing app. The cryptographic signature guarantees that the file is safe to install and was not tampered with in any way. Rather than wait for Google to push this download to your devices, which can take days, download and install it just like any other APK.

Version: 10.25.55