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

Estaba viendo las nuevas APIs introducidas en Android 4.2 . Mientras observaba la clase UserManager me encontré con el siguiente método:

  public boolean isUserAGoat() 

Se utiliza para determinar si el usuario que realiza esta llamada está sujeto a teleportaciones.

Devuelve si el usuario que realiza esta llamada es una cabra.

¿Cómo y cuándo debería utilizarse?

Desde su origen , el método utilizado para devolver false hasta que se cambió en 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 el método no tiene un uso real para nosotros como desarrolladores. Alguien ha declarado anteriormente que podría ser un huevo de Pascua .

En API 21 la implementación se cambió para comprobar si hay una aplicación instalada con el paquete 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"); } 

Aquí está el enlace fuente

No sé si esto fue "el" caso de uso oficial, pero lo siguiente produce una advertencia en Java (que puede producir errores de compilación si se mezcla con declaraciones de return , lo que lleva a código inaccesible):

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

Sin embargo esto es legal:

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

Así que a menudo me encuentro escribiendo un método de utilidad tonto para la forma más rápida de maniquí fuera de un bloque de código, y luego al completar la depuración encontrar todas las llamadas a él, por lo que siempre que la aplicación no cambia esto se puede utilizar para ello.

JLS señala if (false) no activa "código inaccesible" por la razón específica de que esto rompería el soporte para los indicadores de depuración, es decir, básicamente, este caso de uso (h / t @auselen). ( static final boolean DEBUG = false; por ejemplo). He sustituido while para if , la producción de un caso de uso más oscuro. Creo que usted puede tropezar su IDE, como Eclipse, con este comportamiento, pero esta edición es 4 años en el futuro y no tengo un ambiente de Eclipse para jugar.

Esto parece ser una broma dentro de Google. También aparece en el administrador de tareas de Google Chrome. No tiene ningún propósito, aparte de que algunos ingenieros lo encuentren divertido. Que es un propósito por sí mismo, si se quiere.

  1. En Chrome, abre el Administrador de tareas con Mayús + Esc .
  2. Haga clic con el botón derecho para agregar la columna Goats Teleported .
  3. Preguntarse.

Incluso hay un enorme informe de errores de Chromium sobre demasiadas cabras teletransportadas .

cromo

El siguiente fragmento de código fuente de Chromium se ha robado de los comentarios de HN .

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

Complementando la respuesta @djechlin (buena respuesta por cierto!), Esta llamada de función podría ser también utilizado como código ficticio para mantener un punto de interrupción en un IDE cuando se desea detener en alguna iteración específica o una llamada recursiva en particular, por ejemplo:

Introduzca aquí la descripción de la imagen

isUserAGoat() podría utilizarse en lugar de una declaración de variable ficticia que se mostrará en el IDE como una advertencia y, en caso particular de Eclipse, obstruirá la marca de punto de interrupción, dificultando su habilitación / deshabilitación. Si el método se utiliza como una convención, todas las invocaciones podrían ser filtradas más tarde por algún script (durante la fase de confirmación, tal vez?).

Introduzca aquí la descripción de la imagen

Google chicos son pesados ​​usuarios de Eclipse (que proporcionan varios de sus proyectos como complementos de Eclipse: Android SDK, GAE, etc), por lo que la respuesta @djechlin y esta respuesta complementaria tienen mucho sentido (al menos para mí).

Hay un nombre divertido método / constante / lo que sea en cada versión de Android.

El único uso práctico que he visto fue en la última convocatoria para Google I / O Contest donde se preguntó qué era para una versión en particular, para ver si los concursantes leer el informe diff API para cada versión. El concurso también tenía problemas de programación, pero en general algunas trivialidades que se podían clasificar automáticamente en primer lugar para obtener el número de envíos a cantidades razonables que sería más fácil de comprobar.

Google tiene un gusto serio para las cabras y los huevos de pascua basados ​​en cabra. Incluso ha habido mensajes de desbordamiento de pila anteriores sobre él .

Como se ha mencionado en publicaciones anteriores, también existe en el administrador de tareas de Chrome ( que apareció por primera vez en la naturaleza en 2009 ):

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

