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

11 minutos de lectura

avatar de usuario
Ovidiu Latcu

Estaba viendo las nuevas API introducidas en Android 4.2. Mientras miraba el UserManager class me encontré con 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 se debe usar esto?

avatar de usuario
bueno

Actualización de Android R:

Desde Android R, este método siempre devuelve false. Google dice que esto se hace “para proteger la privacidad de las cabras”:

/**
 * 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>
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
 * {@code false} in order to protect goat privacy.</p>
 *
 * @return Returns whether the user making this call is a goat.
 */
public boolean isUserAGoat() {
    if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
        return false;
    }
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Respuesta anterior:

De sus fuenteel 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 ningún uso real para nosotros como desarrolladores. Alguien ha dicho previamente que podría ser un El huevo de Pascua.

En API 21 se cambió la implementación para verificar 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 fuente y el cambio.

  • Teoría: las cabras se encuentran en todo tipo de lugares precarios, como acantilados, posiblemente contradiciendo las tendencias de ubicación que obtienen de los usuarios habituales que no son cabras. Podría explicar las “teletransportaciones”, que podrían ser cabras que parecen reubicarse salvajemente mientras el software intenta determinar su ubicación con algoritmos diseñados para no cabras.

    – henificadores

    14 de noviembre de 2012 a las 12:58

  • @LarsH: la fuente de uno.

    – Djechlin

    14 de noviembre de 2012 a las 20:07

  • Esta es una lección de historia, no una respuesta. Incluso si es un huevo de Pascua, ¿hay un caso de uso válido para él? Ser un huevo de Pascua no impide que sea útil, y no ha demostrado si es útil o no.

    – casperuno

    14 de noviembre de 2012 a las 20:26

  • Eso es un aplicación real.

    –Kevin Krumwiede

    21 de febrero de 2015 a las 8:07

  • Me siento mal por cualquiera que haya usado esta función descaradamente, esperando que regrese false Siempre.

    – Martín Konecny

    27 de abril de 2015 a las 5:11

avatar de usuario
djechlin

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 return declaraciones, 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");
}

Por lo tanto, a menudo me encuentro escribiendo un método de utilidad tonto para obtener la forma más rápida de eliminar un bloque de código, luego, al completar la depuración, encontrar todas las llamadas, por lo que, siempre que la implementación no cambie, esto se puede usar para eso.

JLS Señala if (false) no desencadena un “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).

reemplacé while por if, produciendo un caso de uso más oscuro. yo creer puede tropezar con 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.

  • @djechlin No sé si esto es solo para Android, en java estándar `if (false){…}` compila bien (abra jdk javac 1.6 y 1.7)

    – josefx

    14 de noviembre de 2012 a las 20:24


  • @PeterOlson: si está tratando específicamente de probar una rama de código donde un si es falso o verdadero, esta es la forma más precisa y obvia de simular eso: comentar el bloque podría ser menos preciso si no coincide con el correcto final del bloque (quizás no notó un discreto bloque if/else inmediatamente después), conducirá a un error de compilación si está forzando lo siguiente else bloque, etc

    – Djechlin

    15 de noviembre de 2012 a las 2:01

  • “siempre que la implementación no cambie” – y ahí está el problema. Esta es una forma desastrosa de implementar un “si (falso)” sin advertencia porque la implementación puede cambiar y cambia. Vea mi respuesta a esta pregunta: a partir de API21 isUserAGoat() devuelve verdadero si un usuario tiene instalada una aplicación específica. ¡Buena suerte al diagnosticar eso cuando su código de repente comienza a comportarse de manera extraña en dispositivos “aleatorios”!

    –Mark Whitaker

    5 de noviembre de 2014 a las 12:29

  • @MarkWhitaker O si las cabras comienzan a usar dispositivos.

    – el día cambia

    18 de febrero de 2016 a las 1:51

  • @thedayturns Si las cabras comienzan a usar dispositivos Android, este será el menor de nuestros problemas.

    – Szymon Drosdzol

    29 de febrero de 2016 a las 13:16

