После получения сигнала MainActivity проверяет наличие у приложения доступа в интернет, выставляет онлайн или оффлайн режим работы в глобальных настройках приложения и меняет отображаемый на экране фрагмент на RecognitionFragment (код в приложении 1).
Данный класс отображает на экране индикатор загрузки и запускает асинхронный метод doInBackground класса CardProcessor для распознавания.
Рис. 4. Алгоритм работы модуля сканирования и распознавания визитных карточек
В начале работы данного класса проверяется режим работы данного приложения. Если интернет-соединение доступно, то выполняется запрос к облачному сервису Google Firebase ML Text Recognition для распознавания текста на сохранённом изображении. В случае, когда приложение работает в оффлайн-режиме, инициализируется модуль библиотеки Tesseract OCR для установленного в настройках языка. В результате распознавания обе библиотеки возвращают текстовое представление информации на изображении. Здесь начинается второй этап работы метода doInBackground класса CardProcessor - классификация текста. При наличии соединения с сетью формируется REST запрос к серверам Google Cloud Natural Language API. Полученный ответ будет представлять собой текст, классифицированный по категориям: человек, организация, страна, адрес и прочее. Номер телефона и адрес электронной почты на данный момент не определяется, поэтому для их классификации используется повторный анализ текста с помощью регулярных выражений. Пример регулярных выражений для обработки текста представлен на рисунке 5. В случае оффлайн режима производится только анализ текста регулярными выражениями из-за недоступности сервиса для онлайн-классификации.
Рис. 5. Регулярные выражения для распознавания адреса электронной почты и номера телефона в международном формате
По окончании процесса распознавания и классификации, полученная информация сохраняется в оперативную память приложения, после чего с помощью MainActivity вызывается следующий фрагмент: InitialEditingFragment.
Данный фрагмент представляет собой класс для работы с формой редактирования распознанной информации. Также в данном классе доступно две функции: экспорт информации в стандартную адресную книгу на устройстве и сохранение контакта в галерею приложения. Первая функция осуществляет заполнение запроса к адресной книге на устройстве с помощью стандартных средств системы Android (так называемый поставщик контактов). Вторая осуществляет сохранение информации контакта в локальную базу приложения.
После завершения работы модуль может быть перезапущен пользователем для распознавания новой визитной карточки путём перехода к данному модулю из бокового меню приложения. На рисунке 6 представлен пользовательский интерфейс данного модуля
Рис.6. Этапы работы модуля сканирования и распознавания визитных карточек в онлайн режиме
2.4.4 Модуль отображения сохранённых контактов
Данный модуль приложения организует работу с галереей сохранённых карточек в приложении и состоит из следующих основных классов: CardGalleryFragment и ContactInfoFragment и CardGalleryContent. Кроме того, используются вспомогательные классы ActionBarOverlay, CardLookup и CardsRecyclerViewAdapter для создания динамического списка элементов пользовательского интерфейса (в рамках данной работы - изображения карточки) и SavedCardEditingFragment для редактирования информации о карточке.
Инициализация данного модуля начинается с запуска фрагмента CardGalleryFragment (код приведён в приложении 2), который используется для работы со стандартным пакетом Android - RecyclerView. Данный пакет позволяет создать прокручиваемый на экране список однотипных элементов, сохранённых в классе, реализующем интерфейса Java - Collection. Фактически, данный пакет представляет реализацию для отображения списков элементов в графическом виде на экране. В приложении на базе данного пакета реализована возможность обновления списка при добавлении новых элементов, а также выбора уже существующих для совершения над ними операции удаления.
Однако, RecyclerView предоставляет только реализацию графического представления информации, хранящейся в приложении. Для программной работы с этой информацией используется класс CardGalleryContent, который представляет собой статический объект, в котором сохраняется список контактов и их данные (имя, телефон и так далее). Информация о каждом контакте хранится в двух представлениях: в оперативной памяти устройства для быстрого обращения к нему в программе и на внешнем носителе для восстановления списка после перезапуска приложения. Принцип долгосрочного хранения реализован следующим образом. При первом запуске галереи приложение создаёт в памяти устройства папку для хранения контактов. Каждому вновь созданному контакту присваивается уникальный строковый идентификатор, на основании которого генерируется два файла: один в формате JSON для сохранения метаданных о контакте и BMP файл изображения визитной карточки. При перезапуске приложения оно зачитывает файлы из данной папки и заполняет ими список элементов для отображения. Структура файлов, сохраняемых на устройстве, можно видеть на рисунке 7.
Последний из рассматриваемых классов - ContactInfoFragment используется для представления информации о контакте на экране. Переход к нему осуществляется при выборе пользователем конкретного элемента из списка элементов RecyclerView путём нажатия на него. Данный класс также обеспечивает возможность редактирования контакта и его импорта в стандартную адресную книгу устройства пользователя.
Рис.7. Структура организации хранения информации о контактах в памяти устройства
Рис.8. Интерфейс модуля отображения сохранённых контактов
Пользовательский интерфейс данного модуля представлен на рис. 8.
2.4.5 Модуль общих настроек приложения
Последний из рассматриваемых модулей приложения состоит из одного класса SettingsFragment, который использует API-интерфейсы Preference системы Android для построения интерфейса, согласованного с привычным для пользователей других приложений Android (включая системные настройки). Список настроек генерируется на базе специального XML-.файла
При использовании данного модуля пользователь может выставлять следующие настройки: необходимость оповещения о возможности перехода приложения в онлайн режим для повышения качества распознавания, необходимость оповещения о недоступности сети и возможном падении качества распознавания, возможность использования мобильного интернета для распознавания в режиме онлайн, язык, используемый при распознавании визитки в условиях отсутствия доступа к сети. Настройка ручного переключения между онлайн и офлайн режимами работы приложения вынесена на панель бокового меню для удобства быстрого доступа как самая потенциально часто используемая. Значения данных настроек определяют различные сценарии исполнения модуля сканирования и распознавания визитных карточек. Интерфейс меню настроек представлен на рисунке 9.
2.5 Дизайн пользовательского интерфейса приложения
При разработке мобильного приложения важную роль играет правильно выбранная концепция дизайна пользовательского интерфейса, которая определяет удобство взаимодействия пользователя с приложением. Приложение, созданное в рамках данной работы, было разработано с учётом официальной рекомендации от создателей платформы Android по использованию концепции «Material Design» в мобильных приложениях данной операционной системы [8].
В процессе разработки приложения была применена библиотека «android.material» которая позволила добиться единого вида элементов пользовательского интерфейса (кнопки, шрифты, цветовая гамма) во всех модулях приложения. Также были использованы такие концепции «Material Design» как боковое меню (navigation drawer) [13], список карточек (card view) [12], единое окно настроек (preferences settings screen) [10] и верхняя панель приложения (app bar) [11], что позволило упростить пользовательскую навигацию между различными функциями приложения.
Цветовая гамма приложения базируется на использовании трёх основных цветов: #ffffff, #01579b и #005f63.
2.6 Используемые шаблоны проектирования
Для упрощения процесса разработки и тестирования при создании приложения были применены некоторые шаблоны проектирования.
В основе архитектуры модуля отображения сохранённых контактов лежит использование паттерна «Модель-Представление-Контроллер» (Model-View-Controller, MVC). Данный паттерн предполагает разбиение всей логики приложения на 3 основные части:
ѕ модель: является основным представлением данных в системе, реализуется в классе CardGalleryContent, который хранит в себе информацию о контактах пользователя (сохранённых визитных карточках)
ѕ представление: отвечает за представление данных на экране пользователя, реализуется стандартными механизмами системы Android обеспечивая представление пользовательского интерфейса на экране на основе вёрсток в файлах формата xml, в том числе с помощью пакета RecyclerView
ѕ контроллер: содержит в себе бизнес-логику и отвечает за связь между моделью и представлением, в приложении реализован классом MainActivity для реализации задач навигации и переключения между набором классов, унаследованных от базового класса Fragment
При создании класса CardGalleryContent был применён шаблон Singleton (одиночка), данный класс инициализируется один раз при первом запуске модуля отображения сохранённых контактов и существует после этого на протяжении всего жизненного цикла приложения в единственном экземпляре, что позволило эффективно организовать обращения к данной модели из разных частей приложения и сняло проблему повторной инициализации базы данных.
Раздел 3
3.1 Тестирование приложения
Тестирование приложения осуществлялось в несколько этапов, проводимых по мере готовности приложения к финальной публикации:
ѕ модульное тестирование;
ѕ интеграционное тестирование;
ѕ системное(бета) тестирование.
Основными направлениями тестирования были проверка функционала на соответствие заявленным требованиям и отсутствие критических ошибок в работе приложения. Критической ошибкой признавалась ошибка, которая приводила к невозможности использования основного функционала приложения при отсутствии других способов использовать данный функционал, например, зависание приложения или отсутствие результатов распознавания текста.
3.1.1 Модульное тестирование
Модульное тестирование включало в себя проверку работоспособности функций каждого модуля и их соответствие заявленным требованиям.
Для тестирования функций модуля сканирования и распознавания визитных карточек использовался набор из 10 фотографий визитных карточек на каждой итерации тестов. Фотографии выбирались произвольным образом из наборов картинок «Stanford Mobile Visual Search Data Set: Business Cards» [14] и Google Images. Пример тестов данного модуля приведён в приложении 3.
В модуле отображения сохранённых контактов проверялись следующие функции: добавление карточки, отображение списка, удаление карточки, редактирование карточки.
Для модуля настроек проверялась функция изменения настроек и их сохранения в памяти устройства.
Модульные тесты запускались после внесения каждого изменения в модуль. Тесты проводились в ручном режиме. При финальном проведении модульных тестов критических ошибок выявлено не было.
3.1.2 Интеграционное и системное тестирование
Интеграционное тестирование проводилось с целью проверки корректной взаимосвязи между различными модулями, а именно: время перехода из одного модуля в другой, правильность передаваемой информации, изменения пользовательского интерфейса при переходе, загрузка приложения, работа пользовательской навигации (бокового меню). Тестирование указанных проводилось каждый раз после добавления нового модуля в приложение или внесения изменений в систему навигации. Тесты проводились в ручном режиме, при финальном тестировании критических ошибок выявлено не было.
Системное тестирование проводилось на заключительной стадии разработки приложения на полной, интегрированной системе, с целью проверки соответствия приложения исходным требованиям. Приложение тестировалось третьими лицами на устройствах Xiaomi Redmi 2 (Android 8.0), Samsung Galaxy A50 (Android 9.0), Huawei P20 (Android 8.0). К проверке предлагались следующие сценарии:
ѕ использование приложения для распознавания карточек на английском и русском языке в онлайн режиме с сохранением информации о контакте в галерею приложения, редактирование информации о контакте в галерее, удаление контакта из галереи;
ѕ использование приложения для распознавания карточек на английском и русском языке в оффлайн режиме с экспортом информации о контакте в стандартную электронную адресную книгу устройства.
3.1.3 Итоги тестирования
По результатам финального тестирования были представлены следующие результаты:
ѕ приложение соответствует изначально заявленным требованиям:
o приложение корректно работает с русским и английским языком
o при работе в онлайн режиме корректно классифицируется от 75% до 90% информации
o при работе в оффлайн режиме корректно определяется от 60% до 75% номеров телефонов и адресов электронной почты
o критических проблем с отображением интерфейса приложения выявлено не было, дизайн, в целом, соответствует правилам «Material Design»
ѕ критических ошибок выявлено не было