Материал: Мобильное приложение для оценки эффективности мерчендайзинга торговой компании

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

Класс Db Helper

Данный класс унаследован от абстрактного класса SQ Lite Open Helper, который предоставляет простой и удобный интерфейс для создания баз даны в ОС Android.

Константы:

- DB_NAME - константа, содержащая имя файла базы данных.

-   STORES_TABLE - константа, содержащая имя таблицы магазинов.

-   CATEGORIES_TABLE - константа, содержащая имя таблицы категорий.

-   DB_ID_FIELD - константа, содержащая имя служебного столбца с первичными ключами.

Статические поля:

- instance - поле типа, Db Helper содержащее синглтон-объект данного класса.

Методы:

- Db Helper getInstance (Context context) - статический метод доступа к синглтон-объекту.

-   void on Create (SQ Lite Database sq Lite Database) - метод базового класса SQLite Open Helper, вызываемый при создании базы данных. Объект sq Lite Database представляет собой абстракцию БД, и позволяет выполнять инициализирующие SQL-запросы.

-   void on Upgrade (SQ Lite Database db, int i, int i2) - метод базового класса SQ Lite Open Helper, вызываемый при увеличении версии БД. В данном проекте не используется.

-   void recreate Tables() - метод, позволяющий удалить текущие таблицы и создать новые. Используется для очистки кэша.

Класс Data Provider

Данный класс представляет собой локальную альтернативу полноценного поставщика данных. Класс предоставляет доступ к записям из таблиц БД в виде специальных объектов типа Cursor, позволяющих осуществлять итерацию по некоторому набору данных, являющимся результатом ассоциированного с курсором SQL-запроса.

Константы:

- STORES_URI - константа типа Uri, содержащая URI таблицы магазинов.

-   CATEGORIES_URI - константа типа Uri, содержащая URI таблицы категорий.

Поля:

- instance - поле типа, Data Provider содержащее синглтон-объект данного класса.

-   context - поле типа, Context содержащее ссылку на контекст приложения, необходимы для операций с БД.

Методы:

- Cursor get Categories() - метод, возвращающий объект типа Cursor для итерации по категориям.

-   Cursor get Streets (String city) - метод, возвращающий объект типа Cursor для итерации по всем улицам выбранного в параметре city города.

-   Cursor getStores (String city, String street) - метод, возвращающий объект типа Cursor для итерации по всем магазинам, выбранных в параметре city и street города и улицы.

-   void update Stores (List <StoreEntity> new Stores) - метод, осуществляющий обновление информации в таблице магазинов данными из списка newStores.

-   void update Categories (List <DbEntity> new Categories) - метод, осуществляющий обновление информации в таблице категорий данными из списка new Categories.

-   int get Last Version (String table Name) - метод, позволяющий получить последнюю версию указанной в параметре table Name таблицы.

-   int get Last Stores Version() - метод, позволяющий получить последнюю версию таблицы магазинов.

-   int get Last Categories Version() - метод, позволяющий получить последнюю версию таблицы категорий.

Описание вложенного пакета loaders

Данный пакет содержит в себе реализации классов-загрузчиков. Наиболее сложным элементом пакета является абстрактный класс Simple Cursor Loader, от которого унаследованы все используемые в проекте загрузчики. Он представляет собой типовую реализацию класса-загрузчика, предназначенного для работы с локальными объектами доступа к данным, наподобие класса Data Provider. Simple Cursor Loader по своей сути является слегка модифицированной версией класса Cursor Loader, являющегося частью Android SDK и ориентированного на работу с поставщиками данных. Поскольку задача реализации загрузчика, ориентированного на работу с локальной заменой поставщиков данных, является весьма распространённой, используемую в данном проекте реализацию Simple Cursor Loader можно считать типовой. Её описание можно найти, например, в литературном источнике [8].

Остальные классы-загрузчики являются наследниками класса Simple Cursor Loader и переопределяют метод Cursor get Cursor(), возвращающий курсор с актуальным содержимым, который, в свою очередь, возвращает один из методов класса доступа к данным - Data Provider. Помимо этого, некоторые классы-загрузчики содержат набор методов-установщиков для задания дополнительных данных ассоциированных с курсорами SQL-запросов, например, названия городов и/или улиц.

.4 Описание классов пакета dialogs

Данный пакет содержит определения классов, так или иначе наследуемых от класса Dialog Fragment и служащих для создания диалоговых окон. Как и в случае с пакетом loaders, данный пакет содержит базовый абстрактный класс Base Dialog Fragment, непосредственно унаследованный от класса Dialog Fragment, в то время как конкретные реализации диалоговых фрагментов унаследованы от класса Base Dialog Fragment.

Описание класса Base Dialog Fragment

Данный класс является базовым для всех остальных классов диалоговых фрагментов. Он унаследован от класса Dialog Fragment, оставляя метод on Create Dialog, непосредственно создающий диалоговое окно, для переопределения в классах потомках.

Поля:

- titleId - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве заголовка диалогового окна.

Методы:

- int get TitleId() - метод возвращающий текущее значение поля titleId.

-   void set TitleId (int titleId) - метод позволяющий установить новое значения для поля titleId.

-   void on Destroy View() - метод, определённый в базовом классе DialogFragment. Здесь переопределяется для обхода ошибки в Android SDK.

-   Dialog on Create Dialog (Bundle saved Instance State) - метод, определённый в базовом классе Dialog Fragment и являющийся в данном классе абстрактным, однако переопределённый во всех классах-потомках. Используется для создания диалогового окна, представленного наследником класса Dialog.

Описание класса Progress Dialog Fragment

Данный класс представляет собой диалоговый фрагмент, служащий для отображения бесконечного прогресса с заданным заголовком и текстом сообщения.

Поля:

- messageId - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве текста сообщения.

Методы:

- int get MessageId () - метод возвращающий текущее значение поля messageId.

-   void set MessageId (int messageId) - метод позволяющий установить новое значения для поля messageId.

Описание класса Redirect To Settings Dialog Fragment

Наиболее простой класс диалогового фрагмента. Схож с описанным ниже классом Report Dialog Fragment, однако использует строго определённые тексты заголовка и тела сообщения, а также не может быть закрыт с помощью кнопки «Назад».

Описание класса Report Dialog Fragment

Данный класс представляет собой диалоговое окно сообщения об ошибке с произвольным текстом заголовка и тела сообщения, а также единственной кнопкой «ОК». Важным моментом является то, что активити, использующая данный фрагмент должна реализовывать интерфейс Dialog Interface. On Click Listener для обработки нажатий по единственной кнопке диалога.

Поля:

- messageId - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве текста сообщения.

Методы:

- int get MessageId () - метод возвращающий текущее значение поля messageId.

-   void set MessageId (int messageId) - метод позволяющий установить новое значения для поля messageId.

-   void on Attach(Activity activity) - метод, определённый в базовом классе Dialog Fragment. Вызывается в момент ассоциации фрагмента с определённой активити, но до создания визуальных элементов. Используется для проверки реализации активити интерфейса Dialog Interface. On Click Listener.

Описание класса Report Dialog Fragment

Данный класс представляет собой диалоговое окно сообщения об ошибке с неизменяемым текстом заголовка и тела сообщения, а также двумя кнопками, содержащими произвольный, однако неизменяемый после создания диалога, текст. Все параметры задаются в конструкторе при создании фрагмента. Активити, использующая данный фрагмент, также, как и в случае с классом Report Dialog Fragment, должна реализовывать интерфейс Dialog Interface. On Click Listener для обработки нажатий кнопок диалога.

Поля:

- message Id - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве текста сообщения.

-   Positive Text Id - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве текста на позитивной кнопке диалога.

-   Negative Text Id - пол типа int, содержащее идентификатор строкового ресурса, используемого в качестве текста на негативной кнопке диалога.

Методы: void on Attach(Activity activity) - метод, определённый в базовом классе Dialog Fragment. Описан в классе Report Dialog Fragment и служащий для аналогичной цели.

3.5 Обзор функциональных классов из пакета helpers

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

Описание класса Accessibility Helper

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

- boolean is Networking Enabled (Context context) - метод, показывающий наличие интернет-соединения.

-   boolean is Gps Enabled(Context context) - метод, показывающий доступность провайдеров GPS-координат.

-   Alert Dialog get Dialog (final Context context, int message Id, final String action) - вспомогательный метод для создания диалога с произвольным сообщением, перенаправляющего на определённую страницу системных настроек.

-   Alert Dialog get Gps Dialog (final Context context) - метод, возвращающий диалог, перенаправляющий на страницу настроек интернет-соединения.

-   Alert Dialog get Network Dialog (final Context context) - метод, возвращающий диалог, перенаправляющий на страницу настроек GPS.

Описание класса Authorization Helper

Данный класс предоставляет функционал для авторизации на клиентской стороне, то есть обеспечения доступа согласно роли пользователя.

Константы:

- USER_ROLE - строковая константа, содержащая значение роли «пользователь».

-   MERCHANDISER_ROLE - строковая константа, содержащая значение роли «мерчендайзер».

-   AUTHORIZATION_ERROR - строковая константа-идентификатор, указывающая на ошибку авторизации.

Методы:

- boolean isValidRole(String role) - метод, показывающий наличие доступа к приложением пользователю с указанной в параметре role ролью.

Описание класса Image Store

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

Статические поля:

- image - фото в виде массива байт.

Статические методы:

- byte[] get Image() - возвращает изображение, сохранённое в поле image.

-   void store Image(byte[] image) - сохраняет изображение, в поле image.

-   void clean() - очищает поле image.

Описание класса Json Helper

Данный класс служит для упрощённого создания JSON объектов и используется классами взаимодействия с сетью. В отличие от остальных классов-помощников, данный класс обладает набором не только статическими методами. Класс имеет набор методов add с различной сигнатурой, являющимися полными аналогами методов put класса JSON Object, однако маскирующих неактуальное в данном проекте исключение JSON Exception.