Esto parece ser una broma interna en 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. Lo cual es un propósito en sí mismo, por así decirlo.

  1. En Chrome, abra el Administrador de tareas con Cambio+Esc.
  2. Haga clic derecho para agregar el Goats Teleported columna.
  3. Preguntarse.

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

cromo

El siguiente cromo fragmento de código fuente es robado de la hn comentarios

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

  • Windows XP + último Chrome = no está allí, en Ubuntu lo veo.

    – auselen

    14 de noviembre de 2012 a las 9:47


avatar de usuario
higuaro

Complementando la respuesta de @djechlin (¡buena respuesta por cierto!), esta llamada de función podría ser además se usa como código ficticio para mantener un punto de interrupción en un IDE cuando desea detenerse en alguna iteración específica o una llamada recursiva particular, por ejemplo:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

avatar de usuario
lanza nanek

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

El único uso práctico que vi fue en la última llamada para E/S de Google Concurso en el que preguntaban qué era para una versión en particular, para ver si los concursantes leían el informe de diferencias de API para cada versión. El concurso también tuvo problemas de programación, pero generalmente algunas trivias que podrían calificarse automáticamente primero para reducir el número de presentaciones a cantidades razonables que serían más fáciles de verificar.

  • “Hay un método/constante/lo que sea con un nombre divertido en cada versión de Android”. ¿Podrías nombrar algunos?

    – Angelo Hannes

    15 de noviembre de 2012 a las 8:30

  • Por ejemplo, hay un nivel de log llamado Log.wtf que ellos llaman What a Terrible Failure 😛

    – Aracem

    15 de noviembre de 2012 a las 10:41


  • ¿Un poco como EProgrammerNotFound de Delphi? stackoverflow.com/questions/2084120/…

    – Gerry Coll

    15 de noviembre de 2012 a las 10:52

  • HoneyComb es AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

    – Lanza Nanek

    15 de noviembre de 2012 a las 14:11

  • @Angelo.Hannes, En Sensor Constants for Gravity hay una para Death Star (Star Wars)

    – robó

    15 de noviembre de 2012 a las 14:58

avatar de usuario
Pedro Mortensen

En la disciplina del 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 quienes funciona excepcionalmente mal. Solo el reconocedor de voz sabe qué los separa. Las personas no pueden predecir qué voz se reconocerá 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 planee 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. 😉

  • “Hay un método/constante/lo que sea con un nombre divertido en cada versión de Android”. ¿Podrías nombrar algunos?

    – Angelo Hannes

    15 de noviembre de 2012 a las 8:30

  • Por ejemplo, hay un nivel de log llamado Log.wtf que ellos llaman What a Terrible Failure 😛

    – Aracem

    15 de noviembre de 2012 a las 10:41


  • ¿Un poco como EProgrammerNotFound de Delphi? stackoverflow.com/questions/2084120/…

    – Gerry Coll

    15 de noviembre de 2012 a las 10:52

  • HoneyComb es AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

    – Lanza Nanek

    15 de noviembre de 2012 a las 14:11

  • @Angelo.Hannes, En Sensor Constants for Gravity hay una para Death Star (Star Wars)

    – robó

    15 de noviembre de 2012 a las 14:58

A partir de API 21 (el primer SDK de Android 5.0/Lollipop)esto detecta si el Simulador de cabra la aplicación 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 en claro que la sugerencia de djechlin de usarlo como un aviso sin advertencia if (false) es una estrategia potencialmente desastrosa. Lo que antes regresaba false para cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto estuviera lo suficientemente enterrado en su código, podría tomar un largo es hora de averiguar de dónde vienen los nuevos errores.

En pocas palabras: si no controla la implementación de un método y decide usarlo para fines distintos a los establecidos en la documentación de la API, se encontrará con problemas.

  • ¿Por qué alguien pondría algún tipo de if(false) ¿en producción? Ven aquí. Si ese es el aspecto de su código, entonces este cambio de implementación es el el menos de tus problemas

    – Djechlin

    5 de noviembre de 2014 a las 15:56

  • @djechlin “¿Necesitamos esta característica? cambia a si (falso), función de pruebas no. se registra

    – usuario253751

    25 de septiembre de 2020 a las 15:37

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad