By Ovidiu Latcu


2012-11-14 08:34:01 8 Comments

I was looking at the new APIs introduced in Android 4.2. While looking at the UserManager class I came across the following method:

public boolean isUserAGoat()

Used to determine whether the user making this call is subject to teleportations.

Returns whether the user making this call is a goat.

How and when should this be used?

11 comments

@Gadget Guru 2018-11-17 19:11:42

It's not an inside joke

Apparently it's just an application checker for Goat Simulator - by Coffee Stain Studios

If you have Goat Simulator installed, you're a goat. If you don't have it installed, you're not a goat.

I imagine it was more of a personal experiment by one of the developers, most likely to find people with a common interest.

@Ricardo A. 2019-06-04 12:07:12

The method was created before the goat simulator. Although it checks if the app is installed now, it didn't do anything before. And it's a joke anyway.

@meh 2012-11-14 08:40:30

From their source, the method used to return false until it was changed in API 21.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

It looks like the method has no real use for us as developers. Someone has previously stated that it might be an Easter egg.

In API 21 the implementation was changed to check if there is an installed app with the package com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Here is the source and the change.

@tedders 2012-11-14 12:58:36

Theory: Goats are found in all kinds of precarious places, like sheer cliffs, possibly bucking location trends they get from regular non-goat users. Might explain "teleportations", which could be goats appearing to wildly relocate as the software tries to determine their location with algos designed for non-goats.

@LarsH 2012-11-14 17:17:04

How does this answer add anything to the info that the question already showed?

@djechlin 2012-11-14 20:07:01

@LarsH - the source for one.

@casperOne 2012-11-14 20:26:37

This is a history lesson, not an answer. Even if it is an Easter egg, is there a valid use case for it? Being an Easter egg doesn't preclude it from being useful, and you've not shown whether it is or is not useful.

@LarsH 2012-11-14 20:52:11

@djechlin, one aspect of the source is informative, and now that the answer has been edited, it's far more obvious: (this implementation of) this method always returns false.

@Thorbjørn Ravn Andersen 2013-08-25 06:13:05

The method could be overridden in a test scenario.

@Matthew Flaschen 2014-02-19 06:03:02

It's also a reference to en.wikipedia.org/wiki/The_Men_Who_Stare_at_Goats , about a U.S. military project involving goats.

@logain 2014-03-30 20:49:18

The monkey function is to detect the MonkeyRunner debug tool as specified in another answer.

@Jared Rummler 2015-02-05 09:25:22

They need to add canPigsFly(). while (!canPigsFly()) { /* code */ }

@Kevin Krumwiede 2015-02-21 08:07:45

That's a real app.

@Martin Konecny 2015-04-27 05:11:45

I feel bad for anyone who cheekily used this function, expecting it to return false forever.

@Ced 2015-08-22 05:40:34

@casperOne given the content of the method I think the use case is pretty self explanatory.

@raulk 2016-01-14 18:58:43

What's funny is there's an app with that ID: play.google.com/store/apps/…. And it's not free, nor made by Google!

@user253751 2016-09-27 01:01:33

@raulk Yes, they used the ID of that app, they didn't pick a random app ID and then happen to have someone create an app with that ID...

@Kevin Brotcke 2017-06-21 00:05:49

App is available for free through Amazon app store amazon.com/Coffee-Stain-Studios-Goat-Simulator/dp/B013KNQ2MS

@rainer198 2013-05-31 09:33:44

In the discipline of speech recognition, users are divided into goats and sheeps.

For instance, here on page 89:

Sheeps are people for whom speech recognition works exceptionally well, and goats are people for whom it works exceptionally poorly. Only the voice recognizer knows what separates them. People can't predict whose voice will be recognized easily and whose won't. The best policy is to design the interface so it can handle all kinds of voices in all kinds of environments

Maybe, it is planned to mark Android users as goats in the future to be able to configure the speech recognition engine for goats' needs. ;-)

@djechlin 2012-11-14 14:47:29

I don't know if this was "the" official use case, but the following produces a warning in Java (that can further produce compile errors if mixed with return statements, leading to unreachable code):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

However this is legal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

So I often find myself writing a silly utility method for the quickest way to dummy out a code block, then in completing debugging find all calls to it, so provided the implementation doesn't change this can be used for that.

JLS points out if (false) does not trigger "unreachable code" for the specific reason that this would break support for debug flags, i.e., basically this use case (h/t @auselen). (static final boolean DEBUG = false; for instance).

