A couple of days ago, Google dropped a pretty sweet but surprising late-night update to Google Search with version 2.7.9. You can read about the announced features and download the APK here, if you haven't yet. After the dust settled, I jumped right into the multitude of under-the-hood changes and was able to uncover quite a few things not included in the changelog - both ones that are coming in the future and ones that are already here.

Let's take a look at the new stuff that wasn't mentioned first and then jump to things that may be arriving soon. Teardown season is open, and you're all invited for a ride!

New stuff that's already here

Image downloads

One of the most functional and useful changes is the ability to download images when using image search. The image you are trying to save gets queued up and downloaded in the notification area, just as you'd expect. Here you can see my Note II with Search 2.6 vs the Nexus 4 with Search 2.7:

Left: old Search; Right: new Search

Ongoing reminders

Search 2.7 has a new area under Settings -> My Stuff -> Reminders called Ongoing. By default, all your upcoming reminders go to Upcoming and your past ones to Past. So what goes into Ongoing?

As it turns out, this is exactly how the new functionality to remind you about book, album, and TV episode releases is exposed. For example, when browsing Google for "breaking bad," you will see a card with the information about Breaking Bad, along with a new Remind me button. Set it, and the reminder will go straight into your Ongoing reminders section:

This weekend in reminders

Reminders now support "This weekend." Search understood this phrase before, but displayed it as one of the upcoming days of the week, whereas now it simply says "Weekend."

<string name="this_weekend">This weekend</string>

Left: old Search; Right: new Search

Search 2.7 uses new date and time pickers that I personally really love but others hate for some reason. We saw them first in Google Calendar back in May. Props to Ron for spotting this change.

New Loyalty Programs card?

There is a new Google Now card called Loyalty Programs. Ron found the upcoming Loyalty card functionality in a previous teardown of Search v2.6, and now the card is here. But what does it do? Especially since gift and loyalty cards were cut from Wallet on August 21.

Next Appointment card now lets you select the calendars you want

Yay, you can now hand-pick only the calendars you want for the Next appointment card and notifications. Awesome:

Reminders now have a Remind me in 10 minutes/1 hour button

When a reminder card pops up, you now have the option to snooze it for 10 minutes. Pressing 10 minutes changes the prompt to 1 hour. Handy:

Left: old Search; Middle, Right: new Search

Sound search will no longer hang if you have no connection

If your connection is shaky and you try to identify a song that's playing on the radio around you, the old Search would listen and then hang indefinitely at the end. The new Search will error out right away to avoid the frustration. Here's a test I ran using Airplane mode:

Left: old Search; Right: new Search

Translate button changed to Open in Google Translate

The Translate card that pops up when you travel now says Open in Google Translate instead of just Translate. Here's what the old card looked like:

<string name="open_in_google_translate">Open in Google Translate</string>

(NEW) You can now edit upcoming reminders

Previously, upcoming reminders could only be deleted, whereas now you can both edit and delete them.

(Thanks, Barry!)

Left: old Search; Right: new Search

Stuff that may be coming at some point

Custom hotwords

Right now, Google Search can be activated using voice by saying the hotword "Google." It looks like custom hotwords are coming and can even be controlled by adding a file called hotword_prompt.txt somewhere in the language model. I'm not sure what format the file needs to be in, and where it needs to be placed exactly though - I tried a few things but the hotword didn't change. There is also going to be a hotword setting so you can change it directly from the app.

The current Voice settings in Search 2.7

In Search 2.6, the hotword prompt had Google hardcoded into the string:

<string name="type_or_say_google">Search, or say Google</string> <string name="prefSummary_hotwordDetector">Say Google to launch voice search.</string>

In Search 2.7, it's now a variable:

<string name="type_or_say_hotword">Search, or say %1$s</string> <string name="prefSummary_hotwordDetector">Say <xliff id="hotword_prompt" example="OK Google">%1$s</xliff> to launch voice search.</string>

Here are related new functions:

getHotwordPrompt() addHotwordPrompt()

And the hotword_prompt.txt-related code snippet:

else if ("hotword_prompt.txt".equals(localFile.getName()))

localLocaleResourcesImpl.addHotwordPrompt(localFile);

Auto-updating voice recognition language packs

