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

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?

preguntado el 14 de noviembre de 12 a las 08:11

Se puede usar para evitar alguna advertencia de Java, como huevo de Pascua y como prueba para ver quién lee la API. Y es una referencia a un huevo de pascua en Chrome. -

Esto podría estar relacionado con cuando Google usa cabras como cortacésped en su Sede de Mountain View. -

googlers parece que les gustan las cabras por alguna razón, no es de extrañar que hayan hecho un huevo de pascua con eso. también hay un grave (!) inversión en cabras: - como se publicó en googleblog - siega con cabras - las cabras son baaaahk - y grabado en Youtube después de todo, son motores de césped nativos, eficientes también.. -

También hay constantes para la gravedad en la primera estrella de la muerte. desarrollador.android.com/reference/android/hardware/… y en la isla del programa de tv Lost desarrollador.android.com/reference/android/hardware/… que es, por supuesto, los números. -

13 Respuestas

Actualización de Android R:

Desde Android R, este método siempre devuelve falso. 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 fuente, 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 ningún uso real para nosotros como desarrolladores. Alguien ha dicho previamente que podría ser un 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á la fuente y cambiar.

Respondido el 17 de diciembre de 20 a las 16:12

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. - henificadoras

@LarsH: la fuente de uno. - jechlin

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

Me siento mal por cualquiera que haya usado esta función descaradamente, esperando que regrese false para siempre. - Martín Konecny

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 para if, produciendo un caso de uso más oscuro. yo CREEMOS 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.

Respondido 12 Feb 18, 21:02

@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) - josephx

@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 - jechlin

"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"! - marca whitaker

@MarkWhitaker O si las cabras comienzan a usar dispositivos. - el dia gira

@thedayturns Si las cabras comienzan a usar dispositivos Android, este será el menor de nuestros problemas. - Szymon Drósdzol

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 Shift+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;
}

respondido 15 nov., 12:01

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

Complementando el @djechlin https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be (¡buena respuesta por cierto!), esta llamada de función podría ser también 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 en una llamada recursiva particular, por ejemplo:

enter image description here

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?).

enter image description here

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í).

contestado el 23 de mayo de 17 a las 13:05

Si está escribiendo un código "ficticio" solo para probar algo rápidamente, ¿cuál es el problema con una advertencia de Eclipse? Creo que esto es realmente genial, ya que puedes encontrarlo en caso de que lo hayas olvidado: Tomasz

@Tomasz, el problema es que, en Eclipse, la marca de advertencia abarrota el punto de interrupción y debe abrir la vista de punto de interrupción para desactivarla o eliminarla: híguaro

Sí, tengo una solución para eso. Puede hacer clic con el botón derecho en el símbolo de advertencia y seleccionar "Alternar punto de interrupción". Si la siguiente línea/opción está habilitada, significa que se creó el punto de interrupción. Mi punto era que el código ficticio es malo y debería ser una advertencia para que no lo olvides;) - Tomasz

@Tomasz El problema con esa solución es que sabe de antemano dónde está el punto de interrupción, por lo que una simple inspección visual no le permitirá saber que la advertencia oculta un punto de interrupción, aunque una solución aún mejor es usar puntos de interrupción condicionales, con ellos puede olvidarse del código ficticio (y los métodos de convención) por completo, pero difieren entre los IDE y no se pueden compartir automáticamente entre las estaciones de trabajo. híguaro

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 Google I / O Concurso en el que preguntaron qué era para una versión en particular, para ver si los concursantes leyeron 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.

Respondido el 10 de diciembre de 12 a las 02:12

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

Por ejemplo, hay un nivel de log llamado Log.wtf que ellos llaman What a Terrible Failure :P - aracem

¿Un poco como EProgrammerNotFound de Delphi? stackoverflow.com/questions/2084120/… - gerry coll

HoneyComb es AdapterViewAnimator#fyiWillBeAdvancedByHostKThx() - lanza nanek

