Как мы разрабатывали «Спецкор» — супер-кастомное мобильное приложение для гражданских репортеров

    С удовольствием представляем хабрасообществу мобильное приложение для гражданских журналистов «Спецкор», с помощью которого можно снимать фото- и видеорепортажи и продвигать их под эгидой «Комсомолки». Главный создатель — ИД «Комсомольская правда», IT-приспешники и разработчики — мы, компания EastBanc Technologies. Проект анонсирован «Комсомолкой» в конце апреля 2014 года, тогда же запущены первые конкурсы. Мы же со своей стороны решили поделиться техническими деталями реализации приложения. На наш взгляд, это будет интересным для читателей, потому что редко в одном проекте возникает столько нетривиальных технологических и бизнес-задач одновременно.

    «Спецкор» относится к многоплатформенным клиент-серверным приложениям с административным интерфейсом. Клиентская часть реализована на мобильных платформах iOS и Android и содержит следующий функционал:

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

    Серверная часть состоит из следующих частей:

    • административный интерфейс;
    • API для мобильных приложений;
    • сервис для обработки медиа-контента и публикации контента в социальные сети;
    • сервис для отправки push-уведомлений.

    Бизнес-цель проекта — создание управляемой сети гражданских репортеров с помощью приложения, которое позволит эффективно взаимодействовать журналистам и редакции «Комсомолки». Для достижения этой цели необходимо было дать возможность таргетировать и сегментировать информацию по рубрикам и темам, а пользователей — по регионам России.

    Изначально были сформулированы следующие требования к серверной части:

    • возможность масштабирования;
    • определение геолокации пользователя;
    • обработка фото- и видеоконтента;
    • интеграция с популярными социальными сетями.

    Дополнительные технические требования:

    • MongoDB
    • OpenShift Private Cloud
    • Python и TurboGears 2 для реализации функционала серверной части
    • Twitter Bootstrap для административного интерфейса.

    Как приложение работает


    Разделы административного интерфейса:

    • список соцсетей, добавление и блокировка соцсети;
    • список городов, добавление города, просмотр информации о городе;
    • список шрифтов, добавление и удаление шрифтов. Возможно добавление кастомного шрифта в формате TTF;
    • список скинов (тем оформления репортажа), добавление и редактирование скина;
    • список рубрик, добавление рубрики. Рубрика является набором скинов с дополнительными свойствами, содержащими название рубрики;
    • список связанных хештегов для публикации в социальные сети;
    • список заданий, добавление задания. Задание похоже на рубрику, но может быть назначено на определенные даты, города и даже на отдельных пользователей; для заданий рассылаются push-уведомления;
    • список новостей, добавление новостей. Новости содержат текстовую и графическую информацию и могут быть привязаны к городам и пользователям;
    • лента репортажей – инструмент для модерации и назначения наград пользователям. Также может использоваться для удаления репортажей. Для каждого репортажа отображаются ссылки на публикации в социальных сетях;
    • список пользователей — здесь отображаются все пользователи приложения. Со страницы пользователя можно перейти на ленту его репортажей, назначить награду. Можно назначить пользователю новость или задание, и ему будет отправлено push-уведомление. Если пользователь уже публиковал контент в социальные сети, то будут показаны ссылки на его профили в этих сетях. Также пользователя можно блокировать;
    • список менеджеров, добавление менеджера. Создание аккаунтов для сотрудников «Комсомолки», отвечающих за контент и работу с пользователями в определенном регионе. Права менеджерам назначаются таким образом, что они могут создавать задания и новости только для заданного набора городов. Также менеджеры отвечают за модерацию контента.

    Процесс с точки зрения «Комсомольской правды»


    Сотрудники КП, которые отвечают за работу приложения «Спецкор», называются менеджерами. Каждый менеджер отвечает за определенный географический регион.

    Основные обязанности менеджеров «Комсомолки» – это создание контента для мобильного приложения. Через административную панель менеджеры добавляют задания и рубрики, наполняют их скинами. Для кастомизации скинов они могут добавлять различные шрифты.
    Когда в рубрике или задании есть хотя бы один скин, она становится доступна в мобильном приложении, и пользователи создают свои репортажи с использованием существующих скинов.
    Репортажи отправляются на сервер, обрабатываются и попадают в ленту, доступную менеджеру. В зависимости от задания или рубрики, которые могут быть привязаны к определенному региону, а также от географических координат репортажа для рубрик, не имеющих географических ограничений, репортаж попадет на проверку к тому менеджеру, который отвечает за соответствующий регион.

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

    Информация о награде приходит автору репортажа в виде новости, а также в виде push-уведомления, если соответствующий тип уведомления включен в настройках мобильного приложения.

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

    Одной из интересных задач в создании административного интерфейса для менеджеров «Комсомолки» была реализация возможности создания и редактирования скина. Для этого наши коллеги разработали полнофункциональный WYSIWYG-редактор: все изменения в свойствах сразу отображаются на странице редактирования в виде превью скина. С помощью Javascript и CSS скин отображается в точности так, как будет выглядеть на мобильных устройствах.

    Процесс с точки зрения пользователей «Спецкора»


    Пользователь делает фото или видеоролик, выбирает, в какой рубрике он хочет опубликовать репортаж, в рубрике выбирает нужный скин, заполняет поля репортажа (заголовок, подзаголовок, город, комментарий) и жмет кнопку «Опубликовать». Перед публикацией, пользователь может выбрать список соцсетей, в которые он хочет дополнительно опубликовать свой репортаж.

    Пользователю не нужно регистрироваться в приложении, и если он не хочет поделиться репортажем в своих аккаунтах в социальных сетях, то ему не нужно логиниться даже в них. В приложении «Спецкор» пользователь может выкладывать ролики и фото абсолютно анонимно. Если же пользователь вошел в какую-нибудь социальную сеть, то на сервере появится информация о его аккаунте, и в общей ленте опубликованных репортажей у этого автора будут показаны имя и аватар.

    Чтобы сделать репортаж для задания, пользователю нужно сначала открыть задание, и нажать в нем кнопку «Участвовать», тогда в списке доступных скинов при создании репортажа будут показаны только скины из выбранного задания. Конечно, пользователь может отказаться от выполнения задания в любой момент.

    Пример

    Администратор, отвечающий за Сибирский Федеральный округ, создает одно задание для Новосибирска, Красноярска, Омска и Томска. Например, заснять видеоролик о том, как через эти города несут олимпийский огонь. Для каждого города указывается временной интервал, когда это задание будет актуально.



    Пользователи, которые окажутся в радиусе 50 км от места действия во время действия задания, получат push-уведомление о задании. Волна заданий прокатится по всем запрограммированным городам в соответствии с часовым поясом и временем, когда в городе понесут факел.

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

    После обработки репортаж отображается в «Моей ленте» репортажей, если же репортаж прошел модерацию и был одобрен – он становится доступен в общей ленте.

    Вот так примерно выглядят процессы, которые текут «за кадром». Обратимся к подробностям реализации.

    Архитектура серверной части




    Как организовано хранение информации


    Вся информация с мобильных устройств хранится в базе данных MongoDB. Основные задачи, для которых был критичен выбор СУБД в нашем проекте – это:

    • выбор пользователей по регионам;
    • выбор репортажей по регионам;
    • выбор заданий/рубрик по регионам;
    • хранение большого количества бинарных данных;
    • масштабирование;
    • скорость.

    В MongoDB реализована работа с геоиндексами, и это существенно упростило реализацию работы с геоданными в нашем приложении.

    Одной из возможностей реализации кластерной конфигурации MongoDB является репликация. Это позволяет распределить нагрузку между несколькими копиями БД (удовлетворение требования на масштабируемость).

    Для работы с бинарными данными мы использовали часть MongoDB под названием GridFS, которая позволяет хранить бинарные данные внутри БД. Для повышения скорости работы с бинарными данными мы храним их в разных коллекциях.

    Как кластеризовали нагрузку


    Одно из требований заказчика было, чтобы бэк-энд для простоты, поддержки и расширения был задеплоен в OpenShift-платформу, которая позволяет автоматически масштабировать ресурсы в зависимости от нагрузки. Если сервер сильно нагружен, то OpenShift сама может поднять еще один инстанс этого сервера.

    В нашем случае один сервер состоит из следующих частей:
    • административный интерфейс;
    • API для мобильных приложений;
    • сервис для обработки медиа-контента и публикации контента в социальные сети;
    • сервис для отправки push-уведомлений.

    Сервисы обработки медиа-контента и отправки push-уведомлений – это процессы, которые находят в базе данные для обработки и выполняют ее. Когда при увеличении нагрузки OpenShift поднимает дополнительные инстансы сервера, то увеличивается количество сервисов, и они могут пытаться обработать одну и ту же информацию. Используя атомарную операцию в MongoDB findAndModify процесс устанавливает специальный статус обрабатываемому контенту, тем самым запрещает его использование другими процессами.

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

    API и геолокация


    Поскольку задания и рубрики в приложении часто могут быть ограничены георафическими регионами, важно понимать местоположение пользователя для определения его прав доступа, а также для отправки уведомлений. Для определения координат пользователя приложение запрашивает права на доступ к данным геолокации и, в случае получения разрешения от пользователя, получает координаты и отправляет их на сервер. В случае же если пользователь запретил приложению получать информацию о геолокации от операционной системы смартфона, и приложение не может отправить данные на сервер, координаты определяются посредством использования geoip-сервисов. По запросам приложения определяется примерное положение пользователя по месту регистрации его провайдера.

    Для определения местоположения юзера, который запретил в настройках геолокацию, мы использовали 2 сервиса:

    • MaxMind Geolite — локальная база соотношений IP-адресов и их географического местоположения (есть проблемы с точностью в РФ и СНГ):
    • ip-api.com — онлайн-сервис, который определяет местоположение с более высокой точностью. Есть серьезное ограничение на кол-во запросов, поэтому используется кэширование информации.

    Сервис обработки медиа-контента


    Сервис обработки медиа-контента является процессом, который исполняется независимо от остальных частей. Основные задачи этого процесса – выбор из БД контента с определенным статусом, процессинг и сохранение обработанных данных обратно в БД. Процессинг медиа-контента состоит из двух частей: обработка видео и обработка фото.

    Как реализована обработка видео

    Обработка видео осуществляется при помощи сторонней программы avconv (дальнейшее развитие приложения ffmpeg).

    Репортажное видео может состоять из нескольких кусков. Снимается оно по принципу Vine/Instagram: пока вы держите палец на экране, съемка идет, как только отпускаете — прерывается. Монтировать куски прямо на девайсе — очень ресурсоемкий процесс, поэтому окончательный монтаж у нас происходит на сервере.







    Видео можно снимать с двух камер — фронтальной и тыловой, можно переключаться между ними в процессе съемки. Разрешения видео, снятого на различные смартфоны, отличаются. Однако при публикации мы создаем ролики 640*640. Общий процесс обработки видео включает следующие шаги:

    1. Определяем угол поворота видео (информация берется из метаданных видео-файла).
    2. Переворачиваем в нужную ориентации.
    3. Применяем crop (кадрируем).
    4. Выполняем масштабирование.
    5. Накладываем скин .
    6. После обработки всех кусков, склеиваем в один ролик – все это делается на сервере, без «ручной» работы и участия человека.


    Всё, публикуем.



    Как реализована обработка изображений


    С обработкой фото все проще: изображения обрабатываются с помощью библиотеки Pillow.
    Мобильное приложение отправляет на сервер оригинальную фотографию, а также информацию о репортаже. В целом шаги обработки фото-репортажа аналогичны обработке видео.

    Как реализована загрузка в соцсети


    В приложении реализована поддержка загрузки репортажей в основные социальные сети: ВКонтакте, Одноклассники, Twitter, Facebook, Instagram, YouTube.



    Загрузка репортажей в соцсети пользователя

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

    1. Пользователь авторизуется в выбранной социальной сети.
    2. У пользователя запрашивается разрешение на доступ к профилю и публикацию в его ленту от имени приложения «Спецкор».
    3. Если пользователь разрешает, то мобильное приложение получает Access Token и высылает его на сервер
    4. Сервер запрашивает по токену профиль пользователя и сохраняет в базе некоторые данные о пользователе: имя, фамилию и ссылку на аватар.

    После того как пользователь залил на сервер свой репортаж и медиа-контент репортажа был обработан, запускается непосредственно процесс загрузки репортажа в соцсети. Если это видеорепортаж, то он может быть загружен в сети Вконтакте, Facebook, YouTube. Если пользователь выбрал одну из этих соцсетей, а также выбрал Twitter или Одноклассники, то в видео-хостинговые соцсети будет залито видео, а в Twitter/Одноклассники будет загружена ссылка на видео. Для фоторепортажа доступны все сети, кроме YouTube.

    Загрузка репортажей в соцсети заказчика

    Помимо публикации репортажа в пользовательские аккаунты социальных сетей, репортаж будет загружен в приватные Twitter- и YouTube-аккаунты заказчика. Для этого были созданы отдельные приложения в социальных сетях. Для загрузки в Twitter пользовательская авторизация не нужна (токены, при помощи которых делаются публикации, не имеют срока давности). А для загрузки в YouTube нужна первичная авторизация пользователя (ее мы сделали в админке приложения), в процессе которой сервер получает от YouTube 2 ключа: access_token и refresh_token. Access Token — ключ, который используется для загрузки видео в YouTube и действует определенный период времени. Refresh Token нужен для того чтобы генерировать новый Access Token, когда потребуется.

    Refresh Token не имеет срока давности и может устареть только тогда, когда пользователь заберет права на публикацию у этого приложения. Еще один нюанс, связанный с YouTube: количество загруженных через API видео ограничено, всего 2000 роликов. Поэтому на сервере ведется счетчик публикации и организована возможность добавлять несколько YouTube-аккаунтов. Для публикации видео сервер будет выбирать аккаунт, в котором опубликовано меньше всего роликов.

    Кроме приватных аккаунтов, есть такая же пара публичных аккаунтов. Туда репортажи публикуются только после прохождения модерации.

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

    Сервис для отправки пуш-уведомлений


    Так как наше приложение выпущено на iOS и Android, мы поддерживаем и Apple Push Notification Service и Google Cloud Messaging.

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



    Мы были не согласны на только «выкл» или «вкл» для всех уведомлений приложения. Необходимо было кастомизировать процесс, ведь кто-то из пользователей хочет узнавать о новых заданиях, кто-то — о новых репортажах, кто-то хочет получить уведомление, что их репортаж опубликован, а другим это не надо.

    Работать с задачей решили при помощи настроек и конфигурации сервера. Если пользователь согласился принимать push-уведомления, то у него есть возможность настроить, какие виды уведомлений он хочет получать:

    • о новых репортажах в общей ленте,
    • о новостях и заданиях,
    • о наградах, присвоенных пользователю.

    Итог


    Скажем честно: это был захватывающий опыт разработки продукта, грандиозного не только с технической точки зрения, но базирующегося на глобальной идее — создать огромную сеть гражданских журналистов по всей стране, вывести гражданскую журналистику на профессиональный уровень, предоставив им ресурсы для продвижения силами самого популярного издания России.

    Приложение запущено в работу. Например, за «Ночь в музее» гражданские репортеры уже получили гонорары. Если вы живете в столице, то прямо сейчас можете побороться за славу и деньги, создав интересные репортажи на тему «Жара в Москве», а новосибирцам «Комсомолка» дает шанс стать богатыми и знаменитыми, отправившись на фотоохоту в городской зоопарк (земляки, поспешите, снимки белого медвежонка Шилки — беспроигрышный вариант!).

    Качайте «Спецкор» в Google Play и AppStore.
    True Engineering
    76,00
    Специалисты по цифровой трансформации бизнеса
    Поделиться публикацией

    Комментарии 21

      +5
      Почему у Android версии iOS интерфейс?
        +2
        Для приложений с кастомным дизайном небольшое отхождение от стандартного интерфейса вполне допускается. В данном случае приложение разрабатывалось в едином стиле для удобства использования.
          +3
          В данном случае грубое нарушение гайдов андроид. Для удобство использования надо соблюдать гайды системы, потому что пользователю удобно видеть привычные для него элементы. Он не знает какое приложение на iOS, зато знает другие приложения на Android.
            +2
            Простите, для удобства пользования кого? User experience пользователей android и iOS таки различается. Если человек пользовался только андроидом, то ему ваше приложение, скорее всего, покажется неудобным. Как ниже писали — гайдлайны были грубо нарушены. Привыкнуть можно, но встречный вопрос — почему тогда не единый android-like дизайн для android и iOS приложений? :)
          +2
          Ну что же — идея обзавестись бесплатным контентом не нова. К сожалению, со своего WMфона приложение поставить не могу, но подозреваю, что пользовательское соглашение подразумевает неограниченное использование материалов КП. Одно но — микростоки уже пару лет осваивают мобильную фотографию, поэтому вместо призрачного вознаграждения от КП, по моему, лучше сразу отправлять в фотобанк. Alamy, 123RF, depositphotos (clashot) создали такую возможность на своих площадках.
            +9
            С технической точки зрения — всё отлично. Но Комсомолка — нет, боже упаси. Может есть аналоги менее запомоеные ангажированные?
              –10
              КП — один из самых популярных ИД в России. Их новостные проекты и газеты входят в ТОПы в России и Европе. Понятно, что размещать свои новости можно где угодно, но если хочется донести информацию до большого числа читателей, то Спецкор дает один из самых простых и удобных способов это сделать.
                0
                У этого ИД есть один влиятельный читатель, которого все знают. Поэтому у этого ИД всё всегда будет хорошо, в отличие от большинства других издательств страны.
                  +6
                  Ага, и оказаться в одном ряду со Скойбедой и Стешиным, среди новостей про летающие тарелки и тайну воды. Серьезно?
                +2
                Я понимаю, что с технической и профессиональной точки зрения вы гордитесь.

                Но вы понимаете, что ваше творение будет, по большей части, использоваться для съёмок тайком судебных и личных дрязг «знаменитостей», их же, но постаревших — в больницах? — да что там, посмотрите на фото и видео, которых на kp.ru уже в достатке.

                Не могут же деньги настолько не пахнуть, ну?
                  +1
                  Ну этот вопрос можно адресовать сразу производителям фототехники… Мне кажется, творение на 98-99% будет использоваться для съемки котиков, цветочков и деревьев. А постаревших знаменитостей можно и без этого приложения снимать…
                  +6
                  Про андроид приложение с кастомным дизайном для которого «небольшое отхождение от стандартного интерфейса вполне допускается»:
                  1. В верхнем баре заголовок страницы должен быть слева: developer.android.com/design/patterns/actionbar.html
                  2. Кнопка назад в ActionBar — это кнопка Up, а не Back. Она ведет себя не правильно (дублирует кнопку back). developer.android.com/design/patterns/navigation.html
                  3. Использовиние bottombar — плохо: developer.android.com/design/patterns/pure-android.html
                  4. В списках Android нету стрелки справа: developer.android.com/design/patterns/pure-android.html

                  Не настолько это «кастомный дизайн», что бы нарушать гайды. Это лень (или экономия денег) делать отдельный дизайн для платформы. Поэтому просто копируем то, что есть в iOS и обзываем «кастомный дизайн».

                  Кроме этого, не относящееся к гайдам:
                  1. Отказ от использования SSO для соц сетей, мне кажется странным. Это удобно для пользователя, а Вы заставляете логиниться заново.
                  2. В разделе прочее нет заголовка у первой секции вообще, в третьей есть, но на нем нету текста.
                  3. С ленте имя наезжает на дату (на большом экране Nexus 5).
                  4. PullToRefresh работает странно, что бы его вызвать надо сначала пролистать вниз, а потом вверх. С первого элемента вызвать нельзя. Ну и вообще это не PullToRefresh.
                  5. В списке неправильно грузите картинки. Если быстро пролистать, то на элементе поочереди показываются все предыдущие. (Проверить сложно, но в результате может оказаться не та картинка). Взяли бы Picasso что ли.
                    +2
                    6. Написать при возникновении проблем мне предлагает например в Google Keep, Переводчик и Bluetooth (но заголовок Email).
                    7. В о проекте сайт открывается в WebView, верстка едет, зум не работает (почему не мой любимый броузер?)
                    8. Там же из вебвью кнопка работает не правильно.
                    9. Лента грузится очень долго и при первой загрузке нету никакого индикатора (почему не кешировать на устройстве, что бы показать ленту пока грузится новая?).
                      0
                      Большое спасибо за подробный комментарий. Мы по стараемся учесть замечания при разработке следующих версий :)
                        –2
                        Гайды это конечно хорошо. Лучше их соблюдать, но вот некоторые пункты лично на мой взгляд там описаны спорно.
                        В верхнем баре заголовок страницы должен быть слева
                        Он должен быть слева потому, что справа часто присутсвуют пункты меню и действий. Чем больше будет места до заголовка, тем больше кнопок там поместится. Это правильно, конечно, но что если в моём приложении нет таких кнопок? Почему бы мне не разместить заголовок в центре, если мне этого хочется?
                        Don't use bottom tab bars
                        Использовать нижний таб бар плохо не потому, что он нижний, а потому, что в ios у каждого такого таба свой стек навигации, которому на андроиде не место. Если мои табы не открывают новые окна внутри себя же, то какая разница где я размещу таббар?
                        Don't use right-pointing carets on line items
                        Этот пунк меня даже улыбнул. Неужели стрелка может смутить пользователся так, что он не поймёт, кликать на этот пункт или еще что-то с ним делать? Этот пункт я правда не понимаю, объясните?
                          0
                          Это вопрос к гайдам, который есть под платформу и создают некое единообразие и ожидаемое поведение для пользователя. Попробую их позащищать немного:
                          1. А почему не слева или внизу например? ActionBar — стандартный элемент интерфейса android. Если вы его не хотите использовать — не используйте. Делать элемент, похожий на стандартный, но не стандартный — зачем? Что бы потом использовать кнопки где-то еще, вместо того что бы расположить их в ActionBar (как в этом приложении)?
                          2. Это место для отображение действий по android гайдам. Т.е. не навигации, а действий. Поэтому наличие навигации внизу — это плохо. Конечно, можно сделать и внизу и слева, пользователь даже разберется с этим. Но такие приложение ломают вырабатываемую привычку у пользователя.
                          3. Это вопрос исключительно стиля системы (она и расположена в разделе PureAndroid). Просто наличие этого в гайдах гугла — повод не использовать этот элемент из iOS. А вот ни одно «за» за то что бы его использовать я не вижу.
                            +2
                            Такие вопросы я чаще всего слышу от дизайнера, который сам ходит с iPhone. Каждый раз я слышу одни и те же слова. Почему ни у кого не возникает сделать таббар сверху на iOS?
                            –2
                            1. В верхнем баре заголовок страницы должен быть слева: developer.android.com/design/patterns/actionbar.html
                            2. Кнопка назад в ActionBar — это кнопка Up, а не Back. Она ведет себя не правильно (дублирует кнопку back). developer.android.com/design/patterns/navigation.html
                            3. Использовиние bottombar — плохо: developer.android.com/design/patterns/pure-android.html

                            В данном случае гораздо удобнее перемещаться по табам в bottom bar, нежели использовать стандартный Action Bar от Android.
                            Потому что пользователь держа телефон одной рукой с легкостью может перемещаться по табам большим пальцем. (Можно посмотреть описание «Правила большого пальца» habrahabr.ru/post/150905/)
                            В случае с Action Bar, пользователю бы пришлось одной рукой держать телефон, а другой перемещаться по табам. В данном случае это не совсем удобно, поскольку предполагается частая навигация пользователем между табов.
                            Кроме того c технической стороны Action Bar использует Fragments, для отображения контента табов. Однако Fragments по-умолчанию не умеют хранить состояние.
                            Нами было реализовано сохранение состояния во вкладке. То есть если из вкладки «События» перейти на страницу детального просмотра события, а потом перейти на вкладку «Лента», и вернуться обратно, то Вы окажетесь на странице детального просмотра события, а не на списке с событиями.
                            В случае со стандартным использованием связки ActionBar + Fragments, сохранение состояния не происходило бы.

                            4. В списках Android нету стрелки справа: developer.android.com/design/patterns/pure-android.html

                            В данном случае в стрелке «Назад» нет необходимости, поскольку списки с данными находятся непосредственно на главных страницах вкладок, поэтому пользователь может легко перейти на них используя bottom bar.

                            К тому же посмотрите, например, стандартное Android приложение «Play Пресса». Там в ActionBar также нет кнопки назад на списках с рубриками. И более того история навигации по табам никак не сохраняется. По кнопке back вы просто сразу выходите из приложения.
                              0
                              Итак, про первый и второй пункт ни слова не увидел.
                              Про третий пункт — проблема надуманна.
                              Пользователю тяжело тянуться к вкладкам — ок. Стандартный свайп — чем не устраивает. Горизонтальный свайп решает проблему с правилом большого пальца.
                              Да, action bar предполагает использование фрагментов, но сохранение состояния фрагмента — это не так много кода, зато более рациональная работа памяти.
                              Поведение с отдельным стеком на вкладке — это ужас. Кнопка назад — возвращает назад, а не непонятно куда, как у вас. На детальном экране вообще не должно быть табов.
                              Я боюсь представить как реализовано это внутри, если это без фрагментов еще сделано.
                              Про пункт 4:
                              Я имел в виду Don't use right-pointing carets on line items из гайдов. У вас это в разделе «прочее».
                              Стрелки назад в адроиде нету, есть кнопка вверх (Up). Ее поведение у вас в Прочее -> о проекте -> Свяжитесь с нами -> назад — неправильно.

                              У меня стойкое впечатление, что вы гайды первый раз открыли сегодня. А андроидом пользовались 2 дня тестовым, перед тем как заняться разработкой.
                            0
                            del-- промахнулся веткой.
                              0
                              все отлично, но Комсомолка УГ

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.