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

Je regardais les nouvelles API présentées 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 aux téléportations.

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

Comment et quand faut-il l’utiliser?

De leur source , la méthode utilisée pour renvoyer false était modifiée 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 nous soit pas vraiment utile en tant que développeurs. Quelqu’un a déjà déclaré que cela pourrait être un œuf de Pâques .

Dans API 21, l’implémentation a été modifiée pour vérifier s’il existe une application installée avec le package com.coffeestainstudios.goatsimulator

 /** * Used to determine whether the user making this call is subject to * teleportations. * * 

As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can * now automatically identify goats using advanced goat recognition technology.

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

Je ne sais pas si c’était “le” cas d’utilisation officiel, mais ce qui suit produit un avertissement dans Java (qui peut produire des erreurs de compilation si mélangé avec des instructions de return , conduisant à du 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 comstack time"); } 

Donc, je trouve souvent que j’écris une méthode utilitaire idiote pour trouver le moyen le plus rapide de démystifier un bloc de code, puis, en complétant le débogage, trouver tous les appels, de sorte que l’implémentation ne change pas.

JLS signale if (false) ne déclenche pas de “code inaccessible” pour la raison spécifique que cela supprime 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 pour if , produisant un cas d’utilisation plus obscur. Je pense que vous pouvez tromper votre IDE, comme Eclipse, avec ce comportement, mais cette édition a 4 ans et je n’ai pas d’environnement Eclipse avec lequel jouer.

Cela semble être une blague sur Google. Il figure également dans le gestionnaire de tâches Google Chrome. Cela n’a pas de sens, si ce n’est 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 Maj + Échap .
  2. Cliquez avec le bouton droit pour append la colonne Goats Teleported .
  3. Merveille.

Il y a même un énorme rapport de bug sur le chrome à propos de trop de chèvres téléscopes .

chrome

L’ extrait de code source Chromium suivant est volé dans les commentaires HN .

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

En complément de la réponse @djechlin (bonne réponse au fait!), Cet appel de fonction pourrait également servir de code factice pour contenir un point d’arrêt dans un IDE lorsque vous souhaitez vous arrêter dans une itération spécifique ou un appel récursif particulier:

entrer la description de l'image ici

isUserAGoat() pourrait être utilisé à la place d’une déclaration de variable factice qui sera affichée dans l’EDI en tant qu’avertissement et, dans le cas particulier d’Eclipse, obstruera la marque du point d’arrêt, rendant difficile son activation / désactivation. Si la méthode est utilisée comme une convention, toutes les invocations pourraient ensuite être filtrées par un script (pendant la phase de validation peut-être?).

entrer la description de l'image ici

Les gars de Google sont des utilisateurs lourds d’Eclipse (ils fournissent plusieurs de leurs projets en tant que plug-in Eclipse: Android SDK, GAE, etc.). La réponse de @djechlin et cette réponse complémentaire ont donc beaucoup de sens (du moins pour moi).

Il y a une méthode / constant / quelle que ce soit dans chaque version d’Android.

La seule utilisation pratique que j’ai jamais vue concernait le concours «Dernier appel pour E / S» où ils ont demandé ce que c’était pour une version particulière, pour voir si les candidats lisaient le rapport de diff API pour chaque version. Le concours présentait également des problèmes de programmation, mais en général, certains problèmes pouvaient être classés automatiquement pour que le nombre de soumissions soit réduit à des quantités raisonnables, ce qui serait plus facile à vérifier.

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

Par exemple, ici à la page 89 :

Les moutons sont des personnes pour lesquelles la reconnaissance de la parole fonctionne exceptionnellement bien et les chèvres sont des personnes pour lesquelles cela fonctionne exceptionnellement mal. Seul le système de reconnaissance vocale sait ce qui les sépare. Les gens ne peuvent pas prédire quelle voix sera reconnue facilement et de qui ne le sera pas. La meilleure politique consiste à concevoir l’interface de manière à pouvoir gérer toutes sortes de voix dans tous les types d’environnements.

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

Google a un goût sérieux pour les œufs de Pâques à base de chèvre et de chèvre. Il y a même eu des messages Stack Overflow précédents à ce sujet .

Comme cela a été mentionné dans les publications précédentes, il existe également dans le gestionnaire de tâches Chrome ( il est apparu pour la première fois en 2009 ):

  Goats Teleported  

Et puis dans les versions Windows, Linux et Mac de Chrome début 2010 ). Le nombre de “Goats Teleported” est en fait aléatoire :

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

Parmi les autres références de Google aux chèvres, citons:

  • Tondre avec des chèvres
  • Les chèvres sont baaaahk

La première corrélation de chèvres et de Google appartient à l’article de blog original «Mowing with goats», pour autant que je sache.

Nous pouvons supposer que c’est simplement un oeuf de Pâques et qu’il n’est pas utilisé dans le monde réel, sauf pour retourner un false .

À partir de l’API 21 (le premier SDK Android 5.0 / Lollipop) , cela détecte si l’application Goat Simulator est installée:

 /** * Used to determine whether the user making this call is subject to * teleportations. * * 

As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can * now automatically identify goats using advanced goat recognition technology.

* * @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 if (false) est une stratégie potentiellement désastreuse. La valeur renvoyée précédemment par false pour chaque périphérique renvoie désormais une valeur apparemment aléatoire: si celle-ci était enterrée suffisamment profondément dans votre code, cela pourrait prendre du temps à déterminer l’origine de vos nouveaux bogues.

Bottom line: si vous ne contrôlez pas l’implémentation 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.

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

 public static boolean isUserAMonkey(){} 

Renvoie true si l’interface utilisateur est actuellement manipulée par un singe.

Voici la source.

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

Voir aussi une question similaire, fonction Strange dans ActivityManager: isUserAMonkey. Qu’est-ce que cela signifie, quelle est son utilisation? .

entrer la description de l'image ici

Dans les montagnes les plus reculées de la planète, se trouve une espèce de chèvre avancée qui semble pouvoir utiliser les téléphones, tout comme nous, les humains!

Fuite d’images: youtu.be/YJwZMUn7GdQ

entrer la description de l'image ici

Google a dû repérer cela et a décidé de leur apporter un soutien afin de restr en première ligne en matière de progrès technologique.

Oeuf de Pâques drôle.
Dans la version Ubuntu de Chrome, dans le Gestionnaire des tâches ( shift + esc ), avec un clic droit, vous pouvez append une colonne de science-fiction qui, en version italienne, est “Capre Teletrasportate” (Chèvres téléscopes).

Une théorie amusante à ce sujet est ici .