Juiste gebruiksscenario’s voor Android UserManager.isUserAGoat()?

Ik keek naar de nieuwe API’s die zijn geïntroduceerd in Android 4.2.
Terwijl ik naar de klasse UserManagerkeek, kwam ik via de volgende methode:

public boolean isUserAGoat()

Wordt gebruikt om te bepalen of de gebruiker die deze oproep doet, wordt geteleporteerd.

Retourneert of de gebruiker die deze oproep doet een geit is.

Hoe en wanneer moet dit worden gebruikt?


Antwoord 1, autoriteit 100%

Android R-update:

Vanaf Android R retourneert deze methode altijd false. Google zegt dat dit is gedaan “om de privacy van geiten te beschermen”:

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

Vorige antwoord:

Van hun bron, de methode die werd gebruikt om falsete retourneren totdat deze werd gewijzigd in 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;
}

Het lijkt erop dat de methode niet echt nuttig is voor ons als ontwikkelaars. Iemand heeft eerder verklaard dat het een paaseikan zijn .

In API 21 is de implementatie gewijzigd om te controleren of er een app is geïnstalleerd met het pakket 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");
}

Hier is de bronen de wijzigen.


Antwoord 2, autoriteit 53%

Ik weet niet of dit “de” officiële use-case was, maar het volgende levert een waarschuwing op in Java (die verder compileerfouten kan veroorzaken indien gemengd met return-instructies, wat leidt tot onbereikbare code ):

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

Dit is echter legaal:

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

Dus ik merk dat ik vaak een dwaze hulpprogramma-methode aan het schrijven ben voor de snelste manier om een ​​codeblok te dummyen, en dan bij het voltooien van debugging alle aanroepen ernaar te vinden, dus op voorwaarde dat de implementatie niet verandert, kan dit daarvoor worden gebruikt.

JLS-punten out if (false)activeert geen “onbereikbare code” om de specifieke reden dat dit de ondersteuning voor debug-vlaggen zou verbreken, dwz in feite deze use case (h/t @auselen). (static final boolean DEBUG = false;bijvoorbeeld).

Ik heb whilevervangen door if, wat een meer obscure use case oplevert. Ik geloofdat je je IDE, zoals Eclipse, kunt laten struikelen met dit gedrag, maar deze bewerking is 4 jaar in de toekomst en ik heb geen Eclipse-omgeving om mee te spelen.


Antwoord 3, autoriteit 41%

Dit lijkt een inside joke bij Google te zijn. Het staat ook in de Google Chrome-taakmanager. Het heeft geen doel, behalve dat sommige ingenieurs het grappig vinden. Dat is een doel op zich, als je wilt.

  1. Open in Chrome Taakbeheer met Shift+Esc.
  2. Klik met de rechtermuisknop om de kolom Goats Teleportedtoe te voegen.
  3. Wonder.

Er is zelfs een enorm Chromium-bugrapport over te veel geteleporteerde geiten.

De volgende Chromium broncodefragmentis gestolen uit de HN-opmerkingen.

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

Antwoord 4, autoriteit 16%

Als aanvulling op het @djechlin antwoord(goed antwoord trouwens!), kan deze functieaanroep ook gebruikt als dummy-code om een ​​breekpunt in een IDE vast te houden wanneer u wilt stoppen in een specifieke iteratie of een bepaalde recursieve aanroep, bijvoorbeeld:

isUserAGoat()kan worden gebruikt in plaats van een dummy-variabeledeclaratie die als waarschuwing in de IDE wordt weergegeven en, in het specifieke geval van Eclipse, de breekpuntmarkering verstopt, waardoor het moeilijk wordt om deze in te schakelen / schakel het uit. Als de methode als conventie wordt gebruikt, kunnen alle aanroepen later door een of ander script worden gefilterd (misschien tijdens de commit-fase?).

Google-jongens zijn zware Eclipse-gebruikers (ze leveren verschillende van hun projecten als Eclipse-plug-ins: Android SDK, GAE, enz.), dus het antwoord van @djechlin en dit aanvullende antwoord zijn heel logisch (althans voor mij).


Antwoord 5, autoriteit 8%

Er is een grappige benoemde methode/constante/wat dan ook in elke versie van Android.

