web-dev-qa-db-fra.com

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

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

public boolean isUserAGoat()

Utilisé pour déterminer si l'utilisateur effectuant cet appel est sujet à des téléportations.

Indique si l'utilisateur effectuant cet appel est une chèvre.

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

3311
Ovidiu Latcu

Depuis leur source, la méthode utilisée pour renvoyer false jusqu'à ce qu'elle soit modifiée 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 ne soit pas vraiment utile pour nous en tant que développeurs. Quelqu'un a déjà déclaré qu'il pourrait s'agir d'un Easter Egg.

Dans l'API 21, l'implémentation a été modifiée pour vérifier si une application avec le package com.coffeestainstudios.goatsimulator est installée.

/**
 * 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 source et le change .

1623
meh

Je ne sais pas s'il s'agissait "du" cas d'utilisation officiel, mais les éléments suivants produisent un avertissement en Java (pouvant générer d'autres erreurs de compilation s'il est mélangé à des instructions return, conduisant à un code inaccessible):

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

Cependant c'est légal:

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

Je me retrouve donc souvent en train d'écrire une méthode utilitaire idiote pour trouver le moyen le plus rapide d'extraire un bloc de code, puis, en finissant le débogage, trouver tous les appels qui lui sont destinés.

JLS signale que if (false) ne déclenche pas de "code inaccessible" pour la raison précise que cela annulerait la prise en charge des indicateurs de débogage, c'est-à-dire 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. Je crois que vous pouvez trébucher dans votre IDE, comme Eclipse, avec ce comportement, mais cette édition est dans 4 ans et je n'ai pas d'environnement Eclipse pour jouer.

945
djechlin

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

  1. Dans Chrome, ouvrez le gestionnaire de tâches avec Shift+Esc.
  2. Cliquez avec le bouton droit pour ajouter la colonne Goats Teleported.
  3. Merveille.

Il y a même un énorme rapport de bogue sur Chromium à propos de trop de chèvres téléportées .

chrome

Le chrome extrait de code source est volé dans les commentaires HN .

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

En complément de @djechlin answer (bonne réponse en passant!), Cet appel de fonction pourrait être aussi utilisé comme code factice pour maintenir un point d'arrêt dans un IDE lorsque vous souhaitez vous arrêter dans itération spécifique ou appel récursif particulier, par exemple:

enter image description here

isUserAGoat() pourrait être utilisé à la place d'une déclaration de variable factice qui sera affichée dans le IDE sous forme d'avertissement et, dans le cas particulier d'Eclipse, obstruerait le point d'arrêt, ce qui rendrait son activation/désactivation difficile. Si la méthode est utilisée comme convention, toutes les invocations pourraient être filtrées ultérieurement par un script (au cours de la phase de validation?).

enter image description here

Les gars de Google sont de gros utilisateurs d’Eclipse (ils fournissent plusieurs de leurs projets sous forme de plug-ins Eclipse: Android SDK, GAE, etc.), la réponse @djechlin et cette réponse complémentaire sont donc très utiles (du moins pour moi).

270
higuaro

Il existe une méthode nommée amusante/constante/quelconque dans chaque version d'Android. 

La seule utilisation pratique que j'ai jamais vue se trouvait dans le dernier appel à Google I/O Concours, où ils ont demandé ce que c'était pour une version particulière, afin de voir si les candidats lisent le rapport de différences API de chaque version. Le concours avait aussi des problèmes de programmation, mais en général, certaines anecdotes pouvaient être classées automatiquement en premier pour réduire le nombre de soumissions à des quantités raisonnables qu'il serait plus facile de vérifier.

130
Lance Nanek

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 vocale fonctionne exceptionnellement bien, et les chèvres sont des gens pour qui ça fonctionne exceptionnellement mal. Seul le système de reconnaissance vocale sait ce qui les sépare. Les gens ne peuvent pas prédire quelles voix seront reconnues facilement et lesquelles ne le seront pas. La meilleure politique consiste à concevoir l'interface de sorte qu'elle puisse gérer toutes sortes de voix dans tous types d'environnements

Peut-être qu’il est prévu de marquer les utilisateurs d’Android comme des chèvres à l’avenir pour pouvoir configurer le moteur de reconnaissance vocale pour les besoins des chèvres. ;-)

119
rainer198

Google aime beaucoup les chèvres et les chèvres Œufs de Pâques . Il y a même eu les précédents posts Stack Overflow à ce sujet

Comme il a été mentionné dans des messages précédents, il existe également dans le gestionnaire de tâches de Chrome ( il est apparu 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 de Google aux chèvres incluent:

La première corrélation entre Google et les chèvres appartient à l'article de blogue original "Tondre avec des chèvres", pour autant que je sache.

Nous pouvons sans risque supposer qu’il s’agit simplement d’un œuf de Pâques et n’a aucune utilité réelle, à l’exception du renvoi false.

113
rickyduck

À partir de l’API 21 (le premier Android 5.0/Lollipop SDK) , il 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 if (false) sans mise en garde est une stratégie potentiellement désastreuse. Ce qui retournait précédemment false pour chaque périphérique renvoie maintenant une valeur apparemment aléatoire: si cela était suffisamment enfoui dans votre code, cela pourrait prendre un temps long pour déterminer la source de vos nouveaux bogues.

En bout de ligne: 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.

109
Mark Whitaker

Il existe un appel similaire, isUserAMonkey(), qui renvoie true si l’outil MonkeyRunner est utilisé. L’explication du SDK est aussi curieuse que celle-ci. 

public static boolean isUserAMonkey(){}     

Retourne true si l'interface utilisateur est en train d'être gâchée par un singe.

Ici est la source. 

Je suppose que cela a été ajouté en prévision d’un nouvel outil SDK nommé quelque chose avec une chèvre et en fait sera fonctionnel pour tester la présence de cet outil. 

Voir également une question similaire, Fonction étrange dans ActivityManager: isUserAMonkey. Qu'est-ce que cela signifie, à quoi sert-il?.

100
KDEx

 enter image description here

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

Images perdues: youtu.be/YJwZMUn7GdQ

 enter image description here

Google doit avoir repéré cela et décidé de leur fournir un soutien, dans le but de rester à la pointe du progrès technologique.

59
Sergio Carneiro

Oeuf de Pâques drôle.
Dans Ubuntu version de Chrome, dans le gestionnaire de tâches (shift+esc), avec un clic droit, vous pouvez ajouter une colonne de science-fiction qui est dans la version italienne est "Capre Teletrasportate" (Chèvres téléportées).

Une théorie amusante à ce sujet est ici .

35
j.c

Veuillez voir le code source ci-dessous: 

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

Ce n'est pas une blague intérieure Apparemment, c'est juste un vérificateur d'applications pour Goat Simulator - de Coffee Stain Studios

Si vous avez installé Goat Simulator, vous êtes une chèvre ... Si ce n'est pas le cas, vous n'êtes pas une chèvre.

J'imagine que c'était plus une expérience personnelle de l'un des développeurs, probablement une expérience sociale pour trouver des personnes partageant un intérêt commun.

0
Zillinium