Cas d'utilisation appropriée pour Android UserManager.isUserAGoat ()?

je regardais les nouvelles API introduites dans Android 4.2 . En regardant la UserManager classe I est tombé sur la méthode suivante:

public boolean isUserAGoat()

utilisé pour déterminer si l'utilisateur qui fait cet appel est sujet à des téléportations.

retourne si l'utilisateur qui fait cet appel est une chèvre.

comment et quand cela devrait-il être utilisé?

3207
demandé sur Luca Kiebel 2012-11-14 12:34:01

12 réponses

De leur source , la méthode utilisée pour le retour false jusqu'à ce qu'il a été modifié dans l'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;
}

il semble que la méthode n'a pas d'utilisation réelle pour nous en tant que développeurs. Quelqu'un a déjà déclaré qu'il pourrait s'agir d'un oeuf de Pâques .

dans API 21 la mise en œuvre a été modifiée pour vérifier s'il y a une application installée avec le colis 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");
}

voici le lien source

1551
répondu meh 2017-06-05 20:04:54

Je ne sais pas si c'était "le" cas d'utilisation officielle, mais ce qui suit produit un avertissement en Java (qui peut produire des erreurs de compilation si mélangé avec des instructions return , conduisant à un code inaccessible):

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

Cependant, cela est légal:

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

donc je me retrouve souvent à écrire une méthode utilitaire idiote pour la façon la plus rapide de créer un bloc de code, puis en effectuant le débogage trouver tous les appels à elle, donc pourvu que le la mise en œuvre ne change pas cela peut être utilisé pour cela.

JLS indique if (false) ne déclenche pas de "code inaccessible" pour la raison spécifique que cela briserait le support des drapeaux de débogage, i.e., essentiellement ce cas d'utilisation (h/t @auselen). ( static final boolean DEBUG = false; , par exemple).

j'ai remplacé while par if , produisant un cas d'utilisation plus obscur. J' croire , vous pouvez le voyage jusqu'à votre IDE, comme Eclipse, avec ce comportement, mais cette édition est dans 4 ans dans le futur, et je n'ai pas D'environnement Eclipse pour jouer.

930
répondu djechlin 2018-02-12 21:13:44

cela semble être une blague de L'intérieur à Google. Il figure également dans le gestionnaire de tâches GoogleChrome. Il n'a aucun but, à part que certains ingénieurs trouvent cela amusant. Ce qui est un but en soi, si vous voulez.

  1. dans Chrome, ouvrez le Gestionnaire des tâches avec Shift + Esc .
  2. clic droit pour ajouter la colonne Goats Teleported .
  3. d'Émerveillement.

il y a même un énorme rapport de bogue de Chrome sur trop de chèvres téléportées .

chrome

Chrome code source "extrait de 1519180920" est volé dans la HN des commentaires.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
718
répondu 2012-11-15 01:06:47

en complément de la @djechlin réponse (bonne réponse d'ailleurs!), cet appel de fonction pourrait être aussi utilisé comme code fictif pour maintenir un point de rupture dans un IDE lorsque vous voulez arrêter dans une itération spécifique ou un appel récursif particulier, par exemple:

enter image description here

isUserAGoat() pourrait être utilisé à la place d'une déclaration de variable muette qui sera montrée dans L'IDE comme un avertissement et, dans le cas particulier D'Eclipse, va obstruer la marque de point de rupture, ce qui le rend difficile à activer/désactiver. Si la méthode est utilisée comme une convention, toutes les invocations pourraient être filtrées plus tard par un script (pendant la phase de propagation peut-être?).

enter image description here

les gars de Google sont de gros utilisateurs D'Eclipse (ils fournissent plusieurs de leurs projets comme les plugins Eclipse: Android SDK, GAE, etc), donc la réponse @djechlin et cette réponse complémentaire faire un beaucoup de sens (au moins pour moi).

264
répondu higuaro 2017-05-23 12:02:59

il y a une méthode Drôle nommée/constante/n'importe quoi dans chaque version D'Android.

la seule utilisation pratique que j'ai jamais vu était dans le dernier appel pour Google I/O concours où ils ont demandé ce qu'il était pour une version particulière, pour voir si les concurrents lisent le rapport diff API pour chaque version. Le concours a eu des problèmes de programmation aussi, mais généralement quelques anecdotes qui pourraient être notés automatiquement d'abord pour obtenir le nombre de soumissions à des montants raisonnables qu'il serait plus facile de vérifier.

127
répondu Lance Nanek 2012-12-10 02:46:25

dans la discipline de la reconnaissance vocale, les utilisateurs sont divisés en chèvres et moutons .

par exemple, ici à la page 89 :

les moutons sont des gens pour qui la reconnaissance de la parole fonctionne exceptionnellement bien, et les chèvres sont des gens pour qui cela fonctionne exceptionnellement mal. Seule la reconnaissance vocale sait ce qui les sépare. Gens impossible de prédire qui sera reconnu facilement et qui ne le sera pas. La meilleure politique est de concevoir l'interface afin qu'elle puisse traiter toutes sortes de voix dans toutes sortes d'environnements

peut-être, il est prévu de marquer les utilisateurs Android comme des chèvres à l'avenir pour être en mesure de configurer le moteur de reconnaissance vocale pour les besoins des chèvres. ;- )

115
répondu rainer198 2018-02-12 21:16:35

Google a un goût sérieux pour les chèvres et la chèvre basée oeufs de Pâques . Il y a même eu des précédents messages de débordement de pile à propos de .

comme il a été mentionné dans les billets précédents, il existe aussi dans le Chrome task manager ( il est apparu pour la première fois dans la nature en 2009 ):

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

et puis dans les versions Windows, Linux et Mac de Chrome début 2010 ). Le nombre de "chèvres téléportées" est en fait aléatoire :

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

