it-swarm.it

Casi di utilizzo appropriati per Android UserManager.isUserAGoat ()?

Stavo guardando le nuove API introdotte in Android 4.2 . Osservando il UserManager class ho trovato il seguente metodo:

public boolean isUserAGoat()

Utilizzato per determinare se l'utente che effettua questa chiamata è soggetto a teletrasporto.

Restituisce se l'utente che effettua questa chiamata è una capra.

Come e quando dovrebbe essere usato?

3311
Ovidiu Latcu

Dal loro source, il metodo utilizzato per restituire false fino a quando non è stato modificato 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;
}

Sembra che il metodo non abbia reale utilità per noi come sviluppatori. Qualcuno ha precedentemente affermato che potrebbe essere un Easter Egg.

Nell'API 21 l'implementazione è stata modificata per verificare se è presente un'app installata con il pacchetto 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");
}

Ecco il source e il change .

1623
meh

Non so se questo è stato il "caso d'uso ufficiale", ma quanto segue produce un avvertimento in Java (che può produrre ulteriori errori di compilazione se combinato con istruzioni return, che porta a un codice non raggiungibile):

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

Tuttavia questo è legale:

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

Così spesso mi trovo a scrivere un metodo di utilità stupido per il modo più rapido di svuotare un blocco di codice, quindi nel completamento del debug trovo tutte le chiamate ad esso, quindi a patto che l'implementazione non cambi questo può essere usato per quello.

JLS indica che if (false) non attiva il "codice non raggiungibile" per il motivo specifico che ciò interromperà il supporto per i flag di debug, ovvero, in pratica, questo caso d'uso (h/t @auselen). (static final boolean DEBUG = false; per esempio).

Ho sostituito while per if, producendo un caso d'uso più oscuro. Ibelieve puoi scovare il tuo IDE, come Eclipse, con questo comportamento, ma questa modifica è di 4 anni nel futuro, e non ho un ambiente Eclipse con cui giocare.

945
djechlin

Questo sembra essere uno scherzo di Google. È anche presente nel task manager di Google Chrome. Non ha scopo, a parte alcuni ingegneri che lo trovano divertente. Che è uno scopo di per sé, se vuoi.

  1. In Chrome, apri il Task Manager con Shift+Esc.
  2. Fare clic con il tasto destro per aggiungere la colonna Goats Teleported.
  3. Meravigliarsi.

C'è anche un enorme bug report su Chromium troppe capre teletrasportate .

chrome

Il seguente Chromium snippet del codice sorgente viene rubato dai HN commenti.

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

Completando @djechlin answer (buona risposta tra l'altro!), Questa chiamata di funzione potrebbe essere anche utilizzata come codice fittizio per contenere un punto di interruzione in un IDE quando si desidera interrompere in alcuni iterazione specifica o una particolare chiamata ricorsiva, ad esempio:

enter image description here

isUserAGoat() potrebbe essere usato al posto di una dichiarazione di variabile fittizia che verrà mostrata nel IDE come avvertenza e, nel caso particolare di Eclipse, ostruirà il segno di interruzione, rendendo difficile abilitarlo/disabilitarlo. Se il metodo è usato come convenzione, tutte le invocazioni potrebbero essere successivamente filtrate da qualche script (durante la fase di commit forse?).

enter image description here

I ragazzi di Google sono utenti pesanti di Eclipse (forniscono molti dei loro progetti come plugin di Eclipse: Android SDK, GAE, ecc.), Quindi la risposta di @djechlin e questa risposta complementare hanno molto senso (almeno per me).

270
higuaro

C'è un metodo chiamato divertente/costante/qualunque sia in ogni versione di Android. 

L'unico utilizzo pratico che ho mai visto è stato l'ultimo invito a Google I/O Contest in cui è stato chiesto che cosa fosse per una particolare versione, per vedere se i concorrenti leggevano il rapporto diffettivo API per ogni versione. Il concorso ha avuto anche problemi di programmazione, ma in generale alcune banalità che potrebbero essere classificate automaticamente prima di ottenere il numero di sottomissioni a importi ragionevoli che sarebbe più facile da controllare.

130
Lance Nanek

Nella disciplina del riconoscimento vocale, gli utenti sono divisi in capre e pecore

Ad esempio, qui a pagina 89:

Le pecore sono persone per le quali il riconoscimento vocale funziona eccezionalmente bene e le capre sono persone per le quali funziona eccezionalmente male. Solo il riconoscitore vocale sa cosa li separa. Le persone non possono prevedere la cui voce sarà riconosciuta facilmente e di chi no. La migliore politica è progettare l'interfaccia in modo che possa gestire tutti i tipi di voci in tutti i tipi di ambienti

Forse, si prevede di contrassegnare gli utenti Android come capre in futuro per poter configurare il motore di riconoscimento vocale per le esigenze delle capre. ;-)