@Angelo.Hannes, En las constantes del sensor para la gravedad hay una para la Estrella de la Muerte (Star Wars) - robar

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

Respondido 12 Feb 18, 21:02

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 debe dejar claro que sugerencia de djechlin de usarlo como una advertencia libre 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 Corto 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.

Respondido el 20 de Septiembre de 17 a las 11:09

¿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 menos de tus problemas. - jechlin

@djechlin "¿Necesitamos esta función? cambia a si (falso), función de pruebas pues no. cheques en"- user253751

Google tiene un gran gusto por las cabras y las cabras Los huevos de Pascua. incluso ha habido publicaciones anteriores de Stack Overflow al respecto.

Como se ha mencionado en publicaciones anteriores, también existe dentro del administrador de tareas de Chrome (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 las versiones Windows, Linux y Mac de Chrome a principios de 2010). El número de "Cabras Teletransportadas" es de hecho 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:

La correlación más antigua entre las cabras y Google pertenece a la publicación original del blog "Cortar con cabras", por lo que sé.

Podemos suponer con seguridad que es simplemente un huevo de Pascua y no tiene ningún uso en el mundo real, excepto para devolver false.

contestado el 23 de mayo de 17 a las 12:05

También se rumorea que ibm tiene referencias de cabras en varios programas internos. - cabra

@goat votó solo por el nombre de usuario - Rickyduck

Hay una llamada similar, isUserAMonkey(), que devuelve verdadero si el Herramienta Corredor de monos esta siendo usado. La explicación del SDK es tan curiosa como esta.

public static boolean isUserAMonkey(){}     

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

Aquí es la fuente.

Espero que esto se haya agregado en previsión de un nuevo SDK herramienta nombró algo con una cabra y voluntad realmente ser funcional para probar la presencia de esa herramienta.

También vea una pregunta similar, Función extraña en ActivityManager: isUserAMonkey. ¿Qué significa esto, para qué sirve?.

contestado el 23 de mayo de 17 a las 13:05

Mi suposición con este es que permite el ActivityManager informar si ha sido invocado por el monkey herramienta de prueba de estrés de interfaz de usuario, pero nunca he confirmado esto. - CtrlF

Huevo de Pascua divertido.
En la versión Ubuntu de Chrome, en el Administrador de tareas (Turno+esc), con el botón derecho puedes agregar una columna de ciencia ficción que en la versión italiana es "Capre Teletrasportate" (Cabras teletransportadas).

Una teoría divertida al respecto es aquí.

Respondido 21 Abr '16, 12:04

No es una broma interna

Aparentemente es solo un verificador de aplicaciones para Simulador de cabra - por Coffee Stain Studios

Si tienes instalado Goat Simulator, eres una cabra. Si no lo tienes instalado, no eres una cabra.

Me imagino que fue más un experimento personal de uno de los desarrolladores, probablemente para encontrar personas con un interés común.

Respondido el 04 de diciembre de 19 a las 10:12

El método fue creado antes que el simulador de cabras. Aunque comprueba si la aplicación está instalada ahora, no hizo nada antes. Y es una broma de todos modos. - Ricardo A.

El monitor de pestañas de Google Chrome tenía una columna de huevo de Pascua «cabras teletransportadas» (y isUserAGoat docs también se refiere a la teletransportación de cabras. Así que definitivamente es una broma interna. - artem

Desde el punto de vista de la usabilidad y la accesibilidad, es importante saber si su usuario es o no una cabra.

Las cabras en realidad tienen necesidades muy diferentes de su software si realmente van a beneficiarse de toda la información que la era tiene para ofrecer.

Me parece maravilloso que algún tipo de desarrollador se haya preocupado por TODOS los usuarios, no solo por los que están de moda.

contestado el 10 de mayo de 22 a las 00:05

/**
 * 
 * @return whether the user making this call is a goat 
 */    
public static boolean isUserAGoat(){...}

enter image description here

verdadero

Respondido el 08 de junio de 22 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.