I replaced while for if, producing a more obscure use case. I believe you can trip up your IDE, like Eclipse, with this behavior, but this edit is 4 years into the future, and I don't have an Eclipse environment to play with.

@djechlin 2012-11-14 15:05:59

My bad - those are warnings, however they often lead to actual compile errors if you are returning from a block that control flow is now forced down.

@Andy 2012-11-14 18:13:39

Wouldn't compiler directive be a better use for conditions you want to compile out?

@josefx 2012-11-14 20:24:37

@djechlin I do not know if this is android only, in standard java ` if(false){...}` compiles just fine (open jdk javac 1.6 and 1.7)

@djechlin 2012-11-14 20:26:47

@josefx - compiler warnings and can lead to errors if the branch the code is forced down has a return statement as this produces unreachable code. This is a useful compiler error; e.g. if you forget break; statements in a switch and your default case throws an exception, you will get this error.

@josefx 2012-11-14 20:36:20

@djechlin sorry, I somehow failed to read your first sentence after seeing your (1==2) example - that if(false) is handled by the compiler is a downside in this case (and I should get some sleep to avoid more of these mistakes :-)).

@djechlin 2012-11-15 02:01:38

@PeterOlson - if you are specifically trying to test a code branch where an if goes false or true, this is the most precise and obvious way to simulate that - commenting out the block could be less accurate if you don't match to the proper end of the block (perhaps you didn't notice a discreet if/else block immediately following), it will lead to a compile error if you're forcing to the following else block, etc.

@auselen 2012-11-15 06:37:30

@Mike 2012-12-01 10:34:02

It is legal because a sub-class could override isUserAGoat() and return a different value.

@djechlin 2013-10-09 15:43:04

@Vadzim nope, compiler will detect that always evaluates to true.

@njzk2 2014-04-07 21:21:07

possibly because isUserAGoat is not final.

@Mark Whitaker 2014-11-05 12:29:56

"provided the implementation doesn't change" - and there's the problem. This is a disastrous way to implement a warning-free "if (false)" because the implementation can and does change. See my answer to this question: as of API21 isUserAGoat() returns true if a user has a specific app installed. Good luck diagnosing that when your code suddenly starts behaving oddly on "random" devices!

@thedayturns 2016-02-18 01:51:58

@MarkWhitaker Or if goats start using devices.

@Szymon Drosdzol 2016-02-29 13:16:30

@thedayturns If goats start using Android devices this will be the least of our problems.

@user253751 2016-03-19 22:02:53

@djechlin No it isn't, did you actually try it?

@djechlin 2016-03-20 01:22:54

@immibis what's that referring to?

@user253751 2016-03-20 02:26:22

@djechlin if(false) {/* stuff */} not compiling.

@djechlin 2016-03-20 02:46:14

@immibis guess you're right. Certainly gives this answer a long run of misinformation (and I had at least one chance to read a JLS citation and realize this). It's maybe material enough to keep around if the "Eclipse warning/error" happens but I will have trouble checking given my lack of Eclipse environment. At the least, I brought it up to being technically factual.

@vaxquis 2016-05-13 23:59:36

@djechlin could you please remove the aforementioned misleading comment (stackoverflow.com/questions/13375357/…) - a lot of people his this answer, and, since newbies usually believe highly-upvoted things, we're actually educating newcomers that if(false){} is a compiler error in Java...

@BlueWizard 2016-11-15 08:17:00

have you tried using /* and */ for commenting out code?

@djechlin 2016-11-15 13:06:53

@JonasDralle this is obviously a ridiculous answer, but that won't work for code that already has /* */ inside of it. It's also easy to mess up blocks that way if if ends in } } } } } } } }.

@Mark Whitaker 2014-10-20 10:00:29

As of API 21 (the first Android 5.0/Lollipop SDK), this detects whether the Goat Simulator app is installed:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

This should make it clear that djechlin's suggestion of using it as a warning-free if (false) is a potentially disastrous strategy. What previously returned false for every device now returns a seemingly random value: if this was buried deep enough in your code it could take a long time to figure out where your new bugs are coming from.

Bottom line: if you don't control the implementation of a method and decide to use it for purposes other than stated in the API documentation, you're heading for trouble.

@djechlin 2014-11-05 15:56:59

Why would anyone ever put any kind of if(false) in production? Come on here. If that's what your code looks like then this implementation changing is the least of your problems.

@codebreaker 2014-11-18 16:20:52

Well, as per the actual API documentation (user teleportation tendencies), I think using it to always return false is really the only way to follow the contract. Still, you bring up a good point.