119
rainer198

Google ha un grosso interesse per le capre e le capre basate uova di Pasqua . Ci sono stati anche precedenti post di Overflow dello Stack su di esso

Come è stato menzionato nei post precedenti, esiste anche all'interno del task manager di Chrome ( è apparso per la prima volta nel 2009 ):

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

E poi in Windows, Linux e Mac versioni di Chrome all'inizio del 2010 ). Il numero di "Goat Teleported" è in effetti random :

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

Altri riferimenti di Google alle capre includono:

La prima correlazione tra capre e Google appartiene al post sul blog originale "Falciare le capre", per quanto ne so.

Possiamo tranquillamente presumere che si tratta semplicemente di un Easter Egg e non ha alcun utilizzo nel mondo reale, tranne per il ritorno false.

113
rickyduck

A partire da API 21 (il primo Android 5.0/Lollipop SDK) , questo rileva se l'app Goat Simulator è installata:

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

Questo dovrebbe chiarire che il suggerimento di djechlin di usarlo come un if (false) privo di avvisi è una strategia potenzialmente disastrosa. Ciò che precedentemente restituito false per ogni dispositivo ora restituisce un valore apparentemente casuale: se questo è stato sepolto abbastanza in profondità nel tuo codice, potrebbe essere necessario un tempo long per capire da dove provengono i nuovi bug.

In conclusione: se non controlli l'implementazione di un metodo e decidi di usarlo per scopi diversi da quelli indicati nella documentazione dell'API, stai andando incontro a problemi.

109
Mark Whitaker

C'è una chiamata simile, isUserAMonkey(), che restituisce true se lo strumento MonkeyRunner è in uso. La spiegazione dell'SDK è altrettanto curiosa di questa. 

public static boolean isUserAMonkey(){}     

Restituisce true se l'interfaccia utente è attualmente incasinata da una scimmia.

Qui è la fonte. 

Mi aspetto che questo sia stato aggiunto in previsione di un nuovo SDK tool chiamato qualcosa con una capra e sarà in realtà funzionante per testare la presenza di quello strumento. 

Vedi anche una domanda simile, Strana funzione in ActivityManager: isUserAMonkey. Cosa significa questo, qual è il suo uso?.

100
KDEx

 enter image description here

Nelle montagne più remote del pianeta, giace una specie avanzata di capra che sembra essere attualmente in grado di utilizzare i telefoni, proprio come noi umani!

Filmato trapelato: youtu.be/YJwZMUn7GdQ

 enter image description here

Google deve averlo individuato e ha deciso di fornire supporto per loro, nel tentativo di rimanere in prima linea nel progresso tecnologico.

59
Sergio Carneiro

Uovo di Pasqua divertente.
Nella versione Ubuntu di Chrome, in Task Manager (shift+esc), con il tasto destro è possibile aggiungere una colonna di fantascienza che nella versione italiana è "Capre Teletrasportate" (Capre teletrasportate).

Una divertente teoria a riguardo è qui .

35
j.c

Si prega di consultare il seguente codice sorgente: 

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

Non è uno scherzo interno Apparentemente è solo un correttore di applicazioni for Goat Simulator - di Coffee Stain Studios

Se hai installato Goat Simulator, il tuo Goat . Se non lo hai installato, non sei una capra.

Immagino sia stato più un esperimento personale di uno degli sviluppatori, molto probabilmente un esperimento sociale per trovare persone con un interesse comune.

0
Zillinium