Het enige praktische nut dat ik ooit heb gezien was in de Last Call for Google I/O-wedstrijd waar ze vroegen wat het was voor een bepaalde versie, om te zien of deelnemers het API diff-rapport voor elke release lazen. De wedstrijd had ook programmeerproblemen, maar over het algemeen waren er enkele trivia die automatisch als eerste konden worden beoordeeld om het aantal inzendingen terug te brengen tot redelijke hoeveelheden die gemakkelijker te controleren zouden zijn.


Antwoord 6, autoriteit 8%

Op het gebied van spraakherkenning worden gebruikers onderverdeeld in geitenen schapen.

Bijvoorbeeld hier op pagina 89:

Schapen zijn mensen voor wie spraakherkenning uitzonderlijk goed werkt, en geiten zijn mensen voor wie het uitzonderlijk slecht werkt. Alleen de stemherkenner weet wat hen scheidt. Mensen kunnen niet voorspellen wiens stem gemakkelijk zal worden herkend en wiens niet. Het beste beleid is om de interface zo te ontwerpen dat deze alle soorten stemmen in allerlei omgevingen aankan

Misschien is het de bedoeling om Android-gebruikers in de toekomst als geiten te markeren om de spraakherkenningsengine te kunnen configureren voor de behoeften van geiten. 😉


Antwoord 7, autoriteit 7%

Vanaf API 21 (de eerste Android 5.0/Lollipop SDK)detecteert dit of de Goat Simulatorapp is geïnstalleerd:

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

Dit zou duidelijk moeten maken dat djechlins suggestieom het te gebruiken als een waarschuwingsvrije if (false)is een potentieel rampzalige strategie. Wat eerder falseopleverde voor elk apparaat, retourneert nu een schijnbaar willekeurige waarde: als dit diep genoeg in je code was begraven, zou het langtijd kunnen kosten om erachter te komen waar je nieuwe bugs zijn komen vandaan.

Kortom: als je geen controle hebt over de implementatie van een methode en besluit deze te gebruiken voor andere doeleinden dan vermeld in de API-documentatie, stevent je af op problemen.


Antwoord 8, autoriteit 7%

Google heeft een grote voorliefde voor geiten en op geiten gebaseerde paaseieren. Er zijn zelfs vorige Stack Overflow-berichten over het.

Zoals in eerdere berichten is vermeld, bestaat het ook in de Chrome-taakmanager (het verscheen voor het eerst in het wild in 2009):

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

En dan in Windows-, Linux- en Mac-versies van Chrome begin 2010). Het aantal geteleporteerde geiten is in feite willekeurig:

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

Andere Google-verwijzingen naar geiten zijn:

De vroegste correlatie tussen geiten en Google hoort, voor zover ik weet, thuis in de oorspronkelijke blogpost ‘Maaien met geiten’.

We kunnen er gerust van uitgaan dat het slechts een paasei is en geen gebruik in de echte wereld heeft, behalve het retourneren van false.


Antwoord 9, autoriteit 6%

Er is een vergelijkbare aanroep, isUserAMonkey(), die true retourneert als de MonkeyRunner-toolwordt gebruikt. De SDK-verklaring is net zo merkwaardig als deze.

public static boolean isUserAMonkey(){}     

Retourneert trueals de gebruikersinterface momenteel wordt geknoeid door een aap.

Hieris de bron.

Ik verwacht dat dit is toegevoegd in afwachting van een nieuwe SDK-tool genaamd iets met een geit en zal eigenlijkfunctioneel zijn om te testen op de aanwezigheid van die tool.

Zie ook een vergelijkbare vraag, Vreemde functie in ActivityManager: isUserAMonkey. Wat betekent dit, wat is het nut ervan?.


Antwoord 10, autoriteit 2%

Grappig paasei.
In de Ubuntu-versie van Chrome, in Taakbeheer (shift+esc), kunt u met de rechtermuisknop een sci-fi-kolom toevoegen die in de Italiaanse versie “Capre Teletrasportate” is (Geteleporteerde geiten).

Een grappige theorie hierover is hier.


Antwoord 11

Het is geen inside joke

Blijkbaar is het slechts een toepassingscontrole voor
Geitensimulator – door Coffee Stain Studios

Als je Goat Simulator hebt geïnstalleerd, ben je een geit.
Als je het niet hebt geïnstalleerd, ben je geen geit.

Ik kan me voorstellen dat het meer een persoonlijk experiment was van een van de ontwikkelaars, met de meeste kans om mensen met een gemeenschappelijke interesse te vinden.

Other episodes