Поля:

- json - поле типа JSONO bject, представляющее собой редактируемый JSON-объект.

Методы:

- Json Reader get Reader For Response (Http Response response) - статический метод, позволяющий получить потоковый JSON парсер типа Json Reader, ассоциированный с сетевым потоком из HTTP-ответа, переданного в качестве параметра response.

-   String Entity to String Entity() - метод, преобразующий получить редактируемый JSON-объект, хранящийся в поле json к объекту типа String Entity, который можно использовать в качестве тела HTTP-запроса.

Описание класса Location Helper

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

Константы:

- LATITUDE_FIELD - константа-ключ, по которому доступна широта в интенте с геоданными.

-   LONGITUDE_FIELD - константа-ключ, по которому доступна долгота в интенте с геоданными.

-   ACCURACY_FIELD - константа-ключ, по которому доступна точность в интенте с геоданными.

-   TIMEOUT - таймаут в милисекундах, после которого выдаётся ошибка о невозможности получения координат.

Поля:

- Error Reported - флаг типа boolean, предотвращающий повторную отправку интента с сообщением об ошибке.

Методы:

- void report Error(Context context, Pending Intent pending Intent) - метод осуществляющий отправку интента с сообщением об ошибке.

-   void get Location (final Context context, final Pending Intent pending Intent) - метод, позволяющий компоненту context асинхронно получить геоданные с помощью отложенного интента pending Intent.

3.6 Описание классов пакета networking

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

Классы, представляющие собой структуры данных реализуют ряд свойств в виде набора get- и set- методов для получения полей класса и установки их новых значений. Важной особенностью всех таких классов, является реализация интерфейса Parcelable, необходимого для пересылки экземпляров данных классов вместе с интентами.

Классы веб-клиенты реализуют интерфейс IWeb Client, описывающие программные эквиваленты веб-методов серверного API. При этом существует два класса веб-клиента: рабочий Web Client и тестовый Fаke Web Client, используемый для эмуляции работы сервера.

Описание класса Web Client

Данный класс представляет собой непосредственно клиент, реализующий методы веб-интерфейса, предоставляемого сервером и осуществляющий обмен данный по сети Интернет. Класс объявляет набор констант, названных по шаблону API_*, которые представляют собой названия веб-методов.

Поля:

- client - поле типа Default http Client, представляющее собой объект, занимающийся коммуникацией по протоколу HTTP.

-   Auth Header - строковое поле, содержащее заголовок авторизации.

-   Base Url - строковое поле, содержащее адрес сервера.

Методы:

- Http Response post (String method, Http Entity entity) - метод, отправляющий HTTP POST запрос по адресу веб-метода из параметра method с телом, заданным параметром entity.

-   String login (String login, String password) - метод, осуществляющий авторизацию с указанными логином и паролем и возвращающий роль пользователя.

-   List <Store Entity> update Stores (int version) - метод, позволяющий получить обновления таблицы магазинов выше версии переданной в параметре version в виде списка структур данных Store Entity.

-   List <Db Entity> update Categories (int version) - метод, позволяющий получить обновления таблицы категорий выше версии переданной в параметре version в виде списка структур данных DbEntity.

-   List <Store Entity> parse Stores List (Json Reader reader) - метод, позволяющий считать потоковым парсером reader массив элементов Store Entity.

-   List <DbEntity> parse Categories List (Json Reader reader) - метод, позволяющий считать потоковым парсером reader массив элементов Db Entity.

-   String parse Common Parameter (Db Entity entity, Json Reader reader) - метод, позволяющий извлечь из потока с данными в формате JSON, с помощью парсера reader, одно из полей объекта entity.

-   String upload Picture(byte[] picture) - метод загружающий фото в бинарном виде на сервер, возвращая определённый сервером GUID.

-   boolean send Metadata (Metadata data) - метод, позволяющий сохранить фото с указанными метаданными. Возвращаемое методом значение, показывает успешность выполнения операции.

4. Разработка программных модулей

Одной из важнейших частей приложения является класс Web Client, отвечающий за коммуникацию с сервером. Данный класс реализует интерфейс IWeb Client, описывающий серверное API в виде набора Java-методов. Особенностью этих методов является взаимодействие с сетью, поэтому они все они могут выбросить обязательное для обработки исключение IO Exception, а также не могу быть вызваны в основном потоке, поскольку это вызовет исключение Network On Main Thread Exception. Исходя из этого, методы, определённые в IWeb Client, должны вызываться в контексте, обеспечивающем выполнение в отличном от основного потоке и обрабатывающем исключения ввода/вывода. Таким контекстом является метод on Handle Intent класса Worker Service:

@Override

protected void on Handle Intent (Intent intent) {

try {(hostName != null && !hostName.isEmpty()) {action = intent.getAction();(intent.hasExtra(PENDING_INTENT_FIELD)) {= intent.getParcelableExtra(_INTENT_FIELD);