Right now, you can download offline language packs, and they'll sit on your device in the same state, without any updates. Obviously, Google is improving language processing all the time, so it's only natural that they'll want to keep offline recognition updated as well. Auto-updates are coming, and there will even be a separate tab to configure the auto-update settings.

<string name="auto_update_language_packs">Auto-update</string>

<string name="auto_update_never">Do not auto-update languages</string>

<string name="auto_update_any_time">"Auto-update languages at any time. Data charges may apply."</string>

<string name="auto_update_wifi_only">Auto-update languages over Wi-Fi only</string>

<string name="disable_auto_update_prompt_title">Disable auto-update?</string>

<string name="disable_auto_update_prompt_content">Prevent future downloads by disabling automatic updates of all languages</string>

This code will enable the extra settings tab:

if (Feature.LANGUAGE_PACK_AUTO_DOWNLOAD.isEnabled())

this.mTabsAdapter.addTab(localActionBar.newTab().setText(2131363178), VoiceAutoUpdateRadioButtonFragment.class, new Bundle());

Multiple choice training questions?

The new Google Search has a lot of new files related to training and asking the user various questions, possibly on the back of Now cards. Some questions are multiple choice and some are yes/no:

training\MultipleChoiceQuestionView

training\QuestionKey

training\Training

training\TrainingBackOfCardAdapter

training\TrainingQuestion

training\TrainingQuestionManagerImpl

training\TrainingQuestionViewHelper

training\YesNoQuestionView

These puzzle me - some questions are answered locally and some remotely?

addServerAnsweredQuestion()

addClientAnsweredQuestion()

There are also a bunch of new training-related icons and buttons:

btn_training_next, btn_training_no, btn_training_prev, btn_training_yes

ic_action_info_training

ic_training_add, ic_training_biking, ic_training_driving, ic_training_edit, ic_training_hide, ic_training_people, ic_training_public_transit, ic_training_show, ic_training_tempunits, ic_training_walking

training_vertical_divider

New features being tested

Remember that Feature.LANGUAGE_PACK_AUTO_DOWNLOAD flag I showed you earlier in the auto-update section? There are a whole lot more of these secret flags that enable various hidden things around the app:

FOLLOW_ON = new Feature("FOLLOW_ON", 3, false);

FORCE_EYES_FREE = new Feature("FORCE_EYES_FREE", 4, false);

FORCE_CAR_MODE = new Feature("FORCE_CAR_MODE", 5, false);

LANGUAGE_PACK_AUTO_DOWNLOAD = new Feature("LANGUAGE_PACK_AUTO_DOWNLOAD", 6, false);

LOG_CONTACT_DATA = new Feature("LOG_CONTACT_DATA", 7, false);

REMINDERS_LEAVING_TRIGGER = new Feature("REMINDERS_LEAVING_TRIGGER", 8, false);

REMINDERS_WEEKEND = new Feature("REMINDERS_WEEKEND", 9, true);

SEARCH_HISTORY_IN_APP = new Feature("SEARCH_HISTORY_IN_APP", 10, false);

TEST_FEATURE = new Feature("TEST_FEATURE", 11, false);

TTS_NOVICE_MODE = new Feature("TTS_NOVICE_MODE", 12, false);

TTS_PREFIX_USERNAME = new Feature("TTS_PREFIX_USERNAME", 13, false);

TWO_STEP_DISAMBIG = new Feature("TWO_STEP_DISAMBIG", 14, false);

SHOW_LOGGING_TOASTS = new Feature("SHOW_LOGGING_TOASTS", 15, false);

Some are self-explanatory, some aren't, so I don't know what all of them do. But it's exciting that there's a way to see what's cooking by looking in this area of searchcommon/Feature.java.

I'm especially interested in TWO_STEP_DISAMBIG, which seems to enable a different UI for figuring out which contact you're trying to select when multiple ones match as well as FOLLOW_ON, FORCE_* - hell, I'm interested in all of them.

Debug options

With some help from my new friend Paul Price, we managed to enable some debug options, just for fun. Here are some screenshots:

This is all I have for you today. As you can see, since Ron's no longer with us, I've taken over the teardowns (at least until we find Ron 2.0), and it's my goal to not only continue them here at AP where they started, but make them better, more detailed, and more in-depth than ever before.