Casos de uso adequados para Android UserManager.isUserAGoat ()?

3633

Eu estava olhando as novas APIs introduzidas no Android 4.2 . Enquanto olhava para a UserManagerclasse, me deparei com o seguinte método:

public boolean isUserAGoat()

Usado para determinar se o usuário que está fazendo esta chamada está sujeito a teleporte.

Retorna se o usuário que está fazendo essa ligação é uma cabra.

Como e quando isso deve ser usado?

Ovidiu Latcu
fonte
3
Se pode ser usado para evitar algum aviso de Java, como um ovo de páscoa e como um teste para ver quem leu a API. E é uma referência a um ovo de páscoa no Chrome.
Dorian
10
Isso pode estar relacionado a quando o Google usa cabras como cortador de grama em sua sede em Mountain View .
John Isaiah Carmona
3
os googlers parecem gostar de cabras por algum motivo, não admira que tenham feito um ovo de páscoa com isso. há também um sério ( ! investimento em cabras): - como escrevi na googleblog - roçada com as cabras - cabras são baaaahk - e registrada no youtube afinal eles são motores do gramado nativas, eficiente, bem ..
Nenhum
16
Também existem constantes para a gravidade na primeira estrela da morte developer.android.com/reference/android/hardware/… e na ilha do programa de TV Lost developer.android.com/reference/android/hardware/…, que é de claro, os números.
Fernando Gallego

Respostas:

1791

Na origem , o método usado para retornar falseaté ser alterado na 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;
}

Parece que o método não tem nenhum uso real para nós, como desenvolvedores. Alguém já declarou anteriormente que pode ser um ovo de Páscoa .

Na API 21, a implementação foi alterada para verificar se há um aplicativo instalado com o pacote 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");
}

Aqui está a fonte e a mudança .

meh
fonte
102
Teoria: As cabras são encontradas em todos os tipos de lugares precários, como falésias, possivelmente contraindo as tendências de localização que recebem de usuários comuns que não são de cabra. Pode explicar os "teletransportes", que podem ser cabras que parecem se mudar muito, à medida que o software tenta determinar sua localização com algos projetados para não cabras.
virador
11
@LarsH - a fonte de um.
djechlin
56
Esta é uma lição de história, não uma resposta. Mesmo se for um ovo de Páscoa, existe um caso de uso válido para ele? Ser um ovo de Páscoa não impede que ele seja útil, e você não demonstrou se é ou não útil.
casperOne
36
Esse é um aplicativo real .
Kevin Krumwiede
194
Sinto-me mal por quem usou descaradamente essa função, esperando que ela retornasse falsepara sempre.
Martin Konecny
984

Não sei se esse foi "o" caso de uso oficial, mas o seguinte produz um aviso em Java (que pode produzir ainda mais erros de compilação se misturado com returninstruções, levando a código inacessível):

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

No entanto, isso é legal:

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

Por isso, muitas vezes me pego escrevendo um método de utilitário bobo para a maneira mais rápida de desvendar um bloco de código e, ao concluir a depuração, localizo todas as chamadas para ele, desde que a implementação não mude, isso pode ser usado para isso.

O JLS aponta if (false)que não dispara "código inacessível" pelo motivo específico de que isso interromperia o suporte a sinalizadores de depuração, ou seja, basicamente esse caso de uso (h / t @auselen). ( static final boolean DEBUG = false;por exemplo).

Substituí whilepor if, produzindo um caso de uso mais obscuro. Eu acredito que você pode tropeçar seu IDE, como Eclipse, com este comportamento, mas esta edição é de 4 anos no futuro, e eu não tenho um ambiente Eclipse para brincar.

djechlin
fonte
10
@djechlin Eu não sei se isso é apenas android, no java padrão `if (false) {...}` compila muito bem (abra o jdk javac 1.6 e 1.7)
josefx
9
@ PeterOlson - se você estiver tentando testar especificamente uma ramificação de código em que um if for falso ou verdadeiro, esta é a maneira mais precisa e óbvia de simular isso - comentar o bloco pode ser menos preciso se você não corresponder ao apropriado final do bloco (talvez você não notar uma discreta if / else bloco imediatamente a seguir), que irá conduzir a um erro de compilação se você está forçando ao seguinte elsebloco, etc.
djechlin
160
"desde que a implementação não mude" - e esse é o problema. Essa é uma maneira desastrosa de implementar um "if (false)" sem aviso, porque a implementação pode e muda. Veja minha resposta a esta pergunta: a partir da API21 isUserAGoat()retorna true se um usuário tiver um aplicativo específico instalado. Boa sorte ao diagnosticar que, quando seu código repentinamente começa a se comportar de maneira estranha em dispositivos "aleatórios"!
Mark Whitaker
11
@ MarkWhitaker Ou se as cabras começarem a usar dispositivos.
Thedayturns
8
@thedayturns Se as cabras começarem a usar dispositivos Android, esse será o menor dos nossos problemas.
Szymon Drosdzol 29/02
761