Y luego en Windows, Linux y Mac versiones de Chrome a principios de 2010 ). El número de "cabras teletransportadas" es de hecho al azar :

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

Otras referencias de Google a las cabras incluyen:

  • Cortar con cabras
  • Las cabras son baaaahk

La primera correlación de cabras y Google pertenece en el original "Mowing con cabras" blog, por lo que puedo decir.

Podemos asumir con seguridad que es simplemente un huevo de Pascua y no tiene uso en el mundo real, excepto para volver false .

En la disciplina del reconocimiento del habla, los usuarios se dividen en cabras y ovejas .

Por ejemplo, aquí en la página 89 .

Sheeps son personas para quienes el reconocimiento de voz funciona excepcionalmente bien, y las cabras son personas para las que funciona excepcionalmente mal. Sólo el reconocedor de voz sabe lo que los separa. La gente no puede predecir cuya voz se reconocerá fácilmente y cuál no. La mejor política es diseñar la interfaz para que pueda manejar todo tipo de voces en todo tipo de ambientes

Tal vez, se planea marcar a los usuarios de Android como cabras en el futuro para poder configurar el motor de reconocimiento de voz para las necesidades de la cabra. D

Hay una llamada similar, isUserAMonkey() , que devuelve true si se está utilizando la herramienta MonkeyRunner . La explicación del SDK es tan curiosa como esta.

 public static boolean isUserAMonkey(){} 

Devuelve true si la interfaz de usuario está siendo manipulada por un mono.

Aquí está la fuente.

Espero que esto fue agregado en la anticipación de una nueva herramienta del SDK nombrada algo con una cabra y será realmente funcional para probar para la presencia de esa herramienta.

También vea una pregunta similar, función extraña en ActivityManager: isUserAMonkey. ¿Qué significa esto, cuál es su uso? .

A partir de la API 21 (el primer SDK de Android 5.0 / Lollipop), esto detecta si la aplicación Goat Simulator está instalada:

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

Esto debería dejar claro que la sugerencia de djechlin de usarlo como una advertencia-free if (false) es una estrategia potencialmente desastrosa. Lo que antes se devolvió false para cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto fue enterrado lo suficientemente profundo en su código podría tomar mucho tiempo para averiguar de dónde vienen sus nuevos errores.

En pocas palabras: si no controlas la implementación de un método y decides usarlo para propósitos distintos a los indicados en la documentación de la API, te dirigirás a problemas.

Huevo De Pascua Divertido.
En la versión de Ubuntu de Chrome, en el Administrador de tareas ( shift + esc ), con el botón derecho del ratón se puede agregar una columna de ciencia ficción que en versión italiana es Capre Teletrasportate.

Una teoría divertida sobre él está aquí .

Introduzca aquí la descripción de la imagen

En las montañas más remotas del planeta, se encuentra una avanzada especie de cabra que parece ser capaz de utilizar teléfonos, al igual que los seres humanos!

Película filtrada: youtu.be/YJwZMUn7GdQ

Introduzca aquí la descripción de la imagen

Google debe haber visto esto y decidió proporcionar apoyo para ellos, en un intento de permanecer en el frente de avance de la tecnología.

  • Android NDK: Llamada de funciones Java desde C ++
  • Android setOnMyLocationChangeListener está obsoleto
  • ¿Por qué los colores de los píxeles no son correctos en OpenGL ES 2.0 en Android?
  • Cómo generar comentarios también al generar automáticamente getters y setters en Android Studio
  • Clasificación de ListView por nombre del producto con adaptador personalizado?
  • Google App Engine y Android (OAuth, C2DM o Cloud Messaging)
  • ¿Cómo agregar un fragmento en mi actividad dinámicamente?
  • La aplicación se bloquea cuando se ejecuta desde el teléfono, pero funciona bien cuando se inicia desde el equipo
  • ¿Cómo puedo convertir una parte del archivo de código fuente de Java a Kotlin?
  • ¿Cómo lleno un ListView (en Android) con datos XML o JSON?
  • Cómo establecer una altura máxima con contenido de recapitulación en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.