Всю неделю шли анонсы складных смартфонов: Samsung и Huawei уже жаждут лишить нас крупной суммы, у Oppo и Xiaomi пока что прототипы.
Их бурно обсуждали, но в основном речь шла о железе и о ценах. А для любого нового форм-фактора важна и софтовая поддержка: можно вспомнить, как при появлении iPad сначала приходилось пользоваться «айфонными» приложениями, ужасно выглядевшими на 10-дюймовом экране, а позже постепенно появлялись адаптированные.
Возникнут ли сложности у существующих Android-приложений на «раскладушках»? К чему готовиться тем пользователям, которые решатся купить дорогущее устройство? А что нужно сделать разработчику, чтобы эти пользователи остались довольными? Как протестировать своё приложение, если под рукой нет устройства за $2000?
Под катом мы описали это и с «пользовательской» стороны, и с «разработческой». Могли что-то упустить — так что, если Android-разработчики в комментариях дополнят, будем рады.
Оптимизация UI
Ура, благодаря раскладушкам в карман теперь влезает большой экран! Можно не скроллить постоянно текст по три строчки, а увидеть много информации сразу! Удобно-то как пользоваться всем станет! Так?
Ну, давайте сравним. Слева — то, как выглядит приложение Twitter сейчас на экране 6-дюймового смартфона. Справа — то, как оно может выглядеть на новомодной раскладной штуке с близким к квадратному экраном, как у Huawei Mate X (за попиксельную точность не поручимся, но суть такая):
То есть на старый экран влезло два твита, а на новый — полтора. Упс. Теперь можно купить телефон дороже $2000, чтобы стало неудобнее читать Твиттер.
Почему так? У приложения Твиттера интерфейс рассчитан только на обычный телефонный экран, где «залепить фотографию во всю ширину» никогда не окажется слишком широким. (В итоге под ChromeOS это приложение выглядит так, что вы не хотите этого видеть.)
Вроде бы мы уже проходили всё это в 2011-м с появлением Android-планшетов: сначала телефонные приложения на них выглядели плохо, потом в Android добавили Fragments, разработчики стали работать над тем, чтобы на разных экранах их приложения выглядели по-разному, всё стало хорошо… так? Проблема в том, что сейчас Android-планшеты не пользуются спросом, стало неочевидно, надо ли вкладываться в их поддержку, и в итоге у приложений с отображением на крупных экранах сейчас всё очень по-разному. А конкретно у раскладных смартфонов ещё и соотношение сторон нестандартное.
Теоретически как раз появление раскладушек могло изменить ситуацию: врывается новая модная категория устройств, и все стараются, чтобы их приложения получше выглядели на них. Но практически, пока такие смартфоны стоят от $2000, их доля рынка будет такой маленькой, что вряд ли под них будут подстраиваться.
Это не конец света: скажем, тот же Твиттер в веб-версии выглядит куда лучше, да и в целом веб куда лучше адаптируется к разным размерам экрана, так что вот браузинг и впрямь должен стать комфортнее. Кроме того, если в будущем раскладные телефоны подешевеют, то это может изменить расклад. Но, в общем, пока что не всё гладко в датском королевстве.
Вывод для пользователей
Не верьте красивым картинкам из презентаций, где подберут отлично выглядящие на устройстве приложения — если захотите покупать «раскладушку», проверьте сначала, как выглядят важные вам.
Вывод для разработчиков
Вкладывать ли ресурсы в разные варианты интерфейса, виднее вам самим, исходя из вашей ситуации. Но по случаю появления «раскладушек» попробуйте хотя бы в эмуляторе открыть ваше приложение на экране больше телефонного и посмотрите, что получится — возможно, сами содрогнётесь и захотите изменить ситуацию.
Переход между экранами
Обычно Android-разработчики не сталкиваются с тем, что их приложение прямо во время использования переносят на другой экран с другим разрешением и соотношением сторон. В презентациях раскладных смартфонов показывают, как бесшовно всё это будет происходить: начал смотреть ролик на сложенном устройстве, потом разложил и продолжаешь с того же места. Действительно ли на практике это всегда будет так беспроблемно?
С точки зрения приложения в момент перехода происходит то, что в Android-разработке называют configuration change. По умолчанию Android в таких случаях пересоздаёт текущий экран приложения, что теоретически может означать потерю части текущих данных.
Но, к счастью, это далеко не первая появившаяся разновидность configuration change: например, простой поворот экрана обычного смартфона тоже подходит под это определение. И поскольку этот простой поворот давно мог лишить пользователя только что введённых данных, так же давно предпринимаются и меры для их сохранения. Окончательно тут всё зависит от разработчиков конкретного приложения (позаботились ли они о том, чтобы их приложение корректно обрабатывало смену конфигурации), но в целом ситуация благополучная: новой большой проблемы не возникло, только разновидность старой, с которой давно и успешно справляются.
Вывод для пользователей
Вероятно, подавляющее большинство популярных приложений будет отрабатывать переход между экранами корректно, но в каких-то случаях недоработки могут встречаться.
Вывод для разработчиков
В целом просто требуется, чтобы ваше приложение корректно отрабатывало смену конфигурации (см., например, страницу «Handle configuration changes» в официальной документации).
А как проверить на практике, что переход между экранами проходит благополучно, если «раскладушки» для тестирования у вас нет? Пока в эмуляторе Android Studio виртуальных раскладушек тоже нет, Samsung сделал
Создаёшь в AVD Manager большой планшет, устанавливаешь специальный APK-файл с сайта Samsung, и добавляется «переключалка» между двумя вариантами: в каждом используется только часть экрана планшета, соответствующая по разрешению одному из экранов Samsung Fold. Выглядит это так (переключалка на виртуальном экране справа внизу, с цифрами 1 и 2):
Многооконный режим
Ещё одна особенность новой категории — многооконность: Samsung прямо говорит о том, как здорово будет выводить на экран Fold три приложения сразу. Что будет с этим?
С первого взгляда здесь тоже революции нет: ещё в Android 7.0 появилась возможность выводить на экран два приложения сразу, а переход от двух окон к трём не настолько принципиальный. Вроде бы тогда можно сделать все выводы по тому, как это будет работать, по тому, что мы могли увидеть уже давно?
Но как раз сейчас возник новый нюанс: Google объявил, что у мультиоконного режима появляется новый вариант «multi-resume». Раньше из одновременно отображаемых приложений только одно было «полностью активным» (то, которое «в фокусе»), а остальные оказывались в режиме «паузы», теперь же сразу несколько могут быть активными в равной степени:
А чем это вызвано и что меняет? Google пишет примерно следующее (вольно переводим с вежливого английского на разговорный русский):
«Разработчики, козявки этакие, вы официальные гайды не читаете и правильный подход к многооконному режиму не внедряете. Вы считаете, что раз называется «пауза», надо вообще всё в приложении поставить на паузу — видео, например. Но если пользователь поделил экран между вашим видеоплеером и другим приложением, то ежу ведь понятно, что он хочет продолжать смотреть видео. Ну, раз для вас следовать правильным практикам слишком сложно, фиг с вами, мы подстроимся: теперь все приложения на экране смогут быть активными одновременно».
Пока что это всё в тестовом режиме (multi-resume будет работать только в случаях, когда и разработчик приложения выразил своё согласие на это, и производитель устройства). Но позже собираются сделать нормой для всех, причём не только на «раскладушках», но и в двухоконном сплит-скрине на обычных смартфонах.
Вывод для пользователей
Пока что всё в промежуточном состоянии. Похоже, что в данный момент некоторые приложения в мультиоконном режиме будут работать неудобно (например, мессенджер может не показывать новые пришедшие сообщения, если он в данный момент оказался не в фокусе). Но Google борется за то, чтобы это исправить. Глядишь, через пару лет станет получше.
Вывод для разработчиков
К новому варианту multi-resume можно подключиться, добавив в AndroidManifest такую строчку:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Но поскольку требуется ещё и согласие производителя девайса (и пока непонятно, все ли его дадут) — наверное, лучше всё-таки проштудировать гугловскую страницу «Multi-window support» и реализовать onPause() с её учётом, не засовывая туда остановку всего подряд.
Минутка рекламы. Если вас в этом тексте интересовали «выводы для разработчиков», то вас может заинтересовать и конференция Mobius: оттуда мобильные разработчики могут вынести много ценных выводов по самым разным поводам. Она пройдёт 22-23 мая в Санкт-Петербурге, узнать больше можно на сайте.
А если у вас самого есть ценные выводы по насущному для мобильных разработчиков вопросу — сейчас идут последние дни, когда можно подать заявку на доклад!