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




(10)

A partir de 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 libre if (false) es una estrategia potencialmente desastrosa. Lo que antes devolvía false para cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto se encontraba lo suficientemente oculto en su código, podría llevar mucho tiempo descubrir de dónde provienen sus nuevos errores.

En pocas palabras: si no controla la implementación de un método y decide utilizarlo para otros fines que no sean los indicados en la documentación de la API, se encontrará con problemas.

Estaba mirando las nuevas API introducidas en Android 4.2 . Mientras observaba la clase de UserManager , encontré el siguiente método:

public boolean isUserAGoat()

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

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

¿Cómo y cuándo debe usarse?


Por favor vea el siguiente código fuente:

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

En las montañas más remotas del planeta, se encuentra una especie avanzada de cabra que parece que actualmente puede usar teléfonos, ¡igual que nosotros, los humanos!

Imágenes filtradas: youtu.be/YJwZMUn7GdQ

Google debe haber visto esto y decidió brindarles apoyo, en un intento por mantenerse en la vanguardia de la tecnología.


Como complemento de la answer @djechlin (¡buena respuesta, por cierto!), Esta función de llamada también se puede usar como código ficticio para mantener un punto de interrupción en un IDE cuando desee detenerse en una iteración específica o una llamada recursiva en particular, por ejemplo:

isUserAGoat() podría usarse en lugar de una declaración de variable ficticia que se mostrará en el IDE como una advertencia y, en un caso particular de Eclipse, obstruirá la marca del punto de interrupción, lo que dificultará su habilitación / inhabilitación. Si el método se utiliza como una convención, todas las invocaciones podrían filtrarse posteriormente mediante algún script (¿quizás durante la fase de confirmación?).

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


A Google le gustan mucho las cabras y los huevos de Pascua de cabra. Incluso ha habido publicaciones anteriores de desbordamiento de pila al respecto .

Como se mencionó en publicaciones anteriores, también existe dentro del administrador de tareas de Chrome ( apareció por primera vez en forma silvestre en 2009 ):

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

Y luego, en las versiones de Chrome para Windows, Linux y Mac a principios de 2010 ). El número de "Cabras teletransportadas" es de hecho aleatorio :

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

Otras referencias de Google a las cabras incluyen:

La primera correlación entre cabras y Google pertenece a la publicación original del blog "Siega con cabras", 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 devolver el valor false .


No sé si este 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 un código inalcanzable):

while (1 == 2) { // Note that "if" is treated 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 eliminar un bloque de código, luego, al completar la depuración, encontrar todas las llamadas a él, así que siempre que la implementación no cambie, se puede usar para eso.

JLS señala if (false) no activa "código inalcanzable" 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).

Reemplazé while por if , produciendo un caso de uso más oscuro. Creo que puede hacer tropezar su IDE, como Eclipse, con este comportamiento, pero esta edición es de 4 años en el futuro, y no tengo un entorno de Eclipse para jugar.


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 desordenada por un mono.

Here está la fuente.

Espero que esto se haya agregado antes de una nueva herramienta SDK llamada algo con una cabra y que sea realmente funcional para probar 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? .


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

Una divertida teoría al respecto está here .


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

El único uso práctico que vi en mi vida fue en el concurso de I / O Last Call for Google , donde preguntaron qué significaba para una versión en particular, para ver si los participantes leen el informe de diferencias de API para cada versión. El concurso también tuvo problemas de programación, pero en general, algunos trivialidades podrían clasificarse automáticamente primero para obtener el número de envíos en cantidades razonables que serían más fáciles de verificar.


En la disciplina de reconocimiento de voz, los usuarios se dividen en cabras y ovejas .

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

Las ovejas son personas para quienes el reconocimiento de voz funciona excepcionalmente bien, y las cabras son personas para las cuales funciona excepcionalmente mal. Solo el reconocedor de voz sabe lo que los separa. La gente no puede predecir qué voz será reconocida fácilmente y quién no. La mejor política es diseñar la interfaz para que pueda manejar todo tipo de voces en todo tipo de entornos

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 las cabras. ;-)







usermanager