les autres références Google aux chèvres incluent:

la corrélation la plus ancienne entre les chèvres et Google fait partie du billet original du blog "Mowing with goats", autant que je peux. dire.

nous pouvons en toute sécurité supposer qu'il s'agit simplement d'un œuf de Pâques et qu'il n'a aucune utilité dans le monde réel, sauf pour retourner false .

110
répondu rickyduck 2017-05-23 11:47:32

à partir de API 21 (le PREMIER Android 5.0/Lollipop SDK) , cela détecte si le Goat Simulator app est installé:

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

cela devrait indiquer clairement que la suggestion de djechlin de l'utiliser comme un avertissement sans if (false) est une stratégie potentiellement désastreuse. Ce qui a déjà retourné false pour chaque appareil retourne maintenant une valeur apparemment aléatoire: si cela a été enfoui profond assez dans votre code cela pourrait prendre un long temps pour comprendre d'où viennent vos nouveaux bogues.

en bref: si vous ne contrôlez pas la mise en œuvre d'une méthode et décidez de l'utiliser à des fins autres que celles indiquées dans la documentation de L'API, vous vous dirigez vers des problèmes.

105
répondu Mark Whitaker 2017-09-20 10:30:07

il y a un appel similaire, isUserAMonkey() , qui retourne true si l'outil MonkeyRunner est utilisé. L'explication du SDK est aussi curieuse que celle-ci.

public static boolean isUserAMonkey(){}     

Renvoie true si l'interface utilisateur est actuellement manipulés par un singe.

ici est la source.

Je m'attends à ce que cela a été ajouté dans anticipation d'un nouvel outil SDK nommé quelque chose avec une chèvre et sera en fait être fonctionnelle pour tester la présence de cet outil.

Voir aussi une question similaire, fonction étrange dans ActivityManager: isUserAMonkey. Qu'est-ce que cela signifie, quelle est son utilité? .

96
répondu KDEx 2017-05-23 12:26:36

enter image description here

dans les montagnes les plus reculées de la planète, se trouve une espèce avancée de chèvre qui semble être actuellement en mesure d'utiliser des téléphones, tout comme nous les humains!

a fuité des images: youtu.be / YJwZMUn7GdQ

enter image description here

Google doit avoir repéré ce et a décidé de fournir soutien pour eux, dans une tentative de rester en première ligne de l'avancement de la technologie.

54
répondu Sergio Carneiro 2016-09-30 14:00:20

Drôle D'Œuf De Pâques.

Dans la version Ubuntu de Chrome, dans le Gestionnaire des tâches ( shift + esc ), avec le clic droit, vous pouvez ajouter une colonne de SF qui dans la version italienne est" Cap Teletrasportate " (chèvres téléportées).

Une drôle de théorie à ce sujet est ici .

31
répondu j.c 2016-04-21 11:38:48

s'il vous Plaît voir ci-dessous le code source :

/**
 * 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");
}
0
répondu Koustuv Ganguly 2018-09-28 13:49:47