@cowls 2014-11-29 22:12:55

The goat simulator looks awesome on google play play.google.com/store/apps/…. It would be good to know what one can gain from being a goat.

@j.c 2014-02-06 10:35:13

Funny Easter Egg.
In Ubuntu version of Chrome, in Task Manager (shift+esc), with right-click you can add a sci-fi column that in italian version is "Capre Teletrasportate" (Teleported Goats).

A funny theory about it is here.

@Thornkey 2018-12-23 23:04:47

Can't seem to find it anymore :(

@rickyduck 2012-11-15 10:33:43

Google has a serious liking for goats and goat based Easter eggs. There has even been previous Stack Overflow posts about it.

As has been mentioned in previous posts, it also exists within the Chrome task manager (it first appeared in the wild in 2009):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

And then in Windows, Linux and Mac versions of Chrome early 2010). The number of "Goats Teleported" is in fact random:

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Other Google references to goats include:

The earliest correlation of goats and Google belongs in the original "Mowing with goats" blog post, as far as I can tell.

We can safely assume that it's merely an Easter egg and has no real-world use, except for returning false.

@goat 2014-09-17 04:29:52

ibm is also rumored to have goat references throughout various internal software.

@Mikeb 2019-03-25 17:14:24

Archived link for the "Mowing with goats" reference : web.archive.org/web/20100619024942/https://…

@KDEx 2012-11-16 21:33:43

There is a similar call, isUserAMonkey(), that returns true if the MonkeyRunner tool is being used. The SDK explanation is just as curious as this one.

public static boolean isUserAMonkey(){}     

Returns true if the user interface is currently being messed with by a monkey.

Here is the source.

I expect that this was added in anticipation of a new SDK tool named something with a goat and will actually be functional to test for the presence of that tool.

Also see a similar question, Strange function in ActivityManager: isUserAMonkey. What does this mean, what is its use?.

@CtrlF 2014-01-28 08:16:28

My assumption with this one is it allows the ActivityManager to report if it has been invoked by the monkey ui stress testing tool, but i have never confirmed this.

@Lance Nanek 2012-11-14 17:26:04

There's a funny named method/constant/whatever in each version of Android.

The only practical use I ever saw was in the Last Call for Google I/O Contest where they asked what it was for a particular version, to see if contestants read the API diff report for each release. The contest had programming problems too, but generally some trivia that could be graded automatically first to get the number of submissions down to reasonable amounts that would be easier to check.

@Angelo.Hannes 2012-11-15 08:30:43

"There's a funny named method/constant/whatever in each version of Android." Could you name some?

@Aracem 2012-11-15 10:41:51

For example, there are a nivel of log called Log.wtf that they call What a Terrible Failure :P

@Gerry Coll 2012-11-15 10:52:44

A bit like Delphi's EProgrammerNotFound? stackoverflow.com/questions/2084120/…

@Lance Nanek 2012-11-15 14:11:05

HoneyComb is AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

@st0le 2012-11-15 14:58:11

@Angelo.Hannes, In the Sensor Constants for Gravity there's one for Death Star (Star Wars)

@peejaybee 2013-03-05 14:23:56

In 1.5 there was a "Tricorder" sensor type.

@Emil S. 2018-11-15 16:42:44

@Aracem That one is actually useful and not so much an easter egg. I've used that one quite a lot for errors that break functionality but shouldn't happen (i.e. for if Exceptions get thrown that I prevent with a previous check). It is a far better solution than just ignoring the error.

@higuaro 2012-11-21 16:55:12

Complementing the @djechlin answer (good answer by the way!), this function call could be also used as dummy code to hold a breakpoint in an IDE when you want to stop in some specific iteration or a particular recursive call, for example:

enter image description here

isUserAGoat() could be used instead of a dummy variable declaration that will be shown in the IDE as a warning and, in Eclipse particular case, will clog the breakpoint mark, making it difficult to enable/disable it. If the method is used as a convention, all the invocations could be later filtered by some script (during commit phase maybe?).

enter image description here

Google guys are heavy Eclipse users (they provide several of their projects as Eclipse plugins: Android SDK, GAE, etc), so the @djechlin answer and this complementary answer make a lot of sense (at least for me).

@Tomasz 2013-04-30 20:16:57

If you are writing "dummy" code just to quickly test something, what is the problem with an Eclipse warning?? I think this is actually great as you can find it in case you've forgotten

@higuaro 2013-05-08 22:18:39

