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


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

 public boolean isUserAGoat()

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

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

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


3140
2017-11-14 08:34


origine


Réponses:


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

On dirait que la méthode n'a pas vraiment d'utilité pour nous en tant que développeurs. Quelqu'un a déjà déclaré que cela pourrait être un Œuf de Pâques.

Dans l'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.
 *
 * <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 la lien source


1512
2017-11-14 08:40



Je ne sais pas si c'était "le" cas d'utilisation officiel, mais ce qui suit produit un avertissement en Java (qui peut encore produire des erreurs de compilation si mélangé avec return déclarations, 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 à écrire une méthode utilitaire idiote pour trouver un bloc de code le plus rapidement possible, puis, en finalisant le débogage, trouver tous les appels, donc à condition que l'implémentation ne change pas cela peut être utilisé pour cela.

JLS fait remarquer if (false) ne déclenche pas de "code inaccessible" pour la raison spécifique que cela annulerait le support des drapeaux de débogage, c'est-à-dire, fondamentalement, 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 croyez vous pouvez trébucher votre EDI, comme Eclipse, avec ce comportement, mais cette édition aura lieu dans 4 ans et je n'ai pas d'environnement Eclipse avec lequel jouer.


916
2017-11-14 14:47



Cela semble être une blague à l'intérieur chez Google. Il est également présenté dans le gestionnaire de tâches de Google Chrome. Il n'a pas d'autre but, à part quelques ingénieurs qui trouvent cela amusant. Ce qui est un but en soi, si vous voulez.

  1. Dans Chrome, ouvrez le Gestionnaire des tâches avec Décalage+Esc.
  2. Faites un clic droit pour ajouter le Goats Teleported colonne.
  3. Merveille.

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

chrome 

Le chrome suivant extrait de code source est volé à la HN commentaires.

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

706
2017-11-14 09:03



Compléter le @djechlin répondre (bonne réponse au passage!), cet appel de fonction pourrait être aussi utilisé comme code fictif pour contenir un point d'arrêt dans un EDI lorsque vous souhaitez arrêter 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 fictive qui sera affichée dans l'EDI comme un 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 être filtrées plus tard par un script (pendant la phase de validation peut-être?).

enter image description here

Les gars de Google sont de gros utilisateurs Eclipse (ils fournissent plusieurs de leurs projets en tant que plugins Eclipse: Android SDK, GAE, etc), donc la réponse @djechlin et cette réponse complémentaire ont beaucoup de sens (du moins pour moi).


258
2017-11-21 16:55



Il y a une méthode nommée / constante / peu commune dans chaque version d'Android.

Le seul usage pratique que j'ai jamais vu était dans le dernier appel pour Google I / O Concours où ils ont demandé ce que c'était pour une version particulière, pour voir si les concurrents lisent le rapport de diff API pour chaque version. Le concours comportait également des problèmes de programmation, mais généralement des questions qui pouvaient être classées automatiquement en premier pour ramener le nombre de soumissions à des montants raisonnables qui seraient plus faciles à vérifier.


122
2017-11-14 17:26



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

Par exemple, ici à la page 89:

Les moutons sont des personnes pour qui la reconnaissance vocale fonctionne exceptionnellement bien, et les chèvres sont des personnes pour qui cela fonctionne exceptionnellement mal. Seul le système de reconnaissance vocale sait ce qui les sépare. Les gens ne peuvent pas prédire la voix qui sera facilement reconnue et celle qui ne le sera pas. La meilleure politique est de concevoir l'interface pour qu'elle puisse gérer toutes sortes de voix dans tous les types d'environnements

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


110
2018-05-31 09:33



Google a un goût sérieux pour les chèvres et les chèvres œufs de Pâques. Il y a même eu Stack Overflow posts à 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 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 "Téléportés Goats" est en fait au hasard:

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

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

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

Nous pouvons sans risque supposer que c'est simplement un oeuf de pâques et n'a aucune utilisation réelle, sauf pour le retour false.


104
2017-11-15 10:33



À partir de l'API 21 (le premier SDK Android 5.0 / Lollipop), cela détecte si le Simulateur de chèvre L'application 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");
}

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 été retourné false pour chaque périphérique renvoie maintenant une valeur apparemment aléatoire: si cela a été enterré assez profondément dans votre code, il pourrait prendre un longue temps de comprendre d'où viennent vos nouveaux bugs.

Bottom line: si vous ne contrôlez pas l'implémentation d'une méthode et décidez de l'utiliser à d'autres fins que celles indiquées dans la documentation de l'API, vous vous dirigez vers des problèmes.


101
2017-10-20 10:00



Il y a un appel similaire, isUserAMonkey(), cela revient vrai si le Outil MonkeyRunner est en train d'être utilisé. L'explication du SDK est tout aussi curieuse que celle-ci.

public static boolean isUserAMonkey(){}     

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

Iciest la source.

Je pense que cela a été ajouté en prévision d'une nouvelle SDK outil nommé quelque chose avec une chèvre et volonté réellement être fonctionnel 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 utilisation?.


94
2017-11-16 21:33