Правильные варианты использования для Android UserManager.isUserAGoat()?

Я смотрел новые API, представленные в Android 4.2. Рассматривая класс UserManager, я наткнулся на следующий метод:

 public boolean isUserAGoat()

Используется для определения того, подвержен ли пользователь, выполняющий этот вызов, телепортации.

Возвращает, является ли пользователь, выполняющий этот вызов, козой.

Как и когда это следует использовать?

3039
задан Ovidiu Latcu 14 нояб. '12 в 11:34
источник поделиться
11 ответов

Из своего source метод, используемый для возврата false, пока он не изменился в 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;
}

Похоже, что этот метод не используется для нас как разработчиков. Кто-то ранее заявил, что это может быть пасхальное яйцо.

В API 21 была изменена реализация, чтобы проверить, есть ли установленное приложение с пакетом 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");
}

Вот ссылка источника

1458
ответ дан meh 14 нояб. '12 в 11:40
источник поделиться

Я не знаю, было ли это "официальным" вариантом использования, но следующее выдает предупреждение на Java (которое может дополнительно создавать ошибки компиляции, если они смешиваются с операторами return, что приводит к недостижимому коду):

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

Однако это законно:

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

Итак, я часто нахожу, что я пишу глупый метод утилиты для самого быстрого способа заглушить блок кода, а затем при завершении отладки нахожу все вызовы к нему, поэтому, если реализация не изменится, это может быть использовано для этого.

JLS указывает if (false) не вызывает "недостижимый код" по той причине, что это нарушит поддержку флагов отладки, т.е. в основном этот прецедент (h/t @auselen). (например, static final boolean DEBUG = false;).

Я заменил while на if, создав более неясный вариант использования. Я считаю, что вы можете отключить вашу среду IDE, например Eclipse, с этим поведением, но это редактирование составляет 4 года в будущем, и у меня нет среды Eclipse для воспроизведения.

904
ответ дан djechlin 14 нояб. '12 в 17:47
источник поделиться

Это, кажется, внутренняя шутка в Google. Он также отображается в диспетчере задач Google Chrome. У него нет никакой цели, кроме некоторых инженеров, которые считают это забавным. Какая цель сама по себе, если хотите.

  • В Chrome откройте диспетчер задач с помощью Shift + Esc.
  • Щелкните правой кнопкой мыши, чтобы добавить столбец Goats Teleported.
  • Wonder.

Существует даже огромный отчет об ошибке Chromium о слишком много телепортированных козлов.

chrome

Следующий фрагмент кода Chromium украден из комментариев HN.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
699
ответ дан user479870 14 нояб. '12 в 12:03
источник поделиться

В дополнение к ответу @djechlin (хороший ответ, кстати!), этот вызов функции может быть также использован как фиктивный код для хранения точку останова в среде IDE, когда вы хотите остановиться в некоторой конкретной итерации или конкретном рекурсивном вызове, например:

enter image description here

isUserAGoat() может использоваться вместо объявления фиктивной переменной, которое будет отображаться в среде IDE в качестве предупреждения, а в частном случае Eclipse забивает метку точки останова, что затрудняет ее включение/отключение. Если метод используется как соглашение, все вызовы могут быть позже отфильтрованы некоторым script (во время фазы фиксации, возможно?).

enter image description here

Ребята из Google - это тяжелые пользователи Eclipse (они предоставляют несколько своих проектов как плагины Eclipse: Android SDK, GAE и т.д.), поэтому ответ @djechlin и этот дополнительный ответ имеют большой смысл (по крайней мере для меня).

255
ответ дан higuaro 21 нояб. '12 в 19:55
источник поделиться

В каждой версии Android есть смешной метод /constant/whatever.

Единственное практическое применение, которое я когда-либо видел, было в последнем вызове конкурса Google I/O, на котором они спросили, что именно для конкретной версии, чтобы посмотреть, будут ли конкурсанты прочитайте отчет API diff для каждой версии. В конкурсе также были проблемы с программированием, но в целом некоторые мелочи, которые можно было автоматически классифицировать, чтобы получить количество материалов до разумных количеств, которые было бы легче проверить.

