Новая версия - настройки и багфиксы

На фото "Кардамоновый Moscow Mule" по этому рецепту (пора уже купить медные кружки). Пришлось варить сироп, который через месяц покрылся плесенью...

Начну с рубрики "пользователи пишут": "Could you get an option to get a random drink, that could be helpful when you are in a all inclusive resort".


Ха-ха, успехов получить достойный, скажем, Old Fashioned в all-inclusive отеле! Или все уже изменилось и в all-inclusive не только базовый набор дешевого алкоголя? (написал автор эстет, попивая в баре Гиннесс и заедая притащенной c собой огромной банкой чипсов Pringles). Кстати, не в первый раз уже просят добавить фичу "случайный коктейль". Мне это кажется немного странным, но я видел такую кнопку в других коктейльных приложениях. Где-то даже можно было потрясти телефон, чтобы выпал случайный рецепт. Как будто кубики кинул. Надо будет добавить, но после решения других насущных проблем. А пока расскажу о новом в следующем релизе, результат работы темными воскресными вечерами. Ничего радикально нового нет, но есть несколько приятных вещей.

Новые настройки

Стартовая страница.

Несколько удивительно, но людей реально парит, что приложение всегда открывается на странице "мой бар". Они хотят, чтобы открывалось, например, на "моих коктейлях". Я долго откладывал, но запилить эту простую штуку оказалось делом 15 минут. Добавить новый элемент в настройках, который дает на выбор список всех "табов" (а он уже есть легко доступный в коде), плюс чтение этой настройки в главном Activity на старте. Ну а метод openTabId() у меня был давно готов для других целей. Мелочь, а приятно.

Язык приложения

Эта штука оказалась посложнее. Довольно легко сделать так, что язык приложения всегда соответствует языку системы. Важно только не пропустить все места "кэширования" всяких локализованных ресурсов, и все будет ок. Но невероятно сложно изменить язык приложения программно. Я почувствовал эту боль в полной мере, когда добавлял, казалось бы, простую логику: если язык системы украинский, то поменяй язык приложения на русский. Украинской локализации у меня не было, и я решил, что в такой ситуации русский будет удобнее, чем английский. Потом мне, правда, пару раз прилетало от разгневанных украинцев "какого хрена тут русский?!", даже одну звезду поставили (спасибо).

Если загуглить "android change language programmatically", то первой ссылкой будет stackoverflow с вот таким комментом к первому ответу (оцените количество upvote):

Вдохновляет, правда? Кстати, ответ там неполный, все гораздо хуже. Полный ответ дает вторая ссылка на прекрасный пост под названием, по которому сразу становится понятно, насколько глубока кроличья нора: "How to change the language on Android at runtime and don’t go mad". Помимо основного контента с описанием разного поведения на разных версиях Android API там есть несколько дополнений, и в одном из них автор ссылается на свою библиотеку lingver, которая берет большинство забот на себя. Её я и стал в итоге использовать. Надо не забыть добавить attribution.

С этой библиотекой тоже обнаружилась некоторая странность - например, флаг "follow system locale" оказался по умолчанию false, что, конечно же, совсем не то, что мне нужно. То есть мне по-хорошему нужно его повернуть в true, но только при первом запуске, пока пользователь не сменил язык самостоятельно. Но это мелочи, фича готова:

"keep screen on"

Не выключать экран, когда находишься на странице рецепта коктейля. Ведь обычно как, открываешь коктейль, кладешь телефон на стол, начинаешь читать. Ага, 50мл вискаря, пошел за ним, налил. Пока все это делал, телефон уже "уснул". Хорошо, если можно открыть по отпечатку пальца, а сенсор сверху, как у iPhone или моего бывшего Huawei P20 Pro. Но если это какой-нибудь Pixel 5 (жду не дождусь), то там кнопка сзади, придется брать телефон в руки грязными руками. Сам давно думал, что надо бы сделать какое-то исключение для этого режима, но почему-то считал, что эта функция потребует специального системного разрешения (вроде раньше так было?), но оказалось - нет, keep screen on это буквально одна строчка:

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

Почему я раньше этого не сделал? Непонятно, но решающий пинок дал пользователь, который попросил эту фичу.

Cloud синхронизация

Скажу честно, в этой области у меня склад костылей всего проекта. Хочу обругать Google Firestore, но на самом деле он делает всю работу по синхронизации за меня, хоть и приходится расплачиваться за это весельем с его фантастическим API. В новой версии я решаю сразу две проблемы. Обе требуют рассказать большой бэкграунд, так что я, наверное, оставлю подробности для отдельного технического поста, вместо этого покажу гифку с неожиданным поведением:

Сначала от другого устройства "приходит" ингредиент "A-test1". Но при попытке его отредактировать он просто исчезает! Это связано с хитрым поведением "server timestamp" поля в Firestore и может выстрелить, если у человека хотя бы два устройства в синхронизации.

Новые коктейли

Хотя бы 10 коктейлей в каждом релизе! Пока на примете:

  • Paloma - похож на Tequila Sunrise, но с грейпфрутовым соком и сиропом агавы
  • Penicillion - два типа виски, медовый сироп. Смущает имбирный ликер, редкий ингридиент.
  • Flip cocktails - можно написать про семейство коктейлей Флип. У меня уже есть про Fizz-ы, может быть несколько ярких представителей просто добавлю.
  • Tom & Jerry - коктейль огонь, хороший теплый зимний напиток.

Всегда жду новых предложений по коктейлям на contact@mybarapp.com

Планы

Пока добавлю коктейли, пока все это переведут, к концу ноября (в крайнем случае под новый год) наверное уложимся. Самый свежак - все, что описано выше, кроме коктейлей, уже есть на Бета канале, можно присоединиться здесь (для Про версии здесь).

Еще где-то поправлены рецепты, добавлены новые бокалы, меры, и куча других технических вещей, например, связанных с таргетингом Android API 30. Почти все новые фичи, что я добавил выше - то, что просили пользователи, присылая письма на contact@mybarapp.com. Каждую фичу просили несколько раз.

Cheers!