Parece ser uma piada interna no Google. Também é destaque no gerenciador de tarefas do Google Chrome. Não tem outro objetivo, além de alguns engenheiros acharem divertido. Que é um propósito por si só, se você quiser.

  1. No Chrome, abra o Gerenciador de tarefas com Shift+ Esc.
  2. Clique com o botão direito do mouse para adicionar a Goats Teleportedcoluna.
  3. Maravilha.

Existe até um enorme relatório de bug do Chromium sobre muitas cabras teletransportadas .

cromada

O seguinte snippet de código-fonte do Chromium é roubado dos comentários do HN .

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

fonte
24
eu não tenho, onde você clica com o botão direito? ou que é utilizado para
auselen
13
@auselen Você precisa clicar com o botão direito do mouse no título de uma coluna para ver o menu suspenso para adicionar a coluna Teleported Goats (pelo menos é assim que funciona no Chrome no OS X). cl.ly/Ksbd
greenie
53
Windows XP + Chrome mais recente = não existe, no Ubuntu eu vejo.
auselen
4
@Xeoncross Sim, porque ninguém nunca colocou um ovo de páscoa no software Windows.
Mark Allen
18
É provável que a piada interna tem as suas origens aqui: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html
CupOfTea696
290

Complementando a resposta @djechlin (boa resposta, a propósito!), Essa chamada de função também pode ser usada como código fictício para manter um ponto de interrupção em um IDE quando você deseja parar em alguma iteração específica ou em uma chamada recursiva específica, por exemplo:

insira a descrição da imagem aqui

isUserAGoat()poderia ser usado em vez de uma declaração de variável fictícia que será mostrada no IDE como um aviso e, no caso particular do Eclipse, obstruirá a marca do ponto de interrupção, dificultando a ativação / desativação. Se o método for usado como convenção, todas as invocações poderão ser posteriormente filtradas por algum script (durante a fase de confirmação, talvez?).

insira a descrição da imagem aqui

Os caras do Google são usuários pesados ​​do Eclipse (eles fornecem vários de seus projetos como plug-ins do Eclipse: Android SDK, GAE etc.), então a resposta @djechlin e essa resposta complementar fazem muito sentido (pelo menos para mim).

higuaro
fonte
13
Se você está escrevendo código "fictício" apenas para testar rapidamente algo, qual é o problema com um aviso do Eclipse? Eu acho que isso é realmente grande como você pode encontrá-lo no caso de você esqueceu
Tomasz
20
@Tomasz o problema é que, em Eclipse, as desordens marca aviso o ponto de interrupção, e você tem que abrir a vista breakpoint desativar ou removê-lo
higuaro
4
Sim, eu tenho uma solução para isso. Você pode clicar com o botão direito do mouse no símbolo de aviso e selecionar "Alternar ponto de interrupção". Se a seguinte linha / opção estiver ativada, significa que o ponto de interrupção é criado. Meu ponto era, manequim código é ruim e deve ser um aviso para que yo não se esqueça;)
Tomasz
9
@Tomasz O problema dessa solução é que você sabe de antemão onde está o ponto de interrupção, portanto, uma simples inspeção visual não permitirá que você saiba que o aviso oculta um ponto de interrupção, uma solução ainda melhor, porém, é usar pontos de interrupção condicionais, com eles você pode esquecer manequim código (e métodos de convenções) por completo, mas aqueles diferem entre IDE e não pode ser automaticamente compartilhada entre estações de trabalho
higuaro
1
Por que não usar apenas uma declaração nula ;? Quero dizer, as cabras são claramente melhor, mas há uma maneira fácil de contornar isso já
Bassinator
149

Existe um método nomeado engraçado / constante / qualquer coisa em cada versão do Android.

O único uso prático que eu já vi foi no concurso Última chamada para o Google I / O , onde eles perguntaram o que era uma versão específica, para ver se os concorrentes liam o relatório de diferenças de API para cada versão. O concurso também apresentava problemas de programação, mas geralmente algumas trivialidades que poderiam ser classificadas automaticamente primeiro para reduzir o número de envios a quantias razoáveis ​​que seriam mais fáceis de verificar.

Lance Nanek
fonte
11
"Existe um método nomeado engraçado / constante / qualquer coisa em cada versão do Android." Você poderia citar alguns?
Angelo.Hannes
43
Por exemplo, há um nível de log chamado Log.wtf, que eles chamam de Que Terrível Falha: P
Aracem
7
Um pouco como o EProgrammerNotFound do Delphi? stackoverflow.com/questions/2084120/…
Gerry Coll
12
Favo de mel é AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
Lance Nanek
18
@ Angelo.Hannes, Nas constantes dos sensores de gravidade existe uma para a Estrela da Morte (Guerra nas Estrelas)
st0le
141

