OUYA easter egg menu

On 2013-09-19 OUYA shipped a system update and wrote in its blog post:

4) We’ve even had our intern put a few fun easter eggs on OUYA =)

...

Our intern has hidden an “Easter Eggs” menu somewhere on the OUYA… can you find it?

imnotanerd pointed out a day later that you have to go to "console info" and press Y to get into the easter egg menu.

6 years later, this does not work anymore :/

OUYA development kit

ODK 1.0.12 was the last that included a ouya-launcher.apk, which is the OUYA user interface. It is easily decompilable with jadx.

The code tells us that there is a tv.ouya.console.launcher.settings.EasterEggs activity class, and its getEasterEggList method returns toggle_ou_ya_bumpers and crazy_button_legend.

All the easter eggs are only available when OuyaActivity.EASTER_EGGS_ACTIVATED.booleanValue() is true, which it is in ODK 1.0.12.

The code also suggests what had been on reddit: In the "console info" screen, simply press "Y" to show the easter eggs menu. But no avail today :/

Current firmware

The current firmware version is 1.2.1427_r1, and that obviously differs from the launcher in 1.0.12.

The only way to obtain the OUYA launcher code is to get OUYALauncher.apk and OUYALauncher.odex from the OUYA's /system/app/ folder. The apk file does not contain any code; that one is in the ODEX file whose format changes with every Android version and is much harder to decompile than plain .apk files. Luckily GDorn had already used Universal Deodexer V5 to get a half-way readable representation of the compiled code.

Today the OuyaActivity uses

android.content.Context.getSharedPreferences("EasterEggPreferences", 0);

to load easter egg settings and then looks for a boolean R.string.easter_eggs_enabled to see if easter eggs may be used at all. There is nothing that sets this configuration value, it is only read.

It turns out that those shared preferences are stored in an application's shared_prefs/ data directory; in our case the file path is /data/user/0/tv.ouya.console/shared_prefs/EasterEggPreferences.xml.

R.string.easter_eggs_enabled is a translated string that has a different value in every language :/

So when we put a boolean with that name into the preferences file and set it to true, the easter eggs menu will be enabled.

How to activate easter eggs

You need to have adb installed and running, and the OUYA connected via USB (or networked adb):

$ adb shell
$ su
$ vi /data/user/0/tv.ouya.console/shared_prefs/EasterEggPreferences.xml
type "i"
copy + paste the following:
---
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="Easter Eggs Enabled" value="true" />
<boolean name="Easter Eggs aktiviert" value="true" />
<boolean name="Easter Eggs attivate" value="true" />
<boolean name="Œufs de Pâques activés" value="true" />
<boolean name="Easter eggs activados" value="true" />
</map>
---
press escape
type :wq
$ chown u0_a16:u0_a16 /data/user/0/tv.ouya.console/shared_prefs/EasterEggPreferences.xml
$ reboot

Now go to Manage -> System -> Console Info and press Y. The Easter Eggs menu will appear.

OUYA easter eggs activation menu

Easter eggs

OU-YA

There is only a single easter egg to activate in that menu: OU-YA Bumper Noise Maker. When it is enabled, pressing the left and right top shoulder buttons (KEYCODE_BUTTON_L1 and KEYCODE_BUTTON_R1) will play a sound "OU" and "YA". This works in any menu.

Key combo

The EasterEggs screen code also registers a KeyComboListener that wants the following key codes:

19, 19, 20, 20, 21, 22

It turns out that 19 is DPAD_UP, 20 is down, 21 left and 22 right.

Pressing up up down down left right on the left thumb stick in the easter eggs menu will play the "boot-up finished" video (R.raw.boot_video_long).

Written by Christian Weiske.

Comments? Please send an e-mail.