121
ответ дан Lance Nanek 14 нояб. '12 в 20:26
источник поделиться

У Google есть серьезная симпатия к козам и козам Пасхальные яйца. Там даже были предыдущие Stack сообщения о переполнении.

Как уже упоминалось в предыдущих сообщениях, он также существует в диспетчере задач Chrome (он впервые появился в дикой природе в 2009 году):

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

А потом в Windows, Linux и Mac версии Chrome в начале 2010 года). Количество "Козлов телепортировано" на самом деле random:

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

Другие ссылки Google на коз включают:

Самое раннее соотношение коз и Google принадлежит, как я могу судить, в исходном блоге "Кошение с козами".

Мы можем с уверенностью предположить, что это просто пасхальное яйцо и не имеет реального использования, за исключением возврата false.

104
ответ дан rickyduck 15 нояб. '12 в 13:33
источник поделиться

В дисциплине распознавания речи пользователи делятся на коз и овец.

Например, здесь на стр. 89:

Овцы - это люди, для которых распознавание речи работает исключительно хорошо, а козы - люди, для которых он работает исключительно плохо. Только распознаватель голоса знает, что их разделяет. Люди не могут предсказать, чей голос будет легко распознан и чья воля не будет. Лучшая политика заключается в разработке интерфейса, чтобы он мог обрабатывать все виды голосов во всех видах среды.

Возможно, в будущем планируется отметить пользователей Android как козлов, чтобы настроить механизм распознавания речи для потребностей коз.; -)

103
ответ дан rainer198 31 мая '13 в 12:33
источник поделиться

Начиная с API 21 (первый Android 5.0/Lollipop SDK), это определяет, будет ли Установлено приложение Goat Simulator:

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

Это должно дать понять, что предложение djechlin использовать его в качестве бесплатного if (false) без предупреждения - потенциально катастрофическая стратегия. То, что ранее возвращало false для каждого устройства, теперь возвращает кажущееся случайное значение: если это было достаточно глубоко погребено в коде, может потребоваться много времени, чтобы выяснить, откуда происходят ваши новые ошибки.

Нижняя строка: если вы не контролируете реализацию метода и не решили использовать его для целей, отличных от указанных в документации API, вы столкнулись с проблемами.

99
ответ дан Mark Whitaker 20 окт. '14 в 13:00
источник поделиться

Существует аналогичный вызов isUserAMonkey(), который возвращает true, если используется инструмент MonkeyRunner. Объяснение SDK так же любопытно, как и этот.

public static boolean isUserAMonkey(){}     

Возвращает true, если пользовательский интерфейс в настоящее время запущен обезьяной.

Здесь является источником.

Я ожидаю, что это было добавлено в ожидании нового инструмента Странная функция в ActivityManager: isUserAMonkey. Что это значит, каково его использование?.

93
ответ дан KDEx 17 нояб. '12 в 0:33
источник поделиться

введите описание изображения здесь

В самых отдаленных горах планеты находится продвинутый вид козы, который, по-видимому, в настоящее время способен использовать телефоны, как и мы, люди!

Утечка: youtu.be/YJwZMUn7GdQ

введите описание изображения здесь

Google, должно быть, заметил это и решил оказать им поддержку, пытаясь остаться на переднем крае технологического развития.

47
ответ дан Sergio Carneiro 30 сент. '16 в 17:00
источник поделиться

Смешное пасхальное яйцо.
В версии Ubuntu Chrome, в диспетчере задач (shift + esc), щелкнув правой кнопкой мыши, вы можете добавить научную колонку, которая в итальянской версии будет "Capre Teletrasportate" (Teleported Goats).

Смешная теория об этом здесь.

30
ответ дан j.c 06 февр. '14 в 13:35
источник поделиться

Другие вопросы по меткам