Na disciplina de reconhecimento de fala, os usuários são divididos em cabras e ovelhas .

Por exemplo, aqui na página 89 :

Ovelhas são pessoas para quem o reconhecimento de fala funciona excepcionalmente bem e cabras são pessoas para quem ele trabalha excepcionalmente mal. Somente o reconhecedor de voz sabe o que os separa. As pessoas não podem prever cuja voz será reconhecida facilmente e quem não será. A melhor política é projetar a interface para que ele possa lidar com todos os tipos de vozes em todos os tipos de ambientes

Talvez esteja planejado marcar usuários do Android como cabras no futuro, para poder configurar o mecanismo de reconhecimento de fala para as necessidades das cabras. ;-)

rainer198
fonte
126

O Google gosta muito de cabras e ovos de Páscoa baseados em cabras . Houve até postagens anteriores do Stack Overflow sobre isso .

Como foi mencionado nas postagens anteriores, ele também existe no gerenciador de tarefas do Chrome ( que apareceu pela primeira vez em 2009 ):

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

E depois nas versões Windows, Linux e Mac do Chrome, no início de 2010 ). O número de "cabras teletransportadas" é de fato aleatório :

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

Outras referências do Google a cabras incluem:

A correlação mais antiga de cabras e do Google pertence à postagem original do blog "Roçada com cabras", até onde eu sei.

Podemos assumir com segurança que é apenas um ovo de Páscoa e não tem uso no mundo real, exceto pelo retorno false.

rickyduck
fonte
4
Há rumores de que a IBM também tem referências de cabras em vários softwares internos.
cabra
Link arquivado para a referência "Roçada com cabras": web.archive.org/web/20100619024942/https://…
Mikeb
126

A partir da API 21 (o primeiro Android 5.0 / Lollipop SDK) , isso detecta se o aplicativo Goat Simulator está instalado:

/**
 * 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");
}

Isso deve deixar claro que a sugestão de djechlin de usá-lo como um aviso if (false)é uma estratégia potencialmente desastrosa. O que retornou anteriormente falsepara todos os dispositivos agora retorna um valor aparentemente aleatório: se isso tiver sido aprofundado o suficiente no seu código, poderá demorar muito tempo para descobrir de onde vêm os novos erros.

Conclusão: se você não controla a implementação de um método e decide usá-lo para outros fins que não os mencionados na documentação da API, está enfrentando problemas.

Mark Whitaker
fonte
17
Por que alguém colocaria algum tipo de if(false)produção? Venha aqui. Se esse é o aspecto do seu código, essa alteração na implementação é o menor dos seus problemas.
precisa saber é o seguinte
1
Bem, de acordo com a documentação real da API (tendências de teletransporte do usuário), acho que usá-lo para sempre retornar falso é realmente a única maneira de seguir o contrato. Ainda assim, você traz um bom argumento.
Codebreaker
2
O simulador de cabras parece incrível no Google Play play.google.com/store/apps/… . Seria bom saber o que se pode ganhar por ser uma cabra.
capuzes
109

Existe uma chamada semelhante isUserAMonkey(), que retorna true se a ferramenta MonkeyRunner estiver sendo usada. A explicação do SDK é tão curiosa quanto esta.

public static boolean isUserAMonkey(){}     

Retorna truese a interface do usuário está sendo alterada no momento por um macaco.

Aqui está a fonte.

Espero que isso tenha sido adicionado em antecipação a uma nova ferramenta SDK denominada algo com uma cabra e será realmente funcional para testar a presença dessa ferramenta.

Consulte também uma pergunta semelhante, Função estranha no ActivityManager: isUserAMonkey. O que isso significa, para que serve? .

KDEx
fonte
3
Minha suposição com este é que ele permite ActivityManagerreportar se foi invocado pela monkeyferramenta de teste de estresse da interface do usuário, mas eu nunca confirmei isso.
CtrlF
40

Ovo de Páscoa engraçado.
Na versão Ubuntu do Chrome, no Gerenciador de Tarefas ( shift+ esc), com o botão direito, você pode adicionar uma coluna de ficção científica que na versão italiana é "Capre Teletrasportate" (Cabras Teletransportadas).

Uma teoria engraçada sobre isso está aqui .

jc
fonte
Não consigo mais encontrá-lo :(
Thornkey 23/12
4

Não é uma piada interna

Aparentemente, é apenas um verificador de aplicativos do Goat Simulator - da Coffee Stain Studios

Se você possui o Goat Simulator instalado, você é uma cabra. Se você não o tem instalado, você não é uma cabra.

Eu imagino que foi mais um experimento pessoal de um dos desenvolvedores, com maior probabilidade de encontrar pessoas com um interesse comum.

Gadget Guru
fonte
7
O método foi criado antes do simulador de cabras. Embora verifique se o aplicativo está instalado agora, ele não fez nada antes. E é uma piada de qualquer maneira.
Ricardo A.