@Tomasz the problem is that, in Eclipse, the warning mark clutters the breakpoint, and you have to open the breakpoint view to either deactivate or remove it

@Tomasz 2013-05-09 01:40:38

Yeah, I have a solution for that. You can right click on the warning symbol and select "Toggle Breakpoint". If the following line/option is enabled it means the breakpoint is created. My point was, dummy code is bad and it should be a warning so yo don't forget ;)

@higuaro 2013-05-16 14:51:43

@Tomasz The problem with that solution is that you have know beforehand where the breakpoint is, so a simple visual inspection won't let you know that the warning hides a breakpoint, an even better solution though, is to use conditional breakpoints, with them you can forget about dummy code (and convention methods) altogether, but those differ between IDE's and can't be automatically shared among workstations

@Bassinator 2017-03-15 17:57:13

Why not just use a null statement ;? I mean, goats are clearly better, but there is an easy way around this already

@luizfzs 2017-06-14 16:22:55

The warning may be due to the declaration of dummy variable without using, making the statement a dead store.

@Dawood says reinstate Monica 2018-04-15 20:22:27

Hey, it ain't called Eclipse for nothing! I recommend changing your Eclipse settings so that you get a little vertical line next to your breakpoints. That way, you can see whether they're on or off when you toggle them.

@user479870 2012-11-14 09:03:07

This appears to be an inside joke at Google. It's also featured in the Google Chrome task manager. It has no purpose, other than some engineers finding it amusing. Which is a purpose by itself, if you will.

  1. In Chrome, open the Task Manager with Shift+Esc.
  2. Right click to add the Goats Teleported column.
  3. Wonder.

There is even a huge Chromium bug report about too many teleported goats.

chrome

The following Chromium source code snippet is stolen from the HN comments.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}

@auselen 2012-11-14 09:17:37

i don't have it, where do you right click? or what it is used for

@SteveEdson 2012-11-14 09:29:22

Make sure you're doing it in the Chrome task manager, not the system task mananger

@CocoNess 2012-11-14 09:33:47

I guess it depends on the version of Chrome. Mine is 23.0.1271.64

@user479870 2012-11-14 09:37:42

@OvidiuLatcu In the bug report I just added, it shows a Windows screenshot.

@greenie 2012-11-14 09:38:39

@auselen You have to right click on a column title in order to see the drop down menu to add the Goats Teleported column (at least that's how it works in Chrome on OS X). cl.ly/Ksbd

@user479870 2012-11-14 09:39:39

@greenie: Thanks for adding this. In Linux you can right click anywhere.

@auselen 2012-11-14 09:47:29

Windows XP + latest Chrome = it isn't there, on Ubuntu I see it.

@James Gregory 2012-11-14 10:09:23

It's there on OSX, though I had to right click on the columns and check the Goats Teleported item.

@Isuru 2012-11-14 17:51:35

Windows 7 running Chrome latest doe not show it either. :/

@Mark Allen 2012-11-15 23:56:21

@Xeoncross Yes because nobody has put an easter egg in Windows software, ever.

@NullUserException 2012-11-16 00:03:53

@pdknsk When your answer was deleted, it already had the latest edit. I think it's a decent explanation of what it is, but what's missing is an answer to the original question: "Does anyone know how and when this should be used?"

@CupOfTea696 2012-11-20 21:59:06

It's likely that the inside joke has it's origins here: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html

@om252345 2014-01-30 18:06:07

@pdknsk goats are those creatures who follow each other, or used to follow leading goat without thinking, so gotchas too many goats in programming world. This might be someone's style @ google to say so. Do not follow without thinking.

@Thanos 2019-09-30 06:04:25

seed from goat salt. interesting.

Related Questions

Sponsored Content

97 Answered Questions

31 Answered Questions

48 Answered Questions

[SOLVED] Is there a unique Android device ID?

25 Answered Questions

[SOLVED] Is there a way to run Python on Android?

28 Answered Questions

[SOLVED] What is 'Context' on Android?

17 Answered Questions

[SOLVED] "Debug certificate expired" error in Eclipse Android plugins

77 Answered Questions

4 Answered Questions

[SOLVED] Understanding Fragment's setRetainInstance(boolean)

18 Answered Questions

[SOLVED] Fling gesture detection on grid layout

2 Answered Questions

[SOLVED] Proper use cases for Android ActivityManager.isUserAMonkey()?

  • 2015-06-22 11:25:29
  • Confuse
  • 397 View
  • 5 Score
  • 2 Answer
  • Tags:   